Skip to content
Snippets Groups Projects
Commit 90d160e2 authored by Rafael Ravedutti's avatar Rafael Ravedutti
Browse files

Fix communication for directions without PBC

parent dbbcf937
No related branches found
No related tags found
1 merge request!1Implement DEM and many other features
...@@ -11,7 +11,7 @@ from pairs.sim.lowerable import Lowerable ...@@ -11,7 +11,7 @@ from pairs.sim.lowerable import Lowerable
class DimensionRanges: class DimensionRanges:
def __init__(self, sim): def __init__(self, sim):
self.sim = sim self.sim = sim
self.neighbor_ranks = sim.add_static_array('neighbor_ranks', [sim.ndims() * 2], Types.Int32) self.neighbor_ranks = sim.add_static_array('neighbor_ranks', [sim.ndims() * 2], Types.Int32)
self.pbc = sim.add_static_array('pbc', [sim.ndims() * 2], Types.Int32) self.pbc = sim.add_static_array('pbc', [sim.ndims() * 2], Types.Int32)
self.subdom = sim.add_static_array('subdom', [sim.ndims() * 2], Types.Real) self.subdom = sim.add_static_array('subdom', [sim.ndims() * 2], Types.Real)
...@@ -23,20 +23,37 @@ class DimensionRanges: ...@@ -23,20 +23,37 @@ class DimensionRanges:
return [step * 2 + 0, step * 2 + 1] return [step * 2 + 0, step * 2 + 1]
def ghost_particles(self, step, position, offset=0.0): def ghost_particles(self, step, position, offset=0.0):
if self.sim._pbc[step] is False:
return
# Particles with one of the following flags are ignored # Particles with one of the following flags are ignored
flags_to_exclude = (Flags.Infinite | Flags.Global) flags_to_exclude = (Flags.Infinite | Flags.Global)
for i in For(self.sim, 0, self.sim.nlocal + self.sim.nghost): def next_neighbor(self, j, step, position, offset, flags_to_exclude):
for _ in Filter(self.sim, ScalarOp.cmp(self.sim.particle_flags[i] & flags_to_exclude, 0)): particle_flags = self.sim.particle_flags
j = step * 2 + 0 for i in For(self.sim, 0, self.sim.nlocal + self.sim.nghost):
for _ in Filter(self.sim, position[i][step] < self.subdom[j] + offset): for _ in Filter(self.sim, ScalarOp.cmp(particle_flags[i] & flags_to_exclude, 0)):
yield i, j, self.neighbor_ranks[j], [0 if d != step else self.pbc[j] for d in range(self.sim.ndims())] for _ in Filter(self.sim, position[i][step] < self.subdom[j] + offset):
pbc_shifts = [0 if d != step else self.pbc[j] for d in range(self.sim.ndims())]
for i in For(self.sim, 0, self.sim.nlocal + self.sim.nghost): yield i, j, self.neighbor_ranks[j], pbc_shifts
for _ in Filter(self.sim, ScalarOp.cmp(self.sim.particle_flags[i] & flags_to_exclude, 0)):
j = step * 2 + 1
for _ in Filter(self.sim, position[i][step] > self.subdom[j] - offset):
yield i, j, self.neighbor_ranks[j], [0 if d != step else self.pbc[j] for d in range(self.sim.ndims())] def prev_neighbor(self, j, step, position, offset, flags_to_exclude):
particle_flags = self.sim.particle_flags
j = step * 2 + 1
for i in For(self.sim, 0, self.sim.nlocal + self.sim.nghost):
for _ in Filter(self.sim, ScalarOp.cmp(particle_flags[i] & flags_to_exclude, 0)):
for _ in Filter(self.sim, position[i][step] > self.subdom[j] - offset):
pbc_shifts = [0 if d != step else self.pbc[j] for d in range(self.sim.ndims())]
yield i, j, self.neighbor_ranks[j], pbc_shifts
if self.sim._pbc[step]:
yield from next_neighbor(self, step * 2 + 0, step, position, offset, flags_to_exclude)
yield from prev_neighbor(self, step * 2 + 1, step, position, offset, flags_to_exclude)
else:
j = step * 2 + 0
for _ in Filter(self.sim, ScalarOp.inline(ScalarOp.cmp(self.pbc[j], 0))):
yield from next_neighbor(self, j, step, position, offset, flags_to_exclude)
j = step * 2 + 1
for _ in Filter(self.sim, ScalarOp.inline(ScalarOp.cmp(self.pbc[j], 0))):
yield from prev_neighbor(self, j, step, position, offset, flags_to_exclude)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment