From 6dc13e6b899480780a8e277b7b5135d7c63e1519 Mon Sep 17 00:00:00 2001
From: Isuru Fernando <isuruf@gmail.com>
Date: Wed, 8 Jul 2020 21:19:08 -0500
Subject: [PATCH] PDE -> DifferentialOperator

---
 sumpy/expansion/__init__.py            | 26 ++++++++++----------
 sumpy/expansion/{pde.py => diff_op.py} | 33 +++++++++++++-------------
 test/test_misc.py                      | 17 ++++++++-----
 3 files changed, 40 insertions(+), 36 deletions(-)
 rename sumpy/expansion/{pde.py => diff_op.py} (73%)

diff --git a/sumpy/expansion/__init__.py b/sumpy/expansion/__init__.py
index 971d0ed9..a3ed7c05 100644
--- a/sumpy/expansion/__init__.py
+++ b/sumpy/expansion/__init__.py
@@ -22,12 +22,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-from six.moves import range
 import logging
 from pytools import memoize_method
 import sumpy.symbolic as sym
 from sumpy.tools import add_mi
-from .pde import make_pde_sym, laplacian
+from .diff_op import make_identity_diff_op, laplacian
 
 __doc__ = """
 .. autoclass:: ExpansionBase
@@ -293,7 +292,7 @@ class CSEMatVecOperator(object):
 class LinearPDEBasedExpansionTermsWrangler(ExpansionTermsWrangler):
     """
     .. automethod:: __init__
-    .. automethod:: get_pde
+    .. automethod:: get_pde_as_diff_op
     """
 
     init_arg_names = ("order", "dim", "max_mi")
@@ -336,11 +335,10 @@ class LinearPDEBasedExpansionTermsWrangler(ExpansionTermsWrangler):
         stored_identifiers, _ = self.get_stored_ids_and_unscaled_projection_matrix()
         return stored_identifiers
 
-    def get_pde(self):
+    def get_pde_as_diff_op(self):
         r"""
-        Returns a :class:`sumpy.expansion.pde.PDE` object.
-        A PDE stores a dictionary of (mi, coeff) where mi is the multi-index
-        of the  derivative and coeff is the coefficient.
+        Returns the PDE as a :class:`sumpy.expansion.diff_op.DifferentialOperator`
+        object `L` where `L(u) = 0` is the PDE.
         """
 
         raise NotImplementedError
@@ -356,7 +354,7 @@ class LinearPDEBasedExpansionTermsWrangler(ExpansionTermsWrangler):
         coeff_ident_enumerate_dict = {tuple(mi): i for
                                             (i, mi) in enumerate(mis)}
 
-        pde_dict = self.get_pde().eq
+        pde_dict = self.get_pde_as_diff_op().eq
         for ident in pde_dict.keys():
             if ident not in coeff_ident_enumerate_dict:
                 # Order of the expansion is less than the order of the PDE.
@@ -471,8 +469,8 @@ class LaplaceExpansionTermsWrangler(LinearPDEBasedExpansionTermsWrangler):
         super(LaplaceExpansionTermsWrangler, self).__init__(order=order, dim=dim,
             max_mi=max_mi)
 
-    def get_pde(self):
-        w = make_pde_sym(self.dim)
+    def get_pde_as_diff_op(self):
+        w = make_identity_diff_op(self.dim)
         return laplacian(w)
 
 
@@ -485,8 +483,8 @@ class HelmholtzExpansionTermsWrangler(LinearPDEBasedExpansionTermsWrangler):
         super(HelmholtzExpansionTermsWrangler, self).__init__(order=order, dim=dim,
             max_mi=max_mi)
 
-    def get_pde(self, **kwargs):
-        w = make_pde_sym(self.dim)
+    def get_pde_as_diff_op(self, **kwargs):
+        w = make_identity_diff_op(self.dim)
         k = sym.Symbol(self.helmholtz_k_name)
         return (laplacian(w) + k**2 * w)
 
@@ -499,8 +497,8 @@ class BiharmonicExpansionTermsWrangler(LinearPDEBasedExpansionTermsWrangler):
         super(BiharmonicExpansionTermsWrangler, self).__init__(order=order, dim=dim,
             max_mi=max_mi)
 
-    def get_pde(self, **kwargs):
-        w = make_pde_sym(self.dim)
+    def get_pde_as_diff_op(self, **kwargs):
+        w = make_identity_diff_op(self.dim)
         return laplacian(laplacian(w))
 # }}}
 
diff --git a/sumpy/expansion/pde.py b/sumpy/expansion/diff_op.py
similarity index 73%
rename from sumpy/expansion/pde.py
rename to sumpy/expansion/diff_op.py
index 5aa93e4d..40dae7a4 100644
--- a/sumpy/expansion/pde.py
+++ b/sumpy/expansion/diff_op.py
@@ -25,22 +25,23 @@ THE SOFTWARE.
 from sumpy.tools import add_mi
 
 __doc__ = """
-PDE interface
--------------
+Differential operator interface
+-------------------------------
 
-.. autoclass:: PDE
+.. autoclass:: DifferentialOperator
 """
 
 
-class PDE(object):
+class DifferentialOperator(object):
     r"""
-    Represents a scalar, constant-coefficient PDE of dimension `dim`.
-    It is represented by a dictionary. The dictionary maps a multi-index
-    given as a tuple to the coefficient. This object is immutable.
+    Represents a scalar, constant-coefficient DifferentialOperator of
+    dimension `dim`. It is represented by a dictionary. The dictionary
+    maps a multi-index given as a tuple to the coefficient.
+    This object is immutable.
     """
     def __init__(self, dim, eq):
         """
-        :arg dim: dimension of the PDE
+        :arg dim: dimension of the DifferentialOperator
         :arg eq: A dictionary mapping a multi-index to a coefficient
         """
         self.dim = dim
@@ -50,7 +51,7 @@ class PDE(object):
         eq = {}
         for k, v in self.eq.items():
             eq[k] = v * param
-        return PDE(self.dim, eq)
+        return DifferentialOperator(self.dim, eq)
 
     __rmul__ = __mul__
 
@@ -62,7 +63,7 @@ class PDE(object):
                 res[k] += v
             else:
                 res[k] = v
-        return PDE(self.dim, res)
+        return DifferentialOperator(self.dim, res)
 
     __radd__ = __add__
 
@@ -70,12 +71,12 @@ class PDE(object):
         return self + (-1)*other_pde
 
     def __repr__(self):
-        return f"PDE({self.dim}, {repr(self.eq)})"
+        return f"DifferentialOperator({self.dim}, {repr(self.eq)})"
 
 
 def laplacian(pde):
     dim = pde.dim
-    res = PDE(dim, {})
+    res = DifferentialOperator(dim, {})
     for j in range(dim):
         mi = [0]*dim
         mi[j] = 2
@@ -87,12 +88,12 @@ def diff(pde, mi):
     res = {}
     for eq_mi, v in pde.eq.items():
         res[add_mi(eq_mi, mi)] = v
-    return PDE(pde.dim, res)
+    return DifferentialOperator(pde.dim, res)
 
 
-def make_pde_sym(dim):
+def make_identity_diff_op(dim):
     """
-    Returns a PDE u = 0
+    Returns the identity as a differential operator.
     """
     mi = tuple([0]*dim)
-    return PDE(dim, {mi: 1})
+    return DifferentialOperator(dim, {mi: 1})
diff --git a/test/test_misc.py b/test/test_misc.py
index 8823d183..d43c736b 100644
--- a/test/test_misc.py
+++ b/test/test_misc.py
@@ -279,19 +279,24 @@ def test_toy_p2e2e2p(ctx_factory, case):
 
 
 def test_cse_matvec():
-    from sumpy.expansion import CSEMatVec
-    assignments = [[], [(0, 3)], [], [(2, 7), (1, 5)]]
-    op = CSEMatVec(assignments)
-    m = np.array([[1, 0], [3, 0], [0, 1], [15, 7]])
+    from sumpy.expansion import CSEMatVecOperator
+    assignments = [
+        ([(0, 2)], []),
+        ([], [(0, 3)]),
+        ([(1, 1)], []),
+        ([(1, 9)], [(2, 7), (1, 5)]),
+    ]
+    op = CSEMatVecOperator(assignments, shape=(4, 2))
+    m = np.array([[2, 0], [6, 0], [0, 1], [30, 16]])
 
     vec = np.random.random(2)
     expected_result = m @ vec
-    actual_result = op.matvec(vec, sac=None)
+    actual_result = op.matvec(vec)
     assert np.allclose(expected_result, actual_result)
 
     vec = np.random.random(4)
     expected_result = m.T @ vec
-    actual_result = op.transpose_matvec(vec, sac=None)
+    actual_result = op.transpose_matvec(vec)
     assert np.allclose(expected_result, actual_result)
 
 
-- 
GitLab