From 89c684f7575bc5a879a9607ade6dfb991ca6bcf1 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Sun, 15 Sep 2024 16:29:53 -0700 Subject: [PATCH 1/4] Minor refactoring of refined injection for AddPlasmaFlux --- .../Particles/PhysicalParticleContainer.cpp | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 0617b36a273..b07399806ea 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -1450,23 +1450,23 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, amrex::ParallelForRNG(overlap_box, [=] AMREX_GPU_DEVICE (int i, int j, int k, amrex::RandomEngine const& engine) noexcept { const IntVect iv(AMREX_D_DECL(i, j, k)); + amrex::ignore_unused(j,k); + auto lo = getCellCoords(overlap_corner, dx, {0._rt, 0._rt, 0._rt}, iv); auto hi = getCellCoords(overlap_corner, dx, {1._rt, 1._rt, 1._rt}, iv); - const int num_ppc_int = static_cast(num_ppc_real + amrex::Random(engine)); + // Skip cells that do not overlap with the injection plane + if (!flux_pos->overlapsWith(lo, hi)) return; - if (flux_pos->overlapsWith(lo, hi)) - { - auto index = overlap_box.index(iv); - int r; - if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { - r = compute_area_weights(lrrfac, flux_normal_axis); - } else { - r = 1; - } - pcounts[index] = num_ppc_int*r; + // Determine how many particles to inject in this cell + auto index = overlap_box.index(iv); + const int num_ppc_int = static_cast(num_ppc_real + amrex::Random(engine)); + // Take into account refined injection region + int r = 1; + if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { + r = compute_area_weights(lrrfac, flux_normal_axis); } - amrex::ignore_unused(j,k); + pcounts[index] = num_ppc_int*r; }); // Max number of new particles. All of them are created, @@ -1533,6 +1533,7 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, [=] AMREX_GPU_DEVICE (int i, int j, int k, amrex::RandomEngine const& engine) noexcept { const IntVect iv = IntVect(AMREX_D_DECL(i, j, k)); + amrex::ignore_unused(j,k); const auto index = overlap_box.index(iv); Real scale_fac = compute_scale_fac_area(dx, num_ppc_real, flux_normal_axis); @@ -1540,17 +1541,10 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, auto lo = getCellCoords(overlap_corner, dx, {0._rt, 0._rt, 0._rt}, iv); auto hi = getCellCoords(overlap_corner, dx, {1._rt, 1._rt, 1._rt}, iv); - if (flux_pos->overlapsWith(lo, hi)) - { - int r; - if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { - r = compute_area_weights(lrrfac, flux_normal_axis); - } else { - r = 1; - } + if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { + int r = compute_area_weights(lrrfac, flux_normal_axis); scale_fac /= r; } - amrex::ignore_unused(j,k); for (int i_part = 0; i_part < pcounts[index]; ++i_part) { From 3c006054aca302a14d778c055e393371b1bf9b3b Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Sun, 15 Sep 2024 17:15:47 -0700 Subject: [PATCH 2/4] Additional simplification --- Source/Particles/PhysicalParticleContainer.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index b07399806ea..532fb7fd117 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -1538,9 +1538,6 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, Real scale_fac = compute_scale_fac_area(dx, num_ppc_real, flux_normal_axis); - auto lo = getCellCoords(overlap_corner, dx, {0._rt, 0._rt, 0._rt}, iv); - auto hi = getCellCoords(overlap_corner, dx, {1._rt, 1._rt, 1._rt}, iv); - if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { int r = compute_area_weights(lrrfac, flux_normal_axis); scale_fac /= r; From f16b01c352f13dcef2241c3a7bbae191b58e9348 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Mon, 16 Sep 2024 09:04:50 -0700 Subject: [PATCH 3/4] Minor fixes --- Source/Particles/PhysicalParticleContainer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 532fb7fd117..b9443bf15a7 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -1456,7 +1456,7 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, auto hi = getCellCoords(overlap_corner, dx, {1._rt, 1._rt, 1._rt}, iv); // Skip cells that do not overlap with the injection plane - if (!flux_pos->overlapsWith(lo, hi)) return; + if (!flux_pos->overlapsWith(lo, hi)) { return; } // Determine how many particles to inject in this cell auto index = overlap_box.index(iv); @@ -1539,8 +1539,7 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, Real scale_fac = compute_scale_fac_area(dx, num_ppc_real, flux_normal_axis); if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { - int r = compute_area_weights(lrrfac, flux_normal_axis); - scale_fac /= r; + scale_fac /= compute_area_weights(lrrfac, flux_normal_axis); } for (int i_part = 0; i_part < pcounts[index]; ++i_part) From c6d8ac983c03663ac64995ceb8080c54ff5a0a08 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Tue, 17 Sep 2024 06:26:13 -0700 Subject: [PATCH 4/4] Remove unneeded variable lrrfac --- Source/Particles/PhysicalParticleContainer.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 5023fee81fc..23af57b9206 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -1030,7 +1030,6 @@ PhysicalParticleContainer::AddPlasma (PlasmaInjector const& plasma_injector, int Gpu::DeviceVector counts(overlap_box.numPts(), 0); Gpu::DeviceVector offset(overlap_box.numPts()); auto *pcounts = counts.data(); - const amrex::IntVect lrrfac = rrfac; Box fine_overlap_box; // default Box is NOT ok(). if (refine_injection) { fine_overlap_box = overlap_box & amrex::shift(fine_injection_box, -shifted); @@ -1048,7 +1047,7 @@ PhysicalParticleContainer::AddPlasma (PlasmaInjector const& plasma_injector, int { auto index = overlap_box.index(iv); const amrex::Long r = (fine_overlap_box.ok() && fine_overlap_box.contains(iv))? - (AMREX_D_TERM(lrrfac[0],*lrrfac[1],*lrrfac[2])) : (1); + (AMREX_D_TERM(rrfac[0],*rrfac[1],*rrfac[2])) : (1); pcounts[index] = num_ppc*r; // update pcount by checking if cell-corners or cell-center // has non-zero density @@ -1154,8 +1153,8 @@ PhysicalParticleContainer::AddPlasma (PlasmaInjector const& plasma_injector, int long ip = poffset[index] + i_part; pa_idcpu[ip] = amrex::SetParticleIDandCPU(pid+ip, cpuid); const XDim3 r = (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) ? - // In the refined injection region: use refinement ratio `lrrfac` - inj_pos->getPositionUnitBox(i_part, lrrfac, engine) : + // In the refined injection region: use refinement ratio `rrfac` + inj_pos->getPositionUnitBox(i_part, rrfac, engine) : // Otherwise: use 1 as the refinement ratio inj_pos->getPositionUnitBox(i_part, amrex::IntVect::TheUnitVector(), engine); auto pos = getCellCoords(overlap_corner, dx, r, iv); @@ -1441,7 +1440,6 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, Gpu::DeviceVector counts(overlap_box.numPts(), 0); Gpu::DeviceVector offset(overlap_box.numPts()); auto *pcounts = counts.data(); - const amrex::IntVect lrrfac = rrfac; const int flux_normal_axis = plasma_injector.flux_normal_axis; Box fine_overlap_box; // default Box is NOT ok(). if (refine_injection) { @@ -1460,7 +1458,7 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, auto index = overlap_box.index(iv); int r = 1; if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { - r = compute_area_weights(lrrfac, flux_normal_axis); + r = compute_area_weights(rrfac, flux_normal_axis); } const int num_ppc_int = static_cast(num_ppc_real*r + amrex::Random(engine)); pcounts[index] = num_ppc_int; @@ -1537,7 +1535,7 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, Real scale_fac = compute_scale_fac_area(dx, num_ppc_real, flux_normal_axis); if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) { - scale_fac /= compute_area_weights(lrrfac, flux_normal_axis); + scale_fac /= compute_area_weights(rrfac, flux_normal_axis); } for (int i_part = 0; i_part < pcounts[index]; ++i_part) @@ -1547,8 +1545,8 @@ PhysicalParticleContainer::AddPlasmaFlux (PlasmaInjector const& plasma_injector, // This assumes the flux_pos is of type InjectorPositionRandomPlane const XDim3 r = (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) ? - // In the refined injection region: use refinement ratio `lrrfac` - flux_pos->getPositionUnitBox(i_part, lrrfac, engine) : + // In the refined injection region: use refinement ratio `rrfac` + flux_pos->getPositionUnitBox(i_part, rrfac, engine) : // Otherwise: use 1 as the refinement ratio flux_pos->getPositionUnitBox(i_part, amrex::IntVect::TheUnitVector(), engine); auto pos = getCellCoords(overlap_corner, dx, r, iv);