aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar NeilZaim <49716072+NeilZaim@users.noreply.github.com> 2020-10-23 04:48:16 +0200
committerGravatar GitHub <noreply@github.com> 2020-10-22 19:48:16 -0700
commitcb199e221ae698ac13fdda691985e001ee84039b (patch)
tree0f4f84bec9ceccfcb326571a9e96aa1940cbb4c0 /Source/Particles/MultiParticleContainer.cpp
parent536c3b417666b11c7143d17cc5a7759b7af0da9c (diff)
downloadWarpX-cb199e221ae698ac13fdda691985e001ee84039b.tar.gz
WarpX-cb199e221ae698ac13fdda691985e001ee84039b.tar.zst
WarpX-cb199e221ae698ac13fdda691985e001ee84039b.zip
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 <axel.huebl@plasma.ninja>
Diffstat (limited to '')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp72
1 files changed, 56 insertions, 16 deletions
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
@@ -360,18 +360,41 @@ MultiParticleContainer::PushP (int lev, Real dt,
}
std::unique_ptr<MultiFab>
+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<MultiFab>(amrex::convert(ba,IntVect::TheNodeVector()),
+ dmap,WarpX::ncomps,ng_rho);
+ zero_rho->setVal(amrex::Real(0.0));
+ return zero_rho;
+}
+
+std::unique_ptr<MultiFab>
MultiParticleContainer::GetChargeDensity (int lev, bool local)
{
- std::unique_ptr<MultiFab> rho = allcontainers[0]->GetChargeDensity(lev, true);
- for (unsigned i = 1, n = allcontainers.size(); i < n; ++i) {
- std::unique_ptr<MultiFab> rhoi = allcontainers[i]->GetChargeDensity(lev, true);
- MultiFab::Add(*rho, *rhoi, 0, 0, rho->nComp(), rho->nGrow());
+ if (allcontainers.size() == 0)
+ {
+ std::unique_ptr<MultiFab> rho = GetZeroChargeDensity(lev);
+ return rho;
}
- if (!local) {
- const Geometry& gm = allcontainers[0]->Geom(lev);
- rho->SumBoundary(gm.periodicity());
+ else
+ {
+ std::unique_ptr<MultiFab> rho = allcontainers[0]->GetChargeDensity(lev, true);
+ for (unsigned i = 1, n = allcontainers.size(); i < n; ++i) {
+ std::unique_ptr<MultiFab> 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
@@ -407,18 +430,35 @@ MultiParticleContainer::ApplyBoundaryConditions ()
}
Vector<long>
+MultiParticleContainer::GetZeroParticlesInGrid (const int lev) const
+{
+ WarpX& warpx = WarpX::GetInstance();
+ const int num_boxes = warpx.boxArray(lev).size();
+ const Vector<Long> r(num_boxes, 0);
+ return r;
+}
+
+Vector<long>
MultiParticleContainer::NumberOfParticlesInGrid (int lev) const
{
- const bool only_valid=true, only_local=true;
- Vector<long> 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<m; ++j) {
- r[j] += ri[j];
+ if (allcontainers.size() == 0)
+ {
+ const Vector<long> r = GetZeroParticlesInGrid(lev);
+ return r;
+ }
+ else
+ {
+ const bool only_valid=true, only_local=true;
+ Vector<long> 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<m; ++j) {
+ r[j] += ri[j];
+ }
}
+ ParallelDescriptor::ReduceLongSum(r.data(),r.size());
+ return r;
}
- ParallelDescriptor::ReduceLongSum(r.data(),r.size());
- return r;
}
void