From b069d92a1eced867b7992893c2550cc012c0389b Mon Sep 17 00:00:00 2001
From: Matthew Smith <mjsmith6@illinois.edu>
Date: Mon, 29 Mar 2021 16:34:31 -0500
Subject: [PATCH] add constant handling in interior_trace_pair and
 cross_rank_trace_pairs

---
 grudge/eager.py | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/grudge/eager.py b/grudge/eager.py
index f10afcec..7d9eb1d8 100644
--- a/grudge/eager.py
+++ b/grudge/eager.py
@@ -374,7 +374,15 @@ def interior_trace_pair(discrwb, vec):
     *discrwb*.
     """
     i = discrwb.project("vol", "int_faces", vec)
-    e = obj_array_vectorize(lambda el: discrwb.opposite_face_connection()(el), i)
+
+    def get_opposite_face(el):
+        if isinstance(el, Number):
+            return el
+        else:
+            return discrwb.opposite_face_connection()(el)
+
+    e = obj_array_vectorize(get_opposite_face, i)
+
     return TracePair("int_faces", interior=i, exterior=e)
 
 
@@ -424,9 +432,13 @@ class _RankBoundaryCommunication:
 
 
 def _cross_rank_trace_pairs_scalar_field(discrwb, vec, tag=None):
-    rbcomms = [_RankBoundaryCommunication(discrwb, remote_rank, vec, tag=tag)
-            for remote_rank in discrwb.connected_ranks()]
-    return [rbcomm.finish() for rbcomm in rbcomms]
+    if isinstance(vec, Number):
+        return [TracePair(BTAG_PARTITION(remote_rank), interior=vec, exterior=vec)
+                for remote_rank in discrwb.connected_ranks()]
+    else:
+        rbcomms = [_RankBoundaryCommunication(discrwb, remote_rank, vec, tag=tag)
+                for remote_rank in discrwb.connected_ranks()]
+        return [rbcomm.finish() for rbcomm in rbcomms]
 
 
 def cross_rank_trace_pairs(discrwb, vec, tag=None):
-- 
GitLab