From cb199e221ae698ac13fdda691985e001ee84039b Mon Sep 17 00:00:00 2001 From: NeilZaim <49716072+NeilZaim@users.noreply.github.com> Date: Fri, 23 Oct 2020 04:48:16 +0200 Subject: Remove a few segfaults when there is zero particle species (#1449) * Remove a few segfaults when there is zero particle species * Docs: Update Example * We don't have `part_per_proc` so exemplify with something else. Co-authored-by: Axel Huebl --- Source/Particles/MultiParticleContainer.cpp | 72 ++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 16 deletions(-) (limited to 'Source/Particles/MultiParticleContainer.cpp') diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index ef23f9de5..9fb67dc91 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -359,19 +359,42 @@ MultiParticleContainer::PushP (int lev, Real dt, } } +std::unique_ptr +MultiParticleContainer::GetZeroChargeDensity (const int lev) +{ + WarpX& warpx = WarpX::GetInstance(); + + BoxArray ba = warpx.boxArray(lev); + DistributionMapping dmap = warpx.DistributionMap(lev); + const int ng_rho = warpx.get_ng_depos_rho().max(); + + auto zero_rho = std::make_unique(amrex::convert(ba,IntVect::TheNodeVector()), + dmap,WarpX::ncomps,ng_rho); + zero_rho->setVal(amrex::Real(0.0)); + return zero_rho; +} + std::unique_ptr MultiParticleContainer::GetChargeDensity (int lev, bool local) { - std::unique_ptr rho = allcontainers[0]->GetChargeDensity(lev, true); - for (unsigned i = 1, n = allcontainers.size(); i < n; ++i) { - std::unique_ptr rhoi = allcontainers[i]->GetChargeDensity(lev, true); - MultiFab::Add(*rho, *rhoi, 0, 0, rho->nComp(), rho->nGrow()); + if (allcontainers.size() == 0) + { + std::unique_ptr rho = GetZeroChargeDensity(lev); + return rho; } - if (!local) { - const Geometry& gm = allcontainers[0]->Geom(lev); - rho->SumBoundary(gm.periodicity()); + else + { + std::unique_ptr rho = allcontainers[0]->GetChargeDensity(lev, true); + for (unsigned i = 1, n = allcontainers.size(); i < n; ++i) { + std::unique_ptr rhoi = allcontainers[i]->GetChargeDensity(lev, true); + MultiFab::Add(*rho, *rhoi, 0, 0, rho->nComp(), rho->nGrow()); + } + if (!local) { + const Geometry& gm = allcontainers[0]->Geom(lev); + rho->SumBoundary(gm.periodicity()); + } + return rho; } - return rho; } void @@ -406,19 +429,36 @@ MultiParticleContainer::ApplyBoundaryConditions () } } +Vector +MultiParticleContainer::GetZeroParticlesInGrid (const int lev) const +{ + WarpX& warpx = WarpX::GetInstance(); + const int num_boxes = warpx.boxArray(lev).size(); + const Vector r(num_boxes, 0); + return r; +} + Vector MultiParticleContainer::NumberOfParticlesInGrid (int lev) const { - const bool only_valid=true, only_local=true; - Vector r = allcontainers[0]->NumberOfParticlesInGrid(lev,only_valid,only_local); - for (unsigned i = 1, n = allcontainers.size(); i < n; ++i) { - const auto& ri = allcontainers[i]->NumberOfParticlesInGrid(lev,only_valid,only_local); - for (unsigned j=0, m=ri.size(); j r = GetZeroParticlesInGrid(lev); + return r; + } + else + { + const bool only_valid=true, only_local=true; + Vector r = allcontainers[0]->NumberOfParticlesInGrid(lev,only_valid,only_local); + for (unsigned i = 1, n = allcontainers.size(); i < n; ++i) { + const auto& ri = allcontainers[i]->NumberOfParticlesInGrid(lev,only_valid,only_local); + for (unsigned j=0, m=ri.size(); j