Skip to content
Snippets Groups Projects

test_identities: Run on sphere.

Merged Matt Wala requested to merge identities-3d-actually-this-time into master
+ 26
13
@@ -723,12 +723,12 @@ def get_sphere_mesh(refinement_increment, target_order):
@@ -723,12 +723,12 @@ def get_sphere_mesh(refinement_increment, target_order):
return mesh
return mesh
@pytest.mark.parametrize(("mesh_name", "mesh_getter"), [
@pytest.mark.parametrize(("mesh_name", "mesh_getter", "qbx_order"), [
#("circle", partial(ellipse, 1)),
#("circle", partial(ellipse, 1)),
#("3-to-1 ellipse", partial(ellipse, 3)),
#("3-to-1 ellipse", partial(ellipse, 3)),
("starfish", get_starfish_mesh),
("starfish", get_starfish_mesh, 5),
 
("sphere", get_sphere_mesh, 3),
])
])
@pytest.mark.parametrize("qbx_order", [5])
@pytest.mark.parametrize(("zero_op_name", "k"), [
@pytest.mark.parametrize(("zero_op_name", "k"), [
("green", 0),
("green", 0),
("green", 1.2),
("green", 1.2),
@@ -748,6 +748,12 @@ def test_identities(ctx_getter, zero_op_name, mesh_name, mesh_getter, qbx_order,
@@ -748,6 +748,12 @@ def test_identities(ctx_getter, zero_op_name, mesh_name, mesh_getter, qbx_order,
from sympy.core.cache import clear_cache
from sympy.core.cache import clear_cache
clear_cache()
clear_cache()
 
if mesh_name == "sphere" and k != 0:
 
pytest.skip("both direct eval and generating the FMM kernels are too slow")
 
 
if mesh_name == "sphere" and zero_op_name == "green_grad":
 
pytest.skip("does not achieve sufficient precision")
 
target_order = 8
target_order = 8
order_table = {
order_table = {
@@ -811,18 +817,18 @@ def test_identities(ctx_getter, zero_op_name, mesh_name, mesh_getter, qbx_order,
@@ -811,18 +817,18 @@ def test_identities(ctx_getter, zero_op_name, mesh_name, mesh_getter, qbx_order,
if d == 2:
if d == 2:
order_bump = 15
order_bump = 15
elif d == 3:
elif d == 3:
order_bump = 6
order_bump = 8
refiner_extra_kwargs = {}
refiner_extra_kwargs = {}
if k != 0:
if k != 0:
refiner_extra_kwargs["kernel_length_scale"] = 5/k
refiner_extra_kwargs["kernel_length_scale"] = 5/k
qbx, _ = (
qbx, _ = QBXLayerPotentialSource(
QBXLayerPotentialSource(
pre_density_discr, 4*target_order,
pre_density_discr, 4*target_order,
qbx_order, fmm_order=qbx_order + order_bump
qbx_order, fmm_order=qbx_order + order_bump)
).with_refinement(**refiner_extra_kwargs)
.with_refinement(**refiner_extra_kwargs))
density_discr = qbx.density_discr
density_discr = qbx.density_discr
# {{{ compute values of a solution to the PDE
# {{{ compute values of a solution to the PDE
@@ -832,10 +838,17 @@ def test_identities(ctx_getter, zero_op_name, mesh_name, mesh_getter, qbx_order,
@@ -832,10 +838,17 @@ def test_identities(ctx_getter, zero_op_name, mesh_name, mesh_getter, qbx_order,
normal_host = [normal[j].get() for j in range(d)]
normal_host = [normal[j].get() for j in range(d)]
if k != 0:
if k != 0:
angle = 0.3
if d == 2:
wave_vec = np.array([np.cos(angle), np.sin(angle)])
angle = 0.3
u = np.exp(1j*k*np.tensordot(wave_vec, nodes_host, axes=1))
wave_vec = np.array([np.cos(angle), np.sin(angle)])
grad_u = 1j*k*wave_vec[:, np.newaxis]*u
u = np.exp(1j*k*np.tensordot(wave_vec, nodes_host, axes=1))
 
grad_u = 1j*k*wave_vec[:, np.newaxis]*u
 
else:
 
center = np.array([3, 1, 2])
 
diff = nodes_host - center[:, np.newaxis]
 
r = la.norm(diff, axis=0)
 
u = np.exp(1j*k*r) / r
 
grad_u = diff * (1j*k*u/r - u/r**2)
else:
else:
center = np.array([3, 1, 2])[:d]
center = np.array([3, 1, 2])[:d]
diff = nodes_host - center[:, np.newaxis]
diff = nodes_host - center[:, np.newaxis]
Loading