Skip to content

Commit 7afd5fc

Browse files
committed
Ratio seems to determine relative error in each iteration
1 parent c469921 commit 7afd5fc

File tree

4 files changed

+381
-46
lines changed

4 files changed

+381
-46
lines changed

test/gridfree_taylor_recurrence.ipynb

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
{
1111
"cell_type": "code",
12-
"execution_count": 1,
12+
"execution_count": 2,
1313
"metadata": {},
1414
"outputs": [],
1515
"source": [
@@ -35,19 +35,18 @@
3535
},
3636
{
3737
"cell_type": "code",
38-
"execution_count": 2,
38+
"execution_count": 3,
3939
"metadata": {},
4040
"outputs": [],
4141
"source": [
4242
"var = _make_sympy_vec(\"x\", 2)\n",
4343
"s = sp.Function(\"s\")\n",
44-
"n = sp.symbols(\"n\")\n",
45-
"i = sp.symbols(\"i\")"
44+
"n = sp.symbols(\"n\")"
4645
]
4746
},
4847
{
4948
"cell_type": "code",
50-
"execution_count": 3,
49+
"execution_count": 4,
5150
"metadata": {},
5251
"outputs": [],
5352
"source": [
@@ -59,70 +58,81 @@
5958
},
6059
{
6160
"cell_type": "code",
62-
"execution_count": 4,
61+
"execution_count": 5,
62+
"metadata": {},
63+
"outputs": [],
64+
"source": [
65+
"var = _make_sympy_vec(\"x\", 2)\n",
66+
"var_t = _make_sympy_vec(\"t\", 2)\n",
67+
"g_x_y = sp.log(sp.sqrt((var[0]-var_t[0])**2 + (var[1]-var_t[1])**2))\n",
68+
"derivs_laplace = [g_x_y.subs(var_t[0], 0).subs(var_t[1], 0).diff(var[0], i)\n",
69+
" for i in range(8)]"
70+
]
71+
},
72+
{
73+
"cell_type": "code",
74+
"execution_count": 23,
6375
"metadata": {},
6476
"outputs": [
6577
{
6678
"data": {
6779
"text/latex": [
68-
"$\\displaystyle \\frac{2 s{\\left(1 \\right)}}{x_{1}^{2}}$"
80+
"$\\displaystyle - \\frac{5040}{x_{1}^{8}}$"
6981
],
7082
"text/plain": [
71-
"2*s(1)/x1**2"
83+
"-5040/x1**8"
7284
]
7385
},
74-
"execution_count": 4,
86+
"execution_count": 23,
7587
"metadata": {},
7688
"output_type": "execute_result"
7789
}
7890
],
7991
"source": [
80-
"get_reindexed_and_center_origin_off_axis_recurrence(laplace2d)[2].subs(n, 3)"
92+
"i=4\n",
93+
"j=4\n",
94+
"derivs_laplace[i].diff(var[0], j).subs(var[0], 0)"
8195
]
8296
},
97+
{
98+
"cell_type": "markdown",
99+
"metadata": {},
100+
"source": []
101+
},
83102
{
84103
"cell_type": "code",
85-
"execution_count": 9,
104+
"execution_count": null,
86105
"metadata": {},
87-
"outputs": [
88-
{
89-
"data": {
90-
"text/plain": [
91-
"(x0**3*(((-6*n + (n + 2)**2 - 4)*s(n - 3)/x1**2 + (-5*n + (n + 2)**2 - 4)*s(n - 1)/x1**2)*(-5*n + (n + 4)**2 - 14)/(6*x1**2) + (-6*n + (n + 4)**2 - 16)*s(n - 1)/(6*x1**2)) + x0**2*((-6*n + (n + 3)**2 - 10)*s(n - 2)/(2*x1**2) + (-5*n + (n + 3)**2 - 9)*s(n)/(2*x1**2)) + x0*((-6*n + (n + 2)**2 - 4)*s(n - 3)/x1**2 + (-5*n + (n + 2)**2 - 4)*s(n - 1)/x1**2) + (-6*n + (n + 1)**2 + 2)*s(n - 4)/x1**2 + (-5*n + (n + 1)**2 + 1)*s(n - 2)/x1**2,\n",
92-
" 4)"
93-
]
94-
},
95-
"execution_count": 9,
96-
"metadata": {},
97-
"output_type": "execute_result"
98-
}
99-
],
106+
"outputs": [],
100107
"source": [
101-
"exp = get_off_axis_expression(helmholtz2d)\n",
102-
"exp"
108+
"k = 1\n",
109+
"abs_dist = sp.sqrt((var[0]-var_t[0])**2 +\n",
110+
" (var[1]-var_t[1])**2)\n",
111+
"g_x_y = (1j/4) * hankel1(0, k * abs_dist)\n",
112+
"derivs_helmholtz = [sp.diff(g_x_y,\n",
113+
" var_t[0], i).subs(var_t[0], 0).subs(var_t[1], 0)\n",
114+
" for i in range(6)]"
103115
]
104116
},
105117
{
106118
"cell_type": "code",
107-
"execution_count": 11,
119+
"execution_count": 1,
108120
"metadata": {},
109121
"outputs": [
110122
{
111-
"data": {
112-
"text/latex": [
113-
"$\\displaystyle \\frac{x_{0}^{3} \\left(- x_{1}^{2} \\left(6 n - \\left(n + 4\\right)^{2} + 16\\right) s{\\left(n - 1 \\right)} + \\left(\\left(5 n - \\left(n + 2\\right)^{2} + 4\\right) s{\\left(n - 1 \\right)} + \\left(6 n - \\left(n + 2\\right)^{2} + 4\\right) s{\\left(n - 3 \\right)}\\right) \\left(5 n - \\left(n + 4\\right)^{2} + 14\\right)\\right) + 3 x_{1}^{2} \\left(- x_{0}^{2} \\left(\\left(5 n - \\left(n + 3\\right)^{2} + 9\\right) s{\\left(n \\right)} + \\left(6 n - \\left(n + 3\\right)^{2} + 10\\right) s{\\left(n - 2 \\right)}\\right) - 2 x_{0} \\left(\\left(5 n - \\left(n + 2\\right)^{2} + 4\\right) s{\\left(n - 1 \\right)} + \\left(6 n - \\left(n + 2\\right)^{2} + 4\\right) s{\\left(n - 3 \\right)}\\right) + 2 \\left(- 6 n + \\left(n + 1\\right)^{2} + 2\\right) s{\\left(n - 4 \\right)} + 2 \\left(- 5 n + \\left(n + 1\\right)^{2} + 1\\right) s{\\left(n - 2 \\right)}\\right)}{6 x_{1}^{4}}$"
114-
],
115-
"text/plain": [
116-
"(x0**3*(-x1**2*(6*n - (n + 4)**2 + 16)*s(n - 1) + ((5*n - (n + 2)**2 + 4)*s(n - 1) + (6*n - (n + 2)**2 + 4)*s(n - 3))*(5*n - (n + 4)**2 + 14)) + 3*x1**2*(-x0**2*((5*n - (n + 3)**2 + 9)*s(n) + (6*n - (n + 3)**2 + 10)*s(n - 2)) - 2*x0*((5*n - (n + 2)**2 + 4)*s(n - 1) + (6*n - (n + 2)**2 + 4)*s(n - 3)) + 2*(-6*n + (n + 1)**2 + 2)*s(n - 4) + 2*(-5*n + (n + 1)**2 + 1)*s(n - 2)))/(6*x1**4)"
117-
]
118-
},
119-
"execution_count": 11,
120-
"metadata": {},
121-
"output_type": "execute_result"
123+
"ename": "NameError",
124+
"evalue": "name 'derivs_helmholtz' is not defined",
125+
"output_type": "error",
126+
"traceback": [
127+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
128+
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
129+
"Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mderivs_helmholtz\u001b[49m[\u001b[38;5;241m4\u001b[39m]\u001b[38;5;241m.\u001b[39mdiff(var[\u001b[38;5;241m1\u001b[39m], \u001b[38;5;241m0\u001b[39m)\u001b[38;5;241m.\u001b[39msubs(var[\u001b[38;5;241m1\u001b[39m], \u001b[38;5;241m0\u001b[39m)\n",
130+
"\u001b[0;31mNameError\u001b[0m: name 'derivs_helmholtz' is not defined"
131+
]
122132
}
123133
],
124134
"source": [
125-
"exp[0].simplify()"
135+
"derivs_helmholtz[4].diff(var[1], 0).subs(var[1], 0)"
126136
]
127137
},
128138
{

test/investigate_normal.py

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# %%
2+
from sumpy.recurrence import _make_sympy_vec, get_reindexed_and_center_origin_on_axis_recurrence
3+
4+
from sumpy.expansion.diff_op import (
5+
laplacian,
6+
make_identity_diff_op,
7+
)
8+
9+
10+
import sympy as sp
11+
from sympy import hankel1
12+
13+
import numpy as np
14+
15+
import math
16+
17+
import matplotlib.pyplot as plt
18+
from matplotlib import cm, ticker
19+
20+
# %%
21+
w = make_identity_diff_op(2)
22+
laplace2d = laplacian(w)
23+
n_init_lap, order_lap, recur_laplace = get_reindexed_and_center_origin_on_axis_recurrence(laplace2d)
24+
25+
w = make_identity_diff_op(2)
26+
helmholtz2d = laplacian(w) + w
27+
n_init_helm, order_helm, recur_helmholtz = get_reindexed_and_center_origin_on_axis_recurrence(helmholtz2d)
28+
29+
# %%
30+
var = _make_sympy_vec("x", 2)
31+
rct = sp.symbols("r_{ct}")
32+
s = sp.Function("s")
33+
n = sp.symbols("n")
34+
35+
# %%
36+
def compute_derivatives(p):
37+
var = _make_sympy_vec("x", 2)
38+
var_t = _make_sympy_vec("t", 2)
39+
g_x_y = sp.log(sp.sqrt((var[0]-var_t[0])**2 + (var[1]-var_t[1])**2))
40+
derivs = [sp.diff(g_x_y,
41+
var_t[0], i).subs(var_t[0], 0).subs(var_t[1], 0)
42+
for i in range(p)]
43+
return derivs
44+
l_max = 10
45+
derivs_laplace = compute_derivatives(l_max)
46+
47+
# %%
48+
def compute_derivatives_h2d(p):
49+
k = 1
50+
var = _make_sympy_vec("x", 2)
51+
var_t = _make_sympy_vec("t", 2)
52+
abs_dist = sp.sqrt((var[0]-var_t[0])**2 +
53+
(var[1]-var_t[1])**2)
54+
g_x_y = (1j/4) * hankel1(0, k * abs_dist)
55+
derivs_helmholtz = [sp.diff(g_x_y,
56+
var_t[0], i).subs(var_t[0], 0).subs(var_t[1], 0)
57+
for i in range(p)]
58+
return derivs_helmholtz
59+
h_max = 8
60+
#derivs_helmholtz = compute_derivatives_h2d(h_max)
61+
62+
# %%
63+
def evaluate_recurrence_lamb(coord_dict, recur, p, derivs_list, n_initial, n_order):
64+
s = sp.Function("s")
65+
subs_dict = {}
66+
for i in range(n_initial-n_order, 0):
67+
subs_dict[s(i)] = 0
68+
for i in range(n_initial):
69+
subs_dict[s(i)] = derivs_list[i].subs(coord_dict)
70+
var = _make_sympy_vec("x", 2)
71+
for i in range(n_initial, p):
72+
exp = recur.subs(n, i)
73+
f = sp.lambdify([var[0], var[1]] + [s(i-(1+k)) for k in range(n_order-1)], exp)
74+
subs_dict[s(i)] = f(*([coord_dict[var[0]], coord_dict[var[1]]] + [subs_dict[s(i-(1+k))] for k in range(n_order-1)]))
75+
for i in range(n_initial-n_order, 0):
76+
subs_dict.pop(s(i))
77+
return np.array(list(subs_dict.values()))
78+
79+
# %%
80+
def evaluate_true(coord_dict, p, derivs_list):
81+
retMe = []
82+
for i in range(p):
83+
exp = derivs_list[i]
84+
f = sp.lambdify(var, exp)
85+
retMe.append(f(coord_dict[var[0]], coord_dict[var[1]]))
86+
return np.array(retMe)
87+
88+
# %%
89+
def compute_error_coord(recur, loc, order, derivs_list, n_initial, n_order):
90+
var = _make_sympy_vec("x", 2)
91+
coord_dict = {var[0]: loc[0], var[1]: loc[1]}
92+
93+
exp = evaluate_recurrence_lamb(coord_dict, recur, order+1, derivs_list, n_initial, n_order)[order].evalf()
94+
95+
true = derivs_list[order].subs(coord_dict).evalf()
96+
97+
return (np.abs(exp-true)/np.abs(true))
98+
99+
# %%
100+
def generate_error_grid(res, order_plot, recur, derivs, n_initial, n_order):
101+
x_grid = [10**(pw) for pw in np.linspace(-8, 0, res)]
102+
y_grid = [10**(pw) for pw in np.linspace(-8, 0, res)]
103+
res=len(x_grid)
104+
plot_me = np.empty((res, res))
105+
for i in range(res):
106+
for j in range(res):
107+
if abs(x_grid[i]) == abs(y_grid[j]):
108+
plot_me[i, j] = 1e-16
109+
else:
110+
plot_me[i,j] = compute_error_coord(recur, np.array([x_grid[i],y_grid[j]]), order_plot, derivs, n_initial, n_order)
111+
if plot_me[i,j] == 0:
112+
plot_me[i, j] = 1e-16
113+
return x_grid, y_grid, plot_me
114+
115+
# %%
116+
order_plot = 5
117+
#x_grid, y_grid, plot_me_hem = generate_error_grid(res=5, order_plot=order_plot, recur=recur_helmholtz, derivs=derivs_helmholtz, n_initial=n_init_helm, n_order=order_helm)
118+
x_grid, y_grid, plot_me_lap = generate_error_grid(res=10, order_plot=order_plot, recur=recur_laplace, derivs=derivs_laplace, n_initial=n_init_lap, n_order=order_lap)
119+
plot_me_hem = plot_me_lap
120+
121+
122+
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 8))
123+
cs = ax1.contourf(x_grid, y_grid, plot_me_hem.T, locator=ticker.LogLocator(), cmap=cm.PuBu_r)
124+
cbar = fig.colorbar(cs)
125+
126+
cs = ax2.contourf(x_grid, y_grid, plot_me_lap.T, locator=ticker.LogLocator(), cmap=cm.PuBu_r)
127+
cbar = fig.colorbar(cs)
128+
ax1.set_xscale('log')
129+
ax1.set_yscale('log')
130+
ax1.set_xlabel("source x-coord", fontsize=15)
131+
ax1.set_ylabel("source y-coord", fontsize=15)
132+
133+
134+
ax2.set_xscale('log')
135+
ax2.set_yscale('log')
136+
ax2.set_xlabel("source x-coord", fontsize=15)
137+
ax2.set_ylabel("source y-coord", fontsize=15)
138+
139+
ax1.set_title("Helmholtz recurrence relative error for order = "+str(order_plot), fontsize=15)
140+
ax2.set_title("Laplace recurrence relative error for order = "+str(order_plot), fontsize=15)
141+
142+
fig.savefig('order'+str(order_plot))
143+
plt.show()
144+
145+
# %%
146+
147+
148+

0 commit comments

Comments
 (0)