Skip to content

Commit 6cae72c

Browse files
committed
Fix EME port modes symmetry expansion
1 parent c6cd0ca commit 6cae72c

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ with fewer layers than recommended.
2828
- Plots of objects defined by shape intersection logic will no longer display thin line artifacts.
2929
- Fixed incorrect gradient computation in PyTorch plugin (`to_torch`) for functions returning multi-element arrays.
3030
- `MonitorData.get_amplitude()` no longers multiplies by a factor of `1j` and now directly returns the complex value of the data.
31+
- `EMESimulationData.port_modes_tuple` is now symmetry-expanded.
3132

3233
## [2.9.0rc1] - 2025-06-10
3334

tests/test_components/test_eme.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -967,14 +967,14 @@ def test_eme_sim_data():
967967
port_modes = _get_eme_port_modes()
968968
smatrix = _get_eme_smatrix_dataset(num_modes_1=5, num_modes_2=5)
969969

970-
sim_data = td.EMESimulationData(simulation=sim, data=data, smatrix=smatrix, port_modes=None)
970+
sim_data = td.EMESimulationData(simulation=sim, data=data, smatrix=smatrix, port_modes_raw=None)
971971
with pytest.raises(SetupError):
972972
_ = sim_data.port_modes_tuple
973973
with pytest.raises(SetupError):
974974
_ = sim_data.port_modes_list_sweep
975975

976976
sim_data = td.EMESimulationData(
977-
simulation=sim, data=data, smatrix=smatrix, port_modes=port_modes
977+
simulation=sim, data=data, smatrix=smatrix, port_modes_raw=port_modes
978978
)
979979
_ = sim_data.port_modes_tuple
980980
_ = sim_data.port_modes_list_sweep
@@ -1028,11 +1028,11 @@ def test_eme_sim_data():
10281028
assert len(smatrix_in_basis.S22.coords) == 1
10291029

10301030
with pytest.raises(SetupError):
1031-
_ = sim_data.updated_copy(port_modes=None).smatrix_in_basis(
1031+
_ = sim_data.updated_copy(port_modes_raw=None).smatrix_in_basis(
10321032
modes1=modes_in_data, modes2=modes_out_data
10331033
)
10341034
with pytest.raises(SetupError):
1035-
_ = sim_data.updated_copy(port_modes=None).field_in_basis(
1035+
_ = sim_data.updated_copy(port_modes_raw=None).field_in_basis(
10361036
field=sim_data["field"], modes=modes_in_data, port_index=0
10371037
)
10381038

@@ -1092,7 +1092,7 @@ def test_eme_sim_data():
10921092
smatrix = _get_eme_smatrix_dataset(num_modes_1=5, num_modes_2=5, num_sweep=10)
10931093
sim = sim.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=np.linspace(1, 2, 10)))
10941094
sim_data = td.EMESimulationData(
1095-
simulation=sim, data=data, smatrix=smatrix, port_modes=port_modes
1095+
simulation=sim, data=data, smatrix=smatrix, port_modes_raw=port_modes
10961096
)
10971097

10981098
# test smatrix_in_basis
@@ -1172,7 +1172,7 @@ def test_eme_sim_data():
11721172
sim = sim.updated_copy(sweep_spec=td.EMEFreqSweep(freq_scale_factors=np.linspace(1, 2, 10)))
11731173
port_modes = _get_eme_port_modes(num_sweep=10)
11741174
sim_data = td.EMESimulationData(
1175-
simulation=sim, data=data, smatrix=smatrix, port_modes=port_modes
1175+
simulation=sim, data=data, smatrix=smatrix, port_modes_raw=port_modes
11761176
)
11771177
with pytest.raises(SetupError):
11781178
_ = sim_data.port_modes_tuple

tidy3d/components/eme/data/sim_data.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,23 @@ class EMESimulationData(AbstractYeeGridSimulationData):
3939
None, title="S Matrix", description="Scattering matrix of the EME simulation."
4040
)
4141

42-
port_modes: Optional[EMEModeSolverData] = pd.Field(
42+
port_modes_raw: Optional[EMEModeSolverData] = pd.Field(
4343
None,
4444
title="Port Modes",
4545
description="Modes associated with the two ports of the EME device. "
46-
"The scattering matrix is expressed in this basis.",
46+
"The scattering matrix is expressed in this basis. "
47+
"Note: these modes are not symmetry expanded; use 'port_modes' instead.",
4748
)
4849

50+
@cached_property
51+
def port_modes(self):
52+
"""Modes associated with the two ports of the EME device.
53+
The scattering matrix is expressed in this basis.
54+
Note: these modes are symmetry expanded."""
55+
if self.port_modes_raw is None:
56+
return None
57+
return self.port_modes_raw.symmetry_expanded_copy
58+
4959
def _extract_mode_solver_data(
5060
self, data: EMEModeSolverData, eme_cell_index: int, sweep_index: Optional[int] = None
5161
) -> ModeSolverData:
@@ -89,7 +99,13 @@ def _extract_mode_solver_data(
8999
"certain derived quantities, like the flux."
90100
)
91101
grid_expanded = self.simulation.discretize_monitor(monitor=monitor)
92-
return ModeSolverData(**update_dict, monitor=monitor, grid_expanded=grid_expanded)
102+
return ModeSolverData(
103+
**update_dict,
104+
monitor=monitor,
105+
grid_expanded=grid_expanded,
106+
symmetry=data.symmetry,
107+
symmetry_center=data.symmetry_center,
108+
)
93109

94110
@cached_property
95111
def port_modes_tuple(self) -> tuple[ModeSolverData, ModeSolverData]:

0 commit comments

Comments
 (0)