Skip to content

Commit c469921

Browse files
committed
Truncation error eradicated :). Check helmholtz next
1 parent a77773d commit c469921

File tree

4 files changed

+22
-18
lines changed

4 files changed

+22
-18
lines changed

sumpy/recurrence.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -473,19 +473,23 @@ 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
476-
as a truncated taylor_order th order Taylor series with respect to x_1 and
476+
as a truncated taylor_order th order Taylor series with respect to x_0 and
477477
s(i) where s(i) comes from the off-axis recurrence. See
478478
get_reindexed_and_center_origin_off_axis_recurrence.
479479
480480
Also outputs the number of coefficients it needs from nth order.
481481
So if it outputs 3 as the second return value, then it needs
482482
s(deriv_order), s(deriv_order-1), ..., s(deriv_order-3).
483+
484+
YOU CANNOT SUB N < START_ORDER INTO THE OUTPUTTED EXPRESSION.
485+
I CANNOT REARRANGE THE EXPRESSION IN THIS CASE TO HAVE INDICES
486+
LOWER THAN THE SUBSITUTED N VALUE.
483487
"""
484488
s = sp.Function("s")
485489
n = sp.symbols("n")
486490
deriv_order = n
487491

488-
t_recurrence = get_reindexed_and_center_origin_off_axis_recurrence(pde)[2]
492+
start_order, _, t_recurrence = get_reindexed_and_center_origin_off_axis_recurrence(pde)
489493
var = _make_sympy_vec("x", 2)
490494
exp = 0
491495
for i in range(taylor_order+1):
@@ -507,4 +511,4 @@ def get_off_axis_expression(pde, taylor_order=4) -> [sp.Expr, int]:
507511

508512
idx_l, _ = _extract_idx_terms_from_recurrence(exp)
509513

510-
return exp*(-1)**n, -min(idx_l)
514+
return exp*(-1)**n, -min(idx_l), start_order

sumpy/recurrence_qbx.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def generate_lamb_expr(i, n_initial):
153153

154154
### NEW CODE - COMPUTE OFF AXIS INTERACTIONS
155155
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, 8)
156+
t_exp, t_exp_order, _ = get_off_axis_expression(pde, 8)
157157
storage_taylor_order = max(t_recur_order, t_exp_order+1)
158158

159159
storage_taylor = [np.zeros((n_p, n_p))] * storage_taylor_order
@@ -176,15 +176,15 @@ def gen_lamb_expr_t_recur(i, start_order):
176176
return sp.lambdify(arg_list, lamb_expr_symb)
177177

178178

179-
def gen_lamb_expr_t_exp(i, t_exp_order):
179+
def gen_lamb_expr_t_exp(i, t_exp_order, start_order):
180180
arg_list = []
181181
for j in range(t_exp_order, -1, -1):
182182
# pylint: disable-next=not-callable
183183
arg_list.append(s(i-j))
184184
for j in range(ndim):
185185
arg_list.append(var[j])
186186

187-
if i < t_exp_order:
187+
if i < start_order:
188188
lamb_expr_symb_deriv = sp.diff(g_x_y, var_t[0], i)
189189
for j in range(ndim):
190190
lamb_expr_symb_deriv = lamb_expr_symb_deriv.subs(var_t[j], 0)
@@ -203,7 +203,7 @@ def gen_lamb_expr_t_exp(i, t_exp_order):
203203
storage_taylor.pop(0)
204204
storage_taylor.append(lamb_expr_t_recur(*a1) + np.zeros((n_p, n_p)))
205205

206-
lamb_expr_t_exp = gen_lamb_expr_t_exp(i, t_exp_order)
206+
lamb_expr_t_exp = gen_lamb_expr_t_exp(i, t_exp_order, start_order)
207207
a2 = [*storage_taylor[-(t_exp_order+1):], *coord]
208208

209209
interactions_off_axis += lamb_expr_t_exp(*a2) * radius**i/math.factorial(i)
@@ -231,7 +231,6 @@ def generate_true(i):
231231
a4 = [*coord]
232232
s_new_true = lamb_expr_true(*a4)
233233
interactions_true += s_new_true * radius**i/math.factorial(i)
234-
235234
###############
236235

237236
#slope of line y = mx
@@ -251,14 +250,13 @@ def generate_true(i):
251250
print("Y:", coord[1][mask_on_axis].reshape(-1)[np.argmax(relerr_on)])
252251

253252
print("-------------------------")
254-
253+
255254
if np.any(mask_off_axis):
256255
relerr_off = np.abs(interactions_off_axis[mask_off_axis]-interactions_true[mask_off_axis])/np.abs(interactions_off_axis[mask_off_axis])
257256
print("MAX OFF AXIS ERROR(", percent_off, "):", np.max(relerr_off))
258257
print(np.mean(relerr_off))
259258
print("X:", coord[0][mask_off_axis].reshape(-1)[np.argmax(relerr_off)])
260-
print("Y:", coord[1][mask_off_axis].reshape(-1)[np.argmax(relerr_off)])
261-
259+
print("Y:", coord[1][mask_off_axis].reshape(-1)[np.argmax(relerr_off)])
262260

263261
interactions_total = np.zeros(coord[0].shape)
264262
interactions_total[mask_on_axis] = interactions_on_axis[mask_on_axis]

test/test_recurrence.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def test_helmholtz_2d_off_axis(deriv_order, exp_order):
257257

258258
# CHECK ACCURACY OF EXPRESSION FOR deriv_order
259259

260-
exp, exp_range = get_off_axis_expression(helmholtz2d, exp_order)
260+
exp, exp_range, _ = get_off_axis_expression(helmholtz2d, exp_order)
261261
approx_deriv = exp.subs(n, deriv_order)
262262
for i in range(-exp_range+deriv_order, deriv_order+1):
263263
approx_deriv = approx_deriv.subs(s(i), ic[i])
@@ -317,7 +317,9 @@ def test_laplace_2d_off_axis(deriv_order, exp_order):
317317

318318
# CHECK ACCURACY OF EXPRESSION FOR deriv_order
319319

320-
exp, exp_range = get_off_axis_expression(laplace2d, exp_order)
320+
exp, exp_range, start_order = get_off_axis_expression(laplace2d, exp_order)
321+
322+
assert deriv_order >= start_order
321323
approx_deriv = exp.subs(n, deriv_order)
322324
for i in range(-exp_range+deriv_order, deriv_order+1):
323325
approx_deriv = approx_deriv.subs(s(i), ic[i])

test/test_recurrence_qbx.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,15 +294,15 @@ def _construct_laplace_axis_2d(orders, resolutions):
294294
return err
295295

296296
import matplotlib.pyplot as plt
297-
orders = [1]
297+
orders = [10, 16]
298298
#resolutions = range(200, 800, 200)
299-
resolutions = [400]
299+
resolutions = [400, 800, 1200]
300300
err_mat = _construct_laplace_axis_2d(orders, resolutions)
301301

302302
for i in range(len(orders)):
303-
plt.plot(resolutions, err_mat[i], label="order QBX="+str(orders[i]))
303+
plt.scatter(resolutions, err_mat[i], label="order QBX="+str(orders[i]))
304304
plt.xlabel("Number of Nodes")
305-
plt.ylabel("Error")
306-
plt.title("2D Ellipse LP Eval Error")
305+
plt.ylabel("Relative Error")
306+
plt.title("2D Ellipse LP Eval Error (m=10)")
307307
plt.legend()
308308
plt.show()

0 commit comments

Comments
 (0)