tidy3d.plugins.adjoint.JaxSimulationData#

class tidy3d.plugins.adjoint.JaxSimulationData#

A SimulationData registered with jax.

Parameters

Show JSON schema
{
   "title": "JaxSimulationData",
   "description": "Parameters\n----------\nsimulation : Optional[Any] = None\n        data : Tuple[Annotated[Union[tidy3d.components.data.monitor_data.FieldData, tidy3d.components.data.monitor_data.FieldTimeData, tidy3d.components.data.monitor_data.PermittivityData, tidy3d.components.data.monitor_data.ModeSolverData, tidy3d.components.data.monitor_data.ModeData, tidy3d.components.data.monitor_data.FluxData, tidy3d.components.data.monitor_data.FluxTimeData, tidy3d.components.data.monitor_data.FieldProjectionKSpaceData, tidy3d.components.data.monitor_data.FieldProjectionCartesianData, tidy3d.components.data.monitor_data.FieldProjectionAngleData, tidy3d.components.data.monitor_data.DiffractionData], FieldInfo(default=PydanticUndefined, discriminator='type', extra={})], ...]\n    Mapping of monitor name to :class:`.MonitorData` instance.\nlog : Optional[str] = None\n    A string containing the log information from the simulation run.\ndiverged : bool = False\n    A boolean flag denoting whether the simulation run diverged.\noutput_data : Tuple[Union[JaxModeData, JaxDiffractionData], ...] = ()\n    Tuple of Jax-compatible data associated with output monitors.\ngrad_data : Tuple[FieldData, ...] = ()\n    Tuple of monitor data storing fields associated with the input structures.\ngrad_eps_data : Tuple[PermittivityData, ...] = ()\n    Tuple of monitor data storing epsilon associated with the input structures.",
   "type": "object",
   "properties": {
      "type": {
         "title": "Type",
         "default": "JaxSimulationData",
         "enum": [
            "JaxSimulationData"
         ],
         "type": "string"
      },
      "simulation": {
         "title": "Simulation"
      },
      "data": {
         "title": "Monitor Data",
         "description": "Mapping of monitor name to :class:`.MonitorData` instance.",
         "type": "array",
         "items": {
            "discriminator": {
               "propertyName": "type",
               "mapping": {
                  "FieldData": "#/definitions/FieldData",
                  "FieldTimeData": "#/definitions/FieldTimeData",
                  "PermittivityData": "#/definitions/PermittivityData",
                  "ModeSolverData": "#/definitions/ModeSolverData",
                  "ModeData": "#/definitions/ModeData",
                  "FluxData": "#/definitions/FluxData",
                  "FluxTimeData": "#/definitions/FluxTimeData",
                  "FieldProjectionKSpaceData": "#/definitions/FieldProjectionKSpaceData",
                  "FieldProjectionCartesianData": "#/definitions/FieldProjectionCartesianData",
                  "FieldProjectionAngleData": "#/definitions/FieldProjectionAngleData",
                  "DiffractionData": "#/definitions/DiffractionData"
               }
            },
            "oneOf": [
               {
                  "$ref": "#/definitions/FieldData"
               },
               {
                  "$ref": "#/definitions/FieldTimeData"
               },
               {
                  "$ref": "#/definitions/PermittivityData"
               },
               {
                  "$ref": "#/definitions/ModeSolverData"
               },
               {
                  "$ref": "#/definitions/ModeData"
               },
               {
                  "$ref": "#/definitions/FluxData"
               },
               {
                  "$ref": "#/definitions/FluxTimeData"
               },
               {
                  "$ref": "#/definitions/FieldProjectionKSpaceData"
               },
               {
                  "$ref": "#/definitions/FieldProjectionCartesianData"
               },
               {
                  "$ref": "#/definitions/FieldProjectionAngleData"
               },
               {
                  "$ref": "#/definitions/DiffractionData"
               }
            ]
         }
      },
      "log": {
         "title": "Solver Log",
         "description": "A string containing the log information from the simulation run.",
         "type": "string"
      },
      "diverged": {
         "title": "Diverged",
         "description": "A boolean flag denoting whether the simulation run diverged.",
         "default": false,
         "type": "boolean"
      },
      "output_data": {
         "title": "Jax Data",
         "description": "Tuple of Jax-compatible data associated with output monitors.",
         "default": [],
         "jax_field": true,
         "type": "array",
         "items": {
            "anyOf": [
               {
                  "$ref": "#/definitions/JaxModeData"
               },
               {
                  "$ref": "#/definitions/JaxDiffractionData"
               }
            ]
         }
      },
      "grad_data": {
         "title": "Gradient Field Data",
         "description": "Tuple of monitor data storing fields associated with the input structures.",
         "default": [],
         "type": "array",
         "items": {
            "$ref": "#/definitions/FieldData"
         }
      },
      "grad_eps_data": {
         "title": "Gradient Permittivity Data",
         "description": "Tuple of monitor data storing epsilon associated with the input structures.",
         "default": [],
         "type": "array",
         "items": {
            "$ref": "#/definitions/PermittivityData"
         }
      }
   },
   "required": [
      "data"
   ],
   "additionalProperties": false,
   "definitions": {
      "ApodizationSpec": {
         "title": "ApodizationSpec",
         "description": "Stores specifications for the apodizaton of frequency-domain monitors.\n\nParameters\n----------\nstart : Optional[NonNegativeFloat] = None\n    [units = sec].  Defines the time at which the start apodization ends.\nend : Optional[NonNegativeFloat] = None\n    [units = sec].  Defines the time at which the end apodization begins.\nwidth : Optional[PositiveFloat] = None\n    [units = sec].  Characteristic decay length of the apodization function.\n\nExample\n-------\n>>> apod_spec = ApodizationSpec(start=1, end=2, width=0.5)",
         "type": "object",
         "properties": {
            "start": {
               "title": "Start Interval",
               "description": "Defines the time at which the start apodization ends.",
               "units": "sec",
               "minimum": 0,
               "type": "number"
            },
            "end": {
               "title": "End Interval",
               "description": "Defines the time at which the end apodization begins.",
               "units": "sec",
               "minimum": 0,
               "type": "number"
            },
            "width": {
               "title": "Apodization Width",
               "description": "Characteristic decay length of the apodization function.",
               "units": "sec",
               "exclusiveMinimum": 0,
               "type": "number"
            },
            "type": {
               "title": "Type",
               "default": "ApodizationSpec",
               "enum": [
                  "ApodizationSpec"
               ],
               "type": "string"
            }
         },
         "additionalProperties": false
      },
      "FieldMonitor": {
         "title": "FieldMonitor",
         "description": ":class:`Monitor` that records electromagnetic fields in the frequency domain.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nfields : Tuple[Literal['Ex', 'Ey', 'Ez', 'Hx', 'Hy', 'Hz'], ...] = ['Ex', 'Ey', 'Ez', 'Hx', 'Hy', 'Hz']\n    Collection of field components to store in the monitor.\ninterval_space : Tuple[PositiveInt, PositiveInt, PositiveInt] = (1, 1, 1)\n    Number of grid step intervals between monitor recordings. If equal to 1, there will be no downsampling. If greater than 1, fields will be downsampled and automatically colocated.\ncolocate : Optional[bool] = None\n    Toggle whether fields should be colocated to grid cell centers. Default: ``False`` if ``interval_space`` is 1 in each direction, ``True`` if ``interval_space`` is greater than one in any direction.\n\nExample\n-------\n>>> monitor = FieldMonitor(\n...     center=(1,2,3),\n...     size=(2,2,2),\n...     fields=['Hx'],\n...     freqs=[250e12, 300e12],\n...     name='steady_state_monitor')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldMonitor",
               "enum": [
                  "FieldMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "fields": {
               "title": "Field Components",
               "description": "Collection of field components to store in the monitor.",
               "default": [
                  "Ex",
                  "Ey",
                  "Ez",
                  "Hx",
                  "Hy",
                  "Hz"
               ],
               "type": "array",
               "items": {
                  "enum": [
                     "Ex",
                     "Ey",
                     "Ez",
                     "Hx",
                     "Hy",
                     "Hz"
                  ],
                  "type": "string"
               }
            },
            "interval_space": {
               "title": "Spatial interval",
               "description": "Number of grid step intervals between monitor recordings. If equal to 1, there will be no downsampling. If greater than 1, fields will be downsampled and automatically colocated.",
               "default": [
                  1,
                  1,
                  1
               ],
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "integer",
                     "exclusiveMinimum": 0
                  },
                  {
                     "type": "integer",
                     "exclusiveMinimum": 0
                  },
                  {
                     "type": "integer",
                     "exclusiveMinimum": 0
                  }
               ]
            },
            "colocate": {
               "title": "Colocate fields",
               "description": "Toggle whether fields should be colocated to grid cell centers. Default: ``False`` if ``interval_space`` is 1 in each direction, ``True`` if ``interval_space`` is greater than one in any direction.",
               "type": "boolean"
            }
         },
         "required": [
            "size",
            "name",
            "freqs"
         ],
         "additionalProperties": false
      },
      "Coords": {
         "title": "Coords",
         "description": "Holds data about a set of x,y,z positions on a grid.\n\nParameters\n----------\nx : Array\n    1-dimensional array of x coordinates.\ny : Array\n    1-dimensional array of y coordinates.\nz : Array\n    1-dimensional array of z coordinates.\n\nExample\n-------\n>>> x = np.linspace(-1, 1, 10)\n>>> y = np.linspace(-1, 1, 11)\n>>> z = np.linspace(-1, 1, 12)\n>>> coords = Coords(x=x, y=y, z=z)",
         "type": "object",
         "properties": {
            "x": {
               "title": "Array Like",
               "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
               "type": "tuple",
               "properties": {},
               "required": []
            },
            "y": {
               "title": "Array Like",
               "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
               "type": "tuple",
               "properties": {},
               "required": []
            },
            "z": {
               "title": "Array Like",
               "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
               "type": "tuple",
               "properties": {},
               "required": []
            },
            "type": {
               "title": "Type",
               "default": "Coords",
               "enum": [
                  "Coords"
               ],
               "type": "string"
            }
         },
         "required": [
            "x",
            "y",
            "z"
         ],
         "additionalProperties": false
      },
      "Grid": {
         "title": "Grid",
         "description": "Contains all information about the spatial positions of the FDTD grid.\n\nParameters\n----------\nboundaries : Coords\n    x,y,z coordinates of the boundaries between cells, defining the FDTD grid.\n\nExample\n-------\n>>> x = np.linspace(-1, 1, 10)\n>>> y = np.linspace(-1, 1, 11)\n>>> z = np.linspace(-1, 1, 12)\n>>> coords = Coords(x=x, y=y, z=z)\n>>> grid = Grid(boundaries=coords)\n>>> centers = grid.centers\n>>> sizes = grid.sizes\n>>> yee_grid = grid.yee",
         "type": "object",
         "properties": {
            "boundaries": {
               "title": "Boundary Coordinates",
               "description": "x,y,z coordinates of the boundaries between cells, defining the FDTD grid.",
               "allOf": [
                  {
                     "$ref": "#/definitions/Coords"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "Grid",
               "enum": [
                  "Grid"
               ],
               "type": "string"
            }
         },
         "required": [
            "boundaries"
         ],
         "additionalProperties": false
      },
      "FieldData": {
         "title": "FieldData",
         "description": "Data associated with a :class:`.FieldMonitor`: scalar components of E and H fields.\n\nParameters\n----------\nEx : Optional[ScalarFieldDataArray] = None\n    Spatial distribution of the x-component of the electric field.\nEy : Optional[ScalarFieldDataArray] = None\n    Spatial distribution of the y-component of the electric field.\nEz : Optional[ScalarFieldDataArray] = None\n    Spatial distribution of the z-component of the electric field.\nHx : Optional[ScalarFieldDataArray] = None\n    Spatial distribution of the x-component of the magnetic field.\nHy : Optional[ScalarFieldDataArray] = None\n    Spatial distribution of the y-component of the magnetic field.\nHz : Optional[ScalarFieldDataArray] = None\n    Spatial distribution of the z-component of the magnetic field.\nmonitor : FieldMonitor\n        symmetry : Tuple[Literal[0, -1, 1], Literal[0, -1, 1], Literal[0, -1, 1]] = (0, 0, 0)\n    Symmetry eigenvalues of the original simulation in x, y, and z.\nsymmetry_center : Optional[Tuple[float, float, float]] = None\n    Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.\ngrid_expanded : Optional[Grid] = None\n    :class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.\ngrid_primal_correction : Union[float, FreqDataArray, TimeDataArray, FreqModeDataArray] = 1.0\n    Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the primal grid locations along the normal direction.\ngrid_dual_correction : Union[float, FreqDataArray, TimeDataArray, FreqModeDataArray] = 1.0\n    Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the dual grid locations along the normal direction.\n\nExample\n-------\n>>> from tidy3d import ScalarFieldDataArray\n>>> x = [-1,1]\n>>> y = [-2,0,2]\n>>> z = [-3,-1,1,3]\n>>> f = [2e14, 3e14]\n>>> coords = dict(x=x, y=y, z=z, f=f)\n>>> scalar_field = ScalarFieldDataArray((1+1j) * np.random.random((2,3,4,2)), coords=coords)\n>>> monitor = FieldMonitor(size=(2,4,6), freqs=[2e14, 3e14], name='field', fields=['Ex', 'Hz'])\n>>> data = FieldData(monitor=monitor, Ex=scalar_field, Hz=scalar_field)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldData",
               "enum": [
                  "FieldData"
               ],
               "type": "string"
            },
            "Ex": {
               "title": "DataArray",
               "description": "Spatial distribution of the x-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ey": {
               "title": "DataArray",
               "description": "Spatial distribution of the y-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ez": {
               "title": "DataArray",
               "description": "Spatial distribution of the z-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hx": {
               "title": "DataArray",
               "description": "Spatial distribution of the x-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hy": {
               "title": "DataArray",
               "description": "Spatial distribution of the y-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hz": {
               "title": "DataArray",
               "description": "Spatial distribution of the z-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "monitor": {
               "$ref": "#/definitions/FieldMonitor"
            },
            "symmetry": {
               "title": "Symmetry",
               "description": "Symmetry eigenvalues of the original simulation in x, y, and z.",
               "default": [
                  0,
                  0,
                  0
               ],
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  }
               ]
            },
            "symmetry_center": {
               "title": "Symmetry Center",
               "description": "Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "grid_expanded": {
               "title": "Expanded Grid",
               "description": ":class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.",
               "allOf": [
                  {
                     "$ref": "#/definitions/Grid"
                  }
               ]
            },
            "grid_primal_correction": {
               "title": "Field correction factor",
               "description": "Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the primal grid locations along the normal direction.",
               "default": 1.0,
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  }
               ]
            },
            "grid_dual_correction": {
               "title": "Field correction factor",
               "description": "Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the dual grid locations along the normal direction.",
               "default": 1.0,
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  }
               ]
            }
         },
         "required": [
            "monitor"
         ],
         "additionalProperties": false
      },
      "FieldTimeMonitor": {
         "title": "FieldTimeMonitor",
         "description": ":class:`Monitor` that records electromagnetic fields in the time domain.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nstart : NonNegativeFloat = 0.0\n    [units = sec].  Time at which to start monitor recording.\nstop : Optional[NonNegativeFloat] = None\n    [units = sec].  Time at which to stop monitor recording.  If not specified, record until end of simulation.\ninterval : PositiveInt = 1\n    Number of time step intervals between monitor recordings.\nfields : Tuple[Literal['Ex', 'Ey', 'Ez', 'Hx', 'Hy', 'Hz'], ...] = ['Ex', 'Ey', 'Ez', 'Hx', 'Hy', 'Hz']\n    Collection of field components to store in the monitor.\ninterval_space : Tuple[PositiveInt, PositiveInt, PositiveInt] = (1, 1, 1)\n    Number of grid step intervals between monitor recordings. If equal to 1, there will be no downsampling. If greater than 1, fields will be downsampled and automatically colocated.\ncolocate : Optional[bool] = None\n    Toggle whether fields should be colocated to grid cell centers. Default: ``False`` if ``interval_space`` is 1 in each direction, ``True`` if ``interval_space`` is greater than one in any direction.\n\nExample\n-------\n>>> monitor = FieldTimeMonitor(\n...     center=(1,2,3),\n...     size=(2,2,2),\n...     fields=['Hx'],\n...     start=1e-13,\n...     stop=5e-13,\n...     interval=2,\n...     name='movie_monitor')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldTimeMonitor",
               "enum": [
                  "FieldTimeMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "start": {
               "title": "Start time",
               "description": "Time at which to start monitor recording.",
               "default": 0.0,
               "units": "sec",
               "minimum": 0,
               "type": "number"
            },
            "stop": {
               "title": "Stop time",
               "description": "Time at which to stop monitor recording.  If not specified, record until end of simulation.",
               "units": "sec",
               "minimum": 0,
               "type": "number"
            },
            "interval": {
               "title": "Time interval",
               "description": "Number of time step intervals between monitor recordings.",
               "default": 1,
               "exclusiveMinimum": 0,
               "type": "integer"
            },
            "fields": {
               "title": "Field Components",
               "description": "Collection of field components to store in the monitor.",
               "default": [
                  "Ex",
                  "Ey",
                  "Ez",
                  "Hx",
                  "Hy",
                  "Hz"
               ],
               "type": "array",
               "items": {
                  "enum": [
                     "Ex",
                     "Ey",
                     "Ez",
                     "Hx",
                     "Hy",
                     "Hz"
                  ],
                  "type": "string"
               }
            },
            "interval_space": {
               "title": "Spatial interval",
               "description": "Number of grid step intervals between monitor recordings. If equal to 1, there will be no downsampling. If greater than 1, fields will be downsampled and automatically colocated.",
               "default": [
                  1,
                  1,
                  1
               ],
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "integer",
                     "exclusiveMinimum": 0
                  },
                  {
                     "type": "integer",
                     "exclusiveMinimum": 0
                  },
                  {
                     "type": "integer",
                     "exclusiveMinimum": 0
                  }
               ]
            },
            "colocate": {
               "title": "Colocate fields",
               "description": "Toggle whether fields should be colocated to grid cell centers. Default: ``False`` if ``interval_space`` is 1 in each direction, ``True`` if ``interval_space`` is greater than one in any direction.",
               "type": "boolean"
            }
         },
         "required": [
            "size",
            "name"
         ],
         "additionalProperties": false
      },
      "FieldTimeData": {
         "title": "FieldTimeData",
         "description": "Data associated with a :class:`.FieldTimeMonitor`: scalar components of E and H fields.\n\nParameters\n----------\nEx : Optional[ScalarFieldTimeDataArray] = None\n    Spatial distribution of the x-component of the electric field.\nEy : Optional[ScalarFieldTimeDataArray] = None\n    Spatial distribution of the y-component of the electric field.\nEz : Optional[ScalarFieldTimeDataArray] = None\n    Spatial distribution of the z-component of the electric field.\nHx : Optional[ScalarFieldTimeDataArray] = None\n    Spatial distribution of the x-component of the magnetic field.\nHy : Optional[ScalarFieldTimeDataArray] = None\n    Spatial distribution of the y-component of the magnetic field.\nHz : Optional[ScalarFieldTimeDataArray] = None\n    Spatial distribution of the z-component of the magnetic field.\nmonitor : FieldTimeMonitor\n        symmetry : Tuple[Literal[0, -1, 1], Literal[0, -1, 1], Literal[0, -1, 1]] = (0, 0, 0)\n    Symmetry eigenvalues of the original simulation in x, y, and z.\nsymmetry_center : Optional[Tuple[float, float, float]] = None\n    Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.\ngrid_expanded : Optional[Grid] = None\n    :class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.\ngrid_primal_correction : Union[float, FreqDataArray, TimeDataArray, FreqModeDataArray] = 1.0\n    Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the primal grid locations along the normal direction.\ngrid_dual_correction : Union[float, FreqDataArray, TimeDataArray, FreqModeDataArray] = 1.0\n    Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the dual grid locations along the normal direction.\n\nExample\n-------\n>>> from tidy3d import ScalarFieldTimeDataArray\n>>> x = [-1,1]\n>>> y = [-2,0,2]\n>>> z = [-3,-1,1,3]\n>>> t = [0, 1e-12, 2e-12]\n>>> coords = dict(x=x, y=y, z=z, t=t)\n>>> scalar_field = ScalarFieldTimeDataArray(np.random.random((2,3,4,3)), coords=coords)\n>>> monitor = FieldTimeMonitor(size=(2,4,6), interval=100, name='field', fields=['Ex', 'Hz'])\n>>> data = FieldTimeData(monitor=monitor, Ex=scalar_field, Hz=scalar_field)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldTimeData",
               "enum": [
                  "FieldTimeData"
               ],
               "type": "string"
            },
            "Ex": {
               "title": "DataArray",
               "description": "Spatial distribution of the x-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ey": {
               "title": "DataArray",
               "description": "Spatial distribution of the y-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ez": {
               "title": "DataArray",
               "description": "Spatial distribution of the z-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hx": {
               "title": "DataArray",
               "description": "Spatial distribution of the x-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hy": {
               "title": "DataArray",
               "description": "Spatial distribution of the y-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hz": {
               "title": "DataArray",
               "description": "Spatial distribution of the z-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "monitor": {
               "$ref": "#/definitions/FieldTimeMonitor"
            },
            "symmetry": {
               "title": "Symmetry",
               "description": "Symmetry eigenvalues of the original simulation in x, y, and z.",
               "default": [
                  0,
                  0,
                  0
               ],
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  }
               ]
            },
            "symmetry_center": {
               "title": "Symmetry Center",
               "description": "Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "grid_expanded": {
               "title": "Expanded Grid",
               "description": ":class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.",
               "allOf": [
                  {
                     "$ref": "#/definitions/Grid"
                  }
               ]
            },
            "grid_primal_correction": {
               "title": "Field correction factor",
               "description": "Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the primal grid locations along the normal direction.",
               "default": 1.0,
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  }
               ]
            },
            "grid_dual_correction": {
               "title": "Field correction factor",
               "description": "Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the dual grid locations along the normal direction.",
               "default": 1.0,
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  }
               ]
            }
         },
         "required": [
            "monitor"
         ],
         "additionalProperties": false
      },
      "PermittivityMonitor": {
         "title": "PermittivityMonitor",
         "description": ":class:`Monitor` that records the diagonal components of the complex-valued relative\npermittivity tensor in the frequency domain. The recorded data has the same shape as a\n:class:`.FieldMonitor` of the same geometry: the permittivity values are saved at the\nYee grid locations, and can be interpolated to any point inside the monitor.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\n\nExample\n-------\n>>> monitor = PermittivityMonitor(\n...     center=(1,2,3),\n...     size=(2,2,2),\n...     freqs=[250e12, 300e12],\n...     name='eps_monitor')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "PermittivityMonitor",
               "enum": [
                  "PermittivityMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            }
         },
         "required": [
            "size",
            "name",
            "freqs"
         ],
         "additionalProperties": false
      },
      "PermittivityData": {
         "title": "PermittivityData",
         "description": "Data for a :class:`.PermittivityMonitor`: diagonal components of the permittivity tensor.\n\nParameters\n----------\nmonitor : PermittivityMonitor\n        symmetry : Tuple[Literal[0, -1, 1], Literal[0, -1, 1], Literal[0, -1, 1]] = (0, 0, 0)\n    Symmetry eigenvalues of the original simulation in x, y, and z.\nsymmetry_center : Optional[Tuple[float, float, float]] = None\n    Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.\ngrid_expanded : Optional[Grid] = None\n    :class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.\neps_xx : ScalarFieldDataArray\n    Spatial distribution of the xx-component of the relative permittivity.\neps_yy : ScalarFieldDataArray\n    Spatial distribution of the yy-component of the relative permittivity.\neps_zz : ScalarFieldDataArray\n    Spatial distribution of the zz-component of the relative permittivity.\n\nExample\n-------\n>>> from tidy3d import ScalarFieldDataArray\n>>> x = [-1,1]\n>>> y = [-2,0,2]\n>>> z = [-3,-1,1,3]\n>>> f = [2e14, 3e14]\n>>> coords = dict(x=x, y=y, z=z, f=f)\n>>> sclr_fld = ScalarFieldDataArray((1+1j) * np.random.random((2,3,4,2)), coords=coords)\n>>> monitor = PermittivityMonitor(size=(2,4,6), freqs=[2e14, 3e14], name='eps')\n>>> data = PermittivityData(monitor=monitor, eps_xx=sclr_fld, eps_yy=sclr_fld, eps_zz=sclr_fld)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "PermittivityData",
               "enum": [
                  "PermittivityData"
               ],
               "type": "string"
            },
            "monitor": {
               "$ref": "#/definitions/PermittivityMonitor"
            },
            "symmetry": {
               "title": "Symmetry",
               "description": "Symmetry eigenvalues of the original simulation in x, y, and z.",
               "default": [
                  0,
                  0,
                  0
               ],
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  }
               ]
            },
            "symmetry_center": {
               "title": "Symmetry Center",
               "description": "Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "grid_expanded": {
               "title": "Expanded Grid",
               "description": ":class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.",
               "allOf": [
                  {
                     "$ref": "#/definitions/Grid"
                  }
               ]
            },
            "eps_xx": {
               "title": "DataArray",
               "description": "Spatial distribution of the xx-component of the relative permittivity.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "eps_yy": {
               "title": "DataArray",
               "description": "Spatial distribution of the yy-component of the relative permittivity.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "eps_zz": {
               "title": "DataArray",
               "description": "Spatial distribution of the zz-component of the relative permittivity.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "monitor",
            "eps_xx",
            "eps_yy",
            "eps_zz"
         ],
         "additionalProperties": false
      },
      "ModeSpec": {
         "title": "ModeSpec",
         "description": "Stores specifications for the mode solver to find an electromagntic mode.\nNote, the planar axes are found by popping the injection axis from {x,y,z}.\nFor example, if injection axis is y, the planar axes are ordered {x,z}.\n\nParameters\n----------\nnum_modes : PositiveInt = 1\n    Number of modes returned by mode solver.\ntarget_neff : Optional[PositiveFloat] = None\n    Guess for effective index of the mode.\nnum_pml : Tuple[NonNegativeInt, NonNegativeInt] = (0, 0)\n    Number of standard pml layers to add in the two tangential axes.\nfilter_pol : Optional[Literal['te', 'tm']] = None\n    The solver always computes the ``num_modes`` modes closest to the given ``target_neff``. If ``filter_pol==None``, they are simply sorted in order of decresing effective index. If a polarization filter is selected, the modes are rearranged such that the first ``n_pol`` modes in the list are the ones with the selected polarization fraction larger than or equal to 0.5, while the next ``num_modes - n_pol`` modes are the ones where it is smaller than 0.5 (i.e. the opposite polarization fraction is larger than 0.5). Within each polarization subset, the modes are still ordered by decreasing effective index. ``te``-fraction is defined as the integrated intensity of the E-field component parallel to the first plane axis, normalized to the total in-plane E-field intensity. Conversely, ``tm``-fraction uses the E field component parallel to the second plane axis.\nangle_theta : float = 0.0\n    [units = rad].  Polar angle of the propagation axis from the injection axis.\nangle_phi : float = 0.0\n    [units = rad].  Azimuth angle of the propagation axis in the plane orthogonal to the injection axis.\nprecision : Literal['single', 'double'] = single\n    The solver will be faster and using less memory under single precision, but more accurate under double precision.\nbend_radius : Optional[float] = None\n    [units = um].  A curvature radius for simulation of waveguide bends. Can be negative, in which case the mode plane center has a smaller value than the curvature center along the tangential axis perpendicular to the bend axis.\nbend_axis : Optional[Literal[0, 1]] = None\n    Index into the two tangential axes defining the normal to the plane in which the bend lies. This must be provided if ``bend_radius`` is not ``None``. For example, for a ring in the global xy-plane, and a mode plane in either the xz or the yz plane, the ``bend_axis`` is always 1 (the global z axis).\ntrack_freq : Optional[Literal['central', 'lowest', 'highest']] = central\n    Parameter that turns on/off mode tracking based on their similarity. Can take values ``'lowest'``, ``'central'``, or ``'highest'``, which correspond to mode tracking based on the lowest, central, or highest frequency. If ``None`` no mode tracking is performed.\n\nExample\n-------\n>>> mode_spec = ModeSpec(num_modes=3, target_neff=1.5)",
         "type": "object",
         "properties": {
            "num_modes": {
               "title": "Number of modes",
               "description": "Number of modes returned by mode solver.",
               "default": 1,
               "exclusiveMinimum": 0,
               "type": "integer"
            },
            "target_neff": {
               "title": "Target effective index",
               "description": "Guess for effective index of the mode.",
               "exclusiveMinimum": 0,
               "type": "number"
            },
            "num_pml": {
               "title": "Number of PML layers",
               "description": "Number of standard pml layers to add in the two tangential axes.",
               "default": [
                  0,
                  0
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "integer",
                     "minimum": 0
                  },
                  {
                     "type": "integer",
                     "minimum": 0
                  }
               ]
            },
            "filter_pol": {
               "title": "Polarization filtering",
               "description": "The solver always computes the ``num_modes`` modes closest to the given ``target_neff``. If ``filter_pol==None``, they are simply sorted in order of decresing effective index. If a polarization filter is selected, the modes are rearranged such that the first ``n_pol`` modes in the list are the ones with the selected polarization fraction larger than or equal to 0.5, while the next ``num_modes - n_pol`` modes are the ones where it is smaller than 0.5 (i.e. the opposite polarization fraction is larger than 0.5). Within each polarization subset, the modes are still ordered by decreasing effective index. ``te``-fraction is defined as the integrated intensity of the E-field component parallel to the first plane axis, normalized to the total in-plane E-field intensity. Conversely, ``tm``-fraction uses the E field component parallel to the second plane axis.",
               "enum": [
                  "te",
                  "tm"
               ],
               "type": "string"
            },
            "angle_theta": {
               "title": "Polar Angle",
               "description": "Polar angle of the propagation axis from the injection axis.",
               "default": 0.0,
               "units": "rad",
               "type": "number"
            },
            "angle_phi": {
               "title": "Azimuth Angle",
               "description": "Azimuth angle of the propagation axis in the plane orthogonal to the injection axis.",
               "default": 0.0,
               "units": "rad",
               "type": "number"
            },
            "precision": {
               "title": "single or double precision in mode solver",
               "description": "The solver will be faster and using less memory under single precision, but more accurate under double precision.",
               "default": "single",
               "enum": [
                  "single",
                  "double"
               ],
               "type": "string"
            },
            "bend_radius": {
               "title": "Bend radius",
               "description": "A curvature radius for simulation of waveguide bends. Can be negative, in which case the mode plane center has a smaller value than the curvature center along the tangential axis perpendicular to the bend axis.",
               "units": "um",
               "type": "number"
            },
            "bend_axis": {
               "title": "Bend axis",
               "description": "Index into the two tangential axes defining the normal to the plane in which the bend lies. This must be provided if ``bend_radius`` is not ``None``. For example, for a ring in the global xy-plane, and a mode plane in either the xz or the yz plane, the ``bend_axis`` is always 1 (the global z axis).",
               "enum": [
                  0,
                  1
               ],
               "type": "integer"
            },
            "track_freq": {
               "title": "Mode Tracking Frequency",
               "description": "Parameter that turns on/off mode tracking based on their similarity. Can take values ``'lowest'``, ``'central'``, or ``'highest'``, which correspond to mode tracking based on the lowest, central, or highest frequency. If ``None`` no mode tracking is performed.",
               "default": "central",
               "enum": [
                  "central",
                  "lowest",
                  "highest"
               ],
               "type": "string"
            },
            "type": {
               "title": "Type",
               "default": "ModeSpec",
               "enum": [
                  "ModeSpec"
               ],
               "type": "string"
            }
         },
         "additionalProperties": false
      },
      "ModeSolverMonitor": {
         "title": "ModeSolverMonitor",
         "description": ":class:`Monitor` that stores the mode field profiles returned by the mode solver in the\nmonitor plane.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nmode_spec : ModeSpec\n    Parameters to feed to mode solver which determine modes measured by monitor.\n\nExample\n-------\n>>> mode_spec = ModeSpec(num_modes=3)\n>>> monitor = ModeSolverMonitor(\n...     center=(1,2,3),\n...     size=(2,2,0),\n...     freqs=[200e12, 210e12],\n...     mode_spec=mode_spec,\n...     name='mode_monitor')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "ModeSolverMonitor",
               "enum": [
                  "ModeSolverMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "mode_spec": {
               "title": "Mode Specification",
               "description": "Parameters to feed to mode solver which determine modes measured by monitor.",
               "allOf": [
                  {
                     "$ref": "#/definitions/ModeSpec"
                  }
               ]
            }
         },
         "required": [
            "size",
            "name",
            "freqs",
            "mode_spec"
         ],
         "additionalProperties": false
      },
      "ModeSolverData": {
         "title": "ModeSolverData",
         "description": "Data associated with a :class:`.ModeSolverMonitor`: scalar components of E and H fields.\n\nParameters\n----------\nEx : ScalarModeFieldDataArray\n    Spatial distribution of the x-component of the electric field of the mode.\nEy : ScalarModeFieldDataArray\n    Spatial distribution of the y-component of the electric field of the mode.\nEz : ScalarModeFieldDataArray\n    Spatial distribution of the z-component of the electric field of the mode.\nHx : ScalarModeFieldDataArray\n    Spatial distribution of the x-component of the magnetic field of the mode.\nHy : ScalarModeFieldDataArray\n    Spatial distribution of the y-component of the magnetic field of the mode.\nHz : ScalarModeFieldDataArray\n    Spatial distribution of the z-component of the magnetic field of the mode.\nmonitor : ModeSolverMonitor\n        symmetry : Tuple[Literal[0, -1, 1], Literal[0, -1, 1], Literal[0, -1, 1]] = (0, 0, 0)\n    Symmetry eigenvalues of the original simulation in x, y, and z.\nsymmetry_center : Optional[Tuple[float, float, float]] = None\n    Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.\ngrid_expanded : Optional[Grid] = None\n    :class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.\ngrid_primal_correction : Union[float, FreqDataArray, TimeDataArray, FreqModeDataArray] = 1.0\n    Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the primal grid locations along the normal direction.\ngrid_dual_correction : Union[float, FreqDataArray, TimeDataArray, FreqModeDataArray] = 1.0\n    Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the dual grid locations along the normal direction.\nn_complex : ModeIndexDataArray\n    Complex-valued effective propagation constants associated with the mode.\n\nExample\n-------\n>>> from tidy3d import ModeSpec\n>>> from tidy3d import ScalarModeFieldDataArray, ModeIndexDataArray\n>>> x = [-1,1]\n>>> y = [0]\n>>> z = [-3,-1,1,3]\n>>> f = [2e14, 3e14]\n>>> mode_index = np.arange(5)\n>>> field_coords = dict(x=x, y=y, z=z, f=f, mode_index=mode_index)\n>>> field = ScalarModeFieldDataArray((1+1j)*np.random.random((2,1,4,2,5)), coords=field_coords)\n>>> index_coords = dict(f=f, mode_index=mode_index)\n>>> index_data = ModeIndexDataArray((1+1j) * np.random.random((2,5)), coords=index_coords)\n>>> monitor = ModeSolverMonitor(\n...    size=(2,0,6),\n...    freqs=[2e14, 3e14],\n...    mode_spec=ModeSpec(num_modes=5),\n...    name='mode_solver',\n... )\n>>> data = ModeSolverData(\n...     monitor=monitor,\n...     Ex=field,\n...     Ey=field,\n...     Ez=field,\n...     Hx=field,\n...     Hy=field,\n...     Hz=field,\n...     n_complex=index_data\n... )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "ModeSolverData",
               "enum": [
                  "ModeSolverData"
               ],
               "type": "string"
            },
            "Ex": {
               "title": "DataArray",
               "description": "Spatial distribution of the x-component of the electric field of the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ey": {
               "title": "DataArray",
               "description": "Spatial distribution of the y-component of the electric field of the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ez": {
               "title": "DataArray",
               "description": "Spatial distribution of the z-component of the electric field of the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hx": {
               "title": "DataArray",
               "description": "Spatial distribution of the x-component of the magnetic field of the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hy": {
               "title": "DataArray",
               "description": "Spatial distribution of the y-component of the magnetic field of the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hz": {
               "title": "DataArray",
               "description": "Spatial distribution of the z-component of the magnetic field of the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "monitor": {
               "$ref": "#/definitions/ModeSolverMonitor"
            },
            "symmetry": {
               "title": "Symmetry",
               "description": "Symmetry eigenvalues of the original simulation in x, y, and z.",
               "default": [
                  0,
                  0,
                  0
               ],
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  },
                  {
                     "enum": [
                        0,
                        -1,
                        1
                     ],
                     "type": "integer"
                  }
               ]
            },
            "symmetry_center": {
               "title": "Symmetry Center",
               "description": "Center of the symmetry planes of the original simulation in x, y, and z. Required only if any of the ``symmetry`` field are non-zero.",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "grid_expanded": {
               "title": "Expanded Grid",
               "description": ":class:`.Grid` on which the symmetry will be expanded. Required only if any of the ``symmetry`` field are non-zero.",
               "allOf": [
                  {
                     "$ref": "#/definitions/Grid"
                  }
               ]
            },
            "grid_primal_correction": {
               "title": "Field correction factor",
               "description": "Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the primal grid locations along the normal direction.",
               "default": 1.0,
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  }
               ]
            },
            "grid_dual_correction": {
               "title": "Field correction factor",
               "description": "Correction factor that needs to be applied for data corresponding to a 2D monitor to take into account the finite grid in the normal direction in the simulation in which the data was computed. The factor is applied to fields defined on the dual grid locations along the normal direction.",
               "default": 1.0,
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  },
                  {
                     "title": "DataArray",
                     "type": "xr.DataArray",
                     "properties": {
                        "_dims": {
                           "title": "_dims",
                           "type": "Tuple[str, ...]"
                        }
                     },
                     "required": [
                        "_dims"
                     ]
                  }
               ]
            },
            "n_complex": {
               "title": "DataArray",
               "description": "Complex-valued effective propagation constants associated with the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "Ex",
            "Ey",
            "Ez",
            "Hx",
            "Hy",
            "Hz",
            "monitor",
            "n_complex"
         ],
         "additionalProperties": false
      },
      "ModeMonitor": {
         "title": "ModeMonitor",
         "description": ":class:`Monitor` that records amplitudes from modal decomposition of fields on plane.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nmode_spec : ModeSpec\n    Parameters to feed to mode solver which determine modes measured by monitor.\n\nExample\n-------\n>>> mode_spec = ModeSpec(num_modes=3)\n>>> monitor = ModeMonitor(\n...     center=(1,2,3),\n...     size=(2,2,0),\n...     freqs=[200e12, 210e12],\n...     mode_spec=mode_spec,\n...     name='mode_monitor')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "ModeMonitor",
               "enum": [
                  "ModeMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "mode_spec": {
               "title": "Mode Specification",
               "description": "Parameters to feed to mode solver which determine modes measured by monitor.",
               "allOf": [
                  {
                     "$ref": "#/definitions/ModeSpec"
                  }
               ]
            }
         },
         "required": [
            "size",
            "name",
            "freqs",
            "mode_spec"
         ],
         "additionalProperties": false
      },
      "ModeData": {
         "title": "ModeData",
         "description": "Data associated with a :class:`.ModeMonitor`: modal amplitudes and propagation indices.\n\nParameters\n----------\nmonitor : ModeMonitor\n        amps : ModeAmpsDataArray\n    Complex-valued amplitudes associated with the mode.\nn_complex : ModeIndexDataArray\n    Complex-valued effective propagation constants associated with the mode.\n\nExample\n-------\n>>> from tidy3d import ModeSpec\n>>> from tidy3d import ModeAmpsDataArray, ModeIndexDataArray\n>>> direction = [\"+\", \"-\"]\n>>> f = [1e14, 2e14, 3e14]\n>>> mode_index = np.arange(5)\n>>> index_coords = dict(f=f, mode_index=mode_index)\n>>> index_data = ModeIndexDataArray((1+1j) * np.random.random((3, 5)), coords=index_coords)\n>>> amp_coords = dict(direction=direction, f=f, mode_index=mode_index)\n>>> amp_data = ModeAmpsDataArray((1+1j) * np.random.random((2, 3, 5)), coords=amp_coords)\n>>> monitor = ModeMonitor(\n...    size=(2,0,6),\n...    freqs=[2e14, 3e14],\n...    mode_spec=ModeSpec(num_modes=5),\n...    name='mode',\n... )\n>>> data = ModeData(monitor=monitor, amps=amp_data, n_complex=index_data)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "ModeData",
               "enum": [
                  "ModeData"
               ],
               "type": "string"
            },
            "monitor": {
               "$ref": "#/definitions/ModeMonitor"
            },
            "amps": {
               "title": "DataArray",
               "description": "Complex-valued amplitudes associated with the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "n_complex": {
               "title": "DataArray",
               "description": "Complex-valued effective propagation constants associated with the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "monitor",
            "amps",
            "n_complex"
         ],
         "additionalProperties": false
      },
      "FluxMonitor": {
         "title": "FluxMonitor",
         "description": ":class:`Monitor` that records power flux in the frequency domain.\nIf the monitor geometry is a 2D box, the total flux through this plane is returned, with a\npositive sign corresponding to power flow in the positive direction along the axis normal to\nthe plane. If the geometry is a 3D box, the total power coming out of the box is returned by\nintegrating the flux over all box surfaces (excpet the ones defined in ``exclude_surfaces``).\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nnormal_dir : Optional[Literal['+', '-']] = None\n    Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.\nexclude_surfaces : Optional[Tuple[Literal['x-', 'x+', 'y-', 'y+', 'z-', 'z+'], ...]] = None\n    Surfaces to exclude in the integration, if a volume monitor.\n\nExample\n-------\n>>> monitor = FluxMonitor(\n...     center=(1,2,3),\n...     size=(2,2,0),\n...     freqs=[200e12, 210e12],\n...     name='flux_monitor')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FluxMonitor",
               "enum": [
                  "FluxMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": "Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            },
            "exclude_surfaces": {
               "title": "Excluded surfaces",
               "description": "Surfaces to exclude in the integration, if a volume monitor.",
               "type": "array",
               "items": {
                  "enum": [
                     "x-",
                     "x+",
                     "y-",
                     "y+",
                     "z-",
                     "z+"
                  ],
                  "type": "string"
               }
            }
         },
         "required": [
            "size",
            "name",
            "freqs"
         ],
         "additionalProperties": false
      },
      "FluxData": {
         "title": "FluxData",
         "description": "Data associated with a :class:`.FluxMonitor`: flux data in the frequency-domain.\n\nParameters\n----------\nmonitor : FluxMonitor\n        flux : FluxDataArray\n    \nExample\n-------\n>>> from tidy3d import FluxDataArray\n>>> f = [2e14, 3e14]\n>>> coords = dict(f=f)\n>>> flux_data = FluxDataArray(np.random.random(2), coords=coords)\n>>> monitor = FluxMonitor(size=(2,0,6), freqs=[2e14, 3e14], name='flux')\n>>> data = FluxData(monitor=monitor, flux=flux_data)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FluxData",
               "enum": [
                  "FluxData"
               ],
               "type": "string"
            },
            "monitor": {
               "$ref": "#/definitions/FluxMonitor"
            },
            "flux": {
               "title": "DataArray",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "monitor",
            "flux"
         ],
         "additionalProperties": false
      },
      "FluxTimeMonitor": {
         "title": "FluxTimeMonitor",
         "description": ":class:`Monitor` that records power flux in the time domain.\nIf the monitor geometry is a 2D box, the total flux through this plane is returned, with a\npositive sign corresponding to power flow in the positive direction along the axis normal to\nthe plane. If the geometry is a 3D box, the total power coming out of the box is returned by\nintegrating the flux over all box surfaces (excpet the ones defined in ``exclude_surfaces``).\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nstart : NonNegativeFloat = 0.0\n    [units = sec].  Time at which to start monitor recording.\nstop : Optional[NonNegativeFloat] = None\n    [units = sec].  Time at which to stop monitor recording.  If not specified, record until end of simulation.\ninterval : PositiveInt = 1\n    Number of time step intervals between monitor recordings.\nnormal_dir : Optional[Literal['+', '-']] = None\n    Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.\nexclude_surfaces : Optional[Tuple[Literal['x-', 'x+', 'y-', 'y+', 'z-', 'z+'], ...]] = None\n    Surfaces to exclude in the integration, if a volume monitor.\n\nExample\n-------\n>>> monitor = FluxTimeMonitor(\n...     center=(1,2,3),\n...     size=(2,2,0),\n...     start=1e-13,\n...     stop=5e-13,\n...     interval=2,\n...     name='flux_vs_time')",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FluxTimeMonitor",
               "enum": [
                  "FluxTimeMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "start": {
               "title": "Start time",
               "description": "Time at which to start monitor recording.",
               "default": 0.0,
               "units": "sec",
               "minimum": 0,
               "type": "number"
            },
            "stop": {
               "title": "Stop time",
               "description": "Time at which to stop monitor recording.  If not specified, record until end of simulation.",
               "units": "sec",
               "minimum": 0,
               "type": "number"
            },
            "interval": {
               "title": "Time interval",
               "description": "Number of time step intervals between monitor recordings.",
               "default": 1,
               "exclusiveMinimum": 0,
               "type": "integer"
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": "Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            },
            "exclude_surfaces": {
               "title": "Excluded surfaces",
               "description": "Surfaces to exclude in the integration, if a volume monitor.",
               "type": "array",
               "items": {
                  "enum": [
                     "x-",
                     "x+",
                     "y-",
                     "y+",
                     "z-",
                     "z+"
                  ],
                  "type": "string"
               }
            }
         },
         "required": [
            "size",
            "name"
         ],
         "additionalProperties": false
      },
      "FluxTimeData": {
         "title": "FluxTimeData",
         "description": "Data associated with a :class:`.FluxTimeMonitor`: flux data in the time-domain.\n\nParameters\n----------\nmonitor : FluxTimeMonitor\n        flux : FluxTimeDataArray\n    \nExample\n-------\n>>> from tidy3d import FluxTimeDataArray\n>>> t = [0, 1e-12, 2e-12]\n>>> coords = dict(t=t)\n>>> flux_data = FluxTimeDataArray(np.random.random(3), coords=coords)\n>>> monitor = FluxTimeMonitor(size=(2,0,6), interval=100, name='flux_time')\n>>> data = FluxTimeData(monitor=monitor, flux=flux_data)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FluxTimeData",
               "enum": [
                  "FluxTimeData"
               ],
               "type": "string"
            },
            "monitor": {
               "$ref": "#/definitions/FluxTimeMonitor"
            },
            "flux": {
               "title": "DataArray",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "monitor",
            "flux"
         ],
         "additionalProperties": false
      },
      "FieldProjectionKSpaceMonitor": {
         "title": "FieldProjectionKSpaceMonitor",
         "description": ":class:`Monitor` that samples electromagnetic near fields in the frequency domain\nand projects them on an observation plane defined in k-space.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nnormal_dir : Optional[Literal['+', '-']] = None\n    Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.\nexclude_surfaces : Optional[Tuple[Literal['x-', 'x+', 'y-', 'y+', 'z-', 'z+'], ...]] = None\n    Surfaces to exclude in the integration, if a volume monitor.\ncustom_origin : Optional[Tuple[float, float, float]] = None\n    [units = um].  Local origin used for defining observation points. If ``None``, uses the monitor's center.\nfar_field_approx : bool = True\n    Whether to enable the far field approximation when projecting fields.\nproj_axis : Literal[0, 1, 2]\n    Axis along which the observation plane is oriented.\nproj_distance : float = 1000000.0\n    [units = um].  Radial distance of the projection points from ``local_origin``.\nux : Union[Tuple[float, ...], Array]\n    Local x component of wave vectors on the observation plane, relative to ``local_origin`` and oriented with respect to ``proj_axis``, normalized by (2*pi/lambda) where lambda is the wavelength associated with the background medium. Must be in the range [-1, 1].\nuy : Union[Tuple[float, ...], Array]\n    Local y component of wave vectors on the observation plane, relative to ``local_origin`` and oriented with respect to ``proj_axis``, normalized by (2*pi/lambda) where lambda is the wavelength associated with the background medium. Must be in the range [-1, 1].\n\nExample\n-------\n>>> monitor = FieldProjectionKSpaceMonitor(\n...     center=(1,2,3),\n...     size=(2,2,2),\n...     freqs=[250e12, 300e12],\n...     name='n2f_monitor',\n...     custom_origin=(1,2,3),\n...     proj_axis=2,\n...     ux=[0.1,0.2],\n...     uy=[0.3,0.4,0.5]\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldProjectionKSpaceMonitor",
               "enum": [
                  "FieldProjectionKSpaceMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": "Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            },
            "exclude_surfaces": {
               "title": "Excluded surfaces",
               "description": "Surfaces to exclude in the integration, if a volume monitor.",
               "type": "array",
               "items": {
                  "enum": [
                     "x-",
                     "x+",
                     "y-",
                     "y+",
                     "z-",
                     "z+"
                  ],
                  "type": "string"
               }
            },
            "custom_origin": {
               "title": "Local origin",
               "description": "Local origin used for defining observation points. If ``None``, uses the monitor's center.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "far_field_approx": {
               "title": "Far field approximation",
               "description": "Whether to enable the far field approximation when projecting fields.",
               "default": true,
               "type": "boolean"
            },
            "proj_axis": {
               "title": "Projection plane axis",
               "description": "Axis along which the observation plane is oriented.",
               "enum": [
                  0,
                  1,
                  2
               ],
               "type": "integer"
            },
            "proj_distance": {
               "title": "Projection distance",
               "description": "Radial distance of the projection points from ``local_origin``.",
               "default": 1000000.0,
               "units": "um",
               "type": "number"
            },
            "ux": {
               "title": "Normalized kx",
               "description": "Local x component of wave vectors on the observation plane, relative to ``local_origin`` and oriented with respect to ``proj_axis``, normalized by (2*pi/lambda) where lambda is the wavelength associated with the background medium. Must be in the range [-1, 1].",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "uy": {
               "title": "Normalized ky",
               "description": "Local y component of wave vectors on the observation plane, relative to ``local_origin`` and oriented with respect to ``proj_axis``, normalized by (2*pi/lambda) where lambda is the wavelength associated with the background medium. Must be in the range [-1, 1].",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            }
         },
         "required": [
            "size",
            "name",
            "freqs",
            "proj_axis",
            "ux",
            "uy"
         ],
         "additionalProperties": false
      },
      "Medium": {
         "title": "Medium",
         "description": "Dispersionless medium.\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\npermittivity : ConstrainedFloatValue = 1.0\n    [units = None (relative permittivity)].  Relative permittivity.\nconductivity : ConstrainedFloatValue = 0.0\n    [units = S/um].  Electric conductivity.  Defined such that the imaginary part of the complex permittivity at angular frequency omega is given by conductivity/omega.\n\nExample\n-------\n>>> dielectric = Medium(permittivity=4.0, name='my_medium')\n>>> eps = dielectric.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "Medium",
               "enum": [
                  "Medium"
               ],
               "type": "string"
            },
            "permittivity": {
               "title": "Permittivity",
               "description": "Relative permittivity.",
               "default": 1.0,
               "minimum": 1.0,
               "units": "None (relative permittivity)",
               "type": "number"
            },
            "conductivity": {
               "title": "Conductivity",
               "description": "Electric conductivity.  Defined such that the imaginary part of the complex permittivity at angular frequency omega is given by conductivity/omega.",
               "default": 0.0,
               "minimum": 0.0,
               "units": "S/um",
               "type": "number"
            }
         },
         "additionalProperties": false
      },
      "PermittivityDataset": {
         "title": "PermittivityDataset",
         "description": "Dataset storing the diagonal components of the permittivity tensor.\n\nParameters\n----------\neps_xx : ScalarFieldDataArray\n    Spatial distribution of the xx-component of the relative permittivity.\neps_yy : ScalarFieldDataArray\n    Spatial distribution of the yy-component of the relative permittivity.\neps_zz : ScalarFieldDataArray\n    Spatial distribution of the zz-component of the relative permittivity.\n\nExample\n-------\n>>> x = [-1,1]\n>>> y = [-2,0,2]\n>>> z = [-3,-1,1,3]\n>>> f = [2e14, 3e14]\n>>> coords = dict(x=x, y=y, z=z, f=f)\n>>> sclr_fld = ScalarFieldDataArray((1+1j) * np.random.random((2,3,4,2)), coords=coords)\n>>> data = PermittivityDataset(eps_xx=sclr_fld, eps_yy=sclr_fld, eps_zz=sclr_fld)",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "PermittivityDataset",
               "enum": [
                  "PermittivityDataset"
               ],
               "type": "string"
            },
            "eps_xx": {
               "title": "DataArray",
               "description": "Spatial distribution of the xx-component of the relative permittivity.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "eps_yy": {
               "title": "DataArray",
               "description": "Spatial distribution of the yy-component of the relative permittivity.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "eps_zz": {
               "title": "DataArray",
               "description": "Spatial distribution of the zz-component of the relative permittivity.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "eps_xx",
            "eps_yy",
            "eps_zz"
         ],
         "additionalProperties": false
      },
      "CustomMedium": {
         "title": "CustomMedium",
         "description": ":class:`.Medium` with user-supplied permittivity distribution.\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\neps_dataset : PermittivityDataset\n    User-supplied dataset containing complex-valued permittivity as a function of space. Permittivity distribution over the Yee-grid will be interpolated based on ``interp_method``.\ninterp_method : Literal['nearest', 'linear'] = nearest\n    Interpolation method to obtain permittivity values that are not supplied at the Yee grids; For grids outside the range of the supplied data, extrapolation will be applied. When the extrapolated value is smaller (greater) than the minimal (maximal) of the supplied data, the extrapolated value will take the minimal (maximal) of the supplied data.\n\nExample\n-------\n>>> Nx, Ny, Nz = 10, 9, 8\n>>> X = np.linspace(-1, 1, Nx)\n>>> Y = np.linspace(-1, 1, Ny)\n>>> Z = np.linspace(-1, 1, Nz)\n>>> freqs = [2e14]\n>>> data = np.ones((Nx, Ny, Nz, 1))\n>>> eps_diagonal_data = ScalarFieldDataArray(data, coords=dict(x=X, y=Y, z=Z, f=freqs))\n>>> eps_components = {f\"eps_{d}{d}\": eps_diagonal_data for d in \"xyz\"}\n>>> eps_dataset = PermittivityDataset(**eps_components)\n>>> dielectric = CustomMedium(eps_dataset=eps_dataset, name='my_medium')\n>>> eps = dielectric.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "CustomMedium",
               "enum": [
                  "CustomMedium"
               ],
               "type": "string"
            },
            "eps_dataset": {
               "title": "Permittivity Dataset",
               "description": "User-supplied dataset containing complex-valued permittivity as a function of space. Permittivity distribution over the Yee-grid will be interpolated based on ``interp_method``.",
               "allOf": [
                  {
                     "$ref": "#/definitions/PermittivityDataset"
                  }
               ]
            },
            "interp_method": {
               "title": "Interpolation method",
               "description": "Interpolation method to obtain permittivity values that are not supplied at the Yee grids; For grids outside the range of the supplied data, extrapolation will be applied. When the extrapolated value is smaller (greater) than the minimal (maximal) of the supplied data, the extrapolated value will take the minimal (maximal) of the supplied data.",
               "default": "nearest",
               "enum": [
                  "nearest",
                  "linear"
               ],
               "type": "string"
            }
         },
         "required": [
            "eps_dataset"
         ],
         "additionalProperties": false
      },
      "ComplexNumber": {
         "title": "ComplexNumber",
         "description": "Complex number with a well defined schema.",
         "type": "object",
         "properties": {
            "real": {
               "title": "Real",
               "type": "number"
            },
            "imag": {
               "title": "Imag",
               "type": "number"
            }
         },
         "required": [
            "real",
            "imag"
         ]
      },
      "PoleResidue": {
         "title": "PoleResidue",
         "description": "A dispersive medium described by the pole-residue pair model.\nThe frequency-dependence of the complex-valued permittivity is described by:\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\neps_inf : float = 1.0\n    [units = None (relative permittivity)].  Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).\npoles : Tuple[Tuple[Union[tidy3d.components.types.tidycomplex, tidy3d.components.types.ComplexNumber], Union[tidy3d.components.types.tidycomplex, tidy3d.components.types.ComplexNumber]], ...] = ()\n    [units = (rad/sec, rad/sec)].  Tuple of complex-valued (:math:`a_i, c_i`) poles for the model.\n\nNote\n----\n.. math::\n\n    \\epsilon(\\omega) = \\epsilon_\\infty - \\sum_i\n    \\left[\\frac{c_i}{j \\omega + a_i} +\n    \\frac{c_i^*}{j \\omega + a_i^*}\\right]\n\nExample\n-------\n>>> pole_res = PoleResidue(eps_inf=2.0, poles=[((1+2j), (3+4j)), ((5+6j), (7+8j))])\n>>> eps = pole_res.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "PoleResidue",
               "enum": [
                  "PoleResidue"
               ],
               "type": "string"
            },
            "eps_inf": {
               "title": "Epsilon at Infinity",
               "description": "Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).",
               "default": 1.0,
               "units": "None (relative permittivity)",
               "type": "number"
            },
            "poles": {
               "title": "Poles",
               "description": "Tuple of complex-valued (:math:`a_i, c_i`) poles for the model.",
               "default": [],
               "units": [
                  "rad/sec",
                  "rad/sec"
               ],
               "type": "array",
               "items": {
                  "type": "array",
                  "minItems": 2,
                  "maxItems": 2,
                  "items": [
                     {
                        "anyOf": [
                           {
                              "title": "ComplexNumber",
                              "description": "Complex number with a well defined schema.",
                              "type": "object",
                              "properties": {
                                 "real": {
                                    "title": "Real",
                                    "type": "number"
                                 },
                                 "imag": {
                                    "title": "Imag",
                                    "type": "number"
                                 }
                              },
                              "required": [
                                 "real",
                                 "imag"
                              ]
                           },
                           {
                              "$ref": "#/definitions/ComplexNumber"
                           }
                        ]
                     },
                     {
                        "anyOf": [
                           {
                              "title": "ComplexNumber",
                              "description": "Complex number with a well defined schema.",
                              "type": "object",
                              "properties": {
                                 "real": {
                                    "title": "Real",
                                    "type": "number"
                                 },
                                 "imag": {
                                    "title": "Imag",
                                    "type": "number"
                                 }
                              },
                              "required": [
                                 "real",
                                 "imag"
                              ]
                           },
                           {
                              "$ref": "#/definitions/ComplexNumber"
                           }
                        ]
                     }
                  ]
               }
            }
         },
         "additionalProperties": false
      },
      "Sellmeier": {
         "title": "Sellmeier",
         "description": "A dispersive medium described by the Sellmeier model.\nThe frequency-dependence of the refractive index is described by:\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\ncoeffs : Tuple[Tuple[float, pydantic.types.PositiveFloat], ...]\n    [units = (None, um^2)].  List of Sellmeier (:math:`B_i, C_i`) coefficients.\n\nNote\n----\n.. math::\n\n    n(\\lambda)^2 = 1 + \\sum_i \\frac{B_i \\lambda^2}{\\lambda^2 - C_i}\n\nExample\n-------\n>>> sellmeier_medium = Sellmeier(coeffs=[(1,2), (3,4)])\n>>> eps = sellmeier_medium.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "Sellmeier",
               "enum": [
                  "Sellmeier"
               ],
               "type": "string"
            },
            "coeffs": {
               "title": "Coefficients",
               "description": "List of Sellmeier (:math:`B_i, C_i`) coefficients.",
               "units": [
                  null,
                  "um^2"
               ],
               "type": "array",
               "items": {
                  "type": "array",
                  "minItems": 2,
                  "maxItems": 2,
                  "items": [
                     {
                        "type": "number"
                     },
                     {
                        "type": "number",
                        "exclusiveMinimum": 0
                     }
                  ]
               }
            }
         },
         "required": [
            "coeffs"
         ],
         "additionalProperties": false
      },
      "Lorentz": {
         "title": "Lorentz",
         "description": "A dispersive medium described by the Lorentz model.\nThe frequency-dependence of the complex-valued permittivity is described by:\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\neps_inf : float = 1.0\n    [units = None (relative permittivity)].  Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).\ncoeffs : Tuple[Tuple[float, float, float], ...]\n    [units = (None (relative permittivity), Hz, Hz)].  List of (:math:`\\Delta\\epsilon_i, f_i, \\delta_i`) values for model.\n\nNote\n----\n.. math::\n\n    \\epsilon(f) = \\epsilon_\\infty + \\sum_i\n    \\frac{\\Delta\\epsilon_i f_i^2}{f_i^2 - 2jf\\delta_i - f^2}\n\nExample\n-------\n>>> lorentz_medium = Lorentz(eps_inf=2.0, coeffs=[(1,2,3), (4,5,6)])\n>>> eps = lorentz_medium.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "Lorentz",
               "enum": [
                  "Lorentz"
               ],
               "type": "string"
            },
            "eps_inf": {
               "title": "Epsilon at Infinity",
               "description": "Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).",
               "default": 1.0,
               "units": "None (relative permittivity)",
               "type": "number"
            },
            "coeffs": {
               "title": "Coefficients",
               "description": "List of (:math:`\\Delta\\epsilon_i, f_i, \\delta_i`) values for model.",
               "units": [
                  "None (relative permittivity)",
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "items": {
                  "type": "array",
                  "minItems": 3,
                  "maxItems": 3,
                  "items": [
                     {
                        "type": "number"
                     },
                     {
                        "type": "number"
                     },
                     {
                        "type": "number"
                     }
                  ]
               }
            }
         },
         "required": [
            "coeffs"
         ],
         "additionalProperties": false
      },
      "Debye": {
         "title": "Debye",
         "description": "A dispersive medium described by the Debye model.\nThe frequency-dependence of the complex-valued permittivity is described by:\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\neps_inf : float = 1.0\n    [units = None (relative permittivity)].  Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).\ncoeffs : Tuple[Tuple[float, pydantic.types.PositiveFloat], ...]\n    [units = (None (relative permittivity), sec)].  List of (:math:`\\Delta\\epsilon_i, \\tau_i`) values for model.\n\nNote\n----\n.. math::\n\n    \\epsilon(f) = \\epsilon_\\infty + \\sum_i\n    \\frac{\\Delta\\epsilon_i}{1 - jf\\tau_i}\n\nExample\n-------\n>>> debye_medium = Debye(eps_inf=2.0, coeffs=[(1,2),(3,4)])\n>>> eps = debye_medium.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "Debye",
               "enum": [
                  "Debye"
               ],
               "type": "string"
            },
            "eps_inf": {
               "title": "Epsilon at Infinity",
               "description": "Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).",
               "default": 1.0,
               "units": "None (relative permittivity)",
               "type": "number"
            },
            "coeffs": {
               "title": "Coefficients",
               "description": "List of (:math:`\\Delta\\epsilon_i, \\tau_i`) values for model.",
               "units": [
                  "None (relative permittivity)",
                  "sec"
               ],
               "type": "array",
               "items": {
                  "type": "array",
                  "minItems": 2,
                  "maxItems": 2,
                  "items": [
                     {
                        "type": "number"
                     },
                     {
                        "type": "number",
                        "exclusiveMinimum": 0
                     }
                  ]
               }
            }
         },
         "required": [
            "coeffs"
         ],
         "additionalProperties": false
      },
      "Drude": {
         "title": "Drude",
         "description": "A dispersive medium described by the Drude model.\nThe frequency-dependence of the complex-valued permittivity is described by:\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\neps_inf : float = 1.0\n    [units = None (relative permittivity)].  Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).\ncoeffs : Tuple[Tuple[float, pydantic.types.PositiveFloat], ...]\n    [units = (Hz, Hz)].  List of (:math:`f_i, \\delta_i`) values for model.\n\nNote\n----\n.. math::\n\n    \\epsilon(f) = \\epsilon_\\infty - \\sum_i\n    \\frac{ f_i^2}{f^2 + jf\\delta_i}\n\nExample\n-------\n>>> drude_medium = Drude(eps_inf=2.0, coeffs=[(1,2), (3,4)])\n>>> eps = drude_medium.eps_model(200e12)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "Drude",
               "enum": [
                  "Drude"
               ],
               "type": "string"
            },
            "eps_inf": {
               "title": "Epsilon at Infinity",
               "description": "Relative permittivity at infinite frequency (:math:`\\epsilon_\\infty`).",
               "default": 1.0,
               "units": "None (relative permittivity)",
               "type": "number"
            },
            "coeffs": {
               "title": "Coefficients",
               "description": "List of (:math:`f_i, \\delta_i`) values for model.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "items": {
                  "type": "array",
                  "minItems": 2,
                  "maxItems": 2,
                  "items": [
                     {
                        "type": "number"
                     },
                     {
                        "type": "number",
                        "exclusiveMinimum": 0
                     }
                  ]
               }
            }
         },
         "required": [
            "coeffs"
         ],
         "additionalProperties": false
      },
      "AnisotropicMedium": {
         "title": "AnisotropicMedium",
         "description": "Diagonally anisotropic medium.\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\nxx : Union[Medium, PoleResidue, Sellmeier, Lorentz, Debye, Drude]\n    Medium describing the xx-component of the diagonal permittivity tensor.\nyy : Union[Medium, PoleResidue, Sellmeier, Lorentz, Debye, Drude]\n    Medium describing the yy-component of the diagonal permittivity tensor.\nzz : Union[Medium, PoleResidue, Sellmeier, Lorentz, Debye, Drude]\n    Medium describing the zz-component of the diagonal permittivity tensor.\n\nNote\n----\nOnly diagonal anisotropy is currently supported.\n\nExample\n-------\n>>> medium_xx = Medium(permittivity=4.0)\n>>> medium_yy = Medium(permittivity=4.1)\n>>> medium_zz = Medium(permittivity=3.9)\n>>> anisotropic_dielectric = AnisotropicMedium(xx=medium_xx, yy=medium_yy, zz=medium_zz)",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "AnisotropicMedium",
               "enum": [
                  "AnisotropicMedium"
               ],
               "type": "string"
            },
            "xx": {
               "title": "XX Component",
               "description": "Medium describing the xx-component of the diagonal permittivity tensor.",
               "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                     "Medium": "#/definitions/Medium",
                     "PoleResidue": "#/definitions/PoleResidue",
                     "Sellmeier": "#/definitions/Sellmeier",
                     "Lorentz": "#/definitions/Lorentz",
                     "Debye": "#/definitions/Debye",
                     "Drude": "#/definitions/Drude"
                  }
               },
               "oneOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "yy": {
               "title": "YY Component",
               "description": "Medium describing the yy-component of the diagonal permittivity tensor.",
               "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                     "Medium": "#/definitions/Medium",
                     "PoleResidue": "#/definitions/PoleResidue",
                     "Sellmeier": "#/definitions/Sellmeier",
                     "Lorentz": "#/definitions/Lorentz",
                     "Debye": "#/definitions/Debye",
                     "Drude": "#/definitions/Drude"
                  }
               },
               "oneOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "zz": {
               "title": "ZZ Component",
               "description": "Medium describing the zz-component of the diagonal permittivity tensor.",
               "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                     "Medium": "#/definitions/Medium",
                     "PoleResidue": "#/definitions/PoleResidue",
                     "Sellmeier": "#/definitions/Sellmeier",
                     "Lorentz": "#/definitions/Lorentz",
                     "Debye": "#/definitions/Debye",
                     "Drude": "#/definitions/Drude"
                  }
               },
               "oneOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            }
         },
         "required": [
            "xx",
            "yy",
            "zz"
         ],
         "additionalProperties": false
      },
      "PECMedium": {
         "title": "PECMedium",
         "description": "Perfect electrical conductor class.\n\nParameters\n----------\nname : Optional[str] = None\n    Optional unique name for medium.\nfrequency_range : Optional[Tuple[float, float]] = None\n    [units = (Hz, Hz)].  Optional range of validity for the medium.\n\nNote\n----\nTo avoid confusion from duplicate PECs, should import ``tidy3d.PEC`` instance directly.",
         "type": "object",
         "properties": {
            "name": {
               "title": "Name",
               "description": "Optional unique name for medium.",
               "type": "string"
            },
            "frequency_range": {
               "title": "Frequency Range",
               "description": "Optional range of validity for the medium.",
               "units": [
                  "Hz",
                  "Hz"
               ],
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "type": {
               "title": "Type",
               "default": "PECMedium",
               "enum": [
                  "PECMedium"
               ],
               "type": "string"
            }
         },
         "additionalProperties": false
      },
      "FieldProjectionSurface": {
         "title": "FieldProjectionSurface",
         "description": "Data structure to store surface monitors where near fields are recorded for\nfield projections.\n\nParameters\n----------\nmonitor : FieldMonitor\n    :class:`.FieldMonitor` on which near fields will be sampled and integrated.\nnormal_dir : Literal['+', '-']\n    :class:`.Direction` of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of '+' or '-'.",
         "type": "object",
         "properties": {
            "monitor": {
               "title": "Field monitor",
               "description": ":class:`.FieldMonitor` on which near fields will be sampled and integrated.",
               "allOf": [
                  {
                     "$ref": "#/definitions/FieldMonitor"
                  }
               ]
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": ":class:`.Direction` of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of '+' or '-'.",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            },
            "type": {
               "title": "Type",
               "default": "FieldProjectionSurface",
               "enum": [
                  "FieldProjectionSurface"
               ],
               "type": "string"
            }
         },
         "required": [
            "monitor",
            "normal_dir"
         ],
         "additionalProperties": false
      },
      "FieldProjectionKSpaceData": {
         "title": "FieldProjectionKSpaceData",
         "description": "Data associated with a :class:`.FieldProjectionKSpaceMonitor`: components of\nprojected fields.\n\nParameters\n----------\nmonitor : FieldProjectionKSpaceMonitor\n    Field projection monitor with a projection grid defined in k-space.\nEr : FieldProjectionKSpaceDataArray\n    Spatial distribution of r-component of the electric field.\nEtheta : FieldProjectionKSpaceDataArray\n    Spatial distribution of the theta-component of the electric field.\nEphi : FieldProjectionKSpaceDataArray\n    Spatial distribution of phi-component of the electric field.\nHr : FieldProjectionKSpaceDataArray\n    Spatial distribution of r-component of the magnetic field.\nHtheta : FieldProjectionKSpaceDataArray\n    Spatial distribution of theta-component of the magnetic field.\nHphi : FieldProjectionKSpaceDataArray\n    Spatial distribution of phi-component of the magnetic field.\nmedium : Union[Medium, CustomMedium, AnisotropicMedium, PECMedium, PoleResidue, Sellmeier, Lorentz, Debye, Drude] = Medium(name=None, frequency_range=None, type='Medium', permittivity=1.0, conductivity=0.0)\n    Background medium through which to project fields.\nprojection_surfaces : Tuple[FieldProjectionSurface, ...]\n    Surfaces of the monitor where near fields were recorded for projection\n\nExample\n-------\n>>> from tidy3d import FieldProjectionKSpaceDataArray\n>>> f = np.linspace(1e14, 2e14, 10)\n>>> ux = np.linspace(0, 0.4, 10)\n>>> uy = np.linspace(0, 0.6, 20)\n>>> r = np.atleast_1d(5)\n>>> coords = dict(ux=ux, uy=uy, r=r, f=f)\n>>> values = (1+1j) * np.random.random((len(ux), len(uy), len(r), len(f)))\n>>> scalar_field = FieldProjectionKSpaceDataArray(values, coords=coords)\n>>> monitor = FieldProjectionKSpaceMonitor(\n...     center=(1,2,3), size=(2,2,2), freqs=f, name='n2f_monitor', ux=ux, uy=uy, proj_axis=2\n...     )\n>>> data = FieldProjectionKSpaceData(\n...     monitor=monitor, Er=scalar_field, Etheta=scalar_field, Ephi=scalar_field,\n...     Hr=scalar_field, Htheta=scalar_field, Hphi=scalar_field,\n...     projection_surfaces=monitor.projection_surfaces,\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldProjectionKSpaceData",
               "enum": [
                  "FieldProjectionKSpaceData"
               ],
               "type": "string"
            },
            "monitor": {
               "title": "Projection monitor",
               "description": "Field projection monitor with a projection grid defined in k-space.",
               "allOf": [
                  {
                     "$ref": "#/definitions/FieldProjectionKSpaceMonitor"
                  }
               ]
            },
            "Er": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Etheta": {
               "title": "DataArray",
               "description": "Spatial distribution of the theta-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ephi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hr": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Htheta": {
               "title": "DataArray",
               "description": "Spatial distribution of theta-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hphi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "medium": {
               "title": "Background Medium",
               "description": "Background medium through which to project fields.",
               "default": {
                  "name": null,
                  "frequency_range": null,
                  "type": "Medium",
                  "permittivity": 1.0,
                  "conductivity": 0.0
               },
               "anyOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/CustomMedium"
                  },
                  {
                     "$ref": "#/definitions/AnisotropicMedium"
                  },
                  {
                     "$ref": "#/definitions/PECMedium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "projection_surfaces": {
               "title": "Projection surfaces",
               "description": "Surfaces of the monitor where near fields were recorded for projection",
               "type": "array",
               "items": {
                  "$ref": "#/definitions/FieldProjectionSurface"
               }
            }
         },
         "required": [
            "monitor",
            "Er",
            "Etheta",
            "Ephi",
            "Hr",
            "Htheta",
            "Hphi",
            "projection_surfaces"
         ],
         "additionalProperties": false
      },
      "FieldProjectionCartesianMonitor": {
         "title": "FieldProjectionCartesianMonitor",
         "description": ":class:`Monitor` that samples electromagnetic near fields in the frequency domain\nand projects them on a Cartesian observation plane.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nnormal_dir : Optional[Literal['+', '-']] = None\n    Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.\nexclude_surfaces : Optional[Tuple[Literal['x-', 'x+', 'y-', 'y+', 'z-', 'z+'], ...]] = None\n    Surfaces to exclude in the integration, if a volume monitor.\ncustom_origin : Optional[Tuple[float, float, float]] = None\n    [units = um].  Local origin used for defining observation points. If ``None``, uses the monitor's center.\nfar_field_approx : bool = True\n    Whether to enable the far field approximation when projecting fields.\nproj_axis : Literal[0, 1, 2]\n    Axis along which the observation plane is oriented.\nproj_distance : float = 1000000.0\n    [units = um].  Signed distance of the projection plane along ``proj_axis``. from the plane containing ``local_origin``.\nx : Union[Tuple[float, ...], Array]\n    [units = um].  Local x observation coordinates w.r.t. ``local_origin`` and ``proj_axis``. When ``proj_axis`` is 0, this corresponds to the global y axis. When ``proj_axis`` is 1, this corresponds to the global x axis. When ``proj_axis`` is 2, this corresponds to the global x axis. \ny : Union[Tuple[float, ...], Array]\n    [units = um].  Local y observation coordinates w.r.t. ``local_origin`` and ``proj_axis``. When ``proj_axis`` is 0, this corresponds to the global z axis. When ``proj_axis`` is 1, this corresponds to the global z axis. When ``proj_axis`` is 2, this corresponds to the global y axis. \n\nExample\n-------\n>>> monitor = FieldProjectionCartesianMonitor(\n...     center=(1,2,3),\n...     size=(2,2,2),\n...     freqs=[250e12, 300e12],\n...     name='n2f_monitor',\n...     custom_origin=(1,2,3),\n...     x=[-1, 0, 1],\n...     y=[-2, -1, 0, 1, 2],\n...     proj_axis=2,\n...     proj_distance=5\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldProjectionCartesianMonitor",
               "enum": [
                  "FieldProjectionCartesianMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": "Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            },
            "exclude_surfaces": {
               "title": "Excluded surfaces",
               "description": "Surfaces to exclude in the integration, if a volume monitor.",
               "type": "array",
               "items": {
                  "enum": [
                     "x-",
                     "x+",
                     "y-",
                     "y+",
                     "z-",
                     "z+"
                  ],
                  "type": "string"
               }
            },
            "custom_origin": {
               "title": "Local origin",
               "description": "Local origin used for defining observation points. If ``None``, uses the monitor's center.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "far_field_approx": {
               "title": "Far field approximation",
               "description": "Whether to enable the far field approximation when projecting fields.",
               "default": true,
               "type": "boolean"
            },
            "proj_axis": {
               "title": "Projection plane axis",
               "description": "Axis along which the observation plane is oriented.",
               "enum": [
                  0,
                  1,
                  2
               ],
               "type": "integer"
            },
            "proj_distance": {
               "title": "Projection distance",
               "description": "Signed distance of the projection plane along ``proj_axis``. from the plane containing ``local_origin``.",
               "default": 1000000.0,
               "units": "um",
               "type": "number"
            },
            "x": {
               "title": "Local x observation coordinates",
               "description": "Local x observation coordinates w.r.t. ``local_origin`` and ``proj_axis``. When ``proj_axis`` is 0, this corresponds to the global y axis. When ``proj_axis`` is 1, this corresponds to the global x axis. When ``proj_axis`` is 2, this corresponds to the global x axis. ",
               "units": "um",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "y": {
               "title": "Local y observation coordinates",
               "description": "Local y observation coordinates w.r.t. ``local_origin`` and ``proj_axis``. When ``proj_axis`` is 0, this corresponds to the global z axis. When ``proj_axis`` is 1, this corresponds to the global z axis. When ``proj_axis`` is 2, this corresponds to the global y axis. ",
               "units": "um",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            }
         },
         "required": [
            "size",
            "name",
            "freqs",
            "proj_axis",
            "x",
            "y"
         ],
         "additionalProperties": false
      },
      "FieldProjectionCartesianData": {
         "title": "FieldProjectionCartesianData",
         "description": "Data associated with a :class:`.FieldProjectionCartesianMonitor`: components of\nprojected fields.\n\nParameters\n----------\nmonitor : FieldProjectionCartesianMonitor\n    Field projection monitor with a Cartesian projection grid.\nEr : FieldProjectionCartesianDataArray\n    Spatial distribution of r-component of the electric field.\nEtheta : FieldProjectionCartesianDataArray\n    Spatial distribution of the theta-component of the electric field.\nEphi : FieldProjectionCartesianDataArray\n    Spatial distribution of phi-component of the electric field.\nHr : FieldProjectionCartesianDataArray\n    Spatial distribution of r-component of the magnetic field.\nHtheta : FieldProjectionCartesianDataArray\n    Spatial distribution of theta-component of the magnetic field.\nHphi : FieldProjectionCartesianDataArray\n    Spatial distribution of phi-component of the magnetic field.\nmedium : Union[Medium, CustomMedium, AnisotropicMedium, PECMedium, PoleResidue, Sellmeier, Lorentz, Debye, Drude] = Medium(name=None, frequency_range=None, type='Medium', permittivity=1.0, conductivity=0.0)\n    Background medium through which to project fields.\nprojection_surfaces : Tuple[FieldProjectionSurface, ...]\n    Surfaces of the monitor where near fields were recorded for projection\n\nExample\n-------\n>>> from tidy3d import FieldProjectionCartesianDataArray\n>>> f = np.linspace(1e14, 2e14, 10)\n>>> x = np.linspace(0, 5, 10)\n>>> y = np.linspace(0, 10, 20)\n>>> z = np.atleast_1d(5)\n>>> coords = dict(x=x, y=y, z=z, f=f)\n>>> values = (1+1j) * np.random.random((len(x), len(y), len(z), len(f)))\n>>> scalar_field = FieldProjectionCartesianDataArray(values, coords=coords)\n>>> monitor = FieldProjectionCartesianMonitor(\n...     center=(1,2,3), size=(2,2,2), freqs=f, name='n2f_monitor', x=x, y=y,\n...     proj_axis=2, proj_distance=50\n...     )\n>>> data = FieldProjectionCartesianData(\n...     monitor=monitor, Er=scalar_field, Etheta=scalar_field, Ephi=scalar_field,\n...     Hr=scalar_field, Htheta=scalar_field, Hphi=scalar_field,\n...     projection_surfaces=monitor.projection_surfaces,\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldProjectionCartesianData",
               "enum": [
                  "FieldProjectionCartesianData"
               ],
               "type": "string"
            },
            "monitor": {
               "title": "Projection monitor",
               "description": "Field projection monitor with a Cartesian projection grid.",
               "allOf": [
                  {
                     "$ref": "#/definitions/FieldProjectionCartesianMonitor"
                  }
               ]
            },
            "Er": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Etheta": {
               "title": "DataArray",
               "description": "Spatial distribution of the theta-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ephi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hr": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Htheta": {
               "title": "DataArray",
               "description": "Spatial distribution of theta-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hphi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "medium": {
               "title": "Background Medium",
               "description": "Background medium through which to project fields.",
               "default": {
                  "name": null,
                  "frequency_range": null,
                  "type": "Medium",
                  "permittivity": 1.0,
                  "conductivity": 0.0
               },
               "anyOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/CustomMedium"
                  },
                  {
                     "$ref": "#/definitions/AnisotropicMedium"
                  },
                  {
                     "$ref": "#/definitions/PECMedium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "projection_surfaces": {
               "title": "Projection surfaces",
               "description": "Surfaces of the monitor where near fields were recorded for projection",
               "type": "array",
               "items": {
                  "$ref": "#/definitions/FieldProjectionSurface"
               }
            }
         },
         "required": [
            "monitor",
            "Er",
            "Etheta",
            "Ephi",
            "Hr",
            "Htheta",
            "Hphi",
            "projection_surfaces"
         ],
         "additionalProperties": false
      },
      "FieldProjectionAngleMonitor": {
         "title": "FieldProjectionAngleMonitor",
         "description": ":class:`Monitor` that samples electromagnetic near fields in the frequency domain\nand projects them at given observation angles.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nnormal_dir : Optional[Literal['+', '-']] = None\n    Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.\nexclude_surfaces : Optional[Tuple[Literal['x-', 'x+', 'y-', 'y+', 'z-', 'z+'], ...]] = None\n    Surfaces to exclude in the integration, if a volume monitor.\ncustom_origin : Optional[Tuple[float, float, float]] = None\n    [units = um].  Local origin used for defining observation points. If ``None``, uses the monitor's center.\nfar_field_approx : bool = True\n    Whether to enable the far field approximation when projecting fields.\nproj_distance : float = 1000000.0\n    [units = um].  Radial distance of the projection points from ``local_origin``.\ntheta : Union[Tuple[float, ...], Array]\n    [units = rad].  Polar angles with respect to the global z axis, relative to the location of ``local_origin``, at which to project fields.\nphi : Union[Tuple[float, ...], Array]\n    [units = rad].  Azimuth angles with respect to the global z axis, relative to the location of ``local_origin``, at which to project fields.\n\nExample\n-------\n>>> monitor = FieldProjectionAngleMonitor(\n...     center=(1,2,3),\n...     size=(2,2,2),\n...     freqs=[250e12, 300e12],\n...     name='n2f_monitor',\n...     custom_origin=(1,2,3),\n...     phi=[0, np.pi/2],\n...     theta=np.linspace(-np.pi/2, np.pi/2, 100)\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldProjectionAngleMonitor",
               "enum": [
                  "FieldProjectionAngleMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": "Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Applies to surface monitors only, and defaults to ``'+'`` if not provided.",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            },
            "exclude_surfaces": {
               "title": "Excluded surfaces",
               "description": "Surfaces to exclude in the integration, if a volume monitor.",
               "type": "array",
               "items": {
                  "enum": [
                     "x-",
                     "x+",
                     "y-",
                     "y+",
                     "z-",
                     "z+"
                  ],
                  "type": "string"
               }
            },
            "custom_origin": {
               "title": "Local origin",
               "description": "Local origin used for defining observation points. If ``None``, uses the monitor's center.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "far_field_approx": {
               "title": "Far field approximation",
               "description": "Whether to enable the far field approximation when projecting fields.",
               "default": true,
               "type": "boolean"
            },
            "proj_distance": {
               "title": "Projection distance",
               "description": "Radial distance of the projection points from ``local_origin``.",
               "default": 1000000.0,
               "units": "um",
               "type": "number"
            },
            "theta": {
               "title": "Polar angles",
               "description": "Polar angles with respect to the global z axis, relative to the location of ``local_origin``, at which to project fields.",
               "units": "rad",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "phi": {
               "title": "Azimuth angles",
               "description": "Azimuth angles with respect to the global z axis, relative to the location of ``local_origin``, at which to project fields.",
               "units": "rad",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            }
         },
         "required": [
            "size",
            "name",
            "freqs",
            "theta",
            "phi"
         ],
         "additionalProperties": false
      },
      "FieldProjectionAngleData": {
         "title": "FieldProjectionAngleData",
         "description": "Data associated with a :class:`.FieldProjectionAngleMonitor`: components of projected fields.\n\nParameters\n----------\nmonitor : FieldProjectionAngleMonitor\n    Field projection monitor with an angle-based projection grid.\nEr : FieldProjectionAngleDataArray\n    Spatial distribution of r-component of the electric field.\nEtheta : FieldProjectionAngleDataArray\n    Spatial distribution of the theta-component of the electric field.\nEphi : FieldProjectionAngleDataArray\n    Spatial distribution of phi-component of the electric field.\nHr : FieldProjectionAngleDataArray\n    Spatial distribution of r-component of the magnetic field.\nHtheta : FieldProjectionAngleDataArray\n    Spatial distribution of theta-component of the magnetic field.\nHphi : FieldProjectionAngleDataArray\n    Spatial distribution of phi-component of the magnetic field.\nmedium : Union[Medium, CustomMedium, AnisotropicMedium, PECMedium, PoleResidue, Sellmeier, Lorentz, Debye, Drude] = Medium(name=None, frequency_range=None, type='Medium', permittivity=1.0, conductivity=0.0)\n    Background medium through which to project fields.\nprojection_surfaces : Tuple[FieldProjectionSurface, ...]\n    Surfaces of the monitor where near fields were recorded for projection\n\nExample\n-------\n>>> from tidy3d import FieldProjectionAngleDataArray\n>>> f = np.linspace(1e14, 2e14, 10)\n>>> r = np.atleast_1d(5)\n>>> theta = np.linspace(0, np.pi, 10)\n>>> phi = np.linspace(0, 2*np.pi, 20)\n>>> coords = dict(r=r, theta=theta, phi=phi, f=f)\n>>> values = (1+1j) * np.random.random((len(r), len(theta), len(phi), len(f)))\n>>> scalar_field = FieldProjectionAngleDataArray(values, coords=coords)\n>>> monitor = FieldProjectionAngleMonitor(\n...     center=(1,2,3), size=(2,2,2), freqs=f, name='n2f_monitor', phi=phi, theta=theta\n...     )\n>>> data = FieldProjectionAngleData(\n...     monitor=monitor, Er=scalar_field, Etheta=scalar_field, Ephi=scalar_field,\n...     Hr=scalar_field, Htheta=scalar_field, Hphi=scalar_field,\n...     projection_surfaces=monitor.projection_surfaces,\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "FieldProjectionAngleData",
               "enum": [
                  "FieldProjectionAngleData"
               ],
               "type": "string"
            },
            "monitor": {
               "title": "Projection monitor",
               "description": "Field projection monitor with an angle-based projection grid.",
               "allOf": [
                  {
                     "$ref": "#/definitions/FieldProjectionAngleMonitor"
                  }
               ]
            },
            "Er": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Etheta": {
               "title": "DataArray",
               "description": "Spatial distribution of the theta-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ephi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hr": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Htheta": {
               "title": "DataArray",
               "description": "Spatial distribution of theta-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hphi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "medium": {
               "title": "Background Medium",
               "description": "Background medium through which to project fields.",
               "default": {
                  "name": null,
                  "frequency_range": null,
                  "type": "Medium",
                  "permittivity": 1.0,
                  "conductivity": 0.0
               },
               "anyOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/CustomMedium"
                  },
                  {
                     "$ref": "#/definitions/AnisotropicMedium"
                  },
                  {
                     "$ref": "#/definitions/PECMedium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "projection_surfaces": {
               "title": "Projection surfaces",
               "description": "Surfaces of the monitor where near fields were recorded for projection",
               "type": "array",
               "items": {
                  "$ref": "#/definitions/FieldProjectionSurface"
               }
            }
         },
         "required": [
            "monitor",
            "Er",
            "Etheta",
            "Ephi",
            "Hr",
            "Htheta",
            "Hphi",
            "projection_surfaces"
         ],
         "additionalProperties": false
      },
      "DiffractionMonitor": {
         "title": "DiffractionMonitor",
         "description": ":class:`Monitor` that uses a 2D Fourier transform to compute the\ndiffraction amplitudes and efficiency for allowed diffraction orders.\n\nParameters\n----------\ncenter : Tuple[float, float, float] = (0.0, 0.0, 0.0)\n    [units = um].  Center of object in x, y, and z.\nsize : Tuple[NonNegativeFloat, NonNegativeFloat, NonNegativeFloat]\n    [units = um].  Size in x, y, and z directions.\nname : ConstrainedStrValue\n    Unique name for monitor.\nfreqs : Union[Tuple[float, ...], Array]\n    [units = Hz].  Array or list of frequencies stored by the field monitor.\napodization : ApodizationSpec = ApodizationSpec(start=None, end=None, width=None, type='ApodizationSpec')\n    Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.\nnormal_dir : Literal['+', '-'] = +\n    Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Defaults to ``'+'`` if not provided.\n\nExample\n-------\n>>> monitor = DiffractionMonitor(\n...     center=(1,2,3),\n...     size=(inf,inf,0),\n...     freqs=[250e12, 300e12],\n...     name='diffraction_monitor',\n...     normal_dir='+',\n...     )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "DiffractionMonitor",
               "enum": [
                  "DiffractionMonitor"
               ],
               "type": "string"
            },
            "center": {
               "title": "Center",
               "description": "Center of object in x, y, and z.",
               "default": [
                  0.0,
                  0.0,
                  0.0
               ],
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "size": {
               "title": "Size",
               "description": "Size in x, y, and z directions.",
               "units": "um",
               "type": "array",
               "minItems": 3,
               "maxItems": 3,
               "items": [
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  },
                  {
                     "type": "number",
                     "minimum": 0
                  }
               ]
            },
            "name": {
               "title": "Name",
               "description": "Unique name for monitor.",
               "minLength": 1,
               "type": "string"
            },
            "freqs": {
               "title": "Frequencies",
               "description": "Array or list of frequencies stored by the field monitor.",
               "units": "Hz",
               "anyOf": [
                  {
                     "type": "array",
                     "items": {
                        "type": "number"
                     }
                  },
                  {
                     "title": "Array Like",
                     "description": "Accepts sequence (tuple, list, numpy array) and converts to tuple.",
                     "type": "tuple",
                     "properties": {},
                     "required": []
                  }
               ]
            },
            "apodization": {
               "title": "Apodization Specification",
               "description": "Sets parameters of (optional) apodization. Apodization applies a windowing function to the Fourier transform of the time-domain fields into frequency-domain ones, and can be used to truncate the beginning and/or end of the time signal, for example to eliminate the source pulse when studying the eigenmodes of a system. Note: apodization affects the normalization of the frequency-domain fields.",
               "default": {
                  "start": null,
                  "end": null,
                  "width": null,
                  "type": "ApodizationSpec"
               },
               "allOf": [
                  {
                     "$ref": "#/definitions/ApodizationSpec"
                  }
               ]
            },
            "normal_dir": {
               "title": "Normal vector orientation",
               "description": "Direction of the surface monitor's normal vector w.r.t. the positive x, y or z unit vectors. Must be one of ``'+'`` or ``'-'``. Defaults to ``'+'`` if not provided.",
               "default": "+",
               "enum": [
                  "+",
                  "-"
               ],
               "type": "string"
            }
         },
         "required": [
            "size",
            "name",
            "freqs"
         ],
         "additionalProperties": false
      },
      "DiffractionData": {
         "title": "DiffractionData",
         "description": "Data for a :class:`.DiffractionMonitor`: complex components of diffracted far fields.\n\nParameters\n----------\nmonitor : DiffractionMonitor\n        Er : DiffractionDataArray\n    Spatial distribution of r-component of the electric field.\nEtheta : DiffractionDataArray\n    Spatial distribution of the theta-component of the electric field.\nEphi : DiffractionDataArray\n    Spatial distribution of phi-component of the electric field.\nHr : DiffractionDataArray\n    Spatial distribution of r-component of the magnetic field.\nHtheta : DiffractionDataArray\n    Spatial distribution of theta-component of the magnetic field.\nHphi : DiffractionDataArray\n    Spatial distribution of phi-component of the magnetic field.\nmedium : Union[Medium, CustomMedium, AnisotropicMedium, PECMedium, PoleResidue, Sellmeier, Lorentz, Debye, Drude] = Medium(name=None, frequency_range=None, type='Medium', permittivity=1.0, conductivity=0.0)\n    Background medium through which to project fields.\nsim_size : Tuple[float, float]\n    [units = um].  Size of the near field in the local x and y directions.\nbloch_vecs : Tuple[float, float]\n    Bloch vectors along the local x and y directions in units of ``2 * pi / (simulation size along the respective dimension)``.\n\nExample\n-------\n>>> from tidy3d import DiffractionDataArray\n>>> f = np.linspace(1e14, 2e14, 10)\n>>> orders_x = list(range(-4, 5))\n>>> orders_y = list(range(-6, 7))\n>>> pol = [\"s\", \"p\"]\n>>> coords = dict(orders_x=orders_x, orders_y=orders_y, f=f)\n>>> values = (1+1j) * np.random.random((len(orders_x), len(orders_y), len(f)))\n>>> field = DiffractionDataArray(values, coords=coords)\n>>> monitor = DiffractionMonitor(\n...     center=(1,2,3), size=(np.inf,np.inf,0), freqs=f, name='diffraction'\n... )\n>>> data = DiffractionData(\n...     monitor=monitor, sim_size=[1,1], bloch_vecs=[1,2],\n...     Etheta=field, Ephi=field, Er=field,\n...     Htheta=field, Hphi=field, Hr=field,\n... )",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "DiffractionData",
               "enum": [
                  "DiffractionData"
               ],
               "type": "string"
            },
            "monitor": {
               "$ref": "#/definitions/DiffractionMonitor"
            },
            "Er": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Etheta": {
               "title": "DataArray",
               "description": "Spatial distribution of the theta-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Ephi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the electric field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hr": {
               "title": "DataArray",
               "description": "Spatial distribution of r-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Htheta": {
               "title": "DataArray",
               "description": "Spatial distribution of theta-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "Hphi": {
               "title": "DataArray",
               "description": "Spatial distribution of phi-component of the magnetic field.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            },
            "medium": {
               "title": "Background Medium",
               "description": "Background medium through which to project fields.",
               "default": {
                  "name": null,
                  "frequency_range": null,
                  "type": "Medium",
                  "permittivity": 1.0,
                  "conductivity": 0.0
               },
               "anyOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/CustomMedium"
                  },
                  {
                     "$ref": "#/definitions/AnisotropicMedium"
                  },
                  {
                     "$ref": "#/definitions/PECMedium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "sim_size": {
               "title": "Domain size",
               "description": "Size of the near field in the local x and y directions.",
               "units": "um",
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "bloch_vecs": {
               "title": "Bloch vectors",
               "description": "Bloch vectors along the local x and y directions in units of ``2 * pi / (simulation size along the respective dimension)``.",
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            }
         },
         "required": [
            "monitor",
            "Er",
            "Etheta",
            "Ephi",
            "Hr",
            "Htheta",
            "Hphi",
            "sim_size",
            "bloch_vecs"
         ],
         "additionalProperties": false
      },
      "JaxDataArray": {
         "title": "JaxDataArray",
         "description": "A :class:`.DataArray`-like class that only wraps xarray for jax compability.\n\nParameters\n----------\nvalues : Optional[Any]\n    Nested list containing the raw values, which can be tracked by jax.\ncoords : Mapping[str, list]\n    Dictionary storing the coordinates, namely ``(direction, f, mode_index)``.",
         "type": "object",
         "properties": {
            "values": {
               "title": "Values",
               "description": "Nested list containing the raw values, which can be tracked by jax.",
               "jax_field": true
            },
            "coords": {
               "title": "Coords",
               "description": "Dictionary storing the coordinates, namely ``(direction, f, mode_index)``.",
               "type": "object",
               "additionalProperties": {
                  "type": "array",
                  "items": {}
               }
            },
            "type": {
               "title": "Type",
               "default": "JaxDataArray",
               "enum": [
                  "JaxDataArray"
               ],
               "type": "string"
            }
         },
         "required": [
            "values",
            "coords"
         ],
         "additionalProperties": false
      },
      "JaxModeData": {
         "title": "JaxModeData",
         "description": "A :class:`.ModeData` registered with jax.\n\nParameters\n----------\nmonitor : Union[FieldMonitor, FieldTimeMonitor, PermittivityMonitor, FluxMonitor, FluxTimeMonitor, ModeMonitor, ModeSolverMonitor, FieldProjectionAngleMonitor, FieldProjectionCartesianMonitor, FieldProjectionKSpaceMonitor, DiffractionMonitor]\n    Monitor associated with the data.\namps : JaxDataArray\n    Jax-compatible modal amplitude data associated with an output monitor.\nn_complex : ModeIndexDataArray\n    Complex-valued effective propagation constants associated with the mode.",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "JaxModeData",
               "enum": [
                  "JaxModeData"
               ],
               "type": "string"
            },
            "monitor": {
               "title": "Monitor",
               "description": "Monitor associated with the data.",
               "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                     "FieldMonitor": "#/definitions/FieldMonitor",
                     "FieldTimeMonitor": "#/definitions/FieldTimeMonitor",
                     "PermittivityMonitor": "#/definitions/PermittivityMonitor",
                     "FluxMonitor": "#/definitions/FluxMonitor",
                     "FluxTimeMonitor": "#/definitions/FluxTimeMonitor",
                     "ModeMonitor": "#/definitions/ModeMonitor",
                     "ModeSolverMonitor": "#/definitions/ModeSolverMonitor",
                     "FieldProjectionAngleMonitor": "#/definitions/FieldProjectionAngleMonitor",
                     "FieldProjectionCartesianMonitor": "#/definitions/FieldProjectionCartesianMonitor",
                     "FieldProjectionKSpaceMonitor": "#/definitions/FieldProjectionKSpaceMonitor",
                     "DiffractionMonitor": "#/definitions/DiffractionMonitor"
                  }
               },
               "oneOf": [
                  {
                     "$ref": "#/definitions/FieldMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldTimeMonitor"
                  },
                  {
                     "$ref": "#/definitions/PermittivityMonitor"
                  },
                  {
                     "$ref": "#/definitions/FluxMonitor"
                  },
                  {
                     "$ref": "#/definitions/FluxTimeMonitor"
                  },
                  {
                     "$ref": "#/definitions/ModeMonitor"
                  },
                  {
                     "$ref": "#/definitions/ModeSolverMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldProjectionAngleMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldProjectionCartesianMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldProjectionKSpaceMonitor"
                  },
                  {
                     "$ref": "#/definitions/DiffractionMonitor"
                  }
               ]
            },
            "amps": {
               "title": "Amplitudes",
               "description": "Jax-compatible modal amplitude data associated with an output monitor.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "n_complex": {
               "title": "DataArray",
               "description": "Complex-valued effective propagation constants associated with the mode.",
               "type": "xr.DataArray",
               "properties": {
                  "_dims": {
                     "title": "_dims",
                     "type": "Tuple[str, ...]"
                  }
               },
               "required": [
                  "_dims"
               ]
            }
         },
         "required": [
            "monitor",
            "amps",
            "n_complex"
         ],
         "additionalProperties": false
      },
      "JaxDiffractionData": {
         "title": "JaxDiffractionData",
         "description": "A :class:`.DiffractionData` registered with jax.\n\nParameters\n----------\nmonitor : Union[FieldMonitor, FieldTimeMonitor, PermittivityMonitor, FluxMonitor, FluxTimeMonitor, ModeMonitor, ModeSolverMonitor, FieldProjectionAngleMonitor, FieldProjectionCartesianMonitor, FieldProjectionKSpaceMonitor, DiffractionMonitor]\n    Monitor associated with the data.\nEr : JaxDataArray\n    Spatial distribution of r-component of the electric field.\nEtheta : JaxDataArray\n    Spatial distribution of the theta-component of the electric field.\nEphi : JaxDataArray\n    Spatial distribution of phi-component of the electric field.\nHr : JaxDataArray\n    Spatial distribution of r-component of the magnetic field.\nHtheta : JaxDataArray\n    Spatial distribution of theta-component of the magnetic field.\nHphi : JaxDataArray\n    Spatial distribution of phi-component of the magnetic field.\nmedium : Union[Medium, CustomMedium, AnisotropicMedium, PECMedium, PoleResidue, Sellmeier, Lorentz, Debye, Drude] = Medium(name=None, frequency_range=None, type='Medium', permittivity=1.0, conductivity=0.0)\n    Background medium through which to project fields.\nsim_size : Tuple[float, float]\n    [units = um].  Size of the near field in the local x and y directions.\nbloch_vecs : Tuple[float, float]\n    Bloch vectors along the local x and y directions in units of ``2 * pi / (simulation size along the respective dimension)``.",
         "type": "object",
         "properties": {
            "type": {
               "title": "Type",
               "default": "JaxDiffractionData",
               "enum": [
                  "JaxDiffractionData"
               ],
               "type": "string"
            },
            "monitor": {
               "title": "Monitor",
               "description": "Monitor associated with the data.",
               "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                     "FieldMonitor": "#/definitions/FieldMonitor",
                     "FieldTimeMonitor": "#/definitions/FieldTimeMonitor",
                     "PermittivityMonitor": "#/definitions/PermittivityMonitor",
                     "FluxMonitor": "#/definitions/FluxMonitor",
                     "FluxTimeMonitor": "#/definitions/FluxTimeMonitor",
                     "ModeMonitor": "#/definitions/ModeMonitor",
                     "ModeSolverMonitor": "#/definitions/ModeSolverMonitor",
                     "FieldProjectionAngleMonitor": "#/definitions/FieldProjectionAngleMonitor",
                     "FieldProjectionCartesianMonitor": "#/definitions/FieldProjectionCartesianMonitor",
                     "FieldProjectionKSpaceMonitor": "#/definitions/FieldProjectionKSpaceMonitor",
                     "DiffractionMonitor": "#/definitions/DiffractionMonitor"
                  }
               },
               "oneOf": [
                  {
                     "$ref": "#/definitions/FieldMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldTimeMonitor"
                  },
                  {
                     "$ref": "#/definitions/PermittivityMonitor"
                  },
                  {
                     "$ref": "#/definitions/FluxMonitor"
                  },
                  {
                     "$ref": "#/definitions/FluxTimeMonitor"
                  },
                  {
                     "$ref": "#/definitions/ModeMonitor"
                  },
                  {
                     "$ref": "#/definitions/ModeSolverMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldProjectionAngleMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldProjectionCartesianMonitor"
                  },
                  {
                     "$ref": "#/definitions/FieldProjectionKSpaceMonitor"
                  },
                  {
                     "$ref": "#/definitions/DiffractionMonitor"
                  }
               ]
            },
            "Er": {
               "title": "Er",
               "description": "Spatial distribution of r-component of the electric field.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "Etheta": {
               "title": "Etheta",
               "description": "Spatial distribution of the theta-component of the electric field.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "Ephi": {
               "title": "Ephi",
               "description": "Spatial distribution of phi-component of the electric field.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "Hr": {
               "title": "Hr",
               "description": "Spatial distribution of r-component of the magnetic field.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "Htheta": {
               "title": "Htheta",
               "description": "Spatial distribution of theta-component of the magnetic field.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "Hphi": {
               "title": "Hphi",
               "description": "Spatial distribution of phi-component of the magnetic field.",
               "jax_field": true,
               "allOf": [
                  {
                     "$ref": "#/definitions/JaxDataArray"
                  }
               ]
            },
            "medium": {
               "title": "Background Medium",
               "description": "Background medium through which to project fields.",
               "default": {
                  "name": null,
                  "frequency_range": null,
                  "type": "Medium",
                  "permittivity": 1.0,
                  "conductivity": 0.0
               },
               "anyOf": [
                  {
                     "$ref": "#/definitions/Medium"
                  },
                  {
                     "$ref": "#/definitions/CustomMedium"
                  },
                  {
                     "$ref": "#/definitions/AnisotropicMedium"
                  },
                  {
                     "$ref": "#/definitions/PECMedium"
                  },
                  {
                     "$ref": "#/definitions/PoleResidue"
                  },
                  {
                     "$ref": "#/definitions/Sellmeier"
                  },
                  {
                     "$ref": "#/definitions/Lorentz"
                  },
                  {
                     "$ref": "#/definitions/Debye"
                  },
                  {
                     "$ref": "#/definitions/Drude"
                  }
               ]
            },
            "sim_size": {
               "title": "Domain size",
               "description": "Size of the near field in the local x and y directions.",
               "units": "um",
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            },
            "bloch_vecs": {
               "title": "Bloch vectors",
               "description": "Bloch vectors along the local x and y directions in units of ``2 * pi / (simulation size along the respective dimension)``.",
               "type": "array",
               "minItems": 2,
               "maxItems": 2,
               "items": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "number"
                  }
               ]
            }
         },
         "required": [
            "monitor",
            "Er",
            "Etheta",
            "Ephi",
            "Hr",
            "Htheta",
            "Hphi",
            "sim_size",
            "bloch_vecs"
         ],
         "additionalProperties": false
      }
   }
}

attribute grad_data: Tuple[FieldData, ...] = ()#

Tuple of monitor data storing fields associated with the input structures.

attribute grad_eps_data: Tuple[PermittivityData, ...] = ()#

Tuple of monitor data storing epsilon associated with the input structures.

attribute output_data: Tuple[JaxMonitorDataType, ...] = ()#

Tuple of Jax-compatible data associated with output monitors.

attribute simulation: JaxSimulation [Required]#

The jax-compatible simulation corresponding to the data.

classmethod from_sim_data(sim_data: tidy3d.components.data.sim_data.SimulationData, jax_info: tidy3d.plugins.adjoint.components.simulation.JaxInfo) tidy3d.plugins.adjoint.components.data.sim_data.JaxSimulationData#

Construct a JaxSimulationData instance from a SimulationData.

make_adjoint_simulation(fwidth: float) tidy3d.plugins.adjoint.components.simulation.JaxSimulation#

Make an adjoint simulation out of the data provided (generally, the vjp sim data).

property monitor_data: Dict[str, Union[tidy3d.plugins.adjoint.components.data.monitor_data.JaxModeData, tidy3d.plugins.adjoint.components.data.monitor_data.JaxDiffractionData, tidy3d.components.data.monitor_data.FieldData, tidy3d.components.data.monitor_data.FieldTimeData, tidy3d.components.data.monitor_data.PermittivityData, tidy3d.components.data.monitor_data.ModeSolverData, tidy3d.components.data.monitor_data.ModeData, tidy3d.components.data.monitor_data.FluxData, tidy3d.components.data.monitor_data.FluxTimeData, tidy3d.components.data.monitor_data.FieldProjectionKSpaceData, tidy3d.components.data.monitor_data.FieldProjectionCartesianData, tidy3d.components.data.monitor_data.FieldProjectionAngleData, tidy3d.components.data.monitor_data.DiffractionData]]#

Dictionary of .output_data monitor .name to the corresponding data.

property output_monitor_data: Dict[str, Union[tidy3d.plugins.adjoint.components.data.monitor_data.JaxModeData, tidy3d.plugins.adjoint.components.data.monitor_data.JaxDiffractionData]]#

Dictionary of .output_data monitor .name to the corresponding data.