diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Particles/MultiParticleContainer.H | 17 | ||||
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 72 |
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 |