99 lines
2.3 KiB
Python
99 lines
2.3 KiB
Python
import numpy
|
|
|
|
from .. import fdtd
|
|
from ..fdtd import energy as fdtd_energy
|
|
from ._test_builders import real_ramp, unit_dxes
|
|
from .utils import assert_close
|
|
|
|
|
|
SHAPE = (2, 2, 2)
|
|
DT = 0.25
|
|
UNIT_DXES = unit_dxes(SHAPE)
|
|
DXES = (
|
|
(
|
|
numpy.array([1.0, 1.5]),
|
|
numpy.array([0.75, 1.25]),
|
|
numpy.array([1.1, 0.9]),
|
|
),
|
|
(
|
|
numpy.array([0.8, 1.2]),
|
|
numpy.array([1.4, 0.6]),
|
|
numpy.array([0.7, 1.3]),
|
|
),
|
|
)
|
|
E0 = real_ramp((3, *SHAPE))
|
|
E1 = E0 + 0.5
|
|
E2 = E0 + 1.0
|
|
E3 = E0 + 1.5
|
|
H0 = real_ramp((3, *SHAPE), scale=1 / 3, offset=2 / 3)
|
|
H1 = H0 + 0.25
|
|
H2 = H0 + 0.5
|
|
H3 = H0 + 0.75
|
|
J0 = (E0 + 2.0) / 5.0
|
|
EPSILON = 1.0 + E0 / 20.0
|
|
MU = 1.5 + H0 / 10.0
|
|
|
|
|
|
def test_poynting_default_spacing_matches_explicit_unit_spacing() -> None:
|
|
default_spacing = fdtd.poynting(E1, H1)
|
|
explicit_spacing = fdtd.poynting(E1, H1, dxes=UNIT_DXES)
|
|
assert_close(default_spacing, explicit_spacing)
|
|
|
|
|
|
def test_poynting_divergence_matches_precomputed_poynting_vector() -> None:
|
|
s = fdtd.poynting(E2, H2, dxes=DXES)
|
|
from_fields = fdtd.poynting_divergence(e=E2, h=H2, dxes=DXES)
|
|
from_vector = fdtd.poynting_divergence(s=s)
|
|
assert_close(from_fields, from_vector)
|
|
|
|
|
|
def test_delta_energy_h2e_matches_direct_dxmul_formula() -> None:
|
|
expected = fdtd_energy.dxmul(
|
|
E2 * (E2 - E0) / DT,
|
|
H1 * (H3 - H1) / DT,
|
|
EPSILON,
|
|
MU,
|
|
DXES,
|
|
)
|
|
actual = fdtd.delta_energy_h2e(
|
|
dt=DT,
|
|
e0=E0,
|
|
h1=H1,
|
|
e2=E2,
|
|
h3=H3,
|
|
epsilon=EPSILON,
|
|
mu=MU,
|
|
dxes=DXES,
|
|
)
|
|
assert_close(actual, expected)
|
|
|
|
|
|
def test_delta_energy_e2h_matches_direct_dxmul_formula() -> None:
|
|
expected = fdtd_energy.dxmul(
|
|
E1 * (E3 - E1) / DT,
|
|
H2 * (H2 - H0) / DT,
|
|
EPSILON,
|
|
MU,
|
|
DXES,
|
|
)
|
|
actual = fdtd_energy.delta_energy_e2h(
|
|
dt=DT,
|
|
h0=H0,
|
|
e1=E1,
|
|
h2=H2,
|
|
e3=E3,
|
|
epsilon=EPSILON,
|
|
mu=MU,
|
|
dxes=DXES,
|
|
)
|
|
assert_close(actual, expected)
|
|
|
|
|
|
def test_delta_energy_j_defaults_to_unit_cell_volume() -> None:
|
|
expected = (J0 * E1).sum(axis=0)
|
|
assert_close(fdtd.delta_energy_j(j0=J0, e1=E1), expected)
|
|
|
|
|
|
def test_dxmul_defaults_to_unit_materials_and_spacing() -> None:
|
|
expected = E1.sum(axis=0) + H1.sum(axis=0)
|
|
assert_close(fdtd_energy.dxmul(E1, H1), expected)
|