aboutsummaryrefslogtreecommitdiff
path: root/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp
diff options
context:
space:
mode:
authorGravatar Revathi Jambunathan <41089244+RevathiJambunathan@users.noreply.github.com> 2022-01-07 12:26:40 -0800
committerGravatar GitHub <noreply@github.com> 2022-01-07 12:26:40 -0800
commitb673c598713a8dba4e2477caecabe7a720e13045 (patch)
tree923f7d99fe192592057b2b382b7831f80da884e7 /Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp
parent518f18cbd7fa51f66c6dc7acb72b0d98bd258921 (diff)
downloadWarpX-b673c598713a8dba4e2477caecabe7a720e13045.tar.gz
WarpX-b673c598713a8dba4e2477caecabe7a720e13045.tar.zst
WarpX-b673c598713a8dba4e2477caecabe7a720e13045.zip
Particle Buffer for Backtransformed Diagnostics (#1898)
* move BTD call before Redistribute * define particle buffer, BTD particle functor, particle filter * select particles on the slice * add particle functors * add Lorentz Transform * fix conflict * add call to loretnz operator * storing Particles in buffer * This is WIP. Added particle buffers, filled them, sent them for flush with number already flushed. Does not work for multiple flushes. Crashes for OpenPMD. * trailing endif after rebase * adding print statements and not flushing particles in OPENPMD if numpart is 0 * last timestep flush is ensured at the end of evolve loop * fix bug in declaring uy uy new and computing uzp * set particle Geom, BA, and DMAP for particle flush with plotfile * set Particle BA Geom DMAP for particle buffer and no BTD transform for force flush * separate compute and pack from flush * Fix Typo: resizeable -> resizable Fixes HDF5 BTD particle output. * new class for plotfile particles for BTD * copy particle_H and DATA and Header. some WIP print statements * Merge plotfile * clean print statements * fix warning message * struct declaration in header, fix warning * doxygen comments and copyright * clean print statements * fix eol and override function warning * tile data * fix output species array size bug * fix access for particle buffer size * clean and move time-update * add cur_time update back * remove cur time update which was called twice * dont access particles flushed already for full diagnostics * cur time must be updated for RigidInjection BTD CI test to pass * temporarily move call to BTD * updating time and calling BTD before movewindow * cleanup * reset benchmarks and analysis script * clean and add comments * fix particle box array, geom, dmap * reset benchmarks for multi_J rz and ElectrostaticSphereEB_mixedBC * wip commit * wip commit * add SI conversion * abort for openpmd bp backend if species is selected. Also write particle output for BTD only if write_species is 1 * add documentation for aborting if adios is used with openpmd and add other BTD input parameters * Apply suggestions from code review commit Axel's suggestions from review Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * use bool instead of int * fix doxygen format * using h5 as backend in example test to ensure consistency with abort for particle output. * fix doxygen comment * reset benchmark again for comoving_2d_psatd galilean_2d_psatd multi_J_rz_psatd * reset benchmark for background_mcc * self-review suggestions * reset benchmarks. Update with last snapshot full info * Axel's PR suggestions Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Axel's doxygen fix Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * add comments * fix eol * improved exception handling for stringsteam * PR suggestions * Axels' suggestions from code review Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Axel's suggestions :) Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * simplify logic * suggestions from review (Axel/Reva) Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * variable name change for clarity * if num particles in tmp array is 0, return * Use new BTD inputs to set up BTD for particles in the corresponding particle container * unused var * fix logic error * speciesID undefined * separate particle and field buffer calls and initialization for BTD. Data common to both are initialized separately * rename variable so it does not ghost existing varname * add more comments * Assert that fields are on * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * redundant function definition * unused variable * unused variable zp * 1D 2D 3D definition * fix else * Apply suggestions from code review Add Prabhat's suggestion Co-authored-by: Prabhat Kumar <89051199+prkkumar@users.noreply.github.com> * missing semicolon and ignore xp yp for 1D * resetting benchmarks for boosted sims and mcc sim * temporarily changing tolerance since the relative difference for momentum_z is 3.68e-3 and the current tolerance is 2.5e-3 Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Prabhat Kumar <89051199+prkkumar@users.noreply.github.com>
Diffstat (limited to 'Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp')
-rw-r--r--Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp b/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp
index b1d2a8723..4e9fe41cb 100644
--- a/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp
+++ b/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp
@@ -4,6 +4,7 @@
#include "Particles/Filter/FilterFunctors.H"
#include "Particles/WarpXParticleContainer.H"
#include "Particles/ParticleBuffer.H"
+#include "Particles/PinnedMemoryParticleContainer.H"
#include "Utils/Interpolate.H"
#include "Utils/WarpXProfilerWrapper.H"
#include "WarpX.H"
@@ -58,8 +59,8 @@ FlushFormatPlotfile::WriteToFile (
const amrex::Vector<ParticleDiag>& particle_diags, int nlev,
const std::string prefix, int file_min_digits, bool plot_raw_fields,
bool plot_raw_fields_guards,
- bool /*isBTD*/, int /*snapshotID*/, const amrex::Geometry& /*full_BTD_snapshot*/,
- bool /*isLastBTDFlush*/) const
+ bool isBTD, int /*snapshotID*/, const amrex::Geometry& /*full_BTD_snapshot*/,
+ bool /*isLastBTDFlush*/, const amrex::Vector<int>& /* totalParticlesFlushedAlready*/) const
{
WARPX_PROFILE("FlushFormatPlotfile::WriteToFile()");
auto & warpx = WarpX::GetInstance();
@@ -82,7 +83,7 @@ FlushFormatPlotfile::WriteToFile (
WriteAllRawFields(plot_raw_fields, nlev, filename, plot_raw_fields_guards);
- WriteParticles(filename, particle_diags);
+ WriteParticles(filename, particle_diags, isBTD);
WriteJobInfo(filename);
@@ -294,13 +295,20 @@ FlushFormatPlotfile::WriteWarpXHeader(
}
void
-FlushFormatPlotfile::WriteParticles (const std::string& dir,
- const amrex::Vector<ParticleDiag>& particle_diags) const
+FlushFormatPlotfile::WriteParticles(const std::string& dir,
+ const amrex::Vector<ParticleDiag>& particle_diags,
+ bool isBTD) const
{
for (unsigned i = 0, n = particle_diags.size(); i < n; ++i) {
WarpXParticleContainer* pc = particle_diags[i].getParticleContainer();
auto tmp = ParticleBuffer::getTmpPC<amrex::PinnedArenaAllocator>(pc);
+ if (isBTD) {
+ PinnedMemoryParticleContainer* pinned_pc = particle_diags[i].getPinnedParticleContainer();
+ tmp.SetParticleGeometry(0,pinned_pc->Geom(0));
+ tmp.SetParticleBoxArray(0,pinned_pc->ParticleBoxArray(0));
+ tmp.SetParticleDistributionMap(0, pinned_pc->ParticleDistributionMap(0));
+ }
Vector<std::string> real_names;
Vector<std::string> int_names;
@@ -348,15 +356,19 @@ FlushFormatPlotfile::WriteParticles (const std::string& dir,
GeometryFilter const geometry_filter(particle_diags[i].m_do_geom_filter,
particle_diags[i].m_diag_domain);
- using SrcData = WarpXParticleContainer::ParticleTileType::ConstParticleTileDataType;
- tmp.copyParticles(*pc,
- [=] AMREX_GPU_HOST_DEVICE (const SrcData& src, int ip, const amrex::RandomEngine& engine)
- {
- const SuperParticleType& p = src.getSuperParticle(ip);
- return random_filter(p, engine) * uniform_filter(p, engine)
- * parser_filter(p, engine) * geometry_filter(p, engine);
- }, true);
-
+ if (!isBTD) {
+ using SrcData = WarpXParticleContainer::ParticleTileType::ConstParticleTileDataType;
+ tmp.copyParticles(*pc,
+ [=] AMREX_GPU_HOST_DEVICE (const SrcData& src, int ip, const amrex::RandomEngine& engine)
+ {
+ const SuperParticleType& p = src.getSuperParticle(ip);
+ return random_filter(p, engine) * uniform_filter(p, engine)
+ * parser_filter(p, engine) * geometry_filter(p, engine);
+ }, true);
+ } else {
+ PinnedMemoryParticleContainer* pinned_pc = particle_diags[i].getPinnedParticleContainer();
+ tmp.copyParticles(*pinned_pc);
+ }
// real_names contains a list of all particle attributes.
// real_flags & int_flags are 1 or 0, whether quantity is dumped or not.
tmp.WritePlotFile(