|
59 | 59 | from sumpy.kernel import ( |
60 | 60 | BiharmonicKernel, |
61 | 61 | BrinkmanletKernel, |
| 62 | + BrinkmanletSystemKernel, |
62 | 63 | BrinkmanStressKernel, |
| 64 | + BrinkmanStressSystemKernel, |
63 | 65 | ElasticityKernel, |
| 66 | + ElasticitySystemKernel, |
64 | 67 | ExpressionKernel, |
| 68 | + ExpressionSystemKernel, |
65 | 69 | HeatKernel, |
66 | 70 | HelmholtzKernel, |
67 | | - Kernel, |
68 | 71 | LaplaceKernel, |
69 | 72 | LineOfCompressionKernel, |
70 | 73 | ScalarKernel, |
71 | 74 | StokesletKernel, |
| 75 | + StokesletSystemKernel, |
72 | 76 | StressletKernel, |
| 77 | + StressletSystemKernel, |
73 | 78 | YukawaKernel, |
74 | 79 | ) |
75 | 80 |
|
|
88 | 93 | # {{{ pde check for kernels |
89 | 94 |
|
90 | 95 | class KernelInfo: |
91 | | - kernel: Kernel |
| 96 | + kernel: ScalarKernel |
92 | 97 |
|
93 | | - def __init__(self, kernel: Kernel, **kwargs): |
| 98 | + def __init__(self, kernel: ScalarKernel, **kwargs: Any) -> None: |
94 | 99 | self.kernel = kernel |
95 | 100 | self.extra_kwargs = kwargs |
96 | 101 | diff_op = self.kernel.get_pde_as_diff_op() |
@@ -791,6 +796,83 @@ def test_get_storage_index(order, knl, compressed): |
791 | 796 | # }}} |
792 | 797 |
|
793 | 798 |
|
| 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 | + |
794 | 876 | # You can test individual routines by typing |
795 | 877 | # $ python test_misc.py 'test_pde_check_kernels(_acf, |
796 | 878 | # KernelInfo(HelmholtzKernel(2), k=5), order=5)' |
|
0 commit comments