meanas/meanas/test/test_fdtd_energy.py

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)