Source code for tidy3d.plugins.invdes.utils
"""Functional utilities that help define postprocessing functions more simply in ``invdes``."""
# TODO: improve these?
import typing
import autograd.numpy as anp
import xarray as xr
import tidy3d as td
def make_array(arr: typing.Any) -> anp.ndarray:
"""Turn something into a ``anp.ndarray``."""
if isinstance(arr, xr.DataArray):
return anp.array(arr.values)
return anp.array(arr)
[docs]
def get_amps(sim_data: td.SimulationData, monitor_name: str, **sel_kwargs) -> anp.ndarray:
"""Grab amplitudes from a ``ModeMonitorData`` and select out values."""
monitor_data = sim_data[monitor_name]
if not isinstance(monitor_data, td.ModeData):
raise ValueError("'get_amps' only works with data from 'ModeMonitor's.")
amps = monitor_data.amps
amps_sel = amps.sel(**sel_kwargs)
return amps_sel
[docs]
def get_field_component(
sim_data: td.SimulationData,
monitor_name: str,
field_component: td.components.types.EMField,
**sel_kwargs,
) -> anp.ndarray:
"""Grab field component from a ``FieldMonitorData`` and select out values."""
monitor_data = sim_data[monitor_name]
if not isinstance(monitor_data, td.FieldData):
raise ValueError("'get_field_component' only works with data from 'FieldMonitor's.")
field_component = monitor_data.field_components[field_component]
field_component_sel = field_component.sel(**sel_kwargs)
return field_component_sel
[docs]
def get_intensity(sim_data: td.SimulationData, monitor_name: str, **sel_kwargs) -> anp.ndarray:
"""Grab field intensity from a ``FieldMonitorData`` and select out values."""
intensity = sim_data.get_intensity(monitor_name)
intensity_sel = intensity.sel(**sel_kwargs)
return intensity_sel
[docs]
def sum_array(arr: xr.DataArray) -> float:
"""Sum values in the ``td.DataArray``."""
arr = make_array(arr)
return anp.sum(arr)
[docs]
def sum_abs_squared(arr: xr.DataArray) -> float:
"""Sum the absolute value squared of a ``td.DataArray``."""
arr = make_array(arr)
arr_abs_squared = anp.abs(arr) ** 2
return sum_array(arr_abs_squared)
[docs]
def get_phase(arr: xr.DataArray) -> anp.ndarray:
"""Get ``anp.angle`` of a ``td.DataArray`` as an array."""
arr = make_array(arr)
return anp.angle(arr)