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