From 7bd4e6788200eca9a8e4a35802ae129bc456dbee Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Mon, 4 Jan 2016 00:06:07 -0600 Subject: [PATCH] Add is_surjective flag to mesh connections --- meshmode/discretization/connection/__init__.py | 14 ++++++++++++-- meshmode/discretization/connection/face.py | 3 ++- .../discretization/connection/opposite_face.py | 3 ++- meshmode/discretization/connection/same_mesh.py | 3 ++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/meshmode/discretization/connection/__init__.py b/meshmode/discretization/connection/__init__.py index dcfcd5e3..fcb6cc69 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 f847e5da..521dd056 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 7c0cef52..b7b92aba 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 7f07f598..3b73e34f 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) # }}} -- GitLab