From f98da67950e7fd34d89bb7996327a6c566338c9e Mon Sep 17 00:00:00 2001 From: Weiqun Zhang Date: Thu, 1 Sep 2022 10:30:42 -0700 Subject: Fix a bug in AddPlasma (#3351) When warpx.refine_plasma=1, there was an error in the logic like below. if (lrefine_injection) { Box fine_overlap_box = ...; if (fine_overlap_box.ok()) { pcounts[index] = ...; } // the else part was missing } else { pcounts[index] = ...; } --- Source/Particles/PhysicalParticleContainer.cpp | 38 ++++++++++++-------------- 1 file changed, 18 insertions(+), 20 deletions(-) (limited to 'Source/Particles/PhysicalParticleContainer.cpp') diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 5b0ea8ae5..981dce211 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -963,8 +963,10 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox) Gpu::DeviceVector offset(overlap_box.numPts()); auto pcounts = counts.data(); int lrrfac = rrfac; - int lrefine_injection = refine_injection; - Box lfine_box = fine_injection_box; + Box fine_overlap_box; // default Box is NOT ok(). + if (refine_injection) { + fine_overlap_box = overlap_box & amrex::shift(fine_injection_box, -shifted); + } amrex::ParallelFor(overlap_box, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { IntVect iv(AMREX_D_DECL(i, j, k)); @@ -977,16 +979,13 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox) if (inj_pos->overlapsWith(lo, hi)) { auto index = overlap_box.index(iv); - if (lrefine_injection) { - Box fine_overlap_box = overlap_box & amrex::shift(lfine_box, -shifted); - if (fine_overlap_box.ok()) { - int r = (fine_overlap_box.contains(iv)) ? - AMREX_D_TERM(lrrfac,*lrrfac,*lrrfac) : 1; - pcounts[index] = num_ppc*r; - } + int r; + if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { + r = AMREX_D_TERM(lrrfac,*lrrfac,*lrrfac); } else { - pcounts[index] = num_ppc; + r = 1; } + pcounts[index] = num_ppc*r; } #if defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ) amrex::ignore_unused(k); @@ -1497,8 +1496,10 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt) Gpu::DeviceVector offset(overlap_box.numPts()); auto pcounts = counts.data(); int lrrfac = rrfac; - int lrefine_injection = refine_injection; - Box lfine_box = fine_injection_box; + Box fine_overlap_box; // default Box is NOT ok(). + if (refine_injection) { + fine_overlap_box = overlap_box & amrex::shift(fine_injection_box, -shifted); + } amrex::ParallelForRNG(overlap_box, [=] AMREX_GPU_DEVICE (int i, int j, int k, amrex::RandomEngine const& engine) noexcept { IntVect iv(AMREX_D_DECL(i, j, k)); @@ -1510,16 +1511,13 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt) if (inj_pos->overlapsWith(lo, hi)) { auto index = overlap_box.index(iv); - if (lrefine_injection) { - Box fine_overlap_box = overlap_box & amrex::shift(lfine_box, -shifted); - if (fine_overlap_box.ok()) { - int r = (fine_overlap_box.contains(iv)) ? - AMREX_D_TERM(lrrfac,*lrrfac,*lrrfac) : 1; - pcounts[index] = num_ppc_int*r; - } + int r; + if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { + r = AMREX_D_TERM(lrrfac,*lrrfac,*lrrfac); } else { - pcounts[index] = num_ppc_int; + r = 1; } + pcounts[index] = num_ppc_int*r; } #if defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ) amrex::ignore_unused(k); -- cgit v1.2.3