Skip to content

Commit 54e3cd2

Browse files
Move some backend featurese to simulation
1 parent 1e9b1a3 commit 54e3cd2

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

tidy3d/components/simulation.py

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2216,15 +2216,55 @@ def _modal_plane_frames(self) -> list[Structure]:
22162216
@cached_property
22172217
def _finalized(self) -> Simulation:
22182218
"""Return the finalized version of the simulation setup. That is, including automatic frames around mode sources and internal absorbers, and 2d strutures converted into volumetric analogues."""
2219+
if (
2220+
len(self._modal_plane_frames) == 0
2221+
and not self._contains_converted_volumetric_structures
2222+
):
2223+
return self
2224+
return self.updated_copy(
2225+
grid_spec=GridSpec.from_grid(self.grid),
2226+
structures=self._finalized_volumetric_structures,
2227+
)
22192228

2229+
@cached_property
2230+
def _finalized_volumetric_structures(self) -> list[Structure]:
2231+
"""Volumetric structures in the simulation, including automatic frames around mode sources and internal absorbers, and 2d strutures converted into volumetric analogues."""
22202232
modal_frames = self._modal_plane_frames
2233+
if not self._contains_converted_volumetric_structures:
2234+
return list(self.structures) + modal_frames
2235+
return list(self.volumetric_structures) + modal_frames
22212236

2222-
if len(modal_frames) == 0 and not self._contains_converted_volumetric_structures:
2223-
return self
2237+
@cached_property
2238+
def _finalized_optical_medium_map(self) -> dict[MediumType, pydantic.NonNegativeInt]:
2239+
"""Returns dict mapping medium to index in material in finalized simulation.
22242240
2225-
structures = list(self.volumetric_structures) + modal_frames
2241+
Returns
2242+
-------
2243+
Dict[:class:`.AbstractMedium`, int]
2244+
Mapping between distinct mediums to index in finalized simulation.
2245+
"""
2246+
medium_set = {
2247+
structure._optical_medium for structure in self._finalized_volumetric_structures
2248+
}
2249+
medium_set.add(Structure._get_optical_medium(self.medium))
2250+
return {medium: index for index, medium in enumerate(medium_set)}
22262251

2227-
return self.updated_copy(grid_spec=GridSpec.from_grid(self.grid), structures=structures)
2252+
@cached_property
2253+
def _finalized_full_optical_medium_map(self) -> dict[MediumType, pydantic.NonNegativeInt]:
2254+
"""Returns dict mapping medium to index in material in finalized simulation, including
2255+
parent medium.
2256+
"""
2257+
full_medium_map = dict(self._finalized_optical_medium_map)
2258+
next_index = len(full_medium_map)
2259+
for medium in self._finalized_optical_medium_map.keys():
2260+
if (
2261+
isinstance(medium, AbstractCustomMedium)
2262+
and medium.derived_from is not None
2263+
and medium.derived_from not in full_medium_map
2264+
):
2265+
full_medium_map[medium.derived_from] = next_index
2266+
next_index += 1
2267+
return full_medium_map
22282268

22292269
def _validate_finalized(self) -> None:
22302270
"""Validate that after adding pec frames simulation setup is still valid."""

tidy3d/components/structure.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from .geometry.base import Box, Geometry
2727
from .geometry.utils import GeometryType, validate_no_transformed_polyslabs
2828
from .grid.grid import Coords
29+
from .material.multi_physics import MultiPhysicsMedium
2930
from .material.types import StructureMediumType
3031
from .medium import AbstractCustomMedium, CustomMedium, LossyMetalMedium, Medium, Medium2D
3132
from .monitor import FieldMonitor, PermittivityMonitor
@@ -257,6 +258,16 @@ def eps_diagonal(self, frequency: float, coords: Coords) -> tuple[complex, compl
257258
return self.medium.eps_diagonal_on_grid(frequency=frequency, coords=coords)
258259
return self.medium.eps_diagonal(frequency=frequency)
259260

261+
@staticmethod
262+
def _get_optical_medium(medium):
263+
"""Get optical medium."""
264+
return medium.optical if isinstance(medium, MultiPhysicsMedium) else medium
265+
266+
@property
267+
def _optical_medium(self) -> StructureMediumType:
268+
"""Optical medium of the structure."""
269+
return self._get_optical_medium(self.medium)
270+
260271
@pydantic.validator("medium", always=True)
261272
@skip_if_fields_missing(["geometry"])
262273
def _check_2d_geometry(cls, val, values):

0 commit comments

Comments
 (0)