From 5994a40f86fa61f07beca9888b74ba11d5e39c87 Mon Sep 17 00:00:00 2001
From: "[6~" <inform@tiker.net>
Date: Sun, 17 May 2020 14:12:03 -0500
Subject: [PATCH] Standardize all boundary DOFDescs to use DTAG_BOUNDARY,
 rename DOFDesc.is_boundary -> is_boundary_or_partition_interface

---
 grudge/discretization.py            | 13 +++++++------
 grudge/symbolic/mappers/__init__.py | 15 +++++++--------
 grudge/symbolic/operators.py        |  9 ++++++---
 grudge/symbolic/primitives.py       | 17 ++++++-----------
 4 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/grudge/discretization.py b/grudge/discretization.py
index 730c9d3e..d24fb2c0 100644
--- a/grudge/discretization.py
+++ b/grudge/discretization.py
@@ -131,9 +131,10 @@ class DGDiscretizationWithBoundaries(DiscretizationBase):
             # FIXME
             raise NotImplementedError("Distributed communication with quadrature")
 
-        assert isinstance(dd.domain_tag, sym.BTAG_PARTITION)
+        assert isinstance(dd.domain_tag, sym.DTAG_BOUNDARY)
+        assert isinstance(dd.domain_tag.tag, sym.BTAG_PARTITION)
 
-        return self._dist_boundary_connections[dd.domain_tag.part_nr]
+        return self._dist_boundary_connections[dd.domain_tag.tag.part_nr]
 
     @memoize_method
     def discr_from_dd(self, dd):
@@ -161,8 +162,8 @@ class DGDiscretizationWithBoundaries(DiscretizationBase):
             return self._all_faces_volume_connection().to_discr
         elif dd.domain_tag is sym.FACE_RESTR_INTERIOR:
             return self._interior_faces_connection().to_discr
-        elif dd.is_boundary():
-            return self._boundary_connection(dd.domain_tag).to_discr
+        elif dd.is_boundary_or_partition_interface():
+            return self._boundary_connection(dd.domain_tag.tag).to_discr
         else:
             raise ValueError("DOF desc tag not understood: " + str(dd))
 
@@ -239,9 +240,9 @@ class DGDiscretizationWithBoundaries(DiscretizationBase):
                 return self._all_faces_volume_connection()
             if to_dd.domain_tag is sym.FACE_RESTR_INTERIOR:
                 return self._interior_faces_connection()
-            elif to_dd.is_boundary():
+            elif to_dd.is_boundary_or_partition_interface():
                 assert from_dd.quadrature_tag is sym.QTAG_NONE
-                return self._boundary_connection(to_dd.domain_tag)
+                return self._boundary_connection(to_dd.domain_tag.tag)
             elif to_dd.is_volume():
                 from meshmode.discretization.connection import \
                         make_same_mesh_connection
diff --git a/grudge/symbolic/mappers/__init__.py b/grudge/symbolic/mappers/__init__.py
index 8107b4cb..21abb9e8 100644
--- a/grudge/symbolic/mappers/__init__.py
+++ b/grudge/symbolic/mappers/__init__.py
@@ -930,14 +930,13 @@ class EmptyFluxKiller(CSECachingMapperMixin, IdentityMapper):
     def map_operator_binding(self, expr):
         from meshmode.mesh import is_boundary_tag_empty
         if (isinstance(expr.op, sym.InterpolationOperator)
-                and expr.op.dd_out.is_boundary()
-                and expr.op.dd_out.domain_tag not in [
-                    sym.FACE_RESTR_ALL, sym.FACE_RESTR_INTERIOR]
-                and is_boundary_tag_empty(self.mesh,
-                    expr.op.dd_out.domain_tag)):
-            return 0
-        else:
-            return IdentityMapper.map_operator_binding(self, expr)
+                and expr.op.dd_out.is_boundary_or_partition_interface()):
+            domain_tag = expr.op.dd_out.domain_tag
+            assert isinstance(domain_tag, sym.DTAG_BOUNDARY)
+            if is_boundary_tag_empty(self.mesh, domain_tag.tag):
+                return 0
+
+        return IdentityMapper.map_operator_binding(self, expr)
 
 
 class _InnerDerivativeJoiner(pymbolic.mapper.RecursiveMapper):
diff --git a/grudge/symbolic/operators.py b/grudge/symbolic/operators.py
index a1899ed2..7b315317 100644
--- a/grudge/symbolic/operators.py
+++ b/grudge/symbolic/operators.py
@@ -472,12 +472,15 @@ class OppositePartitionFaceSwap(Operator):
             dd_out = dd_in
 
         super(OppositePartitionFaceSwap, self).__init__(dd_in, dd_out)
-        if not isinstance(self.dd_in.domain_tag, sym.BTAG_PARTITION):
-            raise ValueError("dd_in must be a partition boundary faces domain")
+        if not (isinstance(self.dd_in.domain_tag, sym.DTAG_BOUNDARY)
+                and isinstance(self.dd_in.domain_tag.tag, sym.BTAG_PARTITION)):
+            raise ValueError(
+                    "dd_in must be a partition boundary faces domain, not '%s'"
+                    % self.dd_in.domain_tag)
         if self.dd_out != self.dd_in:
             raise ValueError("dd_out and dd_in must be identical")
 
-        self.i_remote_part = self.dd_in.domain_tag.part_nr
+        self.i_remote_part = self.dd_in.domain_tag.tag.part_nr
 
         assert unique_id is None or isinstance(unique_id, int)
         self.unique_id = unique_id
diff --git a/grudge/symbolic/primitives.py b/grudge/symbolic/primitives.py
index 0e57fcef..0cd8c6ee 100644
--- a/grudge/symbolic/primitives.py
+++ b/grudge/symbolic/primitives.py
@@ -149,7 +149,7 @@ class DOFDesc(object):
     .. automethod:: is_scalar
     .. automethod:: is_discretized
     .. automethod:: is_volume
-    .. automethod:: is_boundary
+    .. automethod:: is_boundary_or_partition_interface
     .. automethod:: is_trace
     .. automethod:: uses_quadrature
     .. automethod:: with_qtag
@@ -203,10 +203,9 @@ class DOFDesc(object):
         elif domain_tag is None:
             pass
         elif isinstance(domain_tag, BTAG_PARTITION):
-            pass
+            domain_tag = DTAG_BOUNDARY(domain_tag)
         elif domain_tag in [BTAG_ALL, BTAG_REALLY_ALL, BTAG_NONE]:
-            # FIXME: Should wrap these in DTAG_BOUNDARY
-            pass
+            domain_tag = DTAG_BOUNDARY(domain_tag)
         elif isinstance(domain_tag, DTAG_BOUNDARY):
             pass
         else:
@@ -230,15 +229,11 @@ class DOFDesc(object):
     def is_volume(self):
         return self.domain_tag is DTAG_VOLUME_ALL
 
-    def is_boundary(self):
-        return (
-                self.domain_tag in [
-                    BTAG_ALL, BTAG_NONE, BTAG_REALLY_ALL]
-                or isinstance(self.domain_tag, BTAG_PARTITION)
-                or isinstance(self.domain_tag, DTAG_BOUNDARY))
+    def is_boundary_or_partition_interface(self):
+        return isinstance(self.domain_tag, DTAG_BOUNDARY)
 
     def is_trace(self):
-        return (self.is_boundary()
+        return (self.is_boundary_or_partition_interface()
                 or self.domain_tag in [
                     FACE_RESTR_ALL,
                     FACE_RESTR_INTERIOR])
-- 
GitLab