@@ -106,6 +106,11 @@ def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
106106# {{{ line taylor
107107
108108class 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
165255class VolumeTaylorLocalExpansionBase (VolumeTaylorExpansionMixin , LocalExpansionBase ):
0 commit comments