diff --git a/grudge/discretization.py b/grudge/discretization.py index 730c9d3e1b78038b33a5a86a39dc2f60a0d34e64..d24fb2c082ddf3585d7de13f58a7a0b371cc4ed0 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 8107b4cba78edb520e079be021dfa3f77e37d575..21abb9e808f77f0a087d2bb83139f0095070ca68 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 a1899ed21ef6431f7b57a81fcf143680433b7b53..7b3153174f6efa07e17678471de3ef1bff25f698 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 0e57fcef6da395dbd147292624c028f5fc15451f..0cd8c6ee9a4024f21ccfb056f1c953079e2f51fe 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])