Skip to content

Commit e87005e

Browse files
committed
Validate against EMEFieldMonitor with EMELengthSweep
1 parent f1ee13a commit e87005e

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
### Changed
1313

1414
### Fixed
15+
- Giving opposite boundaries different names no longer causes a symmetry validator failure.
16+
- Fixed issue with parameters in `InverseDesignResult` sometimes being outside of the valid parameter range.
17+
- Disallow `EMEFieldMonitor` in EME simulations with `EMELengthSweep`.
1518

1619

1720
## [2.9.0] - 2025-08-04

tests/test_components/test_eme.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -492,23 +492,30 @@ def test_eme_simulation():
492492
assert sim_tmp._monitor_num_freqs(monitor=sim_tmp.monitors[0]) == 1
493493

494494
# test sweep
495-
sweep_sim = sim.updated_copy(
495+
with pytest.raises(SetupError):
496+
_ = sim.updated_copy(
497+
sweep_spec=td.EMELengthSweep(scale_factors=list(np.linspace(1, 2, 10)))
498+
)
499+
sim_no_field = sim.updated_copy(
500+
monitors=[mnt for mnt in sim.monitors if not isinstance(mnt, td.EMEFieldMonitor)]
501+
)
502+
sweep_sim = sim_no_field.updated_copy(
496503
sweep_spec=td.EMELengthSweep(scale_factors=list(np.linspace(1, 2, 10)))
497504
)
498505
assert sweep_sim._sweep_cells
499506
assert not sweep_sim._sweep_interfaces
500507
assert sweep_sim._num_sweep_cells == 10
501508
assert sweep_sim._num_sweep_interfaces == 1
502509
assert sweep_sim._num_sweep_modes == 1
503-
_ = sim.updated_copy(
510+
_ = sim_no_field.updated_copy(
504511
sweep_spec=td.EMELengthSweep(
505512
scale_factors=np.stack((np.linspace(1, 2, 7), np.linspace(1, 2, 7)))
506-
)
513+
),
507514
)
508515
with pytest.raises(SetupError):
509-
_ = sim.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=[]))
516+
_ = sim_no_field.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=[]))
510517
with pytest.raises(SetupError):
511-
_ = sim.updated_copy(
518+
_ = sim_no_field.updated_copy(
512519
sweep_spec=td.EMELengthSweep(
513520
scale_factors=np.stack(
514521
(
@@ -520,12 +527,14 @@ def test_eme_simulation():
520527
)
521528
# second shape of length sweep must equal number of cells
522529
with pytest.raises(SetupError):
523-
_ = sim.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=np.array([[1, 2], [3, 4]])))
530+
_ = sim_no_field.updated_copy(
531+
sweep_spec=td.EMELengthSweep(scale_factors=np.array([[1, 2], [3, 4]]))
532+
)
524533
_ = sim.updated_copy(sweep_spec=td.EMEModeSweep(num_modes=list(np.arange(1, 5))))
525534
# test sweep size limit
526535
with pytest.raises(SetupError):
527-
_ = sim.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=[]))
528-
sim_bad = sim.updated_copy(
536+
_ = sim_no_field.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=[]))
537+
sim_bad = sim_no_field.updated_copy(
529538
sweep_spec=td.EMELengthSweep(scale_factors=list(np.linspace(1, 2, 200)))
530539
)
531540
with pytest.raises(SetupError):
@@ -562,7 +571,7 @@ def test_eme_simulation():
562571
sim = sim.updated_copy(sweep_spec=None)
563572
assert sim._num_sweep == 1
564573
assert not sim._sweep_modes
565-
sim = sim.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=[1, 2]))
574+
sim = sim_no_field.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=[1, 2]))
566575
assert not sim._sweep_modes
567576
assert sim._num_sweep == 2
568577
sim = sim.updated_copy(sweep_spec=td.EMEFreqSweep(freq_scale_factors=[1, 2]))
@@ -1090,9 +1099,11 @@ def test_eme_sim_data():
10901099

10911100
# test smatrix in basis with sweep
10921101
smatrix = _get_eme_smatrix_dataset(num_modes_1=5, num_modes_2=5, num_sweep=10)
1093-
sim = sim.updated_copy(sweep_spec=td.EMELengthSweep(scale_factors=np.linspace(1, 2, 10)))
1102+
sim_sweep = sim.updated_copy(
1103+
sweep_spec=td.EMELengthSweep(scale_factors=np.linspace(1, 2, 10)), monitors=[]
1104+
)
10941105
sim_data = td.EMESimulationData(
1095-
simulation=sim, data=data, smatrix=smatrix, port_modes_raw=port_modes
1106+
simulation=sim_sweep, data=[], smatrix=smatrix, port_modes_raw=port_modes
10961107
)
10971108

10981109
# test smatrix_in_basis

tidy3d/components/eme/simulation.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,12 @@ def _validate_sweep_spec(self):
706706
"must equal the number of EME cells in the simulation, which is "
707707
f"'{self.eme_grid.num_cells}'."
708708
)
709+
for i, monitor in enumerate(self.monitors):
710+
if isinstance(monitor, EMEFieldMonitor):
711+
raise SetupError(
712+
f"Monitor '{monitor.name}' at 'monitors[{i}]' is an 'EMEFieldMonitor', "
713+
"which is not compatible with 'EMELengthSweep'."
714+
)
709715
elif isinstance(self.sweep_spec, EMEFreqSweep):
710716
for i, scale_factor in enumerate(self.sweep_spec.freq_scale_factors):
711717
scaled_freqs = np.array(self.freqs) * scale_factor
@@ -719,12 +725,12 @@ def _validate_sweep_spec(self):
719725
for i, monitor in enumerate(self.monitors):
720726
if isinstance(monitor, EMEFieldMonitor):
721727
raise SetupError(
722-
f"Monitor at 'monitors[{i}]' is an 'EMEFieldMonitor', "
728+
f"Monitor '{monitor.name}' at 'monitors[{i}]' is an 'EMEFieldMonitor', "
723729
"which is not compatible with 'EMEPeriodicitySweep'."
724730
)
725731
if isinstance(monitor, EMECoefficientMonitor):
726732
raise SetupError(
727-
f"Monitor at 'monitors[{i}]' is an 'EMECoefficientMonitor', "
733+
f"Monitor '{monitor.name}' at 'monitors[{i}]' is an 'EMECoefficientMonitor', "
728734
"which is not compatible with 'EMEPeriodicitySweep'."
729735
)
730736

@@ -785,7 +791,7 @@ def _validate_monitor_setup(self):
785791
self.eme_grid_spec.virtual_cell_indices, self.eme_grid_spec.real_cell_indices
786792
):
787793
raise SetupError(
788-
f"Monitor at 'monitors[{i}]' is an 'EMEFieldMonitor', "
794+
f"Monitor '{monitor.name}' at 'monitors[{i}]' is an 'EMEFieldMonitor', "
789795
"which is not compatible with periodic repetition "
790796
"('num_reps != 1' in any 'EMEGridSpec'.)"
791797
)

0 commit comments

Comments
 (0)