From f3d294981f770bd34a25e3c3f6f80ea8443ae60c Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Mon, 4 May 2020 12:04:31 -0500 Subject: [PATCH] Make get_derivative_taker part of expansion and not kernel --- sumpy/expansion/__init__.py | 8 ++++++++ sumpy/expansion/local.py | 6 +++--- sumpy/expansion/multipole.py | 2 +- sumpy/kernel.py | 15 --------------- sumpy/symbolic.py | 4 ++-- sumpy/tools.py | 12 +++++++----- test/test_kernels.py | 2 +- 7 files changed, 22 insertions(+), 27 deletions(-) diff --git a/sumpy/expansion/__init__.py b/sumpy/expansion/__init__.py index 9d3a917a..9c6a84ae 100644 --- a/sumpy/expansion/__init__.py +++ b/sumpy/expansion/__init__.py @@ -57,6 +57,7 @@ class ExpansionBase(object): .. automethod:: translate_from .. automethod:: __eq__ .. automethod:: __ne__ + .. automethod:: get_kernel_derivative_taker """ def __init__(self, kernel, order, use_rscale=None): @@ -155,6 +156,13 @@ class ExpansionBase(object): def __ne__(self, other): return not self.__eq__(other) + def get_kernel_derivative_taker(self, dvec): + """Return a MiDerivativeTaker instance that supports taking + derivatives of the kernel with respect to dvec + """ + from sumpy.tools import MiDerivativeTaker + return MiDerivativeTaker(self.kernel.get_expression(dvec), dvec) + # }}} diff --git a/sumpy/expansion/local.py b/sumpy/expansion/local.py index 5db686dc..3879f50d 100644 --- a/sumpy/expansion/local.py +++ b/sumpy/expansion/local.py @@ -123,7 +123,7 @@ class VolumeTaylorLocalExpansionBase(LocalExpansionBase): from sumpy.tools import MiDerivativeTakerWrapper result = [] - taker = self.kernel.get_derivative_taker(avec) + taker = self.get_kernel_derivative_taker(avec) for mi in self.get_coefficient_identifiers(): wrapper = MiDerivativeTakerWrapper(taker, mi) mi_expr = self.kernel.postprocess_at_source(wrapper, avec) @@ -175,7 +175,7 @@ class VolumeTaylorLocalExpansionBase(LocalExpansionBase): # This code speeds up derivative taking by caching all kernel # derivatives. - taker = src_expansion.kernel.get_derivative_taker(dvec) + taker = src_expansion.get_kernel_derivative_taker(dvec) from sumpy.tools import add_mi, _fft_uneval_expr from pytools import generate_nonnegative_integer_tuples_below as gnitb @@ -205,7 +205,7 @@ class VolumeTaylorLocalExpansionBase(LocalExpansionBase): # The vector has the kernel derivatives and depends only on the distance # between the two centers - taker = src_expansion.kernel.get_derivative_taker(dvec) + taker = src_expansion.get_kernel_derivative_taker(dvec) vector_stored = [] # Calculate the kernel derivatives for the compressed set for term in \ diff --git a/sumpy/expansion/multipole.py b/sumpy/expansion/multipole.py index 8186e460..c4b7f098 100644 --- a/sumpy/expansion/multipole.py +++ b/sumpy/expansion/multipole.py @@ -104,7 +104,7 @@ class VolumeTaylorMultipoleExpansionBase(MultipoleExpansionBase): if knl is None: knl = self.kernel - taker = knl.get_derivative_taker(bvec) + taker = self.get_kernel_derivative_taker(bvec) expr_dict = {(0,)*self.dim: 1} expr_dict = knl.get_derivative_transformation_at_target(expr_dict) pp_nderivatives = single_valued(sum(mi) for mi in expr_dict.keys()) diff --git a/sumpy/kernel.py b/sumpy/kernel.py index e020841d..e470e48d 100644 --- a/sumpy/kernel.py +++ b/sumpy/kernel.py @@ -127,7 +127,6 @@ class Kernel(object): .. automethod:: adjust_for_kernel_scaling .. automethod:: postprocess_at_source .. automethod:: postprocess_at_target - .. automethod:: get_derivative_taker .. automethod:: get_global_scaling_const .. automethod:: get_args .. automethod:: get_source_args @@ -356,13 +355,6 @@ class Kernel(object): """ return [] - def get_derivative_taker(self, dvec): - """Return a MiDerivativeTaker instance that supports taking the - derivatives of this kernel - """ - from sumpy.tools import MiDerivativeTaker - return MiDerivativeTaker(self.get_expression(dvec), dvec) - # }}} @@ -497,13 +489,6 @@ class LaplaceKernel(ExpressionKernel): def __repr__(self): return "LapKnl%dD" % self.dim - def get_derivative_taker(self, dvec): - from sumpy.tools import Laplace3DDerivativeTaker, MiDerivativeTaker - if self.dim == 3: - return Laplace3DDerivativeTaker(self.get_expression(dvec), dvec) - else: - return MiDerivativeTaker(self.get_expression(dvec), dvec) - mapper_method = "map_laplace_kernel" diff --git a/sumpy/symbolic.py b/sumpy/symbolic.py index b63fca68..0fed239d 100644 --- a/sumpy/symbolic.py +++ b/sumpy/symbolic.py @@ -82,11 +82,11 @@ if USE_SYMENGINE: import symengine as sym from pymbolic.interop.symengine import ( PymbolicToSymEngineMapper as PymbolicToSympyMapper, - SymEngineToPymbolicMapper as SympyToPymbolicMapper, make_cse) + SymEngineToPymbolicMapper as SympyToPymbolicMapper) else: import sympy as sym from pymbolic.interop.sympy import ( - PymbolicToSympyMapper, SympyToPymbolicMapper, make_cse) + PymbolicToSympyMapper, SympyToPymbolicMapper) for _apifunc in SYMBOLIC_API: globals()[_apifunc] = getattr(sym, _apifunc) diff --git a/sumpy/tools.py b/sumpy/tools.py index 34936601..c2b9b132 100644 --- a/sumpy/tools.py +++ b/sumpy/tools.py @@ -142,10 +142,10 @@ class MiDerivativeTaker(object): key=lambda other_mi: sum(self.mi_dist(mi, other_mi))) -class Laplace3DDerivativeTaker(MiDerivativeTaker): +class LaplaceDerivativeTaker(MiDerivativeTaker): def __init__(self, expr, var_list): - super(Laplace3DDerivativeTaker, self).__init__(expr, var_list) + super(LaplaceDerivativeTaker, self).__init__(expr, var_list) self.r = sym.sqrt(sum(v**2 for v in var_list)) def diff(self, mi): @@ -155,7 +155,7 @@ class Laplace3DDerivativeTaker(MiDerivativeTaker): try: expr = self.cache_by_mi[mi] except KeyError: - if max(mi) == 1: + if max(mi) == 1 or len(self.var_list) == 2: return MiDerivativeTaker.diff(self, mi) d = -1 for i in range(3): @@ -170,10 +170,12 @@ class Laplace3DDerivativeTaker(MiDerivativeTaker): mi_minus_two = list(mi) mi_minus_two[i] -= 2 if i == d: - expr -= (2*mi[i]-1)*self.var_list[i]*self.diff(tuple(mi_minus_one)) + expr -= (2*mi[i]-1)*self.var_list[i]*self.diff( + tuple(mi_minus_one)) expr -= (mi[i]-1)**2*self.diff(tuple(mi_minus_two)) else: - expr -= (2*mi[i])*self.var_list[i]*self.diff(tuple(mi_minus_one)) + expr -= (2*mi[i])*self.var_list[i]*self.diff( + tuple(mi_minus_one)) expr -= mi[i]*(mi[i]-1)*self.diff(tuple(mi_minus_two)) expr /= self.r**2 self.cache_by_mi[mi] = expr diff --git a/test/test_kernels.py b/test/test_kernels.py index a1d5fec4..64c5b217 100644 --- a/test/test_kernels.py +++ b/test/test_kernels.py @@ -366,7 +366,7 @@ def _m2l_translate_simple(tgt_expansion, src_expansion, src_coeff_exprs, src_rsc # # To get the local expansion coefficients, we take derivatives of # the multipole expansion. - taker = src_expansion.kernel.get_derivative_taker(dvec) + taker = src_expansion.get_kernel_derivative_taker(dvec) from sumpy.tools import add_mi -- GitLab