Source code for tidy3d.components.data.index

"""
This module defines the SimulationDataMap, a specialized container for storing and
accessing simulation data results from a Tidy3D simulation.
"""

from __future__ import annotations

from collections.abc import Mapping

from pydantic import Field

from tidy3d.components.index import ValueMap
from tidy3d.components.types.base import discriminated_union
from tidy3d.components.types.simulation import SimulationDataType


[docs] class SimulationDataMap(ValueMap, Mapping[str, SimulationDataType]): """An immutable dictionary-like container for simulation data. Notes ----- It provides standard dictionary behaviors like item access (`data["key"]`), iteration (`for key in data`), and length checking (`len(data)`). It automatically validates that the `keys` and `values` tuples have matching lengths upon instantiation. Attributes ---------- keys : tuple[str, ...] A tuple of unique string identifiers for each simulation data object. values : tuple[SimulationDataType, ...] A tuple of `SimulationDataType` objects, each corresponding to a key at the same index. Example ------- >>> from tidy3d import ( ... Simulation, ... SimulationData, ... SimulationDataMap, ... Structure, ... Box, ... Medium, ... UniformCurrentSource, ... GaussianPulse, ... FieldMonitor, ... GridSpec, ... BoundarySpec, ... Boundary, ... PML, ... ) >>> import tidy3d as td >>> # Simple minimal simulation >>> sim1 = Simulation( ... size=(4, 3, 3), ... grid_spec=GridSpec.auto(min_steps_per_wvl=25), ... structures=[ ... Structure( ... geometry=Box(size=(1, 1, 1), center=(0, 0, 0)), ... medium=Medium(permittivity=2.0), ... ), ... ], ... sources=[ ... UniformCurrentSource( ... size=(0, 0, 0), ... center=(0, 0.5, 0), ... polarization="Hx", ... source_time=GaussianPulse(freq0=2e14, fwidth=4e13), ... current_amplitude_definition="total", ... ) ... ], ... monitors=[ ... FieldMonitor( ... size=(1, 1, 0), ... center=(0, 0, 0), ... freqs=[2e14], ... name='field' ... ), ... ], ... run_time=1e-12, ... boundary_spec=BoundarySpec.all_sides(boundary=PML()), ... ) >>> sim2 = sim1.updated_copy(run_time=2e-12) >>> >>> sim_data_1 = td.SimulationData( ... simulation=sim1, ... data=() # Empty tuple for minimal case ... ) >>> sim_data_2 = td.SimulationData( ... simulation=sim2, ... data=() # Empty tuple for minimal case ... ) >>> # Instantiate the map >>> simulation_data_map = SimulationDataMap( ... keys=("data_1", "data_2"), ... values=(sim_data_1, sim_data_2), ... ) >>> >>> # Access a simulation data like a dictionary >>> # print(simulation_data_map["data_2"]) """ keys_tuple: tuple[str, ...] = Field( description="A tuple of unique string identifiers for each simulation data object.", alias="keys", ) values_tuple: tuple[discriminated_union(SimulationDataType), ...] = Field( description=( "A tuple of `SimulationDataType` objects, each corresponding to a key at the " "same index." ), alias="values", )