100 lines
3.8 KiB
Python
100 lines
3.8 KiB
Python
import numpy
|
|
import pytest
|
|
|
|
from ..fdfd import farfield
|
|
|
|
|
|
NEAR_SHAPE = (2, 3)
|
|
E_NEAR = [numpy.zeros(NEAR_SHAPE, dtype=complex), numpy.zeros(NEAR_SHAPE, dtype=complex)]
|
|
H_NEAR = [numpy.zeros(NEAR_SHAPE, dtype=complex), numpy.zeros(NEAR_SHAPE, dtype=complex)]
|
|
|
|
|
|
def test_near_to_farfield_rejects_wrong_length_inputs() -> None:
|
|
with pytest.raises(Exception, match='E_near must be a length-2 list'):
|
|
farfield.near_to_farfield(E_NEAR[:1], H_NEAR, dx=0.2, dy=0.3)
|
|
|
|
with pytest.raises(Exception, match='H_near must be a length-2 list'):
|
|
farfield.near_to_farfield(E_NEAR, H_NEAR[:1], dx=0.2, dy=0.3)
|
|
|
|
|
|
def test_near_to_farfield_rejects_mismatched_shapes() -> None:
|
|
bad_h_near = [H_NEAR[0], numpy.zeros((2, 4), dtype=complex)]
|
|
|
|
with pytest.raises(Exception, match='All fields must be the same shape'):
|
|
farfield.near_to_farfield(E_NEAR, bad_h_near, dx=0.2, dy=0.3)
|
|
|
|
|
|
def test_near_to_farfield_uses_default_and_scalar_padding_shapes() -> None:
|
|
default_result = farfield.near_to_farfield(E_NEAR, H_NEAR, dx=0.2, dy=0.3)
|
|
scalar_result = farfield.near_to_farfield(E_NEAR, H_NEAR, dx=0.2, dy=0.3, padded_size=8)
|
|
|
|
assert default_result['E'][0].shape == (2, 4)
|
|
assert default_result['H'][0].shape == (2, 4)
|
|
assert scalar_result['E'][0].shape == (8, 8)
|
|
assert scalar_result['H'][0].shape == (8, 8)
|
|
|
|
|
|
def test_far_to_nearfield_rejects_wrong_length_inputs() -> None:
|
|
ff = farfield.near_to_farfield(E_NEAR, H_NEAR, dx=0.2, dy=0.3, padded_size=8)
|
|
|
|
with pytest.raises(Exception, match='E_far must be a length-2 list'):
|
|
farfield.far_to_nearfield(ff['E'][:1], ff['H'], ff['dkx'], ff['dky'])
|
|
|
|
with pytest.raises(Exception, match='H_far must be a length-2 list'):
|
|
farfield.far_to_nearfield(ff['E'], ff['H'][:1], ff['dkx'], ff['dky'])
|
|
|
|
|
|
def test_far_to_nearfield_rejects_mismatched_shapes() -> None:
|
|
ff = farfield.near_to_farfield(E_NEAR, H_NEAR, dx=0.2, dy=0.3, padded_size=8)
|
|
bad_h_far = [ff['H'][0], numpy.zeros((8, 4), dtype=complex)]
|
|
|
|
with pytest.raises(Exception, match='All fields must be the same shape'):
|
|
farfield.far_to_nearfield(ff['E'], bad_h_far, ff['dkx'], ff['dky'])
|
|
|
|
|
|
def test_far_to_nearfield_uses_default_and_scalar_padding_shapes() -> None:
|
|
ff = farfield.near_to_farfield(E_NEAR, H_NEAR, dx=0.2, dy=0.3, padded_size=8)
|
|
default_result = farfield.far_to_nearfield(
|
|
[field.copy() for field in ff['E']],
|
|
[field.copy() for field in ff['H']],
|
|
ff['dkx'],
|
|
ff['dky'],
|
|
)
|
|
scalar_result = farfield.far_to_nearfield(
|
|
[field.copy() for field in ff['E']],
|
|
[field.copy() for field in ff['H']],
|
|
ff['dkx'],
|
|
ff['dky'],
|
|
padded_size=4,
|
|
)
|
|
|
|
assert default_result['E'][0].shape == (8, 8)
|
|
assert default_result['H'][0].shape == (8, 8)
|
|
assert scalar_result['E'][0].shape == (4, 4)
|
|
assert scalar_result['H'][0].shape == (4, 4)
|
|
|
|
|
|
def test_farfield_roundtrip_supports_rectangular_arrays() -> None:
|
|
e_near = [numpy.zeros((4, 8), dtype=complex), numpy.zeros((4, 8), dtype=complex)]
|
|
h_near = [numpy.zeros((4, 8), dtype=complex), numpy.zeros((4, 8), dtype=complex)]
|
|
e_near[0][1, 3] = 1.0 + 0.25j
|
|
h_near[1][2, 5] = -0.5j
|
|
|
|
ff = farfield.near_to_farfield(e_near, h_near, dx=0.2, dy=0.3, padded_size=(4, 8))
|
|
restored = farfield.far_to_nearfield(
|
|
[field.copy() for field in ff['E']],
|
|
[field.copy() for field in ff['H']],
|
|
ff['dkx'],
|
|
ff['dky'],
|
|
padded_size=(4, 8),
|
|
)
|
|
|
|
assert isinstance(ff['dkx'], float)
|
|
assert isinstance(ff['dky'], float)
|
|
assert ff['E'][0].shape == (4, 8)
|
|
assert restored['E'][0].shape == (4, 8)
|
|
assert restored['H'][0].shape == (4, 8)
|
|
assert restored['dx'] == pytest.approx(0.2)
|
|
assert restored['dy'] == pytest.approx(0.3)
|
|
assert numpy.isfinite(restored['E'][0]).all()
|
|
assert numpy.isfinite(restored['H'][0]).all()
|