From 66aea3086bb7760b3b255d774430bf4ec4db5a5a Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Fri, 22 Sep 2017 17:01:18 -0500
Subject: [PATCH] Implement PointsDiscretization abomination

---
 grudge/discretization.py | 33 ++++++++++++++++++++++++++++++++-
 test/test_grudge.py      | 16 ++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/grudge/discretization.py b/grudge/discretization.py
index 8cbacd8..50e112d 100644
--- a/grudge/discretization.py
+++ b/grudge/discretization.py
@@ -27,7 +27,11 @@ from pytools import memoize_method
 from grudge import sym
 
 
-class Discretization(object):
+class DiscretizationBase(object):
+    pass
+
+
+class Discretization(DiscretizationBase):
     """
     .. attribute :: volume_discr
 
@@ -220,4 +224,31 @@ class Discretization(object):
                 or where == sym.VTAG_ALL)
 
 
+class PointsDiscretization(DiscretizationBase):
+    """Implements just enough of the discretization interface to be
+    able to smuggle some points into :func:`bind`.
+    """
+
+    def __init__(self, nodes):
+        self._nodes = nodes
+
+    def ambient_dim(self):
+        return self._nodes.shape[0]
+
+    @property
+    def mesh(self):
+        return self
+
+    @property
+    def nnodes(self):
+        return self._nodes.shape[-1]
+
+    def nodes(self):
+        return self._nodes
+
+    @property
+    def volume_discr(self):
+        return self
+
+
 # vim: foldmethod=marker
diff --git a/test/test_grudge.py b/test/test_grudge.py
index 0ceaf8f..bd47f82 100644
--- a/test/test_grudge.py
+++ b/test/test_grudge.py
@@ -333,6 +333,22 @@ def test_convergence_advec(ctx_factory, mesh_name, mesh_pars, op_type, flux_type
     assert eoc_rec.order_estimate() > order
 
 
+def test_foreign_points(ctx_factory):
+    pytest.importorskip("sumpy")
+    import sumpy.point_calculus as pc
+
+    cl_ctx = cl.create_some_context()
+    queue = cl.CommandQueue(cl_ctx)
+
+    dim = 2
+    cp = pc.CalculusPatch(np.zeros(dim))
+
+    from grudge.discretization import PointsDiscretization
+    pdiscr = PointsDiscretization(cl.array.to_device(queue, cp.points))
+
+    bind(pdiscr, sym.nodes(dim)**2)(queue)
+
+
 # You can test individual routines by typing
 # $ python test_grudge.py 'test_routine()'
 
-- 
GitLab