62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
import numpy
|
|
import pytest
|
|
from numpy.testing import assert_allclose
|
|
|
|
from ..fdtd.boundaries import conducting_boundary
|
|
|
|
|
|
def _axis_index(axis: int, index: int) -> tuple[slice | int, ...]:
|
|
coords: list[slice | int] = [slice(None), slice(None), slice(None)]
|
|
coords[axis] = index
|
|
return tuple(coords)
|
|
|
|
|
|
@pytest.mark.parametrize('direction', [0, 1, 2])
|
|
@pytest.mark.parametrize('polarity', [-1, 1])
|
|
def test_conducting_boundary_updates_expected_faces(direction: int, polarity: int) -> None:
|
|
e = numpy.arange(3 * 4 * 4 * 4, dtype=float).reshape(3, 4, 4, 4)
|
|
h = e.copy()
|
|
e0 = e.copy()
|
|
h0 = h.copy()
|
|
|
|
update_e, update_h = conducting_boundary(direction, polarity)
|
|
update_e(e)
|
|
update_h(h)
|
|
|
|
dirs = [0, 1, 2]
|
|
dirs.remove(direction)
|
|
u, v = dirs
|
|
|
|
if polarity < 0:
|
|
boundary = _axis_index(direction, 0)
|
|
shifted1 = _axis_index(direction, 1)
|
|
|
|
assert_allclose(e[direction][boundary], 0)
|
|
assert_allclose(e[u][boundary], e0[u][shifted1])
|
|
assert_allclose(e[v][boundary], e0[v][shifted1])
|
|
assert_allclose(h[direction][boundary], h0[direction][shifted1])
|
|
assert_allclose(h[u][boundary], 0)
|
|
assert_allclose(h[v][boundary], 0)
|
|
else:
|
|
boundary = _axis_index(direction, -1)
|
|
shifted1 = _axis_index(direction, -2)
|
|
shifted2 = _axis_index(direction, -3)
|
|
|
|
assert_allclose(e[direction][boundary], -e0[direction][shifted2])
|
|
assert_allclose(e[direction][shifted1], 0)
|
|
assert_allclose(e[u][boundary], e0[u][shifted1])
|
|
assert_allclose(e[v][boundary], e0[v][shifted1])
|
|
assert_allclose(h[direction][boundary], h0[direction][shifted1])
|
|
assert_allclose(h[u][boundary], -h0[u][shifted2])
|
|
assert_allclose(h[u][shifted1], 0)
|
|
assert_allclose(h[v][boundary], -h0[v][shifted2])
|
|
assert_allclose(h[v][shifted1], 0)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
('direction', 'polarity'),
|
|
[(-1, 1), (3, 1), (0, 0)],
|
|
)
|
|
def test_conducting_boundary_rejects_invalid_arguments(direction: int, polarity: int) -> None:
|
|
with pytest.raises(ValueError, match='Invalid direction|Bad polarity'):
|
|
conducting_boundary(direction, polarity)
|