Skip to content

Commit 294aa61

Browse files
committed
add asymline expansion + support for different tau values
1 parent 56f3668 commit 294aa61

File tree

1 file changed

+91
-1
lines changed

1 file changed

+91
-1
lines changed

sumpy/expansion/local.py

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
106106
# {{{ line taylor
107107

108108
class LineTaylorLocalExpansion(LocalExpansionBase):
109+
def __init__(self, kernel, order, tau=1, use_rscale=None, m2l_translation=None):
110+
super().__init__(kernel, order, use_rscale, m2l_translation)
111+
self.tau = tau
112+
113+
109114
def get_storage_index(self, k):
110115
return k
111116

@@ -149,8 +154,88 @@ def coefficients_from_source(self, kernel, avec, bvec, rscale, sac=None):
149154

150155
def evaluate(self, tgt_kernel, coeffs, bvec, rscale, sac=None):
151156
# no point in heeding rscale here--just ignore it
157+
158+
return sym.Add(*(
159+
coeffs[self.get_storage_index(i)] / math.factorial(i) * self.tau**i
160+
for i in self.get_coefficient_identifiers()))
161+
162+
def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
163+
dvec, tgt_rscale, sac=None, m2l_translation_classes_dependent_data=None):
164+
raise NotImplementedError
165+
166+
# }}}
167+
168+
169+
# {{{ Asymline taylor
170+
class AsymLineTaylorLocalExpansion(LocalExpansionBase):
171+
def __init__(self, kernel, asymptotic, order, tau=1, use_rscale=None, m2l_translation=None):
172+
super().__init__(kernel, order, use_rscale, m2l_translation)
173+
self.asymptotic = asymptotic
174+
self.tau = tau
175+
176+
177+
def get_storage_index(self, k):
178+
return k
179+
180+
def get_coefficient_identifiers(self):
181+
return list(range(self.order+1))
182+
183+
def get_asymptotic_expression(self, scaled_dist_vec):
184+
from sumpy.symbolic import PymbolicToSympyMapperWithSymbols, Symbol
185+
186+
expr = PymbolicToSympyMapperWithSymbols()(self.asymptotic)
187+
expr = expr.xreplace({Symbol(f"d{i}"): dist_vec_i for i, dist_vec_i in enumerate(scaled_dist_vec)})
188+
189+
tau = sym.Symbol("tau")
190+
191+
b = scaled_dist_vec.applyfunc(lambda expr: expr.coeff(tau))
192+
a = scaled_dist_vec - tau*b
193+
expr = expr.subs({Symbol(f"a{i}"): a_i for i, a_i in enumerate(a)})
194+
expr = expr.subs({Symbol(f"b{i}"): b_i for i, b_i in enumerate(b)})
195+
196+
return expr
197+
198+
199+
def coefficients_from_source(self, kernel, avec, bvec, rscale, sac=None):
200+
# no point in heeding rscale here--just ignore it
201+
if bvec is None:
202+
raise RuntimeError("cannot use line-Taylor expansions in a setting "
203+
"where the center-target vector is not known at coefficient "
204+
"formation")
205+
206+
tau = sym.Symbol("tau")
207+
208+
avec_line = avec + tau*bvec
209+
line_kernel = kernel.get_expression(avec_line) / self.get_asymptotic_expression(avec_line)
210+
211+
from sumpy.symbolic import USE_SYMENGINE
212+
if USE_SYMENGINE:
213+
214+
from sumpy.derivative_taker import ExprDerivativeTaker
215+
deriv_taker = ExprDerivativeTaker(line_kernel, (tau,), sac=sac, rscale=1)
216+
217+
return [kernel.postprocess_at_source(
218+
deriv_taker.diff(i), avec).subs(tau, 0)
219+
for i in self.get_coefficient_identifiers()]
220+
else:
221+
# Workaround for sympy. The automatic distribution after
222+
# single-variable diff makes the expressions very large
223+
# (https://github.com/sympy/sympy/issues/4596), so avoid doing
224+
# single variable diff.
225+
#
226+
# See also https://gitlab.tiker.net/inducer/pytential/merge_requests/12
227+
228+
return [kernel.postprocess_at_source(
229+
line_kernel.diff(tau, i), avec)
230+
.subs(tau, 0)
231+
for i in self.get_coefficient_identifiers()]
232+
233+
234+
def evaluate(self, tgt_kernel, coeffs, bvec, rscale, sac=None):
235+
# no point in heeding rscale here--just ignore it
236+
152237
return sym.Add(*(
153-
coeffs[self.get_storage_index(i)] / math.factorial(i)
238+
coeffs[self.get_storage_index(i)] / math.factorial(i) * self.tau**i
154239
for i in self.get_coefficient_identifiers()))
155240

156241
def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
@@ -160,6 +245,11 @@ def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
160245
# }}}
161246

162247

248+
249+
250+
251+
252+
163253
# {{{ volume taylor
164254

165255
class VolumeTaylorLocalExpansionBase(VolumeTaylorExpansionMixin, LocalExpansionBase):

0 commit comments

Comments
 (0)