From d6f0b279f9da4549b8edaaafad05b6a6d633fe63 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Thu, 16 Nov 2023 00:11:58 +0100
Subject: [PATCH] Fix half-neighbor lists

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 examples/lj.py               |  3 ++-
 src/pairs/ir/apply.py        |  4 ++--
 src/pairs/sim/interaction.py | 18 +++++++++---------
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/examples/lj.py b/examples/lj.py
index 97b66a4..214966e 100644
--- a/examples/lj.py
+++ b/examples/lj.py
@@ -5,7 +5,7 @@ import sys
 def lj(i, j):
     sr2 = 1.0 / squared_distance(i, j)
     sr6 = sr2 * sr2 * sr2 * sigma6[i, j]
-    apply(force, delta(i, j) * 48.0 * sr6 * (sr6 - 0.5) * sr2 * epsilon[i, j])
+    apply(force, delta(i, j) * (48.0 * sr6 * (sr6 - 0.5) * sr2 * epsilon[i, j]))
 
 def euler(i):
     linear_velocity[i] += dt * force[i] / mass[i]
@@ -36,6 +36,7 @@ psim.add_feature_property('type', 'sigma6', pairs.real(), [epsilon for i in rang
 psim.set_domain([0.0, 0.0, 0.0, 53.747078, 53.747078, 53.747078])
 psim.read_particle_data("data/minimd_setup_32x32x32.input", ['type', 'mass', 'position', 'linear_velocity', 'flags'], pairs.point_mass())
 psim.reneighbor_every(20)
+#psim.compute_half()
 psim.build_neighbor_lists(cutoff_radius + skin)
 psim.vtk_output(f"output/lj_{target}")
 psim.compute(lj, cutoff_radius)
diff --git a/src/pairs/ir/apply.py b/src/pairs/ir/apply.py
index 43c21e4..6ae09dd 100644
--- a/src/pairs/ir/apply.py
+++ b/src/pairs/ir/apply.py
@@ -44,11 +44,11 @@ class Apply(Lowerable):
 
     @pairs_inline
     def lower(self):
+        Assign(self.sim, self._reduction_variable, self._reduction_variable + self._expr)
+
         if self.sim._compute_half:
             for _ in Filter(self.sim,
                             ScalarOp.and_op(self._j < self.sim.nlocal,
                                             ScalarOp.cmp(self.sim.particle_flags[self._j] & Flags.Fixed, 0))):
 
                 Assign(self.sim, self._prop[self._j], self._prop[self._j] - self._expr)
-
-        Assign(self.sim, self._reduction_variable, self._reduction_variable + self._expr)
diff --git a/src/pairs/sim/interaction.py b/src/pairs/sim/interaction.py
index fb5becc..ff2f5c2 100644
--- a/src/pairs/sim/interaction.py
+++ b/src/pairs/sim/interaction.py
@@ -72,10 +72,8 @@ class NeighborFor:
                             particle_id = cell_particles[neigh_cell][cell_particle]
 
                             if self.sim._compute_half:
-                                shape_cond = particle_shape[particle_id] > shape
-                                condition = ScalarOp.or_op(shape_cond,
-                                                           ScalarOp.and_op(ScalarOp.not_op(shape_cond),
-                                                                           self.particle < particle_id))
+                                shape_cond = particle_shape[particle_id] > self.sim.get_shape_id(shape)
+                                condition = ScalarOp.or_op(shape_cond, self.particle < particle_id)
 
                             else:
                                 condition = ScalarOp.neq(particle_id, self.particle)
@@ -89,10 +87,8 @@ class NeighborFor:
                     inf_particle = cell_particles[0][inf_id]
 
                     if self.sim._compute_half:
-                        shape_cond = particle_shape[inf_particle] > shape
-                        condition = ScalarOp.or_op(shape_cond,
-                                                   ScalarOp.and_op(ScalarOp.not_op(shape_cond),
-                                                                   self.particle < inf_particle))
+                        shape_cond = particle_shape[inf_particle] > self.sim.get_shape_id(shape)
+                        condition = ScalarOp.or_op(shape_cond, self.particle < inf_particle)
 
                     else:
                         condition = ScalarOp.neq(inf_particle, self.particle)
@@ -266,7 +262,11 @@ class ParticleInteraction(Lowerable):
                             prop_reductions[prop] = prop_reductions[prop] + reduction
 
                     for prop, reduction in prop_reductions.items():
-                        Assign(self.sim, prop[i], reduction)
+                        if self.sim._compute_half:
+                            Assign(self.sim, prop[i], prop[i] + reduction)
+
+                        else:
+                            Assign(self.sim, prop[i], reduction)
 
         else:
             raise Exception("Interactions among more than two particles are currently not supported.")
-- 
GitLab