@@ -139,15 +139,14 @@ def test_biharmonic2d():
139139 var = _make_sympy_vec ("x" , 2 )
140140 var_t = _make_sympy_vec ("t" , 2 )
141141 abs_dist = sp .sqrt ((var [0 ]- var_t [0 ])** 2 + (var [1 ]- var_t [1 ])** 2 )
142- w = make_identity_diff_op (2 )
143-
144- partial_1x = DerivativeIdentifier ((4 ,0 ), 0 )
145- partial_1y = DerivativeIdentifier ((0 ,4 ), 0 )
146- biharmonic_op = {partial_1x : 1 , partial_1y : 1 }
142+ partial_4x = DerivativeIdentifier ((4 ,0 ), 0 )
143+ partial_4y = DerivativeIdentifier ((0 ,4 ), 0 )
144+ partial_2x2y = DerivativeIdentifier ((2 ,2 ), 0 )
145+ biharmonic_op = {partial_4x : 1 , partial_4y : 1 , partial_2x2y :2 }
147146 list_pde = immutabledict (biharmonic_op )
148-
149147 biharmonic_pde = LinearPDESystemOperator (2 , (list_pde ,))
150- g_x_y = abs_dist ** 2 * (sp .log (abs_dist )- 1 )
148+
149+ g_x_y = abs_dist ** 2 * (sp .log (abs_dist ))
151150
152151 n_init , _ , r = get_reindexed_and_center_origin_on_axis_recurrence (biharmonic_pde )
153152
@@ -156,15 +155,15 @@ def test_biharmonic2d():
156155 for i in range (8 )]
157156
158157 x_coord = np .random .rand () # noqa: NPY002
159- y_coord = np .random .rand () # noqa: NPY002
158+ y_coord = np .random .rand () * 1e-3 # noqa: NPY002
160159 coord_dict = {var [0 ]: x_coord , var [1 ]: y_coord }
161160 derivs = [d .subs (coord_dict ) for d in derivs ]
162161
163162 n = sp .symbols ("n" )
164163 s = sp .Function ("s" )
165164
166165 # pylint: disable-next=not-callable
167- subs_dict = {s (0 ): derivs [0 ], s (1 ): derivs [1 ], s (2 ): derivs [1 ], s (3 ): derivs [1 ]}
166+ subs_dict = {s (0 ): derivs [0 ], s (1 ): derivs [1 ], s (2 ): derivs [2 ], s (3 ): derivs [3 ]}
168167 check = []
169168
170169 assert n_init == 4
@@ -175,13 +174,13 @@ def test_biharmonic2d():
175174 subs_dict [s (i )] = derivs [i ]
176175
177176 f2 = sp .lambdify ([var [0 ], var [1 ]], check [0 ])
178- assert abs (f2 (x_coord , y_coord )) <= 1e-13
177+ assert abs (f2 (x_coord , y_coord )) <= 1e-11
179178 f3 = sp .lambdify ([var [0 ], var [1 ]], check [1 ])
180- assert abs (f3 (x_coord , y_coord )) <= 1e-13
179+ assert abs (f3 (x_coord , y_coord )) <= 1e-11
181180 f4 = sp .lambdify ([var [0 ], var [1 ]], check [2 ])
182- assert abs (f4 (x_coord , y_coord )) <= 1e-13
181+ assert abs (f4 (x_coord , y_coord )) <= 1e-11
183182 f5 = sp .lambdify ([var [0 ], var [1 ]], check [3 ])
184- assert abs (f5 (x_coord , y_coord )) <= 1e-12
183+ assert abs (f5 (x_coord , y_coord )) <= 1e-11
185184
186185test_biharmonic2d ()
187186
@@ -334,6 +333,69 @@ def test_helmholtz_2d_off_axis(deriv_order, exp_order):
334333 #assert relerr <= prederror
335334
336335
336+ def test_helmholtz_2d_off_axis (deriv_order , exp_order ):
337+ r"""
338+ Tests off-axis recurrence code for orders up to 6 laplace2d.
339+ """
340+ w = make_identity_diff_op (2 )
341+ helmholtz2d = laplacian (w ) + w
342+
343+ n = sp .symbols ("n" )
344+ s = sp .Function ("s" )
345+
346+ var = _make_sympy_vec ("x" , 2 )
347+ var_t = _make_sympy_vec ("t" , 2 )
348+ abs_dist = sp .sqrt ((var [0 ]- var_t [0 ])** 2 +
349+ (var [1 ]- var_t [1 ])** 2 )
350+ g_x_y = abs_dist ** 2 * sp .log (abs_dist )
351+ derivs = [sp .diff (g_x_y ,
352+ var_t [0 ], i ).subs (var_t [0 ], 0 ).subs (var_t [1 ], 0 )
353+ for i in range (6 )]
354+
355+ x_coord = 1e-2 * np .random .rand () # noqa: NPY002
356+ y_coord = np .random .rand () # noqa: NPY002
357+ coord_dict = {var [0 ]: x_coord , var [1 ]: y_coord }
358+ start_order , recur_order , recur = get_reindexed_and_center_origin_off_axis_recurrence (helmholtz2d )
359+
360+ ic = []
361+ #Generate ic
362+
363+ for i in range (start_order ):
364+ ic .append (derivs [i ].subs (var [0 ], 0 ).subs (var [1 ], coord_dict [var [1 ]]))
365+
366+ n = sp .symbols ("n" )
367+ for i in range (start_order , 15 ):
368+ recur_eval = recur .subs (var [0 ], coord_dict [var [0 ]]).subs (var [1 ], coord_dict [var [1 ]]).subs (n , i )
369+ for j in range (i - recur_order , i ):
370+ recur_eval = recur_eval .subs (s (j ), ic [j ])
371+ ic .append (recur_eval )
372+
373+ ic = np .array (ic )
374+
375+ #true_ic = np.array([derivs[i].subs(var[0], 0).subs(var[1], coord_dict[var[1]]) for i in range(15)])
376+
377+ #assert np.max(np.abs(ic[::2]-true_ic[::2])/np.abs(true_ic[::2])) < 1e-8
378+ #print(np.max(np.abs(ic[::2]-true_ic[::2])/np.abs(true_ic[::2])))
379+
380+ # CHECK ACCURACY OF EXPRESSION FOR deriv_order
381+
382+ exp , exp_range , _ = get_off_axis_expression (helmholtz2d , exp_order )
383+ approx_deriv = exp .subs (n , deriv_order )
384+ for i in range (- exp_range + deriv_order , deriv_order + 1 ):
385+ approx_deriv = approx_deriv .subs (s (i ), ic [i ])
386+
387+ rat = coord_dict [var [0 ]]/ coord_dict [var [1 ]]
388+ if deriv_order + exp_order % 2 == 0 :
389+ prederror = abs ((ic [deriv_order + exp_order + 2 ] * coord_dict [var [0 ]]** (exp_order + 2 )/ math .factorial (exp_order + 2 )).evalf ())
390+ else :
391+ prederror = abs ((ic [deriv_order + exp_order + 1 ] * coord_dict [var [0 ]]** (exp_order + 1 )/ math .factorial (exp_order + 1 )).evalf ())
392+ print ("PREDICTED ERROR: " , prederror )
393+ relerr = abs (((approx_deriv - derivs [deriv_order ])/ derivs [deriv_order ]).subs (var [0 ], coord_dict [var [0 ]]).subs (var [1 ], coord_dict [var [1 ]]).evalf ())
394+ print ("RELATIVE ERROR: " , relerr )
395+ print ("RATIO(x0/x1): " , rat )
396+ #assert relerr <= prederror
397+
398+
337399def test_laplace_2d_off_axis (deriv_order , exp_order ):
338400 r"""
339401 Tests off-axis recurrence code for orders up to 6 laplace2d.
0 commit comments