aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/PhysicalParticleContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/PhysicalParticleContainer.cpp')
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp45
1 files changed, 40 insertions, 5 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index a1d4e1319..8ef4c13a9 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -82,6 +82,40 @@ PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core, int isp
pp.query("do_splitting", do_splitting);
pp.query("split_type", split_type);
pp.query("do_continuous_injection", do_continuous_injection);
+ // Whether to plot back-transformed (lab-frame) diagnostics
+ // for this species.
+ pp.query("do_boosted_frame_diags", do_boosted_frame_diags);
+
+ pp.query("plot_species", plot_species);
+ int do_user_plot_vars;
+ do_user_plot_vars = pp.queryarr("plot_vars", plot_vars);
+ if (not do_user_plot_vars){
+ // By default, all particle variables are dumped to plotfiles,
+ // including {x,y,z,ux,uy,uz}old variables when running in a
+ // boosted frame
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags){
+ plot_flags.resize(PIdx::nattribs + 6, 1);
+ } else {
+ plot_flags.resize(PIdx::nattribs, 1);
+ }
+ } else {
+ // Set plot_flag to 0 for all attribs
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags){
+ plot_flags.resize(PIdx::nattribs + 6, 0);
+ } else {
+ plot_flags.resize(PIdx::nattribs, 0);
+ }
+ // If not none, set plot_flags values to 1 for elements in plot_vars.
+ if (plot_vars[0] != "none"){
+ for (const auto& var : plot_vars){
+ // Return error if var not in PIdx.
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ ParticleStringNames::to_index.count(var),
+ "plot_vars argument not in ParticleStringNames");
+ plot_flags[ParticleStringNames::to_index.at(var)] = 1;
+ }
+ }
+ }
}
PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core)
@@ -185,7 +219,7 @@ PhysicalParticleContainer::AddGaussianBeam(Real x_m, Real y_m, Real z_m,
attribs[PIdx::uz] = u[2];
attribs[PIdx::w ] = weight;
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
auto& particle_tile = DefineAndReturnParticleTile(0, 0, 0);
particle_tile.push_back_real(particle_comps["xold"], x);
@@ -469,7 +503,7 @@ PhysicalParticleContainer::AddPlasmaCPU (int lev, RealBox part_realbox)
attribs[PIdx::uy] = u[1];
attribs[PIdx::uz] = u[2];
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
auto& particle_tile = DefineAndReturnParticleTile(lev, grid_id, tile_id);
particle_tile.push_back_real(particle_comps["xold"], x);
@@ -711,7 +745,7 @@ PhysicalParticleContainer::AddPlasmaGPU (int lev, RealBox part_realbox)
attribs[PIdx::uz] = u[2];
// note - this will be slow on the GPU, need to revisit
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
auto& particle_tile = DefineAndReturnParticleTile(lev, grid_id, tile_id);
particle_tile.push_back_real(particle_comps["xold"], x);
@@ -801,7 +835,6 @@ FieldGatherES (const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,
const auto& particles = pti.GetArrayOfStructs();
int nstride = particles.dataShape().first;
const long np = pti.numParticles();
-
auto& attribs = pti.GetAttribs();
auto& Exp = attribs[PIdx::Ex];
auto& Eyp = attribs[PIdx::Ey];
@@ -1686,7 +1719,7 @@ PhysicalParticleContainer::PushPX(WarpXParIter& pti,
auto& Bzp = attribs[PIdx::Bz];
const long np = pti.numParticles();
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
auto& xpold = pti.GetAttribs(particle_comps["xold"]);
auto& ypold = pti.GetAttribs(particle_comps["yold"]);
@@ -1831,6 +1864,8 @@ void PhysicalParticleContainer::GetParticleSlice(const int direction, const Real
// Note the the slice should always move in the negative boost direction.
AMREX_ALWAYS_ASSERT(z_new < z_old);
+ AMREX_ALWAYS_ASSERT(do_boosted_frame_diags == 1);
+
const int nlevs = std::max(0, finestLevel()+1);
// we figure out a box for coarse-grained rejection. If the RealBox corresponding to a