aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Particles/MultiParticleContainer.H17
-rw-r--r--Source/Particles/MultiParticleContainer.cpp72
2 files changed, 73 insertions, 16 deletions
diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H
index 4a515acf8..ed6c277fe 100644
--- a/Source/Particles/MultiParticleContainer.H
+++ b/Source/Particles/MultiParticleContainer.H
@@ -112,6 +112,14 @@ public:
const amrex::MultiFab& Ex, const amrex::MultiFab& Ey, const amrex::MultiFab& Ez,
const amrex::MultiFab& Bx, const amrex::MultiFab& By, const amrex::MultiFab& Bz);
+ /**
+ * \brief This returns a MultiFAB filled with zeros. It is used to return the charge density
+ * when there is no particle species.
+ *
+ * @param[in] lev the index of the refinement level.
+ */
+ std::unique_ptr<amrex::MultiFab> GetZeroChargeDensity(const int lev);
+
///
/// This deposits the particle charge onto a node-centered MultiFab and returns a unique ptr
/// to it. The charge density is accumulated over all the particles in the MultiParticleContainer
@@ -160,6 +168,15 @@ public:
* of the whole simulation BC. */
void ApplyBoundaryConditions ();
+ /**
+ * \brief This returns a vector filled with zeros whose size is the number of boxes in the
+ * simulation boxarray. It is used to return the number of particles in each grid when there is
+ * no particle species.
+ *
+ * @param[in] lev the index of the refinement level.
+ */
+ amrex::Vector<long> GetZeroParticlesInGrid(const int lev) const;
+
amrex::Vector<long> NumberOfParticlesInGrid(int lev) const;
void Increment (amrex::MultiFab& mf, int lev);
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