Skip to content

Commit e9609c6

Browse files
committed
feat: add tests for system kernels
1 parent 21409c2 commit e9609c6

1 file changed

Lines changed: 85 additions & 3 deletions

File tree

sumpy/test/test_misc.py

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,22 @@
5959
from sumpy.kernel import (
6060
BiharmonicKernel,
6161
BrinkmanletKernel,
62+
BrinkmanletSystemKernel,
6263
BrinkmanStressKernel,
64+
BrinkmanStressSystemKernel,
6365
ElasticityKernel,
66+
ElasticitySystemKernel,
6467
ExpressionKernel,
68+
ExpressionSystemKernel,
6569
HeatKernel,
6670
HelmholtzKernel,
67-
Kernel,
6871
LaplaceKernel,
6972
LineOfCompressionKernel,
7073
ScalarKernel,
7174
StokesletKernel,
75+
StokesletSystemKernel,
7276
StressletKernel,
77+
StressletSystemKernel,
7378
YukawaKernel,
7479
)
7580

@@ -88,9 +93,9 @@
8893
# {{{ pde check for kernels
8994

9095
class KernelInfo:
91-
kernel: Kernel
96+
kernel: ScalarKernel
9297

93-
def __init__(self, kernel: Kernel, **kwargs):
98+
def __init__(self, kernel: ScalarKernel, **kwargs: Any) -> None:
9499
self.kernel = kernel
95100
self.extra_kwargs = kwargs
96101
diff_op = self.kernel.get_pde_as_diff_op()
@@ -791,6 +796,83 @@ def test_get_storage_index(order, knl, compressed):
791796
# }}}
792797

793798

799+
# {{{ test_system_kernel_components
800+
801+
def _get_scalar_cls(knl: ExpressionSystemKernel) -> type[ScalarKernel]:
802+
if isinstance(knl, ElasticitySystemKernel):
803+
return ElasticityKernel
804+
elif isinstance(knl, StokesletSystemKernel):
805+
return StokesletKernel
806+
elif isinstance(knl, StressletSystemKernel):
807+
return StressletKernel
808+
elif isinstance(knl, BrinkmanletSystemKernel):
809+
return BrinkmanletKernel
810+
elif isinstance(knl, BrinkmanStressSystemKernel):
811+
return BrinkmanStressKernel
812+
else:
813+
raise AssertionError
814+
815+
816+
@pytest.mark.parametrize("dim", [2, 3])
817+
@pytest.mark.parametrize("cls", [
818+
ElasticitySystemKernel,
819+
StokesletSystemKernel,
820+
StressletSystemKernel,
821+
BrinkmanletSystemKernel,
822+
BrinkmanStressSystemKernel,
823+
])
824+
def test_system_kernel_components(dim: int, cls: type[ExpressionSystemKernel]) -> None:
825+
knl = cls(dim=dim)
826+
scalar_cls = _get_scalar_cls(knl)
827+
shape = knl.shape
828+
829+
from itertools import product
830+
831+
if len(shape) == 2:
832+
assert shape == (dim, dim)
833+
for i, j in product(range(dim), repeat=2):
834+
comp = knl[i, j]
835+
expected_ij = tuple(sorted([i, j]))
836+
assert isinstance(comp, scalar_cls)
837+
assert comp.dim == dim
838+
assert (comp.icomp, comp.jcomp) == expected_ij
839+
# symmetry
840+
assert knl[i, j] is knl[j, i]
841+
else:
842+
assert shape == (dim, dim, dim)
843+
for i, j, k in product(range(dim), repeat=3):
844+
comp = knl[i, j, k]
845+
expected_ijk = tuple(sorted([i, j, k]))
846+
847+
assert isinstance(comp, scalar_cls)
848+
assert comp.dim == dim
849+
assert (comp.icomp, comp.jcomp, comp.kcomp) == expected_ijk
850+
# symmetry: all permutations of sorted indices are the same
851+
s = tuple(sorted([i, j, k]))
852+
assert knl[i, j, k] is knl[s]
853+
854+
# }}}
855+
856+
857+
# {{{ test_system_kernel_pickle
858+
859+
@pytest.mark.parametrize("dim", [2, 3])
860+
@pytest.mark.parametrize("cls", [
861+
ElasticitySystemKernel,
862+
StokesletSystemKernel,
863+
StressletSystemKernel,
864+
BrinkmanletSystemKernel,
865+
BrinkmanStressSystemKernel,
866+
])
867+
def test_system_kernel_pickle(dim: int, cls: type[ExpressionSystemKernel]) -> None:
868+
from pickle import dumps, loads
869+
870+
knl = cls(dim=dim)
871+
assert loads(dumps(knl)) == knl
872+
873+
# }}}
874+
875+
794876
# You can test individual routines by typing
795877
# $ python test_misc.py 'test_pde_check_kernels(_acf,
796878
# KernelInfo(HelmholtzKernel(2), k=5), order=5)'

0 commit comments

Comments
 (0)