From c86f62a6f8f2f4fb4f0db6c2839576a6d664053a Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Mon, 4 Dec 2017 21:50:23 -0600 Subject: [PATCH] Same-mesh connection: allow 'interpolating' for non-interpolatory groups if nodes are exactly identical --- .../discretization/connection/__init__.py | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/meshmode/discretization/connection/__init__.py b/meshmode/discretization/connection/__init__.py index 85e41d89..7d17be88 100644 --- a/meshmode/discretization/connection/__init__.py +++ b/meshmode/discretization/connection/__init__.py @@ -278,17 +278,25 @@ 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) + nfrom_unit_nodes = from_grp.unit_nodes.shape[1] + if np.array_equal(from_grp.unit_nodes, ibatch.result_unit_nodes): + # Nodes are exactly identical? We can 'interpolate' even when there + # isn't a basis. + + result = np.eye(nfrom_unit_nodes) + + else: + if len(from_grp.basis()) != nfrom_unit_nodes: + 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) with cl.CommandQueue(self.cl_context) as queue: return cl.array.to_device(queue, result).with_queue(None) -- GitLab