dx_prop -> prop_phase
propagation direction wavenumber might be different from operator-derived (2D) wavenumber due to numerical dispersion, so lump it in with dx_prop
This commit is contained in:
parent
8eac9df76e
commit
b5ad284966
@ -109,7 +109,7 @@ def normalized_fields_e(e_xy: numpy.ndarray,
|
|||||||
dxes: dx_lists_t,
|
dxes: dx_lists_t,
|
||||||
epsilon: vfield_t,
|
epsilon: vfield_t,
|
||||||
mu: vfield_t = None,
|
mu: vfield_t = None,
|
||||||
dx_prop: float = 0,
|
prop_phase: float = 0,
|
||||||
) -> Tuple[vfield_t, vfield_t]:
|
) -> Tuple[vfield_t, vfield_t]:
|
||||||
"""
|
"""
|
||||||
Given a vector e_xy containing the vectorized E_x and E_y fields,
|
Given a vector e_xy containing the vectorized E_x and E_y fields,
|
||||||
@ -121,13 +121,14 @@ def normalized_fields_e(e_xy: numpy.ndarray,
|
|||||||
:param dxes: Grid parameters [dx_e, dx_h] as described in meanas.types (2D)
|
:param dxes: Grid parameters [dx_e, dx_h] as described in meanas.types (2D)
|
||||||
:param epsilon: Vectorized dielectric constant grid
|
:param epsilon: Vectorized dielectric constant grid
|
||||||
:param mu: Vectorized magnetic permeability grid (default 1 everywhere)
|
:param mu: Vectorized magnetic permeability grid (default 1 everywhere)
|
||||||
:param dxes_prop: Grid cell width in the propagation direction. Default 0 (continuous).
|
:param prop_phase: Phase shift (dz * corrected_wavenumber) over 1 cell in propagation direction.
|
||||||
|
Default 0 (continuous propagation direction, i.e. dz->0).
|
||||||
:return: Normalized, vectorized (e, h) containing all vector components.
|
:return: Normalized, vectorized (e, h) containing all vector components.
|
||||||
"""
|
"""
|
||||||
e = exy2e(wavenumber=wavenumber, dxes=dxes, epsilon=epsilon) @ e_xy
|
e = exy2e(wavenumber=wavenumber, dxes=dxes, epsilon=epsilon) @ e_xy
|
||||||
h = exy2h(wavenumber=wavenumber, omega=omega, dxes=dxes, epsilon=epsilon, mu=mu) @ e_xy
|
h = exy2h(wavenumber=wavenumber, omega=omega, dxes=dxes, epsilon=epsilon, mu=mu) @ e_xy
|
||||||
e_norm, h_norm = _normalized_fields(e=e, h=h, wavenumber=wavenumber, omega=omega,
|
e_norm, h_norm = _normalized_fields(e=e, h=h, omega=omega, dxes=dxes, epsilon=epsilon,
|
||||||
dxes=dxes, epsilon=epsilon, mu=mu, dx_prop=dx_prop)
|
mu=mu, prop_phase=prop_phase)
|
||||||
return e_norm, h_norm
|
return e_norm, h_norm
|
||||||
|
|
||||||
|
|
||||||
@ -137,7 +138,7 @@ def normalized_fields_h(h_xy: numpy.ndarray,
|
|||||||
dxes: dx_lists_t,
|
dxes: dx_lists_t,
|
||||||
epsilon: vfield_t,
|
epsilon: vfield_t,
|
||||||
mu: vfield_t = None,
|
mu: vfield_t = None,
|
||||||
dx_prop: float = 0,
|
prop_phase: float = 0,
|
||||||
) -> Tuple[vfield_t, vfield_t]:
|
) -> Tuple[vfield_t, vfield_t]:
|
||||||
"""
|
"""
|
||||||
Given a vector e_xy containing the vectorized E_x and E_y fields,
|
Given a vector e_xy containing the vectorized E_x and E_y fields,
|
||||||
@ -154,19 +155,18 @@ def normalized_fields_h(h_xy: numpy.ndarray,
|
|||||||
"""
|
"""
|
||||||
e = hxy2e(wavenumber=wavenumber, omega=omega, dxes=dxes, epsilon=epsilon, mu=mu) @ h_xy
|
e = hxy2e(wavenumber=wavenumber, omega=omega, dxes=dxes, epsilon=epsilon, mu=mu) @ h_xy
|
||||||
h = hxy2h(wavenumber=wavenumber, dxes=dxes, mu=mu) @ h_xy
|
h = hxy2h(wavenumber=wavenumber, dxes=dxes, mu=mu) @ h_xy
|
||||||
e_norm, h_norm = _normalized_fields(e=e, h=h, wavenumber=wavenumber, omega=omega,
|
e_norm, h_norm = _normalized_fields(e=e, h=h, omega=omega, dxes=dxes, epsilon=epsilon,
|
||||||
dxes=dxes, epsilon=epsilon, mu=mu, dx_prop=dx_prop)
|
mu=mu, prop_phase=prop_phase)
|
||||||
return e_norm, h_norm
|
return e_norm, h_norm
|
||||||
|
|
||||||
|
|
||||||
def _normalized_fields(e: numpy.ndarray,
|
def _normalized_fields(e: numpy.ndarray,
|
||||||
h: numpy.ndarray,
|
h: numpy.ndarray,
|
||||||
wavenumber: complex,
|
|
||||||
omega: complex,
|
omega: complex,
|
||||||
dxes: dx_lists_t,
|
dxes: dx_lists_t,
|
||||||
epsilon: vfield_t,
|
epsilon: vfield_t,
|
||||||
mu: vfield_t = None,
|
mu: vfield_t = None,
|
||||||
dx_prop: float = 0,
|
prop_phase: float = 0,
|
||||||
) -> Tuple[vfield_t, vfield_t]:
|
) -> Tuple[vfield_t, vfield_t]:
|
||||||
# TODO documentation
|
# TODO documentation
|
||||||
shape = [s.size for s in dxes[0]]
|
shape = [s.size for s in dxes[0]]
|
||||||
@ -175,7 +175,7 @@ def _normalized_fields(e: numpy.ndarray,
|
|||||||
E = unvec(e, shape)
|
E = unvec(e, shape)
|
||||||
H = unvec(h, shape)
|
H = unvec(h, shape)
|
||||||
|
|
||||||
phase = numpy.exp(-1j * wavenumber * dx_prop / 2)
|
phase = numpy.exp(-1j * prop_phase / 2)
|
||||||
S1 = E[0] * numpy.conj(H[1] * phase) * dxes_real[0][1] * dxes_real[1][0]
|
S1 = E[0] * numpy.conj(H[1] * phase) * dxes_real[0][1] * dxes_real[1][0]
|
||||||
S2 = E[1] * numpy.conj(H[0] * phase) * dxes_real[0][0] * dxes_real[1][1]
|
S2 = E[1] * numpy.conj(H[0] * phase) * dxes_real[0][0] * dxes_real[1][1]
|
||||||
P = numpy.real(S1.sum() - S2.sum())
|
P = numpy.real(S1.sum() - S2.sum())
|
||||||
|
Loading…
Reference in New Issue
Block a user