From bfde480555c14b284d6e9289efc150d07f7569a9 Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Mon, 3 Feb 2025 18:18:20 -0500 Subject: [PATCH 01/13] Added support to use adios2's flatten_step To enable it, put it in the openPMD option through input file. --- Source/Diagnostics/WarpXOpenPMD.H | 1 + Source/Diagnostics/WarpXOpenPMD.cpp | 39 +++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.H b/Source/Diagnostics/WarpXOpenPMD.H index 99d6e0682ab..dfb6fb9a411 100644 --- a/Source/Diagnostics/WarpXOpenPMD.H +++ b/Source/Diagnostics/WarpXOpenPMD.H @@ -176,6 +176,7 @@ private: } } + void flushCurrent(bool isBTD) const; /** This function does initial setup for the fields when interation is newly created * @param[in] meshes The meshes in a series diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 2fac8ede452..da902d2af43 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -391,6 +391,7 @@ WarpXOpenPMDPlot::WarpXOpenPMDPlot ( { m_OpenPMDoptions = detail::getSeriesOptions(operator_type, operator_parameters, engine_type, engine_parameters); + amrex::Print()<<".... openPMD options used: "<flush(); ## NOTE flush only flushes if data is dirty. When the underlying function is collective + // ## like PDW, there will be traouble. + // the change will be use PDW when not BTD, and Put if BTD to avoid slowing down due to multiple writes of small data + openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); + if (isBTD) + currIteration.seriesFlush( "adios2.engine.preferred_flush_target = \"buffer\"" ); + else + currIteration.seriesFlush(); +} + std::string WarpXOpenPMDPlot::GetFileName (std::string& filepath) { @@ -532,7 +548,6 @@ WarpXOpenPMDPlot::WriteOpenPMDParticles (const amrex::Vector& part WARPX_PROFILE("WarpXOpenPMDPlot::WriteOpenPMDParticles()"); for (const auto & particle_diag : particle_diags) { - WarpXParticleContainer* pc = particle_diag.getParticleContainer(); PinnedMemoryParticleContainer* pinned_pc = particle_diag.getPinnedParticleContainer(); if (isBTD || use_pinned_pc) { @@ -642,6 +657,16 @@ for (const auto & particle_diag : particle_diags) { pc->getCharge(), pc->getMass(), isBTD, isLastBTDFlush); } + + auto hasOption=m_OpenPMDoptions.find("FlattenSteps"); + bool flattenSteps = isBTD && (m_Series->backend() == "ADIOS2") && (hasOption != std::string::npos); + + if ( flattenSteps) + { + // forcing new step so data from each btd batch can be flushed out + openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); + currIteration.seriesFlush(R"(adios2.engine.preferred_flush_target = "new_step")"); + } } void @@ -658,6 +683,7 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, const bool isLastBTDFlush ) { + WARPX_PROFILE("WarpXOpenPMDPlot::DumpToFile()"); WARPX_ALWAYS_ASSERT_WITH_MESSAGE(m_Series != nullptr, "openPMD: series must be initialized"); AMREX_ALWAYS_ASSERT(write_real_comp.size() == pc->NumRealComps()); @@ -716,8 +742,7 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, SetConstParticleRecordsEDPIC(currSpecies, positionComponents, NewParticleVectorSize, charge, mass); } - // open files from all processors, in case some will not contribute below - m_Series->flush(); + flushCurrent(isBTD); // dump individual particles bool contributed_particles = false; // did the local MPI rank contribute particles? @@ -758,6 +783,7 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, // BP4 (ADIOS 2.8): last MPI rank's `Put` meta-data wins // BP5 (ADIOS 2.8): everyone has to write an empty block if (is_resizing_flush && !contributed_particles && isBTD && m_Series->backend() == "ADIOS2") { + WARPX_PROFILE("WarpXOpenPMDPlot::ResizeInADIOS()"); for( auto & [record_name, record] : currSpecies ) { for( auto & [comp_name, comp] : record ) { if (comp.constant()) { continue; } @@ -797,7 +823,8 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, } } - m_Series->flush(); + //m_Series->flush(); + flushCurrent(isBTD); } void @@ -1469,7 +1496,8 @@ WarpXOpenPMDPlot::WriteOpenPMDFieldsAll ( //const std::string& filename, amrex::Gpu::streamSynchronize(); #endif // Flush data to disk after looping over all components - m_Series->flush(); + //m_Series->flush(); + flushCurrent(isBTD); } // levels loop (i) } #endif // WARPX_USE_OPENPMD @@ -1483,6 +1511,7 @@ WarpXParticleCounter::WarpXParticleCounter (ParticleContainer* pc): m_MPIRank{amrex::ParallelDescriptor::MyProc()}, m_MPISize{amrex::ParallelDescriptor::NProcs()} { + WARPX_PROFILE("WarpXOpenPMDPlot::ParticleCounter()"); m_ParticleCounterByLevel.resize(pc->finestLevel()+1); m_ParticleOffsetAtRank.resize(pc->finestLevel()+1); m_ParticleSizeAtRank.resize(pc->finestLevel()+1); From 070c418b200956964cbefb470d42ecea368e501a Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Wed, 5 Feb 2025 09:53:09 -0800 Subject: [PATCH 02/13] Update Source/Diagnostics/WarpXOpenPMD.cpp Added braces for the if/else loop via Luca Fedeli Co-authored-by: Luca Fedeli --- Source/Diagnostics/WarpXOpenPMD.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index da902d2af43..1865345156d 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -412,10 +412,12 @@ void WarpXOpenPMDPlot::flushCurrent(bool isBTD) const // ## like PDW, there will be traouble. // the change will be use PDW when not BTD, and Put if BTD to avoid slowing down due to multiple writes of small data openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); - if (isBTD) + if (isBTD) { currIteration.seriesFlush( "adios2.engine.preferred_flush_target = \"buffer\"" ); - else + } + else { currIteration.seriesFlush(); + } } std::string From abef7424bcc7be68b38088d713b90dba5670d302 Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Wed, 5 Feb 2025 09:54:19 -0800 Subject: [PATCH 03/13] Update Source/Diagnostics/WarpXOpenPMD.cpp added const to bool variable via Luca Fedeli Co-authored-by: Luca Fedeli --- Source/Diagnostics/WarpXOpenPMD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 1865345156d..b6c1acea009 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -661,7 +661,7 @@ for (const auto & particle_diag : particle_diags) { } auto hasOption=m_OpenPMDoptions.find("FlattenSteps"); - bool flattenSteps = isBTD && (m_Series->backend() == "ADIOS2") && (hasOption != std::string::npos); + const bool flattenSteps = isBTD && (m_Series->backend() == "ADIOS2") && (hasOption != std::string::npos); if ( flattenSteps) { From 09ab7617bd21634bc16c9a28ad57420a565f23cb Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Wed, 5 Feb 2025 09:54:52 -0800 Subject: [PATCH 04/13] Update Source/Diagnostics/WarpXOpenPMD.cpp eliminate extra space Co-authored-by: Luca Fedeli --- Source/Diagnostics/WarpXOpenPMD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index b6c1acea009..3e0877b9fc7 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -663,7 +663,7 @@ for (const auto & particle_diag : particle_diags) { auto hasOption=m_OpenPMDoptions.find("FlattenSteps"); const bool flattenSteps = isBTD && (m_Series->backend() == "ADIOS2") && (hasOption != std::string::npos); - if ( flattenSteps) + if (flattenSteps) { // forcing new step so data from each btd batch can be flushed out openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); From b9bcd19342c730c4bab0adcdc3704feb0f386751 Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Wed, 5 Feb 2025 10:09:44 -0800 Subject: [PATCH 05/13] Update Source/Diagnostics/WarpXOpenPMD.cpp remove commented line via Luca Fedeli Co-authored-by: Luca Fedeli --- Source/Diagnostics/WarpXOpenPMD.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 3e0877b9fc7..36e40be6fd0 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -825,7 +825,6 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, } } - //m_Series->flush(); flushCurrent(isBTD); } From 2f3601a19865aafd282090f95db7142a9ed436c9 Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Wed, 5 Feb 2025 10:10:05 -0800 Subject: [PATCH 06/13] Update Source/Diagnostics/WarpXOpenPMD.cpp Remove commented line via Luca Fedeli Co-authored-by: Luca Fedeli --- Source/Diagnostics/WarpXOpenPMD.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 36e40be6fd0..3e8b9c035fb 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -1497,7 +1497,6 @@ WarpXOpenPMDPlot::WriteOpenPMDFieldsAll ( //const std::string& filename, amrex::Gpu::streamSynchronize(); #endif // Flush data to disk after looping over all components - //m_Series->flush(); flushCurrent(isBTD); } // levels loop (i) } From 5a19bc35c0a84f924be574b10cb4efdfcf60f3ca Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Thu, 6 Feb 2025 09:55:52 -0800 Subject: [PATCH 07/13] Update Source/Diagnostics/WarpXOpenPMD.cpp typo spotted by Luca Fedeli Co-authored-by: Luca Fedeli --- Source/Diagnostics/WarpXOpenPMD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 3e8b9c035fb..a1b6ab06bb1 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -409,7 +409,7 @@ void WarpXOpenPMDPlot::flushCurrent(bool isBTD) const WARPX_PROFILE("WarpXOpenPMDPlot::flushCurrent"); // open files from all processors, in case some will not contribute below // m_Series->flush(); ## NOTE flush only flushes if data is dirty. When the underlying function is collective - // ## like PDW, there will be traouble. + // ## like PDW, there will be trouble. // the change will be use PDW when not BTD, and Put if BTD to avoid slowing down due to multiple writes of small data openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); if (isBTD) { From b3b3f6f9c41dedbc1eca6ef1868b9f6fa2aa37f3 Mon Sep 17 00:00:00 2001 From: Junmin Gu Date: Thu, 6 Feb 2025 18:29:43 -0500 Subject: [PATCH 08/13] added document for function flushCurrent() --- Source/Diagnostics/WarpXOpenPMD.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index a1b6ab06bb1..e1753c28229 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -391,7 +391,7 @@ WarpXOpenPMDPlot::WarpXOpenPMDPlot ( { m_OpenPMDoptions = detail::getSeriesOptions(operator_type, operator_parameters, engine_type, engine_parameters); - amrex::Print()<<".... openPMD options used: "<flush(); ## NOTE flush only flushes if data is dirty. When the underlying function is collective - // ## like PDW, there will be trouble. - // the change will be use PDW when not BTD, and Put if BTD to avoid slowing down due to multiple writes of small data + openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); if (isBTD) { currIteration.seriesFlush( "adios2.engine.preferred_flush_target = \"buffer\"" ); From cefdca31463645425c65d44ac34a2498e1d8c3f3 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Mon, 3 Mar 2025 10:31:13 -0800 Subject: [PATCH 09/13] Formatting & Inline Comments --- Source/Diagnostics/WarpXOpenPMD.H | 2 +- Source/Diagnostics/WarpXOpenPMD.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.H b/Source/Diagnostics/WarpXOpenPMD.H index dfb6fb9a411..0d7da9d140c 100644 --- a/Source/Diagnostics/WarpXOpenPMD.H +++ b/Source/Diagnostics/WarpXOpenPMD.H @@ -176,7 +176,7 @@ private: } } - void flushCurrent(bool isBTD) const; + void flushCurrent (bool isBTD) const; /** This function does initial setup for the fields when interation is newly created * @param[in] meshes The meshes in a series diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index e1753c28229..340d77e19ac 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -415,12 +415,14 @@ WarpXOpenPMDPlot::~WarpXOpenPMDPlot () * this causes trouble when the underlying writing function is collective (like PDW) * */ -void WarpXOpenPMDPlot::flushCurrent(bool isBTD) const +void WarpXOpenPMDPlot::flushCurrent (bool isBTD) const { WARPX_PROFILE("WarpXOpenPMDPlot::flushCurrent"); openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); if (isBTD) { + // delayed until all fields and particles are registered for flush + // and dumped once via flattenSteps currIteration.seriesFlush( "adios2.engine.preferred_flush_target = \"buffer\"" ); } else { @@ -668,12 +670,13 @@ for (const auto & particle_diag : particle_diags) { isBTD, isLastBTDFlush); } - auto hasOption=m_OpenPMDoptions.find("FlattenSteps"); + auto hasOption = m_OpenPMDoptions.find("FlattenSteps"); const bool flattenSteps = isBTD && (m_Series->backend() == "ADIOS2") && (hasOption != std::string::npos); if (flattenSteps) { - // forcing new step so data from each btd batch can be flushed out + // forcing new step so data from each btd batch in + // preferred_flush_target="buffer" can be flushed out openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); currIteration.seriesFlush(R"(adios2.engine.preferred_flush_target = "new_step")"); } From 24db3720ea6b038dbf022f63b8e6ce8706c2a6b8 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Mon, 3 Mar 2025 10:31:39 -0800 Subject: [PATCH 10/13] Remove Extra Print --- Source/Diagnostics/WarpXOpenPMD.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 340d77e19ac..f9ed9ed4269 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -391,7 +391,6 @@ WarpXOpenPMDPlot::WarpXOpenPMDPlot ( { m_OpenPMDoptions = detail::getSeriesOptions(operator_type, operator_parameters, engine_type, engine_parameters); - amrex::Print() << Utils::TextMsg::Info("openPMD options used: " + m_OpenPMDoptions); } WarpXOpenPMDPlot::~WarpXOpenPMDPlot () From 460cd2533cf622081d929c2e6f249f10008ecca1 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Mon, 3 Mar 2025 10:34:35 -0800 Subject: [PATCH 11/13] Move Doxygen to `.H` --- Source/Diagnostics/WarpXOpenPMD.H | 12 ++++++++++++ Source/Diagnostics/WarpXOpenPMD.cpp | 12 ------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.H b/Source/Diagnostics/WarpXOpenPMD.H index 0d7da9d140c..a25b1057da9 100644 --- a/Source/Diagnostics/WarpXOpenPMD.H +++ b/Source/Diagnostics/WarpXOpenPMD.H @@ -176,6 +176,18 @@ private: } } + /** Flushing out data of the current openPMD iteration + * + * @param[in] isBTD if the current diagnostic is BTD + * + * if isBTD=false, apply the default flush behaviour + * if isBTD=true, advice to use ADIOS Put() instead of PDW for better performance. + * + * iteration.seriesFlush() is used instead of series.flush() + * because the latter flushes only if data is dirty + * this causes trouble when the underlying writing function is collective (like PDW) + * + */ void flushCurrent (bool isBTD) const; /** This function does initial setup for the fields when interation is newly created diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index f9ed9ed4269..c8717c1d7de 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -402,18 +402,6 @@ WarpXOpenPMDPlot::~WarpXOpenPMDPlot () } } -/* - * Flushing out data of the current openPMD iteration - * @param [in]: isBTD if the current diagnostic is BTD - * - * if isBTD=false, apply the default flush behaviour - * if isBTD=true, advice to use ADIOS Put() instead of PDW for better performance. - * - * iteration.seriesFlush() is used instead of series.flush() - * because the latter flushes only if data is dirty - * this causes trouble when the underlying writing function is collective (like PDW) - * - */ void WarpXOpenPMDPlot::flushCurrent (bool isBTD) const { WARPX_PROFILE("WarpXOpenPMDPlot::flushCurrent"); From 0e1295ee828408307b4cee16e44d6c1a96523806 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Mon, 3 Mar 2025 11:25:23 -0800 Subject: [PATCH 12/13] Fix: `flushCurrent` & `flattenSteps` `buffer` target would not work in BTD if not used with `flattenSteps`: final flush would be missing at the end of the current snapshot write to the stations. --- Source/Diagnostics/WarpXOpenPMD.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index c8717c1d7de..ef34ef285b9 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -406,8 +406,11 @@ void WarpXOpenPMDPlot::flushCurrent (bool isBTD) const { WARPX_PROFILE("WarpXOpenPMDPlot::flushCurrent"); + auto hasOption = m_OpenPMDoptions.find("FlattenSteps"); + const bool flattenSteps = isBTD && (m_Series->backend() == "ADIOS2") && (hasOption != std::string::npos); + openPMD::Iteration currIteration = GetIteration(m_CurrentStep, isBTD); - if (isBTD) { + if (flattenSteps) { // delayed until all fields and particles are registered for flush // and dumped once via flattenSteps currIteration.seriesFlush( "adios2.engine.preferred_flush_target = \"buffer\"" ); From 9799a32384ac87f2d46896013106cfe48320fd34 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Mon, 3 Mar 2025 11:29:06 -0800 Subject: [PATCH 13/13] Docs --- Docs/source/usage/parameters.rst | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Docs/source/usage/parameters.rst b/Docs/source/usage/parameters.rst index 7c92b5cf9e7..e12ab2d6122 100644 --- a/Docs/source/usage/parameters.rst +++ b/Docs/source/usage/parameters.rst @@ -2773,7 +2773,7 @@ In-situ capabilities can be used by turning on Sensei or Ascent (provided they a Only read if ``.format = sensei``. When 1 lower left corner of the mesh is pinned to 0.,0.,0. -* ``.openpmd_backend`` (``bp``, ``h5`` or ``json``) optional, only used if ``.format = openpmd`` +* ``.openpmd_backend`` (``bp5``, ``bp4``, ``h5`` or ``json``) optional, only used if ``.format = openpmd`` `I/O backend `_ for `openPMD `_ data dumps. ``bp`` is the `ADIOS I/O library `_, ``h5`` is the `HDF5 format `_, and ``json`` is a `simple text format `_. ``json`` only works with serial/single-rank jobs. @@ -2795,19 +2795,26 @@ In-situ capabilities can be used by turning on Sensei or Ascent (provided they a .. code-block:: text - .adios2_operator.type = blosc - .adios2_operator.parameters.compressor = zstd - .adios2_operator.parameters.clevel = 1 - .adios2_operator.parameters.doshuffle = BLOSC_BITSHUFFLE - .adios2_operator.parameters.threshold = 2048 - .adios2_operator.parameters.nthreads = 6 # per MPI rank (and thus per GPU) + .adios2_operator.type = blosc + .adios2_operator.parameters.compressor = zstd + .adios2_operator.parameters.clevel = 1 + .adios2_operator.parameters.doshuffle = BLOSC_BITSHUFFLE + .adios2_operator.parameters.threshold = 2048 + .adios2_operator.parameters.nthreads = 6 # per MPI rank (and thus per GPU) or for the lossy ZFP compressor using very strong compression per scalar: .. code-block:: text - .adios2_operator.type = zfp - .adios2_operator.parameters.precision = 3 + .adios2_operator.type = zfp + .adios2_operator.parameters.precision = 3 + + For back-transformed diagnostics with ADIOS BP5, we are experimenting with a new option for variable-based encoding that "flattens" the output steps, aiming to increase write and read performance: + + .. code-block:: text + + .openpmd_backend = bp5 + .adios2_engine.parameters.FlattenSteps = on * ``.adios2_engine.type`` (``bp4``, ``sst``, ``ssc``, ``dataman``) optional, `ADIOS2 Engine type `__ for `openPMD `_ data dumps.