aboutsummaryrefslogtreecommitdiff
path: root/Source/ParticleContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ParticleContainer.cpp')
-rw-r--r--Source/ParticleContainer.cpp109
1 files changed, 78 insertions, 31 deletions
diff --git a/Source/ParticleContainer.cpp b/Source/ParticleContainer.cpp
index eeed71fce..39119e960 100644
--- a/Source/ParticleContainer.cpp
+++ b/Source/ParticleContainer.cpp
@@ -23,6 +23,7 @@ MultiParticleContainer::MultiParticleContainer (AmrCore* amr_core)
else if (species_types[i] == PCTypes::RigidInjected) {
allcontainers[i].reset(new RigidInjectedParticleContainer(amr_core, i, species_names[i]));
}
+ allcontainers[i]->deposit_on_main_grid = deposit_on_main_grid[i];
}
if (WarpX::use_laser) {
allcontainers[n-1].reset(new LaserParticleContainer(amr_core,n-1));
@@ -44,6 +45,16 @@ MultiParticleContainer::ReadParameters ()
pp.getarr("species_names", species_names);
BL_ASSERT(species_names.size() == nspecies);
+ deposit_on_main_grid.resize(nspecies, 0);
+ std::vector<std::string> tmp;
+ pp.queryarr("deposit_on_main_grid", tmp);
+ for (auto const& name : tmp) {
+ auto it = std::find(species_names.begin(), species_names.end(), name);
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(it != species_names.end(), "ERROR: species in particles.deposit_on_main_grid must be part of particles.species_names");
+ int i = std::distance(species_names.begin(), it);
+ deposit_on_main_grid[i] = 1;
+ }
+
species_types.resize(nspecies, PCTypes::Physical);
std::vector<std::string> rigid_injected_species;
@@ -115,6 +126,30 @@ MultiParticleContainer::EvolveES (const Vector<std::array<std::unique_ptr<MultiF
}
void
+MultiParticleContainer::Evolve (int lev,
+ const MultiFab& Ex, const MultiFab& Ey, const MultiFab& Ez,
+ const MultiFab& Bx, const MultiFab& By, const MultiFab& Bz,
+ MultiFab& jx, MultiFab& jy, MultiFab& jz,
+ MultiFab* cjx, MultiFab* cjy, MultiFab* cjz,
+ MultiFab* rho,
+ const MultiFab* cEx, const MultiFab* cEy, const MultiFab* cEz,
+ const MultiFab* cBx, const MultiFab* cBy, const MultiFab* cBz,
+ Real t, Real dt)
+{
+ jx.setVal(0.0);
+ jy.setVal(0.0);
+ jz.setVal(0.0);
+ if (cjx) cjx->setVal(0.0);
+ if (cjy) cjy->setVal(0.0);
+ if (cjz) cjz->setVal(0.0);
+ if (rho) rho->setVal(0.0);
+ for (auto& pc : allcontainers) {
+ pc->Evolve(lev, Ex, Ey, Ez, Bx, By, Bz, jx, jy, jz, cjx, cjy, cjz,
+ rho, cEx, cEy, cEz, cBx, cBy, cBz, t, dt);
+ }
+}
+
+void
MultiParticleContainer::PushXES (Real dt)
{
for (auto& pc : allcontainers) {
@@ -172,14 +207,23 @@ MultiParticleContainer::Evolve (int lev,
const MultiFab& Ex, const MultiFab& Ey, const MultiFab& Ez,
const MultiFab& Bx, const MultiFab& By, const MultiFab& Bz,
MultiFab& jx, MultiFab& jy, MultiFab& jz,
- MultiFab* rho, Real t, Real dt)
+ MultiFab* cjx, MultiFab* cjy, MultiFab* cjz,
+ MultiFab* rho, MultiFab* crho,
+ const MultiFab* cEx, const MultiFab* cEy, const MultiFab* cEz,
+ const MultiFab* cBx, const MultiFab* cBy, const MultiFab* cBz,
+ Real t, Real dt)
{
jx.setVal(0.0);
jy.setVal(0.0);
jz.setVal(0.0);
+ if (cjx) cjx->setVal(0.0);
+ if (cjy) cjy->setVal(0.0);
+ if (cjz) cjz->setVal(0.0);
if (rho) rho->setVal(0.0);
+ if (crho) crho->setVal(0.0);
for (auto& pc : allcontainers) {
- pc->Evolve(lev, Ex, Ey, Ez, Bx, By, Bz, jx, jy, jz, rho, t, dt);
+ pc->Evolve(lev, Ex, Ey, Ez, Bx, By, Bz, jx, jy, jz, cjx, cjy, cjz,
+ rho, crho, cEx, cEy, cEz, cBx, cBy, cBz, t, dt);
}
}
@@ -296,36 +340,39 @@ MultiParticleContainer
WarpXParticleContainer* pc = allcontainers[i].get();
WarpXParticleContainer::DiagnosticParticles diagnostic_particles;
pc->GetParticleSlice(direction, z_old, z_new, t_boost, t_lab, dt, diagnostic_particles);
-
- for (auto it = diagnostic_particles.begin(); it != diagnostic_particles.end(); ++it)
- {
- parts[i].GetRealData(DiagIdx::w).insert( parts[i].GetRealData(DiagIdx::w ).end(),
- it->second.GetRealData(DiagIdx::w ).begin(),
- it->second.GetRealData(DiagIdx::w ).end());
-
- parts[i].GetRealData(DiagIdx::x).insert( parts[i].GetRealData(DiagIdx::x ).end(),
- it->second.GetRealData(DiagIdx::x ).begin(),
- it->second.GetRealData(DiagIdx::x ).end());
-
- parts[i].GetRealData(DiagIdx::y).insert( parts[i].GetRealData(DiagIdx::y ).end(),
- it->second.GetRealData(DiagIdx::y ).begin(),
- it->second.GetRealData(DiagIdx::y ).end());
- parts[i].GetRealData(DiagIdx::z).insert( parts[i].GetRealData(DiagIdx::z ).end(),
- it->second.GetRealData(DiagIdx::z ).begin(),
- it->second.GetRealData(DiagIdx::z ).end());
-
- parts[i].GetRealData(DiagIdx::ux).insert( parts[i].GetRealData(DiagIdx::ux).end(),
- it->second.GetRealData(DiagIdx::ux).begin(),
- it->second.GetRealData(DiagIdx::ux).end());
-
- parts[i].GetRealData(DiagIdx::uy).insert( parts[i].GetRealData(DiagIdx::uy).end(),
- it->second.GetRealData(DiagIdx::uy).begin(),
- it->second.GetRealData(DiagIdx::uy).end());
-
- parts[i].GetRealData(DiagIdx::uz).insert( parts[i].GetRealData(DiagIdx::uz).end(),
- it->second.GetRealData(DiagIdx::uz).begin(),
- it->second.GetRealData(DiagIdx::uz).end());
+ for (int lev = 0; lev <= pc->finestLevel(); ++lev)
+ {
+ for (auto it = diagnostic_particles[lev].begin(); it != diagnostic_particles[lev].end(); ++it)
+ {
+ parts[i].GetRealData(DiagIdx::w).insert( parts[i].GetRealData(DiagIdx::w ).end(),
+ it->second.GetRealData(DiagIdx::w ).begin(),
+ it->second.GetRealData(DiagIdx::w ).end());
+
+ parts[i].GetRealData(DiagIdx::x).insert( parts[i].GetRealData(DiagIdx::x ).end(),
+ it->second.GetRealData(DiagIdx::x ).begin(),
+ it->second.GetRealData(DiagIdx::x ).end());
+
+ parts[i].GetRealData(DiagIdx::y).insert( parts[i].GetRealData(DiagIdx::y ).end(),
+ it->second.GetRealData(DiagIdx::y ).begin(),
+ it->second.GetRealData(DiagIdx::y ).end());
+
+ parts[i].GetRealData(DiagIdx::z).insert( parts[i].GetRealData(DiagIdx::z ).end(),
+ it->second.GetRealData(DiagIdx::z ).begin(),
+ it->second.GetRealData(DiagIdx::z ).end());
+
+ parts[i].GetRealData(DiagIdx::ux).insert( parts[i].GetRealData(DiagIdx::ux).end(),
+ it->second.GetRealData(DiagIdx::ux).begin(),
+ it->second.GetRealData(DiagIdx::ux).end());
+
+ parts[i].GetRealData(DiagIdx::uy).insert( parts[i].GetRealData(DiagIdx::uy).end(),
+ it->second.GetRealData(DiagIdx::uy).begin(),
+ it->second.GetRealData(DiagIdx::uy).end());
+
+ parts[i].GetRealData(DiagIdx::uz).insert( parts[i].GetRealData(DiagIdx::uz).end(),
+ it->second.GetRealData(DiagIdx::uz).begin(),
+ it->second.GetRealData(DiagIdx::uz).end());
+ }
}
}
}