import pytest
import numpy as np
from ndelement.reference_cell import ReferenceCellType
from bempp.assembly.potential import OperatorType, create_laplace_assembler
from bempp.function_space import function_space
from ndgrid.shapes import regular_sphere
from ndelement.ciarlet import create_family, Family, Continuity
@pytest.mark.parametrize(
"otype",
[
OperatorType.SingleLayer,
OperatorType.DoubleLayer,
],
)
def test_create_assembler(otype):
a = create_laplace_assembler(otype)
assert a.quadrature_degree(ReferenceCellType.Triangle) != 3
a.set_quadrature_degree(ReferenceCellType.Triangle, 3)
assert a.quadrature_degree(ReferenceCellType.Triangle) == 3
with pytest.raises(ValueError):
a.set_quadrature_degree(ReferenceCellType.Interval, 3)
with pytest.raises(ValueError):
a.quadrature_degree(ReferenceCellType.Interval)
assert a.batch_size != 4
a.set_batch_size(4)
assert a.batch_size == 4
assert a.dtype == np.float64
def test_single_layer_sphere0_dp0():
grid = regular_sphere(0)
element = create_family(Family.Lagrange, 0, Continuity.Discontinuous)
space = function_space(grid, element)
a = create_laplace_assembler(OperatorType.SingleLayer)
points = np.array([[2.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0]])
mat = a.assemble_into_dense(space, points)
from_cl = np.array(
[
[
0.04038047926587569,
0.02879904511649957,
0.02879904511649957,
0.0403804792658757,
0.04038047926587569,
0.028799045116499562,
0.02879904511649957,
0.04038047926587571,
],
[
0.0403804792658757,
0.04038047926587569,
0.028799045116499573,
0.02879904511649957,
0.04038047926587571,
0.04038047926587569,
0.028799045116499573,
0.028799045116499573,
],
[
0.04038047926587571,
0.04038047926587571,
0.04038047926587571,
0.04038047926587571,
0.028799045116499573,
0.028799045116499573,
0.028799045116499573,
0.028799045116499573,
],
]
)
assert np.allclose(mat, from_cl, rtol=1e-4)