import json
import numpy as np
import pytest
from modes._mode_solver_semi_vectorial import ModeSolverSemiVectorial
from modes.autoname import autoname, clean_value
from modes.get_modes_jsonpath import get_modes_jsonpath
from modes.waveguide import waveguide
@pytest.mark.parametrize("overwrite", [True, False])
def test_mode_solver_semi_vectorial_te(overwrite: bool) -> None:
mode_solver = mode_solver_semi(overwrite=overwrite)
# modes = mode_solver.solve()
# neff0 = modes["n_effs"][0].real
neff0 = mode_solver.results["n_effs"][0].real
print(neff0)
assert np.isclose(neff0, 2.507954410087166)
@pytest.mark.parametrize("overwrite", [True, False])
def test_mode_solver_semi_vectorial_tm(overwrite: bool) -> None:
mode_solver = mode_solver_semi(semi_vectorial_method="Ey", overwrite=overwrite)
# modes = mode_solver.solve()
# neff0 = modes["n_effs"][0].real
neff0 = mode_solver.results["n_effs"][0].real
print(neff0)
assert np.isclose(neff0, 1.859555511265503)
@autoname
def _semi(
n_modes: int = 2,
semi_vectorial_method: str = "Ex",
plot_index: bool = False,
**wg_kwargs
) -> ModeSolverSemiVectorial:
"""
returns mode solver with mode_solver.wg
writes waveguide material index
use mode_solver_semi instead
Args:
n_modes: 2
semi_vectorial_method: 'Ey' for TM, 'Ex' for TE
plot_index: plot index profile
wg_kwargs: for waveguide
"""
wg = waveguide(**wg_kwargs)
if plot_index:
wg.plot()
mode_solver = ModeSolverSemiVectorial(
n_modes, semi_vectorial_method=semi_vectorial_method
)
mode_solver.wg = wg
# modes = mode_solver.solve(wg)
# mode_solver.write_modes_to_file("example_modes_1.dat")
return mode_solver
[docs]def mode_solver_semi(
n_modes: int = 2,
semi_vectorial_method: str = "Ex",
overwrite: bool = False,
plot: bool = False,
plot_index: bool = False,
logscale: bool = False,
**wg_kwargs
) -> ModeSolverSemiVectorial:
"""
returns semi vectorial mode solver with the computed modes
Args:
n_modes: 2
overwrite: whether to run again even if it finds the modes in PATH.cache
semi_vectorial_method: 'Ey' for TM, 'Ex' for TE
overwrite: runs even
plot: plot modes
plot_index: plot index profile
logscale: plots mode in logscale
Keyword Args:
x_step: 0.02
y_step: 0.02
thickness: 0.22
width: 0.5
slab_thickness: 0
sub_thickness: 0.5
sub_width: 2.0
clad_thickness: 0.5
n_sub: sio2
n_wg: si
n_clads: [sio2]
wavelength: 1.55
angle: 90.0
.. plot::
:include-source:
import modes as ms
m = ms.mode_solver_semi(plot_index=True, plot=True)
print(m.results.keys())
"""
mode_solver = _semi(
n_modes=n_modes,
semi_vectorial_method=semi_vectorial_method,
plot_index=plot_index,
**wg_kwargs
)
settings = {k: clean_value(v) for k, v in mode_solver.settings.items()}
jsonpath = get_modes_jsonpath(mode_solver)
filepath = jsonpath.with_suffix(".dat")
if overwrite or not jsonpath.exists():
r = mode_solver.solve()
n_effs_real = r["n_effs"].real.tolist()
n_effs_imag = r["n_effs"].imag.tolist()
modes = r["modes"]
modes_real = [mode.real.tolist() for mode in modes]
modes_imag = [mode.imag.tolist() for mode in modes]
d = dict(
n_effs_real=n_effs_real,
n_effs_imag=n_effs_imag,
modes_real=modes_real,
modes_imag=modes_imag,
n_modes=len(n_effs_real),
settings=settings,
)
with open(jsonpath, "w") as f:
f.write(json.dumps(d))
mode_solver.write_modes_to_file(filepath, plot=plot, logscale=logscale)
r["settings"] = settings
else:
d = json.loads(open(jsonpath).read())
modes_real = d["modes_real"]
modes_imag = d["modes_imag"]
modes = [
np.array(np.array(mr) + 1j * np.array(mi))
for mr, mi in zip(modes_real, modes_imag)
]
n_effs_real = d["n_effs_real"]
n_effs_imag = d["n_effs_imag"]
n_effs = [
np.array(np.array(mr) + 1j * np.array(mi))
for mr, mi in zip(n_effs_real, n_effs_imag)
]
r = dict(modes=modes, n_effs=n_effs)
mode_solver.modes = r["modes"]
mode_solver.n_effs = r["n_effs"]
if plot:
mode_solver.plot_modes(filepath, logscale=logscale)
mode_solver.results = r
return mode_solver
# def load_mode(mode_solver):
# filepath = get_modes_filepath(mode_solver)
# jsonpath = filepath.with_suffix(".json")
# data = np.loadtxt(filepath, delimiter=",").T
# return data
if __name__ == "__main__":
import matplotlib.pylab as plt
# test_mode_solver_semi_vectorial_te(overwrite=True)
# test_mode_solver_semi_vectorial_te(overwrite=False)
# test_mode_solver_semi_vectorial_tm(overwrite=True)
# test_mode_solver_semi_vectorial_tm(overwrite=False)
mode_solver_semi(plot=True, logscale=True)
plt.show()