"""Functional utilities that help define postprocessing functions more simply in ``invdes``."""# TODO: improve these?importtypingimportautograd.numpyasanpimportxarrayasxrimporttidy3dastddefmake_array(arr:typing.Any)->anp.ndarray:"""Turn something into a ``anp.ndarray``."""ifisinstance(arr,xr.DataArray):returnanp.array(arr.values)returnanp.array(arr)
[docs]defget_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]ifnotisinstance(monitor_data,td.ModeData):raiseValueError("'get_amps' only works with data from 'ModeMonitor's.")amps=monitor_data.ampsamps_sel=amps.sel(**sel_kwargs)returnamps_sel
[docs]defget_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]ifnotisinstance(monitor_data,td.FieldData):raiseValueError("'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)returnfield_component_sel
[docs]defget_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)returnintensity_sel
[docs]defsum_array(arr:xr.DataArray)->float:"""Sum values in the ``td.DataArray``."""arr=make_array(arr)returnanp.sum(arr)
[docs]defsum_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)**2returnsum_array(arr_abs_squared)
[docs]defget_phase(arr:xr.DataArray)->anp.ndarray:"""Get ``anp.angle`` of a ``td.DataArray`` as an array."""arr=make_array(arr)returnanp.angle(arr)