diff options
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index 4990f7c6d..b7d34ec75 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -421,6 +421,72 @@ MultiParticleContainer::GetZeroChargeDensity (const int lev) return zero_rho; } +void +MultiParticleContainer::DepositCurrent ( + amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& J, + const amrex::Real dt, const amrex::Real relative_t) +{ + // Reset the J arrays + for (int lev = 0; lev < J.size(); ++lev) + { + J[lev][0]->setVal(0.0, J[lev][0]->nGrowVect()); + J[lev][1]->setVal(0.0, J[lev][1]->nGrowVect()); + J[lev][2]->setVal(0.0, J[lev][2]->nGrowVect()); + } + + // Call the deposition kernel for each species + for (int ispecies = 0; ispecies < nSpecies(); ispecies++) + { + WarpXParticleContainer& species = GetParticleContainer(ispecies); + species.DepositCurrent(J, dt, relative_t); + } + +#ifdef WARPX_DIM_RZ + for (int lev = 0; lev < J.size(); ++lev) + { + WarpX::GetInstance().ApplyInverseVolumeScalingToCurrentDensity(J[lev][0].get(), J[lev][1].get(), J[lev][2].get(), lev); + } +#endif +} + +void +MultiParticleContainer::DepositCharge ( + amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho, + const amrex::Real relative_t, const int icomp) +{ + // Reset the rho array + for (int lev = 0; lev < rho.size(); ++lev) + { + int const nc = WarpX::ncomps; + rho[lev]->setVal(0.0, icomp*nc, nc, rho[lev]->nGrowVect()); + } + + // Push the particles in time, if needed + if (relative_t != 0.) PushX(relative_t); + + // Call the deposition kernel for each species + for (int ispecies = 0; ispecies < nSpecies(); ispecies++) + { + WarpXParticleContainer& species = GetParticleContainer(ispecies); + bool const local = true; + bool const reset = false; + bool const do_rz_volume_scaling = false; + bool const interpolate_across_levels = false; + species.DepositCharge(rho, local, reset, do_rz_volume_scaling, + interpolate_across_levels, icomp); + } + + // Push the particles back in time + if (relative_t != 0.) PushX(-relative_t); + +#ifdef WARPX_DIM_RZ + for (int lev = 0; lev < rho.size(); ++lev) + { + WarpX::GetInstance().ApplyInverseVolumeScalingToChargeDensity(rho[lev].get(), lev); + } +#endif +} + std::unique_ptr<MultiFab> MultiParticleContainer::GetChargeDensity (int lev, bool local) { |