From 3349f5c7053ca93b127234aa810a2871e1651e17 Mon Sep 17 00:00:00 2001 From: LudwigBoess Date: Fri, 21 Aug 2026 18:28:12 +0000 Subject: [PATCH 1/4] pass is_left through to CrossesPiston so a right-facing wall can reuse it --- src/archetypes/piston.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/archetypes/piston.h b/src/archetypes/piston.h index 66f7160f2..d9d81bb14 100644 --- a/src/archetypes/piston.h +++ b/src/archetypes/piston.h @@ -80,6 +80,7 @@ namespace arch { * @param piston_position Position of the piston at the start of timestep in global coordinates * @param piston_v Velocity of piston at current timestep * @param massive Whether the particle is massive or massless (e.g. photon) + * @param is_left Is piston on the left side of the box or right side of the box */ template Inline void Piston(prtlidx_t p, @@ -88,10 +89,11 @@ namespace arch { const M& metric, real_t piston_position, real_t piston_v, - bool massive) { + bool massive, + bool is_left = true) { // check if particle actually crosses the piston, if not return - if (!CrossesPiston(p, dt, particles, metric, piston_position, piston_v, true)) { + if (!CrossesPiston(p, dt, particles, metric, piston_position, piston_v, is_left)) { return; } // step 1: calculate the particle 3 velocity From 523c40135eead2e70fc322da8f7e021088b1a26a Mon Sep 17 00:00:00 2001 From: LudwigBoess Date: Fri, 21 Aug 2026 19:04:43 +0000 Subject: [PATCH 2/4] bugfix in conductor BCs --- src/kernels/fields_bcs.hpp | 48 ++++++++++++++------------------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/src/kernels/fields_bcs.hpp b/src/kernels/fields_bcs.hpp index 729a09d10..c831fce4b 100644 --- a/src/kernels/fields_bcs.hpp +++ b/src/kernels/fields_bcs.hpp @@ -554,15 +554,13 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i1 == 0) { - Fld(i_edge, em::bx1) = ZERO; - } else { + if (i1 != 0) { if constexpr (not P) { - Fld(i_edge - i1, em::bx1) = -Fld(i_edge + i1, em::bx1); + Fld(i_edge - i1, em::bx1) = Fld(i_edge + i1, em::bx1); Fld(i_edge - i1, em::bx2) = Fld(i_edge + i1 - 1, em::bx2); Fld(i_edge - i1, em::bx3) = Fld(i_edge + i1 - 1, em::bx3); } else { - Fld(i_edge + i1, em::bx1) = -Fld(i_edge - i1, em::bx1); + Fld(i_edge + i1, em::bx1) = Fld(i_edge - i1, em::bx1); Fld(i_edge + i1 - 1, em::bx2) = Fld(i_edge - i1, em::bx2); Fld(i_edge + i1 - 1, em::bx3) = Fld(i_edge - i1, em::bx3); } @@ -596,15 +594,13 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i1 == 0) { - Fld(i_edge, i2, em::bx1) = ZERO; - } else { + if (i1 != 0) { if constexpr (not P) { - Fld(i_edge - i1, i2, em::bx1) = -Fld(i_edge + i1, i2, em::bx1); + Fld(i_edge - i1, i2, em::bx1) = Fld(i_edge + i1, i2, em::bx1); Fld(i_edge - i1, i2, em::bx2) = Fld(i_edge + i1 - 1, i2, em::bx2); Fld(i_edge - i1, i2, em::bx3) = Fld(i_edge + i1 - 1, i2, em::bx3); } else { - Fld(i_edge + i1, i2, em::bx1) = -Fld(i_edge - i1, i2, em::bx1); + Fld(i_edge + i1, i2, em::bx1) = Fld(i_edge - i1, i2, em::bx1); Fld(i_edge + i1 - 1, i2, em::bx2) = Fld(i_edge - i1, i2, em::bx2); Fld(i_edge + i1 - 1, i2, em::bx3) = Fld(i_edge - i1, i2, em::bx3); } @@ -629,16 +625,14 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i2 == 0) { - Fld(i1, i_edge, em::bx2) = ZERO; - } else { + if (i2 != 0) { if constexpr (not P) { Fld(i1, i_edge - i2, em::bx1) = Fld(i1, i_edge + i2 - 1, em::bx1); - Fld(i1, i_edge - i2, em::bx2) = -Fld(i1, i_edge + i2, em::bx2); + Fld(i1, i_edge - i2, em::bx2) = Fld(i1, i_edge + i2, em::bx2); Fld(i1, i_edge - i2, em::bx3) = Fld(i1, i_edge + i2 - 1, em::bx3); } else { Fld(i1, i_edge + i2 - 1, em::bx1) = Fld(i1, i_edge - i2, em::bx1); - Fld(i1, i_edge + i2, em::bx2) = -Fld(i1, i_edge - i2, em::bx2); + Fld(i1, i_edge + i2, em::bx2) = Fld(i1, i_edge - i2, em::bx2); Fld(i1, i_edge + i2 - 1, em::bx3) = Fld(i1, i_edge - i2, em::bx3); } } @@ -678,11 +672,9 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i1 == 0) { - Fld(i_edge, i2, i3, em::bx1) = ZERO; - } else { + if (i1 != 0) { if constexpr (not P) { - Fld(i_edge - i1, i2, i3, em::bx1) = -Fld(i_edge + i1, i2, i3, em::bx1); + Fld(i_edge - i1, i2, i3, em::bx1) = Fld(i_edge + i1, i2, i3, em::bx1); Fld(i_edge - i1, i2, i3, em::bx2) = Fld(i_edge + i1 - 1, i2, i3, @@ -692,7 +684,7 @@ namespace kernel::bc { i3, em::bx3); } else { - Fld(i_edge + i1, i2, i3, em::bx1) = -Fld(i_edge - i1, i2, i3, em::bx1); + Fld(i_edge + i1, i2, i3, em::bx1) = Fld(i_edge - i1, i2, i3, em::bx1); Fld(i_edge + i1 - 1, i2, i3, em::bx2) = Fld(i_edge - i1, i2, i3, @@ -729,15 +721,13 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i2 == 0) { - Fld(i1, i_edge, i3, em::bx2) = ZERO; - } else { + if (i2 != 0) { if constexpr (not P) { Fld(i1, i_edge - i2, i3, em::bx1) = Fld(i1, i_edge + i2 - 1, i3, em::bx1); - Fld(i1, i_edge - i2, i3, em::bx2) = -Fld(i1, i_edge + i2, i3, em::bx2); + Fld(i1, i_edge - i2, i3, em::bx2) = Fld(i1, i_edge + i2, i3, em::bx2); Fld(i1, i_edge - i2, i3, em::bx3) = Fld(i1, i_edge + i2 - 1, i3, @@ -747,7 +737,7 @@ namespace kernel::bc { i_edge - i2, i3, em::bx1); - Fld(i1, i_edge + i2, i3, em::bx2) = -Fld(i1, i_edge - i2, i3, em::bx2); + Fld(i1, i_edge + i2, i3, em::bx2) = Fld(i1, i_edge - i2, i3, em::bx2); Fld(i1, i_edge + i2 - 1, i3, em::bx3) = Fld(i1, i_edge - i2, i3, @@ -780,9 +770,7 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i3 == 0) { - Fld(i1, i2, i_edge, em::bx3) = ZERO; - } else { + if (i3 != 0) { if constexpr (not P) { Fld(i1, i2, i_edge - i3, em::bx1) = Fld(i1, i2, @@ -792,7 +780,7 @@ namespace kernel::bc { i2, i_edge + i3 - 1, em::bx2); - Fld(i1, i2, i_edge - i3, em::bx3) = -Fld(i1, i2, i_edge + i3, em::bx3); + Fld(i1, i2, i_edge - i3, em::bx3) = Fld(i1, i2, i_edge + i3, em::bx3); } else { Fld(i1, i2, i_edge + i3 - 1, em::bx1) = Fld(i1, i2, @@ -802,7 +790,7 @@ namespace kernel::bc { i2, i_edge - i3, em::bx2); - Fld(i1, i2, i_edge + i3, em::bx3) = -Fld(i1, i2, i_edge - i3, em::bx3); + Fld(i1, i2, i_edge + i3, em::bx3) = Fld(i1, i2, i_edge - i3, em::bx3); } } } From 1aa6ee9e9c9d74c3fe9602d1ce10de44126d40d6 Mon Sep 17 00:00:00 2001 From: LudwigBoess Date: Fri, 21 Aug 2026 19:28:06 +0000 Subject: [PATCH 3/4] Turn inline Lambda into proper kernel to avoid NVidia compilation error --- src/archetypes/moving_window.h | 83 +++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/src/archetypes/moving_window.h b/src/archetypes/moving_window.h index b8dc74fa2..3b9faca6f 100644 --- a/src/archetypes/moving_window.h +++ b/src/archetypes/moving_window.h @@ -134,6 +134,54 @@ namespace arch { } }; +#if defined(MPI_ENABLED) + /** + * @brief Assigns MPI send tags from the particle cell indices. + * @note Particles outside the active domain get the tag of the neighbor they belong to. + */ + template + struct PrtlRetag_kernel { + array_t i1, i2, i3; + array_t tag; + const int ni1, ni2, ni3; + + PrtlRetag_kernel(const array_t& i1, + const array_t& i2, + const array_t& i3, + const array_t& tag, + int ni1, + int ni2, + int ni3) + : i1 { i1 } + , i2 { i2 } + , i3 { i3 } + , tag { tag } + , ni1 { ni1 } + , ni2 { ni2 } + , ni3 { ni3 } {} + + Inline void operator()(prtlidx_t p) const { + if constexpr (D == Dim::_1D) { + tag(p) = mpi::SendTag(tag(p), i1(p) < 0, i1(p) >= ni1); + } else if constexpr (D == Dim::_2D) { + tag(p) = mpi::SendTag(tag(p), + i1(p) < 0, + i1(p) >= ni1, + i2(p) < 0, + i2(p) >= ni2); + } else if constexpr (D == Dim::_3D) { + tag(p) = mpi::SendTag(tag(p), + i1(p) < 0, + i1(p) >= ni1, + i2(p) < 0, + i2(p) >= ni2, + i3(p) < 0, + i3(p) >= ni3); + } + } + }; +#endif // MPI_ENABLED + /** * @brief Updates particle position and fields in the moving window. @@ -213,32 +261,15 @@ namespace arch { : 0; for (auto s { 0u }; s < nspec; ++s) { auto& species = domain.species[s]; - auto i1 = species.i1; - auto i2 = species.i2; - auto i3 = species.i3; - auto tag = species.tag; - Kokkos::parallel_for( - "RetagWindowParticles", - species.rangeActiveParticles(), - Lambda(prtlidx_t p) { - if constexpr (M::Dim == Dim::_1D) { - tag(p) = mpi::SendTag(tag(p), i1(p) < 0, i1(p) >= ni1); - } else if constexpr (M::Dim == Dim::_2D) { - tag(p) = mpi::SendTag(tag(p), - i1(p) < 0, - i1(p) >= ni1, - i2(p) < 0, - i2(p) >= ni2); - } else if constexpr (M::Dim == Dim::_3D) { - tag(p) = mpi::SendTag(tag(p), - i1(p) < 0, - i1(p) >= ni1, - i2(p) < 0, - i2(p) >= ni2, - i3(p) < 0, - i3(p) >= ni3); - } - }); + Kokkos::parallel_for("RetagWindowParticles", + species.rangeActiveParticles(), + PrtlRetag_kernel(species.i1, + species.i2, + species.i3, + species.tag, + ni1, + ni2, + ni3)); } #endif From 33ac2eb8617fa464caecfd03976180cc0f10a781 Mon Sep 17 00:00:00 2001 From: LudwigBoess Date: Mon, 21 Sep 2026 18:58:26 +0000 Subject: [PATCH 4/4] revert conductor BC normal-B fix, preserved on bug/conductor_bcs_normal_b --- src/kernels/fields_bcs.hpp | 48 ++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/kernels/fields_bcs.hpp b/src/kernels/fields_bcs.hpp index c831fce4b..729a09d10 100644 --- a/src/kernels/fields_bcs.hpp +++ b/src/kernels/fields_bcs.hpp @@ -554,13 +554,15 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i1 != 0) { + if (i1 == 0) { + Fld(i_edge, em::bx1) = ZERO; + } else { if constexpr (not P) { - Fld(i_edge - i1, em::bx1) = Fld(i_edge + i1, em::bx1); + Fld(i_edge - i1, em::bx1) = -Fld(i_edge + i1, em::bx1); Fld(i_edge - i1, em::bx2) = Fld(i_edge + i1 - 1, em::bx2); Fld(i_edge - i1, em::bx3) = Fld(i_edge + i1 - 1, em::bx3); } else { - Fld(i_edge + i1, em::bx1) = Fld(i_edge - i1, em::bx1); + Fld(i_edge + i1, em::bx1) = -Fld(i_edge - i1, em::bx1); Fld(i_edge + i1 - 1, em::bx2) = Fld(i_edge - i1, em::bx2); Fld(i_edge + i1 - 1, em::bx3) = Fld(i_edge - i1, em::bx3); } @@ -594,13 +596,15 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i1 != 0) { + if (i1 == 0) { + Fld(i_edge, i2, em::bx1) = ZERO; + } else { if constexpr (not P) { - Fld(i_edge - i1, i2, em::bx1) = Fld(i_edge + i1, i2, em::bx1); + Fld(i_edge - i1, i2, em::bx1) = -Fld(i_edge + i1, i2, em::bx1); Fld(i_edge - i1, i2, em::bx2) = Fld(i_edge + i1 - 1, i2, em::bx2); Fld(i_edge - i1, i2, em::bx3) = Fld(i_edge + i1 - 1, i2, em::bx3); } else { - Fld(i_edge + i1, i2, em::bx1) = Fld(i_edge - i1, i2, em::bx1); + Fld(i_edge + i1, i2, em::bx1) = -Fld(i_edge - i1, i2, em::bx1); Fld(i_edge + i1 - 1, i2, em::bx2) = Fld(i_edge - i1, i2, em::bx2); Fld(i_edge + i1 - 1, i2, em::bx3) = Fld(i_edge - i1, i2, em::bx3); } @@ -625,14 +629,16 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i2 != 0) { + if (i2 == 0) { + Fld(i1, i_edge, em::bx2) = ZERO; + } else { if constexpr (not P) { Fld(i1, i_edge - i2, em::bx1) = Fld(i1, i_edge + i2 - 1, em::bx1); - Fld(i1, i_edge - i2, em::bx2) = Fld(i1, i_edge + i2, em::bx2); + Fld(i1, i_edge - i2, em::bx2) = -Fld(i1, i_edge + i2, em::bx2); Fld(i1, i_edge - i2, em::bx3) = Fld(i1, i_edge + i2 - 1, em::bx3); } else { Fld(i1, i_edge + i2 - 1, em::bx1) = Fld(i1, i_edge - i2, em::bx1); - Fld(i1, i_edge + i2, em::bx2) = Fld(i1, i_edge - i2, em::bx2); + Fld(i1, i_edge + i2, em::bx2) = -Fld(i1, i_edge - i2, em::bx2); Fld(i1, i_edge + i2 - 1, em::bx3) = Fld(i1, i_edge - i2, em::bx3); } } @@ -672,9 +678,11 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i1 != 0) { + if (i1 == 0) { + Fld(i_edge, i2, i3, em::bx1) = ZERO; + } else { if constexpr (not P) { - Fld(i_edge - i1, i2, i3, em::bx1) = Fld(i_edge + i1, i2, i3, em::bx1); + Fld(i_edge - i1, i2, i3, em::bx1) = -Fld(i_edge + i1, i2, i3, em::bx1); Fld(i_edge - i1, i2, i3, em::bx2) = Fld(i_edge + i1 - 1, i2, i3, @@ -684,7 +692,7 @@ namespace kernel::bc { i3, em::bx3); } else { - Fld(i_edge + i1, i2, i3, em::bx1) = Fld(i_edge - i1, i2, i3, em::bx1); + Fld(i_edge + i1, i2, i3, em::bx1) = -Fld(i_edge - i1, i2, i3, em::bx1); Fld(i_edge + i1 - 1, i2, i3, em::bx2) = Fld(i_edge - i1, i2, i3, @@ -721,13 +729,15 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i2 != 0) { + if (i2 == 0) { + Fld(i1, i_edge, i3, em::bx2) = ZERO; + } else { if constexpr (not P) { Fld(i1, i_edge - i2, i3, em::bx1) = Fld(i1, i_edge + i2 - 1, i3, em::bx1); - Fld(i1, i_edge - i2, i3, em::bx2) = Fld(i1, i_edge + i2, i3, em::bx2); + Fld(i1, i_edge - i2, i3, em::bx2) = -Fld(i1, i_edge + i2, i3, em::bx2); Fld(i1, i_edge - i2, i3, em::bx3) = Fld(i1, i_edge + i2 - 1, i3, @@ -737,7 +747,7 @@ namespace kernel::bc { i_edge - i2, i3, em::bx1); - Fld(i1, i_edge + i2, i3, em::bx2) = Fld(i1, i_edge - i2, i3, em::bx2); + Fld(i1, i_edge + i2, i3, em::bx2) = -Fld(i1, i_edge - i2, i3, em::bx2); Fld(i1, i_edge + i2 - 1, i3, em::bx3) = Fld(i1, i_edge - i2, i3, @@ -770,7 +780,9 @@ namespace kernel::bc { } if (tags & BC::B) { - if (i3 != 0) { + if (i3 == 0) { + Fld(i1, i2, i_edge, em::bx3) = ZERO; + } else { if constexpr (not P) { Fld(i1, i2, i_edge - i3, em::bx1) = Fld(i1, i2, @@ -780,7 +792,7 @@ namespace kernel::bc { i2, i_edge + i3 - 1, em::bx2); - Fld(i1, i2, i_edge - i3, em::bx3) = Fld(i1, i2, i_edge + i3, em::bx3); + Fld(i1, i2, i_edge - i3, em::bx3) = -Fld(i1, i2, i_edge + i3, em::bx3); } else { Fld(i1, i2, i_edge + i3 - 1, em::bx1) = Fld(i1, i2, @@ -790,7 +802,7 @@ namespace kernel::bc { i2, i_edge - i3, em::bx2); - Fld(i1, i2, i_edge + i3, em::bx3) = Fld(i1, i2, i_edge - i3, em::bx3); + Fld(i1, i2, i_edge + i3, em::bx3) = -Fld(i1, i2, i_edge - i3, em::bx3); } } }