Skip to content

Commit 3b7d7ef

Browse files
committed
Clear code written to combine off/on-axis recurrence
1 parent c87b3c3 commit 3b7d7ef

File tree

3 files changed

+69
-13
lines changed

3 files changed

+69
-13
lines changed

sumpy/recurrence.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def get_reindexed_and_center_origin_on_axis_recurrence(pde) -> tuple[int, int,
425425
return n_initial, order, r_s
426426

427427
# ================ OFF-AXIS RECURRENCE =================
428-
def move_center_origin_source_arbitrary_expression(pde: LinearPDESystemOperator) -> sp.Expr:
428+
def _move_center_origin_source_arbitrary_expression(pde: LinearPDESystemOperator) -> sp.Expr:
429429
r"""
430430
A function that "shifts" the recurrence so it's center is placed
431431
at the origin and source is the input for the recurrence generated.
@@ -447,14 +447,14 @@ def move_center_origin_source_arbitrary_expression(pde: LinearPDESystemOperator)
447447
return r_ret
448448

449449

450-
def get_reindexed_and_center_origin_off_axis_recurrence(pde: LinearPDESystemOperator) -> sp.Expr:
450+
def get_reindexed_and_center_origin_off_axis_recurrence(pde: LinearPDESystemOperator) -> [int, int, sp.Expr]:
451451
r"""
452452
A function that takes in as input a pde and outputs a off-axis recurrence
453453
for derivatives taken at the origin with an arbitrary source location.
454454
The recurrence is reindexed so it gives s(n) in terms of s(n-1), ..., etc.
455455
"""
456456
var = _make_sympy_vec("x", 1)
457-
r_exp = move_center_origin_source_arbitrary_expression(pde).subs(var[0], 0)
457+
r_exp = _move_center_origin_source_arbitrary_expression(pde).subs(var[0], 0)
458458

459459
var = _make_sympy_vec("x", 2)
460460
var_t = _make_sympy_vec("t", 2)
@@ -469,7 +469,7 @@ def get_reindexed_and_center_origin_off_axis_recurrence(pde: LinearPDESystemOper
469469
return start_order, recur_order, recur
470470

471471

472-
def get_off_axis_expression(pde, taylor_order=4):
472+
def get_off_axis_expression(pde, taylor_order=4) -> [sp.Expr, int]:
473473
r"""
474474
A function that takes in as input a pde, and outputs
475475
the Taylor expression that gives the n th derivative

sumpy/recurrence_qbx.py

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@
3939
import numpy as np
4040
import 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

test/test_recurrence_qbx.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,4 @@ def _construct_laplace_axis_2d(orders, resolutions):
303303
plt.ylabel("Error")
304304
plt.title("2D Ellipse LP Eval Error")
305305
plt.legend()
306-
plt.show()
307-
308-
309-
306+
plt.show()

0 commit comments

Comments
 (0)