From dc3d0730d6c74d8effe4643d9f5d386cba135e10 Mon Sep 17 00:00:00 2001 From: Rafael Ravedutti <rafaelravedutti@gmail.com> Date: Tue, 6 Feb 2024 16:14:03 +0100 Subject: [PATCH] Add PBC check when sending particles with BlockForest Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com> --- runtime/domain/block_forest.cpp | 6 +++--- src/pairs/sim/domain_partitioning.py | 16 ++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/runtime/domain/block_forest.cpp b/runtime/domain/block_forest.cpp index 8da11de..9092cbe 100644 --- a/runtime/domain/block_forest.cpp +++ b/runtime/domain/block_forest.cpp @@ -22,11 +22,12 @@ namespace pairs { void BlockForest::updateNeighborhood() { auto me = mpi::MPIManager::instance()->rank(); + this->nranks = 0; + this->total_aabbs = 0; + ranks.clear(); naabbs.clear(); aabbs.clear(); - this->nranks = 0; - this->total_aabbs = 0; for(auto& iblock: *forest) { auto block = static_cast<blockforest::Block *>(&iblock); @@ -80,7 +81,6 @@ void BlockForest::copyRuntimeArray(const std::string& name, void *dest, const in void *src = name.compare('ranks') ? ranks.data() : name.compare('naabbs') ? vec_naabbs.data() : name.compare('rank_offsets') ? offsets : - name.compare('pbc') ? vec_pbc.data() : name.compare('aabbs') ? vec_aabbs.data() : name.compare('subdom') ? subdom; diff --git a/src/pairs/sim/domain_partitioning.py b/src/pairs/sim/domain_partitioning.py index 1c88c4c..6adaa85 100644 --- a/src/pairs/sim/domain_partitioning.py +++ b/src/pairs/sim/domain_partitioning.py @@ -83,7 +83,6 @@ class BlockForest: self.ranks = sim.add_static_array('ranks', [self.nranks_capacity], Types.Int32) self.naabbs = sim.add_static_array('naabbs', [self.nranks_capacity], Types.Int32) self.offsets = sim.add_static_array('rank_offsets', [self.nranks_capacity], Types.Int32) - self.pbc = sim.add_static_array('pbc', [self.aabb_capacity, 3], Types.Int32) self.aabbs = sim.add_static_array('aabbs', [self.aabb_capacity, 6], Types.Real) self.subdom = sim.add_static_array('subdom', [sim.ndims() * 2], Types.Real) @@ -135,15 +134,20 @@ class BlockForest: for r in For(self.sim, 0, self.nranks): for aabb_id in For(self.sim, self.offsets[r], self.offsets[r] + self.naabbs[r]): full_cond = None + pbc_shifts = [] for d in range(self.sim.ndims()): + cond_pbc_neg = position[i][d] - offset < self.sim.grid.min(d) + cond_pbc_pos = position[i][d] + offset > self.sim.grid.max(d) + d_pbc = Select(self.sim, cond_pbc_neg, -1, Select(self.sim, cond_pbc_pos, 1, 0)) + + adj_pos = position[i][d] + d_pbc * self.sim.grid.length(d) d_cond = ScalarOp.and_op( - position[i][d] > self.aabbs[aabb_id][d * 2 + 0] + offset, - position[i][d] < self.aabbs[aabb_id][d * 2 + 1] - offset) + adj_pos > self.aabbs[aabb_id][d * 2 + 0] + offset, + adj_pos < self.aabbs[aabb_id][d * 2 + 1] - offset) - full_cond = d_cond if full_cond is None else \ - ScalarOp.and_op(full_cond, d_cond) + full_cond = d_cond if full_cond is None else ScalarOp.and_op(full_cond, d_cond) + pbc_shifts.append(d_pbc) for _ in Filter(self.sim, full_cond): - pbc_shifts = [self.pbc[aabb_id][d] for d in range(self.sim.ndims())] yield i, r, self.ranks[r], pbc_shifts -- GitLab