diff --git a/meshmode/discretization/connection/__init__.py b/meshmode/discretization/connection/__init__.py index dcfcd5e318eeba84551806d817f4631e85fb042e..fcb6cc6983bc1d08cb8e2878ccc5b748c3e4b573 100644 --- a/meshmode/discretization/connection/__init__.py +++ b/meshmode/discretization/connection/__init__.py @@ -164,13 +164,18 @@ class DiscretizationConnection(object): instances, with a one-to-one correspondence to the groups in :attr:`to_discr`. + .. attribute:: is_surjective + + A :class:`bool` indicating whether every output degree + of freedom is set by the connection. + .. automethod:: __call__ .. automethod:: full_resample_matrix """ - def __init__(self, from_discr, to_discr, groups): + def __init__(self, from_discr, to_discr, groups, is_surjective): if from_discr.cl_context != to_discr.cl_context: raise ValueError("from_discr and to_discr must live in the " "same OpenCL context") @@ -191,6 +196,8 @@ class DiscretizationConnection(object): self.to_discr = to_discr self.groups = groups + self.is_surjective = is_surjective + @memoize_method def _resample_matrix(self, to_group_index, ibatch_index): import modepy as mp @@ -356,7 +363,10 @@ class DiscretizationConnection(object): if not isinstance(vec, cl.array.Array): return vec - result = self.to_discr.empty(dtype=vec.dtype) + if self.is_surjective: + result = self.to_discr.empty(dtype=vec.dtype) + else: + result = self.to_discr.zeros(dtype=vec.dtype) if vec.shape != (self.from_discr.nnodes,): raise ValueError("invalid shape of incoming resampling data") diff --git a/meshmode/discretization/connection/face.py b/meshmode/discretization/connection/face.py index f847e5dae9ebce17049b82de5e90d6d68dac9234..521dd0561a2d707ce53f6ca43d50a7ce36dffb2f 100644 --- a/meshmode/discretization/connection/face.py +++ b/meshmode/discretization/connection/face.py @@ -81,7 +81,8 @@ def _build_boundary_connection(queue, vol_discr, bdry_discr, connection_data): connection_batches)) return DiscretizationConnection( - vol_discr, bdry_discr, connection_groups) + vol_discr, bdry_discr, connection_groups, + is_surjective=True) # }}} diff --git a/meshmode/discretization/connection/opposite_face.py b/meshmode/discretization/connection/opposite_face.py index 7c0cef52e2adb8356cbc00c7a0c97eaeb19e16c8..b7b92aba9b3ce242e81ddb9e3beef1b882f1cb1b 100644 --- a/meshmode/discretization/connection/opposite_face.py +++ b/meshmode/discretization/connection/opposite_face.py @@ -383,7 +383,8 @@ def make_opposite_face_connection(volume_to_bdry_conn): to_discr=bdry_discr, groups=[ DiscretizationConnectionElementGroup(batches=batches) - for batches in groups]) + for batches in groups], + is_surjective=True) # }}} diff --git a/meshmode/discretization/connection/same_mesh.py b/meshmode/discretization/connection/same_mesh.py index 7f07f5988cedca0bff0986627c935bbf37f74593..3b73e34fefd5115e01b97728ab414cc8c77fd178 100644 --- a/meshmode/discretization/connection/same_mesh.py +++ b/meshmode/discretization/connection/same_mesh.py @@ -57,7 +57,8 @@ def make_same_mesh_connection(to_discr, from_discr): DiscretizationConnectionElementGroup([ibatch])) return DiscretizationConnection( - from_discr, to_discr, groups) + from_discr, to_discr, groups, + is_surjective=True) # }}}