From 18a1df1943283a693daa153dc40f44be769b0850 Mon Sep 17 00:00:00 2001 From: Weiqun Zhang Date: Sat, 16 Apr 2022 08:20:40 -0700 Subject: Avoid unnecessary construction of CopyParticleAttribs (#3042) If it's not used there is no reason to construct a CopyParticleAttribs object. In fact, it could result in a runtime `std::out_of_range` error in `std::map::at()` because `tmp_particle_data` is used in the CopyParticleAttribs constructor, but in `PhysicalParticleContainer::Evolve`, `tmp_particle_data` is properly prepared only when doing back transformed diagnostics. --- Source/Particles/PhysicalParticleContainer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'Source/Particles/PhysicalParticleContainer.cpp') diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 8845fb9e2..f8ec5044b 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -2594,11 +2594,14 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti, ParticleReal* const AMREX_RESTRICT uy = attribs[PIdx::uy].dataPtr() + offset; ParticleReal* const AMREX_RESTRICT uz = attribs[PIdx::uz].dataPtr() + offset; - auto copyAttribs = CopyParticleAttribs(pti, tmp_particle_data, offset); int do_copy = ( (WarpX::do_back_transformed_diagnostics && do_back_transformed_diagnostics && a_dt_type!=DtType::SecondHalf) || (m_do_back_transformed_particles && (a_dt_type!=DtType::SecondHalf)) ); + CopyParticleAttribs copyAttribs; + if (do_copy) { + copyAttribs = CopyParticleAttribs(pti, tmp_particle_data, offset); + } int* AMREX_RESTRICT ion_lev = nullptr; if (do_field_ionization) { -- cgit v1.2.3