Skip to content

flex_rf.tidy3d.CustomMedium

Type: class Base(s): AbstractCustomMedium

Medium with user-supplied permittivity distribution.

Practical Advice

Use CustomMedium when permittivity varies spatially — for example, graded-index (GRIN) lenses or topology-optimized design regions. Define the permittivity on a rectangular grid using SpatialDataArray:

from tidy3d import SpatialDataArray
import numpy as np
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
z = [0] # 2D variation
X, Y = np.meshgrid(x, y, indexing="ij")
eps_data = 1 + 3 * np.exp(-(X**2 + Y**2) / 4)
eps_data = eps_data[:, :, np.newaxis]
permittivity = SpatialDataArray(eps_data, coords=dict(x=x, y=y, z=z))
custom_medium = CustomMedium(permittivity=permittivity)

For uniform pixelated grids (e.g. topology optimization), consider the convenience method from_permittivity_array, which creates a Structure with a CustomMedium directly from a 3D numpy array and a geometry.

For wavelength-independent homogeneous materials, use Medium instead. For dispersive materials, use FastDispersionFitter or an analytical model.

Nx, Ny, Nz = 10, 9, 8
X = np.linspace(-1, 1, Nx)
Y = np.linspace(-1, 1, Ny)
Z = np.linspace(-1, 1, Nz)
coords = dict(x=X, y=Y, z=Z)
permittivity= SpatialDataArray(np.ones((Nx, Ny, Nz)), coords=coords)
conductivity= SpatialDataArray(np.ones((Nx, Ny, Nz)), coords=coords)
dielectric = CustomMedium(permittivity=permittivity, conductivity=conductivity)
eps = dielectric.eps_model(200e12)
name [str | None] = None

Optional unique name for medium.

frequency_range [FreqBound | None] = None

Optional range of validity for the medium.

allow_gain [bool] = False

Allow the medium to be active. Caution: simulations with a gain medium are unstable, and are likely to diverge.Simulations where allow_gain is set to True will still be charged even if diverged. Monitor data up to the divergence point will still be returned and can be useful in some cases.

nonlinear_spec [NonlinearSpec | NonlinearSusceptibility | None] = None

Nonlinear spec applied on top of the base medium properties.

modulation_spec [ModulationSpec | None] = None

Modulation spec applied on top of the base medium properties.

viz_spec [VisualizationSpec | None] = None

Plotting specification for visualizing medium.

heat_spec [ThermalSpecType | None] = None

DEPRECATED: Use MultiPhysicsMedium. Specification of the medium heat properties. They are used for solving the heat equation via the HeatSimulation interface. Such simulations can beused for investigating the influence of heat propagation on the properties of optical systems. Once the temperature distribution in the system is found using HeatSimulation object, Simulation.perturbed_mediums_copy() can be used to convert mediums with perturbation models defined into spatially dependent custom mediums. Otherwise, the heat_spec does not directly affect the running of an optical Simulation.

interp_method [InterpMethod] = 'nearest'

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.

subpixel [bool] = False

If True, apply the subpixel averaging method specified by Simulation’s field subpixel for this type of material on the interface of the structure, including exterior boundary and intersection interfaces with other structures.

derived_from [PerturbationMediumType | None] = None

If not None, it records the parent medium from which this medium was derived.

eps_dataset [PermittivityDataset | None] = None

[To be deprecated] 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.

permittivity [CustomSpatialDataTypeAnnotated | None] = None

Spatial profile of relative permittivity.

conductivity [CustomSpatialDataTypeAnnotated | None] = None

Spatial profile Electric conductivity. Defined such that the imaginary part of the complex permittivity at angular frequency omega is given by conductivity/omega.

eps_dataarray_freq(frequency: float)

Permittivity array at frequency. ()

eps_diagonal(frequency: float)

Main diagonal of the complex-valued permittivity tensor at frequency. Spatially, we take max{|eps|}, so that autoMesh generation works appropriately.

eps_diagonal_on_grid(frequency: float, coords: Coords)

Spatial profile of main diagonal of the complex-valued permittivity at frequency interpolated at the supplied coordinates.

eps_model(frequency: float)

Spatial and polarizaiton average of complex-valued permittivity as a function of frequency.

freqs()

float array of frequencies. This field is to be deprecated in v3.0.

from_eps_raw(eps: ScalarFieldDataArray | CustomSpatialDataType, freq: float | None = None, interp_method: InterpMethod = 'nearest', **kwargs: Any)

Construct a CustomMedium from datasets containing raw permittivity values.

from_nk(n: ScalarFieldDataArray | CustomSpatialDataType, k: ScalarFieldDataArray | CustomSpatialDataType | None = None, freq: float | None = None, interp_method: InterpMethod = 'nearest', **kwargs: Any)

Construct a CustomMedium from datasets containing n and k values.

grids(bounds: Bound)

Make a Grid corresponding to the data in each eps_ii component. The min and max coordinates along each dimension are bounded by bounds.

is_isotropic()

Check if the medium is isotropic or anisotropic.

is_spatially_uniform()

Whether the medium is spatially uniform.

n_cfl()

This property computes the index of refraction related to CFL condition, so that the FDTD with this medium is stable when the time step size that doesn’t take material factor into account is multiplied by “n_cfl```.