3939import numpy as np
4040import sympy as sp
4141
42- from sumpy .recurrence import _make_sympy_vec , get_reindexed_and_center_origin_on_axis_recurrence
42+ from sumpy .recurrence import (
43+ _make_sympy_vec ,
44+ get_off_axis_expression ,
45+ get_reindexed_and_center_origin_off_axis_recurrence ,
46+ get_reindexed_and_center_origin_on_axis_recurrence ,
47+ )
4348
4449
4550# ================ Transform/Rotate =================
@@ -114,11 +119,10 @@ def generate_lamb_expr(i, n_initial):
114119 for j in range (ndim ):
115120 arg_list .append (var [j ])
116121
117- lamb_expr_symb_deriv = sp .diff (g_x_y , var_t [0 ], i )
118- for j in range (ndim ):
119- lamb_expr_symb_deriv = lamb_expr_symb_deriv .subs (var_t [j ], 0 )
120-
121122 if i < n_initial :
123+ lamb_expr_symb_deriv = sp .diff (g_x_y , var_t [0 ], i )
124+ for j in range (ndim ):
125+ lamb_expr_symb_deriv = lamb_expr_symb_deriv .subs (var_t [j ], 0 )
122126 lamb_expr_symb = lamb_expr_symb_deriv
123127 else :
124128 lamb_expr_symb = recurrence .subs (n , i )
@@ -148,7 +152,61 @@ def generate_lamb_expr(i, n_initial):
148152
149153
150154 ### NEW CODE - COMPUTE OFF AXIS INTERACTIONS
155+ start_order , t_recur_order , t_recur = get_reindexed_and_center_origin_off_axis_recurrence (pde )
156+ t_exp , t_exp_order = get_off_axis_expression (pde )
157+ storage_taylor_order = max (t_recur_order , t_exp_order + 1 )
158+
159+ storage = [np .zeros ((n_p , n_p ))] * storage_taylor_order
160+
161+ def gen_lamb_expr_t_recur (i , start_order ):
162+ arg_list = []
163+ for j in range (t_recur_order , 0 , - 1 ):
164+ # pylint: disable-next=not-callable
165+ arg_list .append (s (i - j ))
166+ for j in range (ndim ):
167+ arg_list .append (var [j ])
168+
169+ if i < start_order :
170+ lamb_expr_symb_deriv = sp .diff (g_x_y , var_t [0 ], i )
171+ for j in range (ndim ):
172+ lamb_expr_symb_deriv = lamb_expr_symb_deriv .subs (var_t [j ], 0 )
173+ lamb_expr_symb = lamb_expr_symb_deriv
174+ else :
175+ lamb_expr_symb = t_recur .subs (n , i )
176+
177+ return lamb_expr_symb
178+
179+
180+ def gen_lamb_expr_t_exp (i , t_exp_order ):
181+ arg_list = []
182+ for j in range (t_exp_order , - 1 , - 1 ):
183+ # pylint: disable-next=not-callable
184+ arg_list .append (s (i - j ))
185+ for j in range (ndim ):
186+ arg_list .append (var [j ])
187+
188+ if i < t_exp_order :
189+ lamb_expr_symb_deriv = sp .diff (g_x_y , var_t [0 ], i )
190+ for j in range (ndim ):
191+ lamb_expr_symb_deriv = lamb_expr_symb_deriv .subs (var_t [j ], 0 )
192+ lamb_expr_symb = lamb_expr_symb_deriv .subs (var [0 ], 0 )
193+ else :
194+ lamb_expr_symb = t_exp .subs (n , i )
195+
196+ return lamb_expr_symb
197+
198+ interactions_off_axis = 0
199+ for i in range (p + 1 ):
200+ lamb_expr_t_recur = gen_lamb_expr_t_recur (i , start_order )
201+ a1 = [* storage [:- t_recur_order ], * coord ]
202+
203+ storage .pop (0 )
204+ storage .append (lamb_expr_t_recur (a1 ))
205+
206+ lamb_expr_t_exp = gen_lamb_expr_t_exp (i , t_exp_order )
207+ a2 = [* storage [:- (t_exp_order + 1 )], * coord ]
151208
209+ interactions_off_axis += lamb_expr_t_exp (a2 ) * radius ** i / math .factorial (i )
152210
153211 ################
154212
@@ -159,6 +217,7 @@ def generate_lamb_expr(i, n_initial):
159217
160218 interactions_total = np .zeros (coord [0 ].shape )
161219 interactions_total [mask_on_axis ] = interactions_on_axis [mask_on_axis ]
220+ interactions_total [mask_off_axis ] = interactions_off_axis [mask_off_axis ]
162221
163222 exp_res = (interactions_total * strengths [None , :]).sum (axis = 1 )
164223
0 commit comments