add test_fdfd
This commit is contained in:
parent
061dbf59d1
commit
b0b295d1ac
90
meanas/test/test_fdfd.py
Normal file
90
meanas/test/test_fdfd.py
Normal file
@ -0,0 +1,90 @@
|
||||
from typing import List, Tuple
|
||||
import dataclasses
|
||||
import pytest
|
||||
import numpy
|
||||
from numpy.testing import assert_allclose, assert_array_equal
|
||||
|
||||
from .. import fdfd, vec, unvec
|
||||
from .utils import assert_close, assert_fields_close
|
||||
|
||||
|
||||
def test_poynting_planes(sim):
|
||||
mask = (sim.j != 0).any(axis=0)
|
||||
if mask.sum() > 1:
|
||||
pytest.skip(f'test_poynting_planes can only test single point sources, got {mask.sum()}')
|
||||
|
||||
mx = numpy.roll(mask, -1, axis=0)
|
||||
my = numpy.roll(mask, -1, axis=1)
|
||||
mz = numpy.roll(mask, -1, axis=2)
|
||||
|
||||
e2h = fdfd.operators.e2h(omega=sim.omega, dxes=sim.dxes, pmc=sim.pmc)
|
||||
ev = vec(sim.e)
|
||||
hv = e2h @ ev
|
||||
|
||||
exh = fdfd.operators.poynting_e_cross(e=ev, dxes=sim.dxes) @ hv.conj()
|
||||
s = unvec(exh.real / 2, sim.shape[1:])
|
||||
planes = [s[0, mask].sum(), -s[0, mx].sum(),
|
||||
s[0, mask].sum(), -s[1, my].sum(),
|
||||
s[0, mask].sum(), -s[2, mz].sum()]
|
||||
|
||||
e_dot_j = sim.e * sim.j
|
||||
src_energy = -e_dot_j.real / 2
|
||||
|
||||
assert_close(sum(planes), (src_energy).sum())
|
||||
|
||||
|
||||
#####################################
|
||||
# Test fixtures
|
||||
#####################################
|
||||
# Also see conftest.py
|
||||
|
||||
@pytest.fixture(params=[1/1500])
|
||||
def omega(request):
|
||||
yield request.param
|
||||
|
||||
|
||||
@pytest.fixture(params=[None])
|
||||
def pec(request):
|
||||
yield request.param
|
||||
|
||||
|
||||
@pytest.fixture(params=[None])
|
||||
def pmc(request):
|
||||
yield request.param
|
||||
|
||||
|
||||
@dataclasses.dataclass()
|
||||
class SimResult:
|
||||
shape: Tuple[int]
|
||||
dxes: List[List[numpy.ndarray]]
|
||||
epsilon: numpy.ndarray
|
||||
omega: complex
|
||||
j: numpy.ndarray
|
||||
e: numpy.ndarray
|
||||
pmc: numpy.ndarray
|
||||
pec: numpy.ndarray
|
||||
|
||||
@pytest.fixture()
|
||||
def sim(request, shape, epsilon, dxes, j_distribution, omega, pec, pmc):
|
||||
# is3d = (numpy.array(shape) == 1).sum() == 0
|
||||
# if is3d:
|
||||
# pytest.skip('Skipping dt != 0.3 because test is 3D (for speed)')
|
||||
|
||||
j_vec = vec(j_distribution)
|
||||
eps_vec = vec(epsilon)
|
||||
e_vec = fdfd.solvers.generic(J=j_vec, omega=omega, dxes=dxes, epsilon=eps_vec)
|
||||
e = unvec(e_vec, shape[1:])
|
||||
|
||||
sim = SimResult(
|
||||
shape=shape,
|
||||
dxes=dxes,
|
||||
epsilon=epsilon,
|
||||
j=j_distribution,
|
||||
e=e,
|
||||
pec=pec,
|
||||
pmc=pmc,
|
||||
omega=omega,
|
||||
)
|
||||
|
||||
return sim
|
||||
|
Loading…
Reference in New Issue
Block a user