From 7244761ef1e5ac7c3526817a70053c562a0ef30a Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Wed, 11 Jan 2017 18:05:20 +0800 Subject: [PATCH] Spew intelligible errors if non-interpolatory element groups are used to interpolate --- meshmode/discretization/__init__.py | 4 ++++ meshmode/discretization/connection/__init__.py | 10 +++++++++- meshmode/discretization/poly_element.py | 8 ++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/meshmode/discretization/__init__.py b/meshmode/discretization/__init__.py index 45fdc22e..6da392ca 100644 --- a/meshmode/discretization/__init__.py +++ b/meshmode/discretization/__init__.py @@ -37,6 +37,10 @@ __doc__ = """ # {{{ element group base +class NoninterpolatoryElementGroupError(TypeError): + pass + + class ElementGroupBase(object): """Container for the :class:`Discretization` data corresponding to one :class:`meshmode.mesh.MeshElementGroup`. diff --git a/meshmode/discretization/connection/__init__.py b/meshmode/discretization/connection/__init__.py index c0b622d0..bdb0f525 100644 --- a/meshmode/discretization/connection/__init__.py +++ b/meshmode/discretization/connection/__init__.py @@ -156,7 +156,7 @@ class DiscretizationConnectionElementGroup(object): # }}} -# {{{ connection class +# {{{ connection classes class DiscretizationConnection(object): """Abstract interface for transporting a DOF vector from one @@ -266,6 +266,14 @@ class DirectDiscretizationConnection(DiscretizationConnection): ibatch = self.groups[to_group_index].batches[ibatch_index] from_grp = self.from_discr.groups[ibatch.from_group_index] + if len(from_grp.basis()) != from_grp.unit_nodes.shape[1]: + from meshmode.discretization import NoninterpolatoryElementGroupError + raise NoninterpolatoryElementGroupError( + "%s does not support interpolation because it is not " + "unisolvent (its unit node count does not match its " + "number of basis functions). Using connections requires " + "the ability to interpolate." % type(from_grp).__name__) + result = mp.resampling_matrix( from_grp.basis(), ibatch.result_unit_nodes, from_grp.unit_nodes) diff --git a/meshmode/discretization/poly_element.py b/meshmode/discretization/poly_element.py index 54aaabef..f509a911 100644 --- a/meshmode/discretization/poly_element.py +++ b/meshmode/discretization/poly_element.py @@ -80,6 +80,14 @@ class PolynomialSimplexElementGroupBase(ElementGroupBase): @memoize_method def diff_matrices(self): + if len(self.basis()) != self.unit_nodes.shape[1]: + from meshmode.discretization import NoninterpolatoryElementGroupError + raise NoninterpolatoryElementGroupError( + "%s does not support interpolation because it is not " + "unisolvent (its unit node count does not match its " + "number of basis functions). Differentiation requires " + "the ability to interpolate." % type(self).__name__) + result = mp.differentiation_matrices( self.basis(), self.grad_basis(), -- GitLab