diff --git a/Source/Diagnostics/WarpXOpenPMD.cpp b/Source/Diagnostics/WarpXOpenPMD.cpp index 6e73ab55d5c..6ce68ad1d67 100644 --- a/Source/Diagnostics/WarpXOpenPMD.cpp +++ b/Source/Diagnostics/WarpXOpenPMD.cpp @@ -756,14 +756,10 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, auto const positionComponents = detail::getParticlePositionComponentLabels(); #if defined(WARPX_DIM_RZ) { - std::shared_ptr z( - new amrex::ParticleReal[numParticleOnTile], - [](amrex::ParticleReal const *p) { delete[] p; } - ); + auto z = currSpecies["position"]["z"].storeChunk({offset}, {numParticleOnTile64}); + auto zBuffer = z.currentBuffer(); for (auto i = 0; i < numParticleOnTile; i++) - z.get()[i] = aos[i].pos(1); // {0: "r", 1: "z"} - std::string const positionComponent = "z"; - currSpecies["position"]["z"].storeChunk(z, {offset}, {numParticleOnTile64}); + zBuffer[i] = aos[i].pos(1); // {0: "r", 1: "z"} } // reconstruct x and y from polar coordinates r, theta @@ -773,47 +769,39 @@ WarpXOpenPMDPlot::DumpToFile (ParticleContainer* pc, WARPX_ALWAYS_ASSERT_WITH_MESSAGE(int(soa.GetRealData(PIdx::theta).size()) == numParticleOnTile, "openPMD: theta and tile size do not match"); { - std::shared_ptr< amrex::ParticleReal > x( - new amrex::ParticleReal[numParticleOnTile], - [](amrex::ParticleReal const *p){ delete[] p; } - ); - std::shared_ptr< amrex::ParticleReal > y( - new amrex::ParticleReal[numParticleOnTile], - [](amrex::ParticleReal const *p){ delete[] p; } - ); + auto x = currSpecies["position"]["x"].storeChunk({offset}, {numParticleOnTile64}); + auto y = currSpecies["position"]["y"].storeChunk({offset}, {numParticleOnTile64}); + auto xBuffer = x.currentBuffer(); + auto yBuffer = y.currentBuffer(); for (auto i=0; i curr( - new amrex::ParticleReal[numParticleOnTile], - [](amrex::ParticleReal const *p) { delete[] p; } - ); - for (auto i = 0; i < numParticleOnTile; i++) { - curr.get()[i] = aos[i].pos(currDim); - } + // std::shared_ptr curr( + // new amrex::ParticleReal[numParticleOnTile], + // [](amrex::ParticleReal const *p) { delete[] p; } + // ); std::string const positionComponent = positionComponents[currDim]; - currSpecies["position"][positionComponent].storeChunk(curr, {offset}, + auto curr = currSpecies["position"][positionComponent].storeChunk({offset}, {numParticleOnTile64}); + auto currBuffer = curr.currentBuffer(); + for (auto i = 0; i < numParticleOnTile; i++) { + currBuffer[i] = aos[i].pos(currDim); + } } #endif // save particle ID after converting it to a globally unique ID - std::shared_ptr ids( - new uint64_t[numParticleOnTile], - [](uint64_t const *p) { delete[] p; } - ); + auto const scalar = openPMD::RecordComponent::SCALAR; + auto ids = currSpecies["id"][scalar].storeChunk({offset}, {numParticleOnTile64}); + auto idsBuffer = ids.currentBuffer(); for (auto i = 0; i < numParticleOnTile; i++) { - ids.get()[i] = ablastr::particles::localIDtoGlobal(aos[i].id(), aos[i].cpu()); + idsBuffer[i] = ablastr::particles::localIDtoGlobal(aos[i].id(), aos[i].cpu()); } - auto const scalar = openPMD::RecordComponent::SCALAR; - currSpecies["id"][scalar].storeChunk(ids, {offset}, {numParticleOnTile64}); } // save "extra" particle properties in AoS and SoA @@ -932,16 +920,13 @@ WarpXOpenPMDPlot::SaveRealProperty (ParticleIter& pti, auto currRecord = currSpecies[record_name]; auto currRecordComp = currRecord[component_name]; - std::shared_ptr< amrex::ParticleReal > d( - new amrex::ParticleReal[numParticleOnTile], - [](amrex::ParticleReal const *p){ delete[] p; } - ); + auto d = currRecordComp.storeChunk( + {offset}, {numParticleOnTile64}); + auto dBuffer = d.currentBuffer(); for( auto kk=0; kk