From 63c15e6d167430c9a1758eeb73ef8478b3c87d5f Mon Sep 17 00:00:00 2001
From: Thomas Gibson <gibsonthomas1120@hotmail.com>
Date: Sat, 15 May 2021 20:33:40 -0500
Subject: [PATCH] Make advection and maxwell operators parallel-safe

---
 grudge/models/advection.py | 24 ++++++++++++++++++++++--
 grudge/models/em.py        |  4 ++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/grudge/models/advection.py b/grudge/models/advection.py
index df29ecdc..adf93210 100644
--- a/grudge/models/advection.py
+++ b/grudge/models/advection.py
@@ -121,7 +121,12 @@ class StrongAdvectionOperator(AdvectionOperatorBase):
                 dcoll,
                 op.face_mass(
                     dcoll,
-                    flux(op.interior_trace_pair(dcoll, u)) + inflow_flux
+                    flux(op.interior_trace_pair(dcoll, u))
+                    # communication of interface fluxes between
+                    # parallel boundaries
+                    + sum(flux(tpair)
+                          for tpair in op.cross_rank_trace_pairs(dcoll, u))
+                    + inflow_flux
 
                     # FIXME: Add support for inflow/outflow tags
                     # + flux(TracePair(self.inflow_tag,
@@ -166,7 +171,12 @@ class WeakAdvectionOperator(AdvectionOperatorBase):
                 np.dot(self.v, op.weak_local_grad(dcoll, u))
                 - op.face_mass(
                     dcoll,
-                    flux(op.interior_trace_pair(dcoll, u)) + inflow_flux
+                    flux(op.interior_trace_pair(dcoll, u))
+                    # communication of interface fluxes between
+                    # parallel boundaries
+                    + sum(flux(tpair)
+                          for tpair in op.cross_rank_trace_pairs(dcoll, u))
+                    + inflow_flux
 
                     # FIXME: Add support for inflow/outflow tags
                     # + flux(TracePair(self.inflow_tag,
@@ -269,6 +279,11 @@ class VariableCoefficientAdvectionOperator(AdvectionOperatorBase):
                     dcoll,
                     face_dd,
                     flux(to_quad_int_tpair(dcoll, u, self.quad_tag))
+                    # communication of interface fluxes between
+                    # parallel boundaries
+                    + sum(flux(tpair)
+                          for tpair in op.cross_rank_trace_pairs(dcoll, u,
+                                                                 self.quad_tag))
                     + inflow_flux
 
                     # FIXME: Add support for inflow/outflow tags
@@ -371,6 +386,11 @@ class SurfaceAdvectionOperator(AdvectionOperatorBase):
                     dcoll,
                     face_dd,
                     flux(to_quad_int_tpair(dcoll, u, self.quad_tag))
+                    # communication of interface fluxes between
+                    # parallel boundaries
+                    + sum(flux(tpair)
+                          for tpair in op.cross_rank_trace_pairs(dcoll, u,
+                                                                 self.quad_tag))
                 )
             )
         )
diff --git a/grudge/models/em.py b/grudge/models/em.py
index a3fc5b32..d23eb080 100644
--- a/grudge/models/em.py
+++ b/grudge/models/em.py
@@ -301,6 +301,10 @@ class MaxwellOperator(HyperbolicOperator):
                 op.face_mass(
                     dcoll,
                     flux(op.interior_trace_pair(dcoll, w))
+                    # communication of interface fluxes between
+                    # parallel boundaries
+                    + sum(flux(tpair)
+                          for tpair in op.cross_rank_trace_pairs(dcoll, w))
                     + sum(flux(bv_tpair(tag, w, bc))
                           for tag, bc in tags_and_bcs)
                 )
-- 
GitLab