aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Diagnostics/BoostedFrameDiagnostic.H4
-rw-r--r--Source/Diagnostics/BoostedFrameDiagnostic.cpp25
-rw-r--r--Source/Particles/MultiParticleContainer.H5
-rw-r--r--Source/Particles/MultiParticleContainer.cpp36
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp15
-rw-r--r--Source/Particles/RigidInjectedParticleContainer.cpp2
-rw-r--r--Source/Particles/WarpXParticleContainer.H8
-rw-r--r--Source/Particles/WarpXParticleContainer.cpp6
-rw-r--r--Source/WarpX.cpp8
9 files changed, 84 insertions, 25 deletions
diff --git a/Source/Diagnostics/BoostedFrameDiagnostic.H b/Source/Diagnostics/BoostedFrameDiagnostic.H
index e35d307a6..ef4bd2ec1 100644
--- a/Source/Diagnostics/BoostedFrameDiagnostic.H
+++ b/Source/Diagnostics/BoostedFrameDiagnostic.H
@@ -75,6 +75,10 @@ class BoostedFrameDiagnostic {
int boost_direction_;
amrex::Vector<std::unique_ptr<amrex::MultiFab> > data_buffer_;
+ // particles_buffer_ is current blind to refinement level.
+ // particles_buffer_[i][j] is a WarpXParticleContainer::DiagnosticParticleData where
+ // - i is the back-transformed snapshot number
+ // - j is the species number
amrex::Vector<amrex::Vector<WarpXParticleContainer::DiagnosticParticleData> > particles_buffer_;
int num_buffer_ = 256;
int max_box_size_ = 256;
diff --git a/Source/Diagnostics/BoostedFrameDiagnostic.cpp b/Source/Diagnostics/BoostedFrameDiagnostic.cpp
index 13972075d..5d85fc8f8 100644
--- a/Source/Diagnostics/BoostedFrameDiagnostic.cpp
+++ b/Source/Diagnostics/BoostedFrameDiagnostic.cpp
@@ -540,13 +540,14 @@ void BoostedFrameDiagnostic::Flush(const Geometry& geom)
if (WarpX::do_boosted_frame_particles) {
for (int j = 0; j < mypc.nSpecies(); ++j) {
+ std::string species_name = species_names[mypc.map_species_lab_diags[j]];
#ifdef WARPX_USE_HDF5
writeParticleDataHDF5(particles_buffer_[i][j],
snapshots_[i].file_name,
- species_names[j]);
+ species_name);
#else
std::stringstream part_ss;
- part_ss << snapshots_[i].file_name + "/" + species_names[j] + "/";
+ part_ss << snapshots_[i].file_name + "/" + species_name + "/";
writeParticleData(particles_buffer_[i][j], part_ss.str(), i_lab);
#endif
}
@@ -600,7 +601,7 @@ writeLabFrameData(const MultiFab* cell_centered_data,
DistributionMapping buff_dm(buff_ba);
data_buffer_[i].reset( new MultiFab(buff_ba, buff_dm, ncomp, 0) );
}
- if (WarpX::do_boosted_frame_particles) particles_buffer_[i].resize(mypc.nSpecies());
+ if (WarpX::do_boosted_frame_particles) particles_buffer_[i].resize(mypc.nspecies_lab_frame_diags);
}
if (WarpX::do_boosted_frame_fields) {
@@ -666,14 +667,15 @@ writeLabFrameData(const MultiFab* cell_centered_data,
}
if (WarpX::do_boosted_frame_particles) {
- for (int j = 0; j < mypc.nSpecies(); ++j) {
+ for (int j = 0; j < mypc.nspecies_lab_frame_diags; ++j) {
+ const std::string species_name = species_names[mypc.map_species_lab_diags[j]];
#ifdef WARPX_USE_HDF5
writeParticleDataHDF5(particles_buffer_[i][j],
snapshots_[i].file_name,
- species_names[j]);
+ species_name);
#else
std::stringstream part_ss;
- part_ss << snapshots_[i].file_name + "/" + species_names[j] + "/";
+ part_ss << snapshots_[i].file_name + "/" + species_name + "/";
writeParticleData(particles_buffer_[i][j], part_ss.str(), i_lab);
#endif
}
@@ -855,16 +857,16 @@ LabSnapShot(Real t_lab_in, Real t_boost, Real zmin_lab_in,
ParallelDescriptor::Barrier();
- if (WarpX::do_boosted_frame_particles)
- {
+ if (WarpX::do_boosted_frame_particles){
auto & mypc = WarpX::GetInstance().GetPartContainer();
const std::vector<std::string> species_names = mypc.GetSpeciesNames();
for (int j = 0; j < mypc.nSpecies(); ++j)
{
- output_create_species_group(file_name, species_names[j]);
+ std::string species_name = species_names[mypc.map_species_lab_diags[j]];
+ output_create_species_group(file_name, species_name);
for (int k = 0; k < static_cast<int>(particle_field_names.size()); ++k)
{
- std::string field_path = species_names[j] + "/" + particle_field_names[k];
+ std::string field_path = species_name + "/" + particle_field_names[k];
output_create_particle_field(file_name, field_path);
}
}
@@ -888,7 +890,8 @@ LabSnapShot(Real t_lab_in, Real t_boost, Real zmin_lab_in,
const std::string particles_prefix = "particle";
for(int i = 0; i < nspecies; ++i) {
- const std::string fullpath = file_name + "/" + species_names[i];
+ std::string species_name = species_names[mypc.map_species_lab_diags[i]];
+ const std::string fullpath = file_name + "/" + species_name;
if (!UtilCreateDirectory(fullpath, 0755))
CreateDirectoryFailed(fullpath);
}
diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H
index 9291e0358..5a79443d0 100644
--- a/Source/Particles/MultiParticleContainer.H
+++ b/Source/Particles/MultiParticleContainer.H
@@ -153,6 +153,8 @@ public:
void SetParticleBoxArray (int lev, amrex::BoxArray& new_ba);
void SetParticleDistributionMap (int lev, amrex::DistributionMapping& new_dm);
+ void setSpeciesLabFrameDiags() const;
+
int nSpecies() const {return nspecies;}
int nSpeciesDepositOnMainGrid () const {
@@ -184,6 +186,9 @@ public:
// Number of coefficients for the stencil of the NCI corrector.
// The stencil is applied in the z direction only.
static constexpr int nstencilz_fdtd_nci_corr=5;
+ int nspecies_lab_frame_diags = 0;
+ std::vector<int> map_species_lab_diags;
+ int do_boosted_frame_diags = 0;
amrex::Vector<amrex::Array<amrex::Real, nstencilz_fdtd_nci_corr> > fdtd_nci_stencilz_ex;
amrex::Vector<amrex::Array<amrex::Real, nstencilz_fdtd_nci_corr> > fdtd_nci_stencilz_by;
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index 440906348..bde8d244e 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -31,7 +31,21 @@ MultiParticleContainer::MultiParticleContainer (AmrCore* amr_core)
pc_tmp.reset(new PhysicalParticleContainer(amr_core));
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ // Compute the number of species for which mab frame data is dumped
+ // nspecies_lab_frame_diags, and map their ID to MultiParticleContainer
+ // particle IDs in map_species_lab_diags.
+ map_species_lab_diags.resize(nspecies);
+ nspecies_lab_frame_diags = 0;
+ for (int i=0; i<nspecies; i++){
+ auto& pc = allcontainers[i];
+ if (pc->do_boosted_frame_diags){
+ map_species_lab_diags[nspecies_lab_frame_diags] = i;
+ nspecies_lab_frame_diags += 1;
+ do_boosted_frame_diags = 1;
+ }
+ }
+
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
for (int i = 0; i < nspecies + nlasers; ++i)
{
@@ -376,13 +390,24 @@ MultiParticleContainer
BL_PROFILE("MultiParticleContainer::GetLabFrameData");
+ // Loop over particle species
for (int i = 0; i < nspecies; ++i){
WarpXParticleContainer* pc = allcontainers[i].get();
WarpXParticleContainer::DiagnosticParticles diagnostic_particles;
pc->GetParticleSlice(direction, z_old, z_new, t_boost, t_lab, dt, diagnostic_particles);
-
+ // Here, diagnostic_particles[lev][index] is a WarpXParticleContainer::DiagnosticParticleData
+ // where "lev" is the AMR level and "index" is a [grid index][tile index] pair.
+
+ // Loop over AMR levels
for (int lev = 0; lev <= pc->finestLevel(); ++lev){
+ // Loop over [grid index][tile index] pairs
+ // and Fills parts[species number i] with particle data from all grids and
+ // tiles in diagnostic_particles. parts contains particles from all
+ // AMR levels indistinctly.
for (auto it = diagnostic_particles[lev].begin(); it != diagnostic_particles[lev].end(); ++it){
+ // it->first is the [grid index][tile index] key
+ // it->second is the corresponding
+ // WarpXParticleContainer::DiagnosticParticleData value
parts[i].GetRealData(DiagIdx::w).insert( parts[i].GetRealData(DiagIdx::w ).end(),
it->second.GetRealData(DiagIdx::w ).begin(),
it->second.GetRealData(DiagIdx::w ).end());
@@ -459,3 +484,10 @@ MultiParticleContainer::doContinuousInjection() const
}
return warpx_do_continuous_injection;
}
+
+// Set number of species for which lab frame data is dumped
+// and maps their ID to MultiParticleContainer IDs.
+//void
+//MultiParticleContainer::setSpeciesLabFrameDiags() const
+//{
+//}
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index b3c598c22..d99cc9c66 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -82,6 +82,9 @@ 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;
@@ -90,14 +93,14 @@ PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core, int isp
// 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 && WarpX::do_boosted_frame_particles){
+ 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 && WarpX::do_boosted_frame_particles){
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags){
plot_flags.resize(PIdx::nattribs + 6, 0);
} else {
plot_flags.resize(PIdx::nattribs, 0);
@@ -216,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);
@@ -500,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);
@@ -742,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);
@@ -1715,7 +1718,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"]);
diff --git a/Source/Particles/RigidInjectedParticleContainer.cpp b/Source/Particles/RigidInjectedParticleContainer.cpp
index a5acca281..fd1b2dfb5 100644
--- a/Source/Particles/RigidInjectedParticleContainer.cpp
+++ b/Source/Particles/RigidInjectedParticleContainer.cpp
@@ -225,7 +225,7 @@ RigidInjectedParticleContainer::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"]);
diff --git a/Source/Particles/WarpXParticleContainer.H b/Source/Particles/WarpXParticleContainer.H
index 51dc5ec05..600061e8d 100644
--- a/Source/Particles/WarpXParticleContainer.H
+++ b/Source/Particles/WarpXParticleContainer.H
@@ -85,7 +85,13 @@ class WarpXParticleContainer
public:
friend MultiParticleContainer;
+ // amrex::StructOfArrays with DiagIdx::nattribs amrex::Real components
+ // for the particle data and 0 int components.
using DiagnosticParticleData = amrex::StructOfArrays<DiagIdx::nattribs, 0>;
+ // DiagnosticParticles is a vector, with one element per MR level.
+ // DiagnosticParticles[lev] is typically a key-value pair where the key is
+ // a pair [grid_index, tile_index], and the value is the corresponding
+ // DiagnosticParticleData (see above) on this tile.
using DiagnosticParticles = amrex::Vector<std::map<std::pair<int, int>, DiagnosticParticleData> >;
WarpXParticleContainer (amrex::AmrCore* amr_core, int ispecies);
@@ -265,6 +271,8 @@ protected:
// support all features allowed by direct injection.
int do_continuous_injection = 0;
+ int do_boosted_frame_diags = 0;
+
amrex::Vector<amrex::FArrayBox> local_rho;
amrex::Vector<amrex::FArrayBox> local_jx;
amrex::Vector<amrex::FArrayBox> local_jy;
diff --git a/Source/Particles/WarpXParticleContainer.cpp b/Source/Particles/WarpXParticleContainer.cpp
index 1abbd747d..0cf5c10b4 100644
--- a/Source/Particles/WarpXParticleContainer.cpp
+++ b/Source/Particles/WarpXParticleContainer.cpp
@@ -78,7 +78,7 @@ WarpXParticleContainer::WarpXParticleContainer (AmrCore* amr_core, int ispecies)
particle_comps["theta"] = PIdx::theta;
#endif
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
particle_comps["xold"] = PIdx::nattribs;
particle_comps["yold"] = PIdx::nattribs+1;
@@ -231,7 +231,7 @@ WarpXParticleContainer::AddNParticles (int lev,
p.pos(1) = z[i];
#endif
- 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[i]);
@@ -249,7 +249,7 @@ WarpXParticleContainer::AddNParticles (int lev,
particle_tile.push_back_real(PIdx::uy, vy + ibegin, vy + iend);
particle_tile.push_back_real(PIdx::uz, vz + ibegin, vz + iend);
- 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["uxold"], vx + ibegin, vx + iend);
diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp
index eb84af2c7..c863e9a4c 100644
--- a/Source/WarpX.cpp
+++ b/Source/WarpX.cpp
@@ -56,9 +56,12 @@ int WarpX::num_mirrors = 0;
int WarpX::sort_int = -1;
-bool WarpX::do_boosted_frame_diagnostic = false;
int WarpX::num_snapshots_lab = std::numeric_limits<int>::lowest();
Real WarpX::dt_snapshots_lab = std::numeric_limits<Real>::lowest();
+// bool WarpX::do_boosted_frame_diagnostic = false;
+// bool WarpX::do_boosted_frame_fields = true;
+// bool WarpX::do_boosted_frame_particles = true;
+bool WarpX::do_boosted_frame_diagnostic = false;
bool WarpX::do_boosted_frame_fields = true;
bool WarpX::do_boosted_frame_particles = true;
@@ -117,7 +120,7 @@ WarpX::ResetInstance ()
{
delete m_instance;
m_instance = nullptr;
-}
+}
WarpX::WarpX ()
{
@@ -157,6 +160,7 @@ WarpX::WarpX ()
current_injection_position = geom[0].ProbLo(moving_window_dir);
}
}
+ do_boosted_frame_particles = mypc->do_boosted_frame_diags;
Efield_aux.resize(nlevs_max);
Bfield_aux.resize(nlevs_max);