From c81685b543a734d6e64a6745246f0ae8bc578054 Mon Sep 17 00:00:00 2001 From: Casey Wojcik Date: Tue, 25 Nov 2025 14:51:07 -0800 Subject: [PATCH] chore: minor EME docstring and validation improvements --- CHANGELOG.md | 2 ++ schemas/EMESimulation.json | 1 - tests/sims/full_fdtd.h5 | Bin 479344 -> 479632 bytes tests/sims/full_fdtd.json | 33 ++++++++++++------ tests/test_components/test_eme.py | 19 +++++++++-- tidy3d/components/eme/monitor.py | 17 +++++++--- tidy3d/components/eme/simulation.py | 50 +++++++++++++++++++--------- 7 files changed, 89 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22a791d11a..54338d0034 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Port names in `ModalComponentModeler` and `TerminalComponentModeler` can no longer include the `@` symbol. - Improved speed of convolutions for large inputs. - Default value of `EMEModeSpec.interp_spec` is `ModeInterpSpec.cheb(num_points=3, reduce_data=True)` for faster multi-frequency EME simulations. +- Default value of `num_sweep` in `EMECoefficientMonitor` is now `None`, recording all sweep indices. +- Maximum number of frequencies in an `EMESimulation` is now larger if mode interpolation via `ModeInterpSpec` is used. ### Fixed - Ensured the legacy `Env` proxy mirrors `config.web` profile switches and preserves API URL. diff --git a/schemas/EMESimulation.json b/schemas/EMESimulation.json index 2891f92347..496a9174fb 100644 --- a/schemas/EMESimulation.json +++ b/schemas/EMESimulation.json @@ -4718,7 +4718,6 @@ "type": "integer" }, "num_sweep": { - "default": 1, "minimum": 0, "type": "integer" }, diff --git a/tests/sims/full_fdtd.h5 b/tests/sims/full_fdtd.h5 index 40730d6e309c40556deab984ca160fb53797057b..cd3de0886dfb2b4d653a44f86da6d124ed2a16e9 100644 GIT binary patch delta 17589 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 None: if num_freqs > MAX_NUM_FREQS: raise SetupError( f"Simulation has {num_freqs:.2e} frequencies, " - f"a maximum of {MAX_NUM_FREQS:.2e} are allowed. Mode solving " - f"is repeated at each frequency, so EME simulations with too many frequencies " - f"can be slower and more expensive than FDTD simulations. " - f"Consider using an 'EMEFreqSweep' instead for a faster approximate solution." + f"a maximum of {MAX_NUM_FREQS:.2e} are allowed." ) - if num_freqs > WARN_NUM_FREQS: + num_sampling_points = self._num_sampling_points + if num_sampling_points > MAX_NUM_SAMPLING_POINTS: + raise SetupError( + f"Simulation has {num_sampling_points:.2e} frequency sampling points, " + f"a maximum of {MAX_NUM_SAMPLING_POINTS:.2e} are allowed. Mode solving " + f"is repeated at each sampling point, so EME simulations with too many " + f"frequencies can be slower and more expensive than FDTD simulations. " + f"Consider using 'EMEModeSpec.interp_spec' instead for a faster approximate solution." + ) + if num_sampling_points > WARN_NUM_SAMPLING_POINTS: log.warning( - f"Simulation has {num_freqs:.2e} frequencies. Mode solving " - f"is repeated at each frequency, so EME simulations with too many frequencies " - f"can be slower and more expensive than FDTD simulations. " - f"Consider using an 'EMEFreqSweep' instead for a faster approximate solution." + f"Simulation has {num_sampling_points:.2e} frequency sampling points. Mode solving " + f"is repeated at each sampling point, so EME simulations with too many " + f"frequencies can be slower and more expensive than FDTD simulations. " + f"Consider using 'EMEModeSpec.interp_spec' instead for a faster approximate solution." ) def _validate_monitor_size(self) -> None: @@ -934,6 +940,18 @@ def monitors_data_size(self) -> dict[str, float]: data_size[monitor.name] = storage_size return data_size + @property + def _num_sampling_points(self) -> int: + """Max number of sampling freqs in the simulation.""" + freqs = set() + for mode_spec in self.eme_grid.mode_specs: + interp_spec = mode_spec.interp_spec + if interp_spec is None: + freqs |= set(self.freqs) + else: + freqs |= set(interp_spec.sampling_points(self.freqs)) + return len(freqs) + @property def _num_sweep(self) -> pd.PositiveInt: """Number of sweep indices."""