RingModel

class photonforge.RingModel(*, kappa1, kappa2=None, n_eff, length, propagation_loss=0.0, n_group=None, dispersion=0.0, dispersion_slope=0.0, reference_frequency=None, dn_dT=0.0, dL_dT=.0, temperature=293.0, reference_temperature=293.0, voltage=0.0, dn_dv=0.0, dn_dv2=, dloss_dv=.0, dloss_dv2=, ports=None)[source]

Analytic ring resonator/modulator model with single or double bus.

The S matrix for each mode is given by:

\[\begin{split}S = \begin{bmatrix} 0 & t_1 & d & 0 \\ t_1 & 0 & 0 & d \\ d & 0 & 0 & t_2 \\ 0 & d & t_2 & 0 \\ \end{bmatrix}\end{split}\]

in which \(t_1\) and \(t_2\) are the thru-port transmissions, and \(d\) is the drop-port transmission. Temperature- and voltage-dependent effective index and ring loss are introduced analogously to the AnalyticWaveguideModel.

For single-bus models, \(\tau_2 = 1\) and the S matrix becomes:

\[\begin{split}S = \begin{bmatrix} 0 & t_1 \\ t_1 & 0 \\ \end{bmatrix}\end{split}\]
Parameters:
  • kappa1 (complex | Sequence[complex] | Sequence[Sequence[complex]] | Interpolator) – Coupling coefficient for the first bus waveguide.

  • kappa2 (complex | Sequence[complex] | Sequence[Sequence[complex]] | Interpolator | None) – Coupling coefficient for the second bus waveguide. If None, models a single-bus ring.

  • n_eff (complex | Sequence[complex] | Interpolator) – Effective refractive index (loss can be included here by using complex values).

  • length (Annotated[float, units='μm']) – Round-trip length of the ring.

  • propagation_loss (Annotated[float, minimum=0, units='dB/μm'] | Sequence[Annotated[float, minimum=0, units='dB/μm']]) – Propagation loss.

  • n_group (float | Sequence[float] | Interpolator | None) – Group index. If None, the value of n_eff is used.

  • dispersion (Annotated[float, units='s/μm²'] | Sequence[Annotated[float, units='s/μm²']]) – Chromatic dispersion coefficient.

  • dispersion_slope (Annotated[float, units='s/μm³'] | Sequence[Annotated[float, units='s/μm³']]) – Chromatic dispersion slope.

  • reference_frequency (Annotated[float, minimum=0, units='Hz'] | None) – Reference frequency for dispersion coefficients. If None, the central frequency is used.

  • dn_dT (Annotated[complex | Sequence[complex], units='1/K']) – Temperature sensitivity for n_eff.

  • dL_dT (Annotated[float | Sequence[float], units='dB/μm/K']) – Temperature sensitivity for propagation_loss.

  • temperature (Annotated[float, minimum=0, units='K']) – Operating temperature.

  • reference_temperature (Annotated[float, minimum=0, units='K']) – Reference temperature.

  • voltage (Annotated[float, units='V']) – Operating voltage.

  • dn_dv (Annotated[complex, units='1/V']) – Linear voltage-dependent effective index coefficient.

  • dn_dv2 (Annotated[complex, units='1/V²']) – Quadratic voltage-dependent effective index coefficient.

  • dloss_dv (Annotated[float, units='dB/μm/V']) – Linear voltage-dependent propagation loss coefficient.

  • dloss_dv2 (Annotated[float, units='dB/μm/V²']) – Quadratic voltage-dependent propagation loss coefficient.

  • ports (Annotated[Sequence[str], maxItems=2, minItems=2] | Annotated[Sequence[str], maxItems=4, minItems=4] | None) – List of port names. If not set, the sorted list of port names from the component is used.

Notes

For multimode ports, mixed-mode coefficients are 0. Parameters can be specified per mode by using sequences of values. Dispersion for kappa1 and kappa2 can also be manually included by setting the coefficients to an Interpolator (with multiple values for multimode ports), or a 2D array with shape (M, N), in which M is the number of modes, and N the length of the frequency sequence used in the S matrix computation.

Methods

autograd_smatrix(*, component, ...[, ...])

Compute an autograd-compatible S matrix for traced parameters.

black_box_component([port_spec, technology, ...])

Create a black-box component using this model for testing.

estimate_cost(*args, **kwargs)

Estimate the cost for S matrix computation.

s_matrix(component, frequencies[, ...])

Compute the S matrix for a component using this model.

setup_time_stepper(component, time_step[, ...])

Obtain a time stepper for a component using this model.

start(component, frequencies[, temperature, ...])

Start computing the S matrix response from a component.

transform([translation, rotation, scaling, ...])

Apply a transformation to this model.

update(*args, **kwargs)

Update this model.

Attributes

parametric_function

Function used to update the model.

parametric_kwargs

Keyword arguments used to update the model.

properties

Object properties.

random_variables

Random variables associated to the model's parameters.

time_stepper

Time stepper associated with this model.

black_box_component(port_spec=None, technology=None, name=None)[source]

Create a black-box component using this model for testing.

Parameters:
  • port_spec (str | PortSpec | None) – Port specification used in the component. If None, look for "port_spec" in config.default_kwargs.

  • technology (Technology | None) – Component technology. If None, the default technology is used.

  • name (str | None) – Component name. If None a default is used.

Returns:

Component with ports and model.

Return type:

Component

start(component, frequencies, temperature=None, voltage=None, **kwargs)[source]

Start computing the S matrix response from a component.

Parameters:
  • component (Component) – Component from which to compute the S matrix.

  • frequencies (Sequence[Annotated[float, minimum=0, units='Hz']]) – Sequence of frequencies at which to perform the computation.

  • temperature (Annotated[float, minimum=0, units='K'] | None) – Operating temperature override.

  • voltage (Annotated[float, units='V'] | None) – Operating voltage override.

  • **kwargs (object) – Unused.

Returns:

Result object with attributes status and s_matrix.

Return type:

SMatrix