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