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)