From 7ea397a8e59bd75167fb516a298c9c84a91a48c5 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:08:37 -0500 Subject: [PATCH 01/15] particles_simple: -check --- src/include/particles_simple.hxx | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 5a68e6789e..f64096085e 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -148,13 +148,6 @@ struct MparticlesSimple : MparticlesBase mprts_.storage_.push_back(p_, prt); } - void check() const - { - for (auto& prt : mprts_.storage_[p_]) { - mprts_.pi_.validCellIndex(prt.x()); - } - } - // ParticleIndexer functionality int cellPosition(real_t xi, int d) const { @@ -228,13 +221,6 @@ struct MparticlesSimple : MparticlesBase BndBuffers& bndBuffers() { return storage_.bndBuffers(); } - void check() const - { - for (int p = 0; p < n_patches(); p++) { - (*this)[p].check(); - } - } - void dump(const std::string& filename) { FILE* file = fopen(filename.c_str(), "w"); From cfc2dde612c79cde5e7c6f03acac17acd9ecb5b3 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:15:27 -0500 Subject: [PATCH 02/15] particles_simple; *: -Patch::cellPosition --- src/include/particles_simple.hxx | 6 ++---- .../output_particles_hdf5_impl.hxx | 12 ++++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index f64096085e..aee0b85ebf 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -149,10 +149,6 @@ struct MparticlesSimple : MparticlesBase } // ParticleIndexer functionality - int cellPosition(real_t xi, int d) const - { - return mprts_.pi_.cellPosition(xi, d); - } int validCellIndex(const Particle& prt) const { return mprts_.pi_.validCellIndex(prt.x); @@ -212,6 +208,8 @@ struct MparticlesSimple : MparticlesBase const ParticleIndexer& particleIndexer() const { return pi_; } + int cellPosition(real_t xi, int d) const { return pi_.cellPosition(xi, d); } + InjectorSimple injector() { return {*this}; } ConstAccessor accessor() const { diff --git a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx index af1798b7af..2dc6e92f77 100644 --- a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx +++ b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx @@ -454,15 +454,15 @@ struct OutputParticlesHdf5 kind; }; - static inline int get_sort_index(Particles& prts, int n) + static inline int get_sort_index(Mparticles& mprts, int p, int n) { - const Grid_t& grid = prts.grid(); + const Grid_t& grid = mprts.grid(); const int* ldims = grid.ldims; - const auto& prt = prts[n]; + const auto& prt = mprts[p][n]; Int3 pos; for (int d = 0; d < 3; d++) { - pos[d] = prts.cellPosition(prt.x[d], d); + pos[d] = mprts.cellPosition(prt.x[d], d); // FIXME, this is hoping that reason is that we were just on the right // bnd... if (pos[d] == ldims[d]) @@ -497,7 +497,7 @@ struct OutputParticlesHdf5 for (int n = 0; n < n_prts; n++) { if (selector(prts[n])) { particle_indices.push_back(n); - int si = get_sort_index(prts, n); + int si = get_sort_index(mprts, p, n); off[p][si]++; } } @@ -514,7 +514,7 @@ struct OutputParticlesHdf5 // sort a map only, not the actual particles map[p].resize(n_prts); for (auto n : particle_indices) { - int si = get_sort_index(prts, n); + int si = get_sort_index(mprts, p, n); map[p][off2[si]++] = n; } } From fc8c1a22861880f0b1a22d51bfeaa54874320da9 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:19:20 -0500 Subject: [PATCH 03/15] particles_simple; *: cellPosition takes p, n --- src/include/particles_simple.hxx | 5 ++++- .../psc_output_particles/output_particles_hdf5_impl.hxx | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index aee0b85ebf..fca43b5b9e 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -208,7 +208,10 @@ struct MparticlesSimple : MparticlesBase const ParticleIndexer& particleIndexer() const { return pi_; } - int cellPosition(real_t xi, int d) const { return pi_.cellPosition(xi, d); } + int cellPosition(int p, int n, int d) const + { + return pi_.cellPosition((*this)[p][n].x[d], d); + } InjectorSimple injector() { return {*this}; } ConstAccessor accessor() const diff --git a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx index 2dc6e92f77..dc75c888c2 100644 --- a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx +++ b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx @@ -462,7 +462,7 @@ struct OutputParticlesHdf5 Int3 pos; for (int d = 0; d < 3; d++) { - pos[d] = mprts.cellPosition(prt.x[d], d); + pos[d] = mprts.cellPosition(p, n, d); // FIXME, this is hoping that reason is that we were just on the right // bnd... if (pos[d] == ldims[d]) From 063572bdf66d34580295f75e2fad9501c3605199 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:23:01 -0500 Subject: [PATCH 04/15] particles_simple; *: -Patch::validCellIndex --- src/include/particles_simple.hxx | 11 ++++++----- src/libpsc/psc_collision/psc_collision_impl.hxx | 10 +++++----- src/libpsc/psc_sort/psc_sort_impl.hxx | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index fca43b5b9e..ec632f04d1 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -144,15 +144,11 @@ struct MparticlesSimple : MparticlesBase // need to copy because we modify it auto prt = new_prt; checkInPatchMod(prt); - validCellIndex(prt); + mprts_.validCellIndex(prt); mprts_.storage_.push_back(p_, prt); } // ParticleIndexer functionality - int validCellIndex(const Particle& prt) const - { - return mprts_.pi_.validCellIndex(prt.x); - } void checkInPatchMod(Particle& prt) const { @@ -213,6 +209,11 @@ struct MparticlesSimple : MparticlesBase return pi_.cellPosition((*this)[p][n].x[d], d); } + int validCellIndex(const Particle& prt) const + { + return pi_.validCellIndex(prt.x); + } + InjectorSimple injector() { return {*this}; } ConstAccessor accessor() const { diff --git a/src/libpsc/psc_collision/psc_collision_impl.hxx b/src/libpsc/psc_collision/psc_collision_impl.hxx index eadf79688e..b229e226c7 100644 --- a/src/libpsc/psc_collision/psc_collision_impl.hxx +++ b/src/libpsc/psc_collision/psc_collision_impl.hxx @@ -66,7 +66,7 @@ struct CollisionHost int* offsets = (int*)calloc(nr_cells + 1, sizeof(*offsets)); struct psc_collision_stats stats_total = {}; - find_cell_offsets(prts, offsets); + find_cell_offsets(mprts, p, offsets); auto F = make_Fields3d(mflds_stats_[p]); grid.Foreach_3d(0, 0, [&](int ix, int iy, int iz) { @@ -144,14 +144,14 @@ struct CollisionHost // ---------------------------------------------------------------------- // find_cell_offsets - static void find_cell_offsets(const Particles& prts, int offsets[]) + static void find_cell_offsets(const Mparticles& mprts, int p, int offsets[]) { - const int* ldims = prts.grid().ldims; + const int* ldims = mprts.grid().ldims; int last = 0; offsets[last] = 0; - int n_prts = prts.size(); + int n_prts = mprts[p].size(); for (int n = 0; n < n_prts; n++) { - int cell_index = prts.validCellIndex(prts[n]); + int cell_index = mprts.validCellIndex(mprts[p][n]); assert(cell_index >= last); while (last < cell_index) { offsets[++last] = n; diff --git a/src/libpsc/psc_sort/psc_sort_impl.hxx b/src/libpsc/psc_sort/psc_sort_impl.hxx index 9c64412dee..0226f2f2d5 100644 --- a/src/libpsc/psc_sort/psc_sort_impl.hxx +++ b/src/libpsc/psc_sort/psc_sort_impl.hxx @@ -80,7 +80,7 @@ struct SortCountsort2 int i = 0; for (auto prt_iter = prts.begin(); prt_iter != prts.end(); ++prt_iter, ++i) { - cnis[i] = prts.validCellIndex(*prt_iter); + cnis[i] = mprts.validCellIndex(*prt_iter); } unsigned int* cnts = new unsigned int[n_cells]{}; From c0403ff8a009c9660354746916b451a2f430f23e Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:35:05 -0500 Subject: [PATCH 05/15] particles_simple; *: validCellIndex takes x --- src/include/particles_simple.hxx | 7 ++----- src/libpsc/psc_collision/psc_collision_impl.hxx | 2 +- src/libpsc/psc_sort/psc_sort_impl.hxx | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index ec632f04d1..5b9a66b1ab 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -144,7 +144,7 @@ struct MparticlesSimple : MparticlesBase // need to copy because we modify it auto prt = new_prt; checkInPatchMod(prt); - mprts_.validCellIndex(prt); + mprts_.validCellIndex(prt.x); mprts_.storage_.push_back(p_, prt); } @@ -209,10 +209,7 @@ struct MparticlesSimple : MparticlesBase return pi_.cellPosition((*this)[p][n].x[d], d); } - int validCellIndex(const Particle& prt) const - { - return pi_.validCellIndex(prt.x); - } + int validCellIndex(const Real3& x) const { return pi_.validCellIndex(x); } InjectorSimple injector() { return {*this}; } ConstAccessor accessor() const diff --git a/src/libpsc/psc_collision/psc_collision_impl.hxx b/src/libpsc/psc_collision/psc_collision_impl.hxx index b229e226c7..f62df9bc7d 100644 --- a/src/libpsc/psc_collision/psc_collision_impl.hxx +++ b/src/libpsc/psc_collision/psc_collision_impl.hxx @@ -151,7 +151,7 @@ struct CollisionHost offsets[last] = 0; int n_prts = mprts[p].size(); for (int n = 0; n < n_prts; n++) { - int cell_index = mprts.validCellIndex(mprts[p][n]); + int cell_index = mprts.validCellIndex(mprts[p][n].x); assert(cell_index >= last); while (last < cell_index) { offsets[++last] = n; diff --git a/src/libpsc/psc_sort/psc_sort_impl.hxx b/src/libpsc/psc_sort/psc_sort_impl.hxx index 0226f2f2d5..17fe21c1e3 100644 --- a/src/libpsc/psc_sort/psc_sort_impl.hxx +++ b/src/libpsc/psc_sort/psc_sort_impl.hxx @@ -80,7 +80,7 @@ struct SortCountsort2 int i = 0; for (auto prt_iter = prts.begin(); prt_iter != prts.end(); ++prt_iter, ++i) { - cnis[i] = mprts.validCellIndex(*prt_iter); + cnis[i] = mprts.validCellIndex(prt_iter->x); } unsigned int* cnts = new unsigned int[n_cells]{}; From 04f9ece2986a0d4bc69ad4ede67e782d3cc4d1b8 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:36:18 -0500 Subject: [PATCH 06/15] particles_simple; *: -Patch::checkInPatchMod --- src/include/particles_simple.hxx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 5b9a66b1ab..18f04a2ca5 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -143,18 +143,11 @@ struct MparticlesSimple : MparticlesBase { // need to copy because we modify it auto prt = new_prt; - checkInPatchMod(prt); + mprts_.checkInPatchMod(prt); mprts_.validCellIndex(prt.x); mprts_.storage_.push_back(p_, prt); } - // ParticleIndexer functionality - - void checkInPatchMod(Particle& prt) const - { - return mprts_.pi_.checkInPatchMod(prt.x); - } - const Grid_t& grid() const { return mprts_.grid(); } const MparticlesSimple& mprts() const { return mprts_; } int p() const { return p_; } @@ -211,6 +204,11 @@ struct MparticlesSimple : MparticlesBase int validCellIndex(const Real3& x) const { return pi_.validCellIndex(x); } + void checkInPatchMod(Particle& prt) const + { + return pi_.checkInPatchMod(prt.x); + } + InjectorSimple injector() { return {*this}; } ConstAccessor accessor() const { From 314390624265eb4a1c44a3a67fdf90954ff90fd6 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:39:01 -0500 Subject: [PATCH 07/15] particles_simple; *: -push_back --- src/include/injector_simple.hxx | 2 +- src/include/particles_simple.hxx | 18 +++++++++--------- src/libpsc/psc_particles_impl.cxx | 2 +- src/libpsc/vpic/psc_particles_vpic.cxx | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/include/injector_simple.hxx b/src/include/injector_simple.hxx index 0b5048ef08..ac4b49d034 100644 --- a/src/include/injector_simple.hxx +++ b/src/include/injector_simple.hxx @@ -32,7 +32,7 @@ struct InjectorSimple new_prt.kind, mprts_.uid_gen(), new_prt.tag}; - mprts_[p_].push_back(prt); + mprts_.push_back(p_, prt); } void reweight(const psc::particle::Inject& new_prt) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 18f04a2ca5..945ac6ca5e 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -139,15 +139,6 @@ struct MparticlesSimple : MparticlesBase iterator end() { return mprts_.storage_[p_].end(); } unsigned int size() const { return mprts_.storage_[p_].size(); } - void push_back(const Particle& new_prt) - { - // need to copy because we modify it - auto prt = new_prt; - mprts_.checkInPatchMod(prt); - mprts_.validCellIndex(prt.x); - mprts_.storage_.push_back(p_, prt); - } - const Grid_t& grid() const { return mprts_.grid(); } const MparticlesSimple& mprts() const { return mprts_; } int p() const { return p_; } @@ -209,6 +200,15 @@ struct MparticlesSimple : MparticlesBase return pi_.checkInPatchMod(prt.x); } + void push_back(int p, const Particle& new_prt) + { + // need to copy because we modify it + auto prt = new_prt; + checkInPatchMod(prt); + validCellIndex(prt.x); + storage_.push_back(p, prt); + } + InjectorSimple injector() { return {*this}; } ConstAccessor accessor() const { diff --git a/src/libpsc/psc_particles_impl.cxx b/src/libpsc/psc_particles_impl.cxx index 800a7d51bf..d88de36031 100644 --- a/src/libpsc/psc_particles_impl.cxx +++ b/src/libpsc/psc_particles_impl.cxx @@ -34,7 +34,7 @@ void psc_mparticles_copy(MP_FROM& mp_from, MP_TO& mp_to) auto&& prts_to = mp_to[p]; int n_prts = prts_from.size(); for (int n = 0; n < n_prts; n++) { - prts_to.push_back(convert(prts_from[n], mp_from.grid())); + mp_to.push_back(p, convert(prts_from[n], mp_from.grid())); } } } diff --git a/src/libpsc/vpic/psc_particles_vpic.cxx b/src/libpsc/vpic/psc_particles_vpic.cxx index 4022751173..ddca96e932 100644 --- a/src/libpsc/vpic/psc_particles_vpic.cxx +++ b/src/libpsc/vpic/psc_particles_vpic.cxx @@ -52,8 +52,8 @@ void copy_to(MparticlesBase& mprts_from_base, MparticlesBase& mprts_to_base) auto kind = sp->id; auto qni_wni = float(vprt.w * dVi) * float(mprts_to.grid().kinds[kind].q); - mprts_to[p].push_back( - {x, u, qni_wni, kind, psc::particle::Id{}, psc::particle::Tag{}}); + mprts_to.push_back( + p, {x, u, qni_wni, kind, psc::particle::Id{}, psc::particle::Tag{}}); } } } From 353fe4bdd950c2fd306eb1aaf0aaf4ce6006482f Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:42:19 -0500 Subject: [PATCH 08/15] particles_simple: -checkInPatchMod --- src/include/particles_simple.hxx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 945ac6ca5e..d263fbb454 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -195,16 +195,11 @@ struct MparticlesSimple : MparticlesBase int validCellIndex(const Real3& x) const { return pi_.validCellIndex(x); } - void checkInPatchMod(Particle& prt) const - { - return pi_.checkInPatchMod(prt.x); - } - void push_back(int p, const Particle& new_prt) { // need to copy because we modify it auto prt = new_prt; - checkInPatchMod(prt); + pi_.checkInPatchMod(prt.x); validCellIndex(prt.x); storage_.push_back(p, prt); } From 1595b4f6beb5343dad6ecec868b9d3d0736c3dca Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:43:52 -0500 Subject: [PATCH 09/15] particles_simple: -Patch::p --- src/include/particles_simple.hxx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index d263fbb454..f53997ad5f 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -141,7 +141,6 @@ struct MparticlesSimple : MparticlesBase const Grid_t& grid() const { return mprts_.grid(); } const MparticlesSimple& mprts() const { return mprts_; } - int p() const { return p_; } private: MparticlesSimple& mprts_; From a36dd05170ba209baa7869aff41a409a31969b21 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:52:40 -0500 Subject: [PATCH 10/15] particles_simple; *: -Patch::grid --- src/include/particles_simple.hxx | 1 - .../psc_collision/psc_collision_impl.hxx | 42 +++++++++---------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index f53997ad5f..62b38e55a9 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -139,7 +139,6 @@ struct MparticlesSimple : MparticlesBase iterator end() { return mprts_.storage_[p_].end(); } unsigned int size() const { return mprts_.storage_[p_].size(); } - const Grid_t& grid() const { return mprts_.grid(); } const MparticlesSimple& mprts() const { return mprts_; } private: diff --git a/src/libpsc/psc_collision/psc_collision_impl.hxx b/src/libpsc/psc_collision/psc_collision_impl.hxx index f62df9bc7d..7578595e76 100644 --- a/src/libpsc/psc_collision/psc_collision_impl.hxx +++ b/src/libpsc/psc_collision/psc_collision_impl.hxx @@ -72,15 +72,15 @@ struct CollisionHost grid.Foreach_3d(0, 0, [&](int ix, int iy, int iz) { int c = (iz * ldims[1] + iy) * ldims[0] + ix; - update_rei_before(prts, offsets[c], offsets[c + 1], p, ix, iy, iz); + update_rei_before(mprts, p, offsets[c], offsets[c + 1], ix, iy, iz); struct psc_collision_stats stats = {}; // mprintf("p %d ijk %d:%d:%d # %d\n", p, ix, iy, iz, offsets[c+1] - // offsets[c]); auto permute = randomize_in_cell(offsets[c], offsets[c + 1]); - collide_in_cell(prts, permute, &stats); + collide_in_cell(mprts, p, permute, &stats); - update_rei_after(prts, offsets[c], offsets[c + 1], p, ix, iy, iz); + update_rei_after(mprts, p, offsets[c], offsets[c + 1], ix, iy, iz); for (int s = 0; s < NR_STATS; s++) { F(s, ix, iy, iz) = stats.s[s]; @@ -176,17 +176,16 @@ struct CollisionHost // ---------------------------------------------------------------------- // update_rei_before - void update_rei_before(const Particles& prts, int n_start, int n_end, int p, + void update_rei_before(const Mparticles& mprts, int p, int n_start, int n_end, int i, int j, int k) { - real_t fnqs = prts.grid().norm.fnqs; + real_t fnqs = mprts.grid().norm.fnqs; auto F = make_Fields3d(mflds_rei_[p]); F(0, i, j, k) = 0.; F(1, i, j, k) = 0.; F(2, i, j, k) = 0.; - auto& mprts = prts.mprts(); for (int n = n_start; n < n_end; n++) { - const auto& prt = prts[n]; + const auto& prt = mprts[p][n]; auto fac = mprts.prt_m(prt) * mprts.prt_w(prt) * fnqs; F(0, i, j, k) -= prt.u[0] * fac; F(1, i, j, k) -= prt.u[1] * fac; @@ -197,14 +196,14 @@ struct CollisionHost // ---------------------------------------------------------------------- // update_rei_after - void update_rei_after(const Particles& prts, int n_start, int n_end, int p, + void update_rei_after(const Mparticles& mprts, int p, int n_start, int n_end, int i, int j, int k) { - real_t fnqs = prts.grid().norm.fnqs, dt = prts.grid().dt; + real_t fnqs = mprts.grid().norm.fnqs; + real_t dt = mprts.grid().dt; auto F = make_Fields3d(mflds_rei_[p]); - auto& mprts = prts.mprts(); for (int n = n_start; n < n_end; n++) { - const auto& prt = prts[n]; + const auto& prt = mprts[p][n]; auto fac = mprts.prt_m(prt) * mprts.prt_w(prt) * fnqs; F(0, i, j, k) += prt.u[0] * fac; F(1, i, j, k) += prt.u[1] * fac; @@ -218,19 +217,19 @@ struct CollisionHost // ---------------------------------------------------------------------- // collide_in_cell - void collide_in_cell(Particles& prts, const std::vector& permute, + void collide_in_cell(Mparticles& mprts, int p, + const std::vector& permute, struct psc_collision_stats* stats) { - const auto& grid = prts.grid(); + const auto& grid = mprts.grid(); int nn = permute.size(); if (nn < 2) { // can't collide only one (or zero) particles return; } - const auto& mprts = prts.mprts(); // all particles need to have same weight! - real_t wni = mprts.prt_w(prts[permute[0]]); + real_t wni = mprts.prt_w(mprts[p][permute[0]]); real_t nudt1 = wni * grid.norm.cori * nn * this->interval_ * grid.dt * nu_; real_t* nudts = (real_t*)malloc((nn / 2 + 2) * sizeof(*nudts)); @@ -238,25 +237,24 @@ struct CollisionHost int n = 0; if (nn % 2 == 1) { // odd # of particles: do 3-collision - nudts[cnt++] = do_bc(prts, permute[0], permute[1], .5 * nudt1); - nudts[cnt++] = do_bc(prts, permute[0], permute[2], .5 * nudt1); - nudts[cnt++] = do_bc(prts, permute[1], permute[2], .5 * nudt1); + nudts[cnt++] = do_bc(mprts, p, permute[0], permute[1], .5 * nudt1); + nudts[cnt++] = do_bc(mprts, p, permute[0], permute[2], .5 * nudt1); + nudts[cnt++] = do_bc(mprts, p, permute[1], permute[2], .5 * nudt1); n = 3; } for (; n < nn; n += 2) { // do remaining particles as pair - nudts[cnt++] = do_bc(prts, permute[n], permute[n + 1], nudt1); + nudts[cnt++] = do_bc(mprts, p, permute[n], permute[n + 1], nudt1); } calc_stats(stats, nudts, cnt); free(nudts); } - real_t do_bc(Particles& prts, int n1, int n2, real_t nudt1) + real_t do_bc(Mparticles& mprts, int p, int n1, int n2, real_t nudt1) { Rng rng; - const auto& mprts = prts.mprts(); BinaryCollision bc(mprts); - return bc(prts[n1], prts[n2], nudt1, rng); + return bc(mprts[p][n1], mprts[p][n2], nudt1, rng); } int interval() const { return interval_; } From d81dc4f15e298c1d8cce533ae8dfaeb47ca764ad Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 14:53:03 -0500 Subject: [PATCH 11/15] particles_simple: -Patch::mprts --- src/include/particles_simple.hxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 62b38e55a9..b23c87f6ad 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -139,8 +139,6 @@ struct MparticlesSimple : MparticlesBase iterator end() { return mprts_.storage_[p_].end(); } unsigned int size() const { return mprts_.storage_[p_].size(); } - const MparticlesSimple& mprts() const { return mprts_; } - private: MparticlesSimple& mprts_; int p_; From 34a1170ff5294623663de8fde100a8ca5afb8fb4 Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 15:08:19 -0500 Subject: [PATCH 12/15] particles_simple; *: -Patch::size --- src/include/const_accessor_simple.hxx | 4 ++-- src/include/particles_simple.hxx | 10 +++++++++- src/include/particles_simple.inl | 4 ++-- src/libpsc/psc_balance/psc_balance_impl.hxx | 8 ++++---- src/libpsc/psc_collision/psc_collision_impl.hxx | 2 +- .../output_particles_hdf5_impl.hxx | 2 +- src/libpsc/psc_particles_impl.cxx | 2 +- src/libpsc/psc_sort/psc_sort_impl.hxx | 2 +- src/psc_flatfoil_yz.cxx | 2 +- 9 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/include/const_accessor_simple.hxx b/src/include/const_accessor_simple.hxx index e0c9b82c19..4d72ef4fe1 100644 --- a/src/include/const_accessor_simple.hxx +++ b/src/include/const_accessor_simple.hxx @@ -212,7 +212,7 @@ struct ConstAccessorSimple Patch operator[](int p) const { return {*this, p}; } const Mparticles& mprts() const { return mprts_; } - uint size(int p) const { return mprts_[p].size(); } + uint size(int p) const { return mprts_.size(p); } typename Mparticles::Patch::iterator data(int p) const { return mprts_[p].begin(); @@ -237,7 +237,7 @@ struct AccessorSimple Patch operator[](int p) { return {*this, p}; } const Mparticles& mprts() const { return mprts_; } Mparticles& mprts() { return mprts_; } - uint size(int p) const { return mprts_[p].size(); } + uint size(int p) const { return mprts_.size(p); } typename Mparticles::Patch::iterator data(int p) { return mprts_[p].begin(); } const Grid_t& grid() const { return mprts_.grid(); } diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index b23c87f6ad..12222edaff 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -43,6 +43,7 @@ struct MparticlesStorage using PatchBuffer = std::vector; using Buffers = std::vector; using Range = Span; + using ConstRange = Span; using iterator = typename Range::iterator; using const_iterator = typename Range::const_iterator; @@ -91,6 +92,12 @@ struct MparticlesStorage } Range operator[](int p) { return {bufs_[p].data(), bufs_[p].size()}; } + + ConstRange operator[](int p) const + { + return {bufs_[p].data(), bufs_[p].size()}; + } + Particle& at(int p, int n) { return bufs_[p][n]; @@ -137,7 +144,6 @@ struct MparticlesSimple : MparticlesBase iterator begin() { return mprts_.storage_[p_].begin(); } iterator end() { return mprts_.storage_[p_].end(); } - unsigned int size() const { return mprts_.storage_[p_].size(); } private: MparticlesSimple& mprts_; @@ -228,6 +234,8 @@ struct MparticlesSimple : MparticlesBase fclose(file); } + unsigned int size(int p) const { return storage_[p].size(); } + real_t prt_q(const Particle& prt) const { return grid().kinds[prt.kind].q; } real_t prt_m(const Particle& prt) const { return grid().kinds[prt.kind].m; } diff --git a/src/include/particles_simple.inl b/src/include/particles_simple.inl index eacd18066d..94b7b71085 100644 --- a/src/include/particles_simple.inl +++ b/src/include/particles_simple.inl @@ -58,7 +58,7 @@ public: auto it = vec.begin(); for (int p = 0; p < mprts_.n_patches(); p++) { auto prts = mprts_[p]; - for (int n = 0; n < prts.size(); n++) { + for (int n = 0; n < mprts_.size(p); n++) { *it++ = *func(prts[n]); } } @@ -90,7 +90,7 @@ public: auto it = vec.begin(); for (int p = 0; p < mprts_.n_patches(); p++) { auto prts = mprts_[p]; - for (int n = 0; n < prts.size(); n++) { + for (int n = 0; n < mprts_.size(p); n++) { *func(prts[n]) = *it++; } } diff --git a/src/libpsc/psc_balance/psc_balance_impl.hxx b/src/libpsc/psc_balance/psc_balance_impl.hxx index 97084c4643..cea8fcac46 100644 --- a/src/libpsc/psc_balance/psc_balance_impl.hxx +++ b/src/libpsc/psc_balance/psc_balance_impl.hxx @@ -609,7 +609,7 @@ public: for (int pi = 0; pi < recv->nr_patches; pi++) { int p = recv->pi_to_patch[pi]; auto&& prts_new = mp_new[p]; - int nn = prts_new.size() * (sizeof(Particle) / sizeof(real_t)); + int nn = mp_new.size(p) * (sizeof(Particle) / sizeof(real_t)); MPI_Irecv(&*prts_new.begin(), nn, mpi_dtype, recv->rank, pi, comm_, &recv_reqs[nr_recv_reqs++]); } @@ -630,7 +630,7 @@ public: for (int pi = 0; pi < send->nr_patches; pi++) { int p = send->pi_to_patch[pi]; auto&& prts_old = mp_old[p]; - int nn = prts_old.size() * (sizeof(Particle) / sizeof(real_t)); + int nn = mp_old.size(p) * (sizeof(Particle) / sizeof(real_t)); // mprintf("A send -> %d tag %d (patch %d)\n", send->rank, pi, p); MPI_Isend(&*prts_old.begin(), nn, mpi_dtype, send->rank, pi, comm_, &send_reqs[nr_send_reqs++]); @@ -648,9 +648,9 @@ public: auto&& prts_old = mp_old[recv_info_[p].patch]; auto&& prts_new = mp_new[p]; - assert(prts_old.size() == prts_new.size()); + assert(mp_old.size(recv_info_[p].patch) == mp_new.size(p)); #if 1 - for (int n = 0; n < prts_new.size(); n++) { + for (int n = 0; n < mp_new.size(p); n++) { prts_new[n] = prts_old[n]; } #else diff --git a/src/libpsc/psc_collision/psc_collision_impl.hxx b/src/libpsc/psc_collision/psc_collision_impl.hxx index 7578595e76..f3994ce5c4 100644 --- a/src/libpsc/psc_collision/psc_collision_impl.hxx +++ b/src/libpsc/psc_collision/psc_collision_impl.hxx @@ -149,7 +149,7 @@ struct CollisionHost const int* ldims = mprts.grid().ldims; int last = 0; offsets[last] = 0; - int n_prts = mprts[p].size(); + int n_prts = mprts.size(p); for (int n = 0; n < n_prts; n++) { int cell_index = mprts.validCellIndex(mprts[p][n].x); assert(cell_index >= last); diff --git a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx index dc75c888c2..4029591e72 100644 --- a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx +++ b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx @@ -489,7 +489,7 @@ struct OutputParticlesHdf5 int nr_indices = ldims[0] * ldims[1] * ldims[2] * nr_kinds; off[p].resize(nr_indices + 1); auto&& prts = mprts[p]; - unsigned int n_prts = prts.size(); + unsigned int n_prts = mprts.size(p); std::vector particle_indices; particle_indices.reserve(n_prts); diff --git a/src/libpsc/psc_particles_impl.cxx b/src/libpsc/psc_particles_impl.cxx index d88de36031..76514b393a 100644 --- a/src/libpsc/psc_particles_impl.cxx +++ b/src/libpsc/psc_particles_impl.cxx @@ -32,7 +32,7 @@ void psc_mparticles_copy(MP_FROM& mp_from, MP_TO& mp_to) for (int p = 0; p < mp_to.n_patches(); p++) { auto&& prts_from = mp_from[p]; auto&& prts_to = mp_to[p]; - int n_prts = prts_from.size(); + int n_prts = mp_from.size(p); for (int n = 0; n < n_prts; n++) { mp_to.push_back(p, convert(prts_from[n], mp_from.grid())); } diff --git a/src/libpsc/psc_sort/psc_sort_impl.hxx b/src/libpsc/psc_sort/psc_sort_impl.hxx index 17fe21c1e3..046c2c1f5b 100644 --- a/src/libpsc/psc_sort/psc_sort_impl.hxx +++ b/src/libpsc/psc_sort/psc_sort_impl.hxx @@ -72,7 +72,7 @@ struct SortCountsort2 { for (int p = 0; p < mprts.n_patches(); p++) { auto&& prts = mprts[p]; - unsigned int n_prts = prts.size(); + unsigned int n_prts = mprts.size(p); unsigned int n_cells = mprts.pi_.n_cells_; unsigned int* cnis = new unsigned int[n_prts]; diff --git a/src/psc_flatfoil_yz.cxx b/src/psc_flatfoil_yz.cxx index ff2910e74f..140d0a77e4 100644 --- a/src/psc_flatfoil_yz.cxx +++ b/src/psc_flatfoil_yz.cxx @@ -437,7 +437,7 @@ void run() auto& mp = mprts.template get_as(); for (int p = 0; p < mp.n_patches(); p++) { auto prts = mp[p]; - for (int n = 0; n < prts.size(); n++) { + for (int n = 0; n < mprts.size(p); n++) { if (prts[n].kind == 0) { prts[n].kind = MY_ION; } else if (prts[n].kind == 1) { From 3caa59e9d1b4e81ceb1532a3ce6b2cd19b884f1a Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 15:25:45 -0500 Subject: [PATCH 13/15] particles_simple; *: -Patch::begin, end --- src/include/const_accessor_simple.hxx | 7 ++----- src/include/particles_simple.hxx | 10 ++++++---- src/libpsc/mparticles.cxx | 11 ++++++----- src/libpsc/psc_balance/psc_balance_impl.hxx | 6 ++---- src/libpsc/psc_heating/psc_heating_impl.hxx | 14 +++++++------- src/libpsc/psc_sort/psc_sort_impl.hxx | 4 ++-- src/libpsc/tests/test_mparticles.cxx | 9 +++++---- 7 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/include/const_accessor_simple.hxx b/src/include/const_accessor_simple.hxx index 4d72ef4fe1..462f57e308 100644 --- a/src/include/const_accessor_simple.hxx +++ b/src/include/const_accessor_simple.hxx @@ -213,10 +213,7 @@ struct ConstAccessorSimple Patch operator[](int p) const { return {*this, p}; } const Mparticles& mprts() const { return mprts_; } uint size(int p) const { return mprts_.size(p); } - typename Mparticles::Patch::iterator data(int p) const - { - return mprts_[p].begin(); - } + typename Mparticles::iterator data(int p) const { return mprts_.begin(p); } const Grid_t& grid() const { return mprts_.grid(); } private: @@ -238,7 +235,7 @@ struct AccessorSimple const Mparticles& mprts() const { return mprts_; } Mparticles& mprts() { return mprts_; } uint size(int p) const { return mprts_.size(p); } - typename Mparticles::Patch::iterator data(int p) { return mprts_[p].begin(); } + typename Mparticles::iterator data(int p) { return mprts_.begin(p); } const Grid_t& grid() const { return mprts_.grid(); } private: diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 12222edaff..b05ec9bb45 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -126,9 +126,10 @@ struct MparticlesSimple : MparticlesBase using BndBuffer = typename Storage::PatchBuffer; using BndBuffers = typename Storage::Buffers; + using iterator = typename Storage::iterator; + struct Patch { - using iterator = typename Storage::iterator; using const_iterator = typename Storage::const_iterator; Patch(MparticlesSimple& mprts, int p) : mprts_(mprts), p_(p) {} @@ -142,9 +143,6 @@ struct MparticlesSimple : MparticlesBase return mprts_.storage_.at(p_, n); } - iterator begin() { return mprts_.storage_[p_].begin(); } - iterator end() { return mprts_.storage_[p_].end(); } - private: MparticlesSimple& mprts_; int p_; @@ -234,6 +232,10 @@ struct MparticlesSimple : MparticlesBase fclose(file); } + iterator begin(int p) { return storage_[p].begin(); } + + iterator end(int p) { return storage_[p].end(); } + unsigned int size(int p) const { return storage_[p].size(); } real_t prt_q(const Particle& prt) const { return grid().kinds[prt.kind].q; } diff --git a/src/libpsc/mparticles.cxx b/src/libpsc/mparticles.cxx index d0386be8c1..f1220ef998 100644 --- a/src/libpsc/mparticles.cxx +++ b/src/libpsc/mparticles.cxx @@ -61,12 +61,13 @@ void psc_mparticles_check(MparticlesBase& mprts_base) xe[d] = patch.xb[d] + grid.ldims[d] * grid.domain.dx[d]; } - for (auto prt : prts) { - if (prt.x[0] < 0.f || prt.x[0] >= xe[0] - xb[0] || // FIXME xz only! - prt.x[2] < 0.f || prt.x[2] >= xe[2] - xb[2]) { + for (auto prt_iter = mprts.begin(p); prt_iter != mprts.end(p); prt_iter++) { + if (prt_iter->x[0] < 0.f || + prt_iter->x[0] >= xe[0] - xb[0] || // FIXME xz only! + prt_iter->x[2] < 0.f || prt_iter->x[2] >= xe[2] - xb[2]) { if (fail_cnt++ < 10) { - mprintf("FAIL: xi %g [%g:%g]\n", prt.x[0], 0., xe[0] - xb[0]); - mprintf(" zi %g [%g:%g]\n", prt.x[2], 0., xe[2] - xb[2]); + mprintf("FAIL: xi %g [%g:%g]\n", prt_iter->x[0], 0., xe[0] - xb[0]); + mprintf(" zi %g [%g:%g]\n", prt_iter->x[2], 0., xe[2] - xb[2]); } } } diff --git a/src/libpsc/psc_balance/psc_balance_impl.hxx b/src/libpsc/psc_balance/psc_balance_impl.hxx index cea8fcac46..de1c1c1ff8 100644 --- a/src/libpsc/psc_balance/psc_balance_impl.hxx +++ b/src/libpsc/psc_balance/psc_balance_impl.hxx @@ -608,9 +608,8 @@ public: for (int pi = 0; pi < recv->nr_patches; pi++) { int p = recv->pi_to_patch[pi]; - auto&& prts_new = mp_new[p]; int nn = mp_new.size(p) * (sizeof(Particle) / sizeof(real_t)); - MPI_Irecv(&*prts_new.begin(), nn, mpi_dtype, recv->rank, pi, comm_, + MPI_Irecv(&*mp_new.begin(p), nn, mpi_dtype, recv->rank, pi, comm_, &recv_reqs[nr_recv_reqs++]); } } @@ -629,10 +628,9 @@ public: for (int pi = 0; pi < send->nr_patches; pi++) { int p = send->pi_to_patch[pi]; - auto&& prts_old = mp_old[p]; int nn = mp_old.size(p) * (sizeof(Particle) / sizeof(real_t)); // mprintf("A send -> %d tag %d (patch %d)\n", send->rank, pi, p); - MPI_Isend(&*prts_old.begin(), nn, mpi_dtype, send->rank, pi, comm_, + MPI_Isend(&*mp_old.begin(p), nn, mpi_dtype, send->rank, pi, comm_, &send_reqs[nr_send_reqs++]); } } diff --git a/src/libpsc/psc_heating/psc_heating_impl.hxx b/src/libpsc/psc_heating/psc_heating_impl.hxx index f82c1a1142..ecea96dc61 100644 --- a/src/libpsc/psc_heating/psc_heating_impl.hxx +++ b/src/libpsc/psc_heating/psc_heating_impl.hxx @@ -57,16 +57,16 @@ struct Heating__ : HeatingBase for (int p = 0; p < mprts.n_patches(); p++) { auto&& prts = mprts[p]; auto& patch = mprts.grid().patches[p]; - for (auto& prt : prts) { - + for (auto prt_iter = mprts.begin(p); prt_iter != mprts.end(p); + prt_iter++) { double xx[3] = { - prt.x[0] + patch.xb[0], - prt.x[1] + patch.xb[1], - prt.x[2] + patch.xb[2], + prt_iter->x[0] + patch.xb[0], + prt_iter->x[1] + patch.xb[1], + prt_iter->x[2] + patch.xb[2], }; - double H = get_H_(xx, prt.kind); + double H = get_H_(xx, prt_iter->kind); if (H > 0.f) { - kick_particle(prt, H); + kick_particle(*prt_iter, H); } } } diff --git a/src/libpsc/psc_sort/psc_sort_impl.hxx b/src/libpsc/psc_sort/psc_sort_impl.hxx index 046c2c1f5b..a736ba8e8f 100644 --- a/src/libpsc/psc_sort/psc_sort_impl.hxx +++ b/src/libpsc/psc_sort/psc_sort_impl.hxx @@ -78,7 +78,7 @@ struct SortCountsort2 unsigned int* cnis = new unsigned int[n_prts]; // FIXME, might as well merge counting here, too int i = 0; - for (auto prt_iter = prts.begin(); prt_iter != prts.end(); + for (auto prt_iter = mprts.begin(p); prt_iter != mprts.end(p); ++prt_iter, ++i) { cnis[i] = mprts.validCellIndex(prt_iter->x); } @@ -114,7 +114,7 @@ struct SortCountsort2 } // back to in-place - memcpy(&*prts.begin(), particles2, n_prts * sizeof(*particles2)); + memcpy(&*mprts.begin(p), particles2, n_prts * sizeof(*particles2)); delete[] particles2; delete[] cnis; diff --git a/src/libpsc/tests/test_mparticles.cxx b/src/libpsc/tests/test_mparticles.cxx index cc8e362e22..770418669f 100644 --- a/src/libpsc/tests/test_mparticles.cxx +++ b/src/libpsc/tests/test_mparticles.cxx @@ -503,9 +503,10 @@ TEST(TestSetupParticles, Id) EXPECT_EQ(mprts.size(), n_cells * kinds.size() * prm.nicell); psc::particle::Id cnt = 0; + for (int p = 0; p < mprts.n_patches(); p++) { - for (auto& prt : mprts[p]) { - EXPECT_EQ(prt.id(), cnt++); + for (auto prt_iter = mprts.begin(p); prt_iter != mprts.end(p); prt_iter++) { + EXPECT_EQ(prt_iter->id(), cnt++); } } } @@ -532,8 +533,8 @@ TEST(TestSetupParticles, Tag) EXPECT_EQ(mprts.size(), n_cells * kinds.size() * prm.nicell); for (int p = 0; p < mprts.n_patches(); p++) { - for (auto& prt : mprts[p]) { - EXPECT_EQ(prt.tag(), prt.kind * 10); + for (auto prt_iter = mprts.begin(p); prt_iter != mprts.end(p); prt_iter++) { + EXPECT_EQ(prt_iter->tag(), prt_iter->kind * 10); } } } From a6b07b4cfe8785e773afba18473dbb2af22222ad Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 15:51:56 -0500 Subject: [PATCH 14/15] particles_simple; *: -operator[] --- src/include/particle_simple.hxx | 16 ++++++++-------- src/include/particles_simple.hxx | 18 +++++++++++------- src/include/particles_simple.inl | 12 ++++++------ src/libpsc/psc_balance/psc_balance_impl.hxx | 4 +--- .../psc_collision/psc_collision_impl.hxx | 10 +++++----- .../output_particles_hdf5_impl.hxx | 5 ++--- src/libpsc/psc_particles_impl.cxx | 4 +--- src/libpsc/psc_sort/psc_sort_impl.hxx | 4 ++-- src/psc_flatfoil_yz.cxx | 9 ++++----- 9 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/include/particle_simple.hxx b/src/include/particle_simple.hxx index 4f1b3e2107..6a504fddb3 100644 --- a/src/include/particle_simple.hxx +++ b/src/include/particle_simple.hxx @@ -50,13 +50,13 @@ public: template static void run(FUNC&& func) { - func("x", [](Particle& prt) { return &prt.x[0]; }); - func("y", [](Particle& prt) { return &prt.x[1]; }); - func("z", [](Particle& prt) { return &prt.x[2]; }); - func("ux", [](Particle& prt) { return &prt.u[0]; }); - func("uy", [](Particle& prt) { return &prt.u[1]; }); - func("uz", [](Particle& prt) { return &prt.u[2]; }); - func("kind", [](Particle& prt) { return &prt.kind; }); - func("qni_wni", [](Particle& prt) { return &prt.qni_wni; }); + func("x", [](auto& prt) { return &prt.x[0]; }); + func("y", [](auto& prt) { return &prt.x[1]; }); + func("z", [](auto& prt) { return &prt.x[2]; }); + func("ux", [](auto& prt) { return &prt.u[0]; }); + func("uy", [](auto& prt) { return &prt.u[1]; }); + func("uz", [](auto& prt) { return &prt.u[2]; }); + func("kind", [](auto& prt) { return &prt.kind; }); + func("qni_wni", [](auto& prt) { return &prt.qni_wni; }); } }; diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index b05ec9bb45..43cd768af1 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -102,6 +102,12 @@ struct MparticlesStorage { return bufs_[p][n]; } // FIXME, ugly and not great for effciency + + const Particle& at(int p, int n) const + { + return bufs_[p][n]; + } // FIXME, ugly and not great for effciency + void push_back(int p, const Particle& prt) { bufs_[p].push_back(prt); } Buffers& bndBuffers() { return bufs_; } @@ -137,12 +143,6 @@ struct MparticlesSimple : MparticlesBase Patch(const Patch&) = delete; Patch(Patch&&) = default; - Particle& operator[](int n) { return mprts_.storage_.at(p_, n); } - const Particle& operator[](int n) const - { - return mprts_.storage_.at(p_, n); - } - private: MparticlesSimple& mprts_; int p_; @@ -190,7 +190,7 @@ struct MparticlesSimple : MparticlesBase int cellPosition(int p, int n, int d) const { - return pi_.cellPosition((*this)[p][n].x[d], d); + return pi_.cellPosition(this->at(p, n).x[d], d); } int validCellIndex(const Real3& x) const { return pi_.validCellIndex(x); } @@ -232,6 +232,10 @@ struct MparticlesSimple : MparticlesBase fclose(file); } + Particle& at(int p, int n) { return storage_.at(p, n); } + + const Particle& at(int p, int n) const { return storage_.at(p, n); } + iterator begin(int p) { return storage_[p].begin(); } iterator end(int p) { return storage_[p].end(); } diff --git a/src/include/particles_simple.inl b/src/include/particles_simple.inl index 94b7b71085..094d9c5556 100644 --- a/src/include/particles_simple.inl +++ b/src/include/particles_simple.inl @@ -53,13 +53,13 @@ public: template void operator()(const std::string& name, FUNC&& func) { - using Ret = typename std::remove_pointer::type; + using Ret = typename std::remove_const_t< + typename std::remove_pointer_t>; std::vector vec(mprts_.size()); auto it = vec.begin(); for (int p = 0; p < mprts_.n_patches(); p++) { - auto prts = mprts_[p]; for (int n = 0; n < mprts_.size(p); n++) { - *it++ = *func(prts[n]); + *it++ = *func(mprts_.at(p, n)); } } @@ -83,15 +83,15 @@ public: template void operator()(const std::string& name, FUNC&& func) { - using Ret = typename std::remove_pointer::type; + using Ret = + typename std::remove_pointer::type; std::vector vec(mprts_.size()); reader_.get(name, vec, mprts_.grid(), kg::io::Mode::Blocking); auto it = vec.begin(); for (int p = 0; p < mprts_.n_patches(); p++) { - auto prts = mprts_[p]; for (int n = 0; n < mprts_.size(p); n++) { - *func(prts[n]) = *it++; + *func(mprts_.at(p, n)) = *it++; } } } diff --git a/src/libpsc/psc_balance/psc_balance_impl.hxx b/src/libpsc/psc_balance/psc_balance_impl.hxx index de1c1c1ff8..78164a4457 100644 --- a/src/libpsc/psc_balance/psc_balance_impl.hxx +++ b/src/libpsc/psc_balance/psc_balance_impl.hxx @@ -644,12 +644,10 @@ public: continue; } - auto&& prts_old = mp_old[recv_info_[p].patch]; - auto&& prts_new = mp_new[p]; assert(mp_old.size(recv_info_[p].patch) == mp_new.size(p)); #if 1 for (int n = 0; n < mp_new.size(p); n++) { - prts_new[n] = prts_old[n]; + mp_new.at(p, n) = mp_old.at(recv_info_[p].patch, n); } #else // FIXME, this needs at least a proper interface -- if not separately diff --git a/src/libpsc/psc_collision/psc_collision_impl.hxx b/src/libpsc/psc_collision/psc_collision_impl.hxx index f3994ce5c4..2487142232 100644 --- a/src/libpsc/psc_collision/psc_collision_impl.hxx +++ b/src/libpsc/psc_collision/psc_collision_impl.hxx @@ -151,7 +151,7 @@ struct CollisionHost offsets[last] = 0; int n_prts = mprts.size(p); for (int n = 0; n < n_prts; n++) { - int cell_index = mprts.validCellIndex(mprts[p][n].x); + int cell_index = mprts.validCellIndex(mprts.at(p, n).x); assert(cell_index >= last); while (last < cell_index) { offsets[++last] = n; @@ -185,7 +185,7 @@ struct CollisionHost F(1, i, j, k) = 0.; F(2, i, j, k) = 0.; for (int n = n_start; n < n_end; n++) { - const auto& prt = mprts[p][n]; + const auto& prt = mprts.at(p, n); auto fac = mprts.prt_m(prt) * mprts.prt_w(prt) * fnqs; F(0, i, j, k) -= prt.u[0] * fac; F(1, i, j, k) -= prt.u[1] * fac; @@ -203,7 +203,7 @@ struct CollisionHost real_t dt = mprts.grid().dt; auto F = make_Fields3d(mflds_rei_[p]); for (int n = n_start; n < n_end; n++) { - const auto& prt = mprts[p][n]; + const auto& prt = mprts.at(p, n); auto fac = mprts.prt_m(prt) * mprts.prt_w(prt) * fnqs; F(0, i, j, k) += prt.u[0] * fac; F(1, i, j, k) += prt.u[1] * fac; @@ -229,7 +229,7 @@ struct CollisionHost } // all particles need to have same weight! - real_t wni = mprts.prt_w(mprts[p][permute[0]]); + real_t wni = mprts.prt_w(mprts.at(p, permute[0])); real_t nudt1 = wni * grid.norm.cori * nn * this->interval_ * grid.dt * nu_; real_t* nudts = (real_t*)malloc((nn / 2 + 2) * sizeof(*nudts)); @@ -254,7 +254,7 @@ struct CollisionHost { Rng rng; BinaryCollision bc(mprts); - return bc(mprts[p][n1], mprts[p][n2], nudt1, rng); + return bc(mprts.at(p, n1), mprts.at(p, n2), nudt1, rng); } int interval() const { return interval_; } diff --git a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx index 4029591e72..3baf9fa07b 100644 --- a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx +++ b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx @@ -458,7 +458,7 @@ struct OutputParticlesHdf5 { const Grid_t& grid = mprts.grid(); const int* ldims = grid.ldims; - const auto& prt = mprts[p][n]; + const auto& prt = mprts.at(p, n); Int3 pos; for (int d = 0; d < 3; d++) { @@ -488,14 +488,13 @@ struct OutputParticlesHdf5 const int* ldims = mprts.grid().ldims; int nr_indices = ldims[0] * ldims[1] * ldims[2] * nr_kinds; off[p].resize(nr_indices + 1); - auto&& prts = mprts[p]; unsigned int n_prts = mprts.size(p); std::vector particle_indices; particle_indices.reserve(n_prts); // counting sort to get map for (int n = 0; n < n_prts; n++) { - if (selector(prts[n])) { + if (selector(mprts.at(p, n))) { particle_indices.push_back(n); int si = get_sort_index(mprts, p, n); off[p][si]++; diff --git a/src/libpsc/psc_particles_impl.cxx b/src/libpsc/psc_particles_impl.cxx index 76514b393a..74389d4e99 100644 --- a/src/libpsc/psc_particles_impl.cxx +++ b/src/libpsc/psc_particles_impl.cxx @@ -30,11 +30,9 @@ void psc_mparticles_copy(MP_FROM& mp_from, MP_TO& mp_to) mp_to.clear(); for (int p = 0; p < mp_to.n_patches(); p++) { - auto&& prts_from = mp_from[p]; - auto&& prts_to = mp_to[p]; int n_prts = mp_from.size(p); for (int n = 0; n < n_prts; n++) { - mp_to.push_back(p, convert(prts_from[n], mp_from.grid())); + mp_to.push_back(p, convert(mp_from.at(p, n), mp_from.grid())); } } } diff --git a/src/libpsc/psc_sort/psc_sort_impl.hxx b/src/libpsc/psc_sort/psc_sort_impl.hxx index a736ba8e8f..ee985d746f 100644 --- a/src/libpsc/psc_sort/psc_sort_impl.hxx +++ b/src/libpsc/psc_sort/psc_sort_impl.hxx @@ -71,7 +71,6 @@ struct SortCountsort2 void operator()(Mparticles& mprts) { for (int p = 0; p < mprts.n_patches(); p++) { - auto&& prts = mprts[p]; unsigned int n_prts = mprts.size(p); unsigned int n_cells = mprts.pi_.n_cells_; @@ -108,7 +107,8 @@ struct SortCountsort2 while (i + n < n_prts && cnis[i + n] == cni) { n++; } - memcpy(&particles2[cnts[cni]], &prts[i], n * sizeof(*particles2)); + memcpy(&particles2[cnts[cni]], &mprts.at(p, i), + n * sizeof(*particles2)); cnts[cni] += n; i += n - 1; } diff --git a/src/psc_flatfoil_yz.cxx b/src/psc_flatfoil_yz.cxx index 140d0a77e4..f2de74e21a 100644 --- a/src/psc_flatfoil_yz.cxx +++ b/src/psc_flatfoil_yz.cxx @@ -436,12 +436,11 @@ void run() // fix up renumbered particle kind auto& mp = mprts.template get_as(); for (int p = 0; p < mp.n_patches(); p++) { - auto prts = mp[p]; for (int n = 0; n < mprts.size(p); n++) { - if (prts[n].kind == 0) { - prts[n].kind = MY_ION; - } else if (prts[n].kind == 1) { - prts[n].kind = MY_ELECTRON; + if (mprts.at(p, n).kind == 0) { + mprts.at(p, n).kind = MY_ION; + } else if (mprts.at(p, n).kind == 1) { + mprts.at(p, n).kind = MY_ELECTRON; } else { assert(0); } From 9e86a46487e359691ebd56195f75fcc50214ecad Mon Sep 17 00:00:00 2001 From: James McClung Date: Thu, 8 Jan 2026 15:57:50 -0500 Subject: [PATCH 15/15] particles_simple; *: -Patch --- src/include/const_accessor_simple.hxx | 1 - src/include/particles_simple.hxx | 19 ------------------- src/libpsc/mparticles.cxx | 1 - .../psc_collision/psc_collision_impl.hxx | 3 --- src/libpsc/psc_heating/psc_heating_impl.hxx | 1 - .../output_particles_hdf5_impl.hxx | 1 - 6 files changed, 26 deletions(-) diff --git a/src/include/const_accessor_simple.hxx b/src/include/const_accessor_simple.hxx index 462f57e308..9e751f9876 100644 --- a/src/include/const_accessor_simple.hxx +++ b/src/include/const_accessor_simple.hxx @@ -9,7 +9,6 @@ struct ParticleProxySimple { using Particle = typename Mparticles::Particle; using real_t = typename Mparticles::real_t; - using Patch = typename Mparticles::Patch; using Real3 = Vec3; ParticleProxySimple(Particle& prt, const Mparticles& mprts) diff --git a/src/include/particles_simple.hxx b/src/include/particles_simple.hxx index 43cd768af1..0fbd773270 100644 --- a/src/include/particles_simple.hxx +++ b/src/include/particles_simple.hxx @@ -134,20 +134,6 @@ struct MparticlesSimple : MparticlesBase using iterator = typename Storage::iterator; - struct Patch - { - using const_iterator = typename Storage::const_iterator; - - Patch(MparticlesSimple& mprts, int p) : mprts_(mprts), p_(p) {} - - Patch(const Patch&) = delete; - Patch(Patch&&) = default; - - private: - MparticlesSimple& mprts_; - int p_; - }; - explicit MparticlesSimple(const Grid_t& grid) : MparticlesBase(grid), storage_(grid.n_patches()), @@ -166,11 +152,6 @@ struct MparticlesSimple : MparticlesBase storage_.reset(grid); } - Patch operator[](int p) const - { - return {const_cast(*this), p}; - } // FIXME, isn't actually const - void reserve_all(const std::vector& n_prts_by_patch) { storage_.reserve_all(n_prts_by_patch); diff --git a/src/libpsc/mparticles.cxx b/src/libpsc/mparticles.cxx index f1220ef998..8076521e20 100644 --- a/src/libpsc/mparticles.cxx +++ b/src/libpsc/mparticles.cxx @@ -49,7 +49,6 @@ void psc_mparticles_check(MparticlesBase& mprts_base) for (int p = 0; p < grid.n_patches(); p++) { auto& patch = grid.patches[p]; - auto&& prts = mprts[p]; double xb[3], xe[3]; diff --git a/src/libpsc/psc_collision/psc_collision_impl.hxx b/src/libpsc/psc_collision/psc_collision_impl.hxx index 2487142232..89c9887f66 100644 --- a/src/libpsc/psc_collision/psc_collision_impl.hxx +++ b/src/libpsc/psc_collision/psc_collision_impl.hxx @@ -23,7 +23,6 @@ struct CollisionHost using real_t = typename Mparticles::real_t; using MfieldsState = _MfieldsState; using Mfields = _Mfields; - using Particles = typename Mparticles::Patch; using Particle = typename Mparticles::Particle; enum @@ -59,8 +58,6 @@ struct CollisionHost auto& grid = mprts.grid(); for (int p = 0; p < mprts.n_patches(); p++) { - auto prts = mprts[p]; - const int* ldims = grid.ldims; int nr_cells = ldims[0] * ldims[1] * ldims[2]; int* offsets = (int*)calloc(nr_cells + 1, sizeof(*offsets)); diff --git a/src/libpsc/psc_heating/psc_heating_impl.hxx b/src/libpsc/psc_heating/psc_heating_impl.hxx index ecea96dc61..07c794fe81 100644 --- a/src/libpsc/psc_heating/psc_heating_impl.hxx +++ b/src/libpsc/psc_heating/psc_heating_impl.hxx @@ -55,7 +55,6 @@ struct Heating__ : HeatingBase void operator()(Mparticles& mprts) { for (int p = 0; p < mprts.n_patches(); p++) { - auto&& prts = mprts[p]; auto& patch = mprts.grid().patches[p]; for (auto prt_iter = mprts.begin(p); prt_iter != mprts.end(p); prt_iter++) { diff --git a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx index 3baf9fa07b..1417bfd676 100644 --- a/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx +++ b/src/libpsc/psc_output_particles/output_particles_hdf5_impl.hxx @@ -433,7 +433,6 @@ struct OutputParticlesHdf5 { using writer_type = OutputParticlesWriterHDF5; using writer_particles_type = writer_type::particles_type; - using Particles = typename Mparticles::Patch; OutputParticlesHdf5(const Grid_t& grid, const OutputParticlesParams& params) : lo_{params.lo},