DualRingModel¶
- class photonforge.DualRingModel(*, kappa1, kappa2, kappa3=None, n_eff1, n_eff2, length1, length2, propagation_loss1=0.0, propagation_loss2=0.0, n_group1=None, n_group2=None, dispersion1=0.0, dispersion2=0.0, dispersion_slope1=0.0, dispersion_slope2=0.0, reference_frequency=None, dn1_dT=0.0, dn2_dT=0.0, dL1_dT=.0, dL2_dT=.0, temperature1=293.0, temperature2=293.0, reference_temperature=293.0, voltage1=0.0, voltage2=0.0, dn1_dv=0.0, dn2_dv=0.0, dn1_dv2=, dn2_dv2=, dloss_dv_1=.0, dloss_dv_2=.0, dloss_dv2_1=, dloss_dv2_2=, ports=None)[source]¶
Dual 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_3 = 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) – Coupling coefficient between rings.
kappa3 (complex | Sequence[complex] | Sequence[Sequence[complex]] | Interpolator | None) – Coupling coefficient for the second bus. If
None, models a single-bus ring.n_eff1 (complex | Sequence[complex] | Interpolator) – Effective refractive index for the first ring (loss can be included here by using complex values).
n_eff2 (complex | Sequence[complex] | Interpolator) – Effective refractive index for the second ring (loss can be included here by using complex values).
length1 (Annotated[float, units='μm']) – Round-trip length of the first ring.
length2 (Annotated[float, units='μm']) – Round-trip length of the second ring.
propagation_loss1 (Annotated[float, minimum=0, units='dB/μm'] | Sequence[Annotated[float, minimum=0, units='dB/μm']]) – Propagation loss for the first ring.
propagation_loss2 (Annotated[float, minimum=0, units='dB/μm'] | Sequence[Annotated[float, minimum=0, units='dB/μm']]) – Propagation loss for the second ring.
n_group1 (float | Sequence[float] | Interpolator | None) – Group index for the first ring. If
None, the value ofn_eff1is used.n_group2 (float | Sequence[float] | Interpolator | None) – Group index for the second ring. If
None, the value ofn_eff2is used.dispersion1 (Annotated[float, units='s/μm²'] | Sequence[Annotated[float, units='s/μm²']]) – Chromatic dispersion coefficient for the first ring.
dispersion2 (Annotated[float, units='s/μm²'] | Sequence[Annotated[float, units='s/μm²']]) – Chromatic dispersion coefficient for the second ring.
dispersion_slope1 (Annotated[float, units='s/μm³'] | Sequence[Annotated[float, units='s/μm³']]) – Chromatic dispersion slope for the first ring.
dispersion_slope2 (Annotated[float, units='s/μm³'] | Sequence[Annotated[float, units='s/μm³']]) – Chromatic dispersion slope for the second ring.
reference_frequency (Annotated[float, minimum=0, units='Hz'] | None) – Reference frequency for dispersion coefficients. If
None, the central frequency is used.dn1_dT (Annotated[complex | Sequence[complex], units='1/K']) – Temperature sensitivity for
n_eff1.dn2_dT (Annotated[complex | Sequence[complex], units='1/K']) – Temperature sensitivity for
n_eff2.dL1_dT (Annotated[float | Sequence[float], units='dB/μm/K']) – Temperature sensitivity for
propagation_loss1.dL2_dT (Annotated[float | Sequence[float], units='dB/μm/K']) – Temperature sensitivity for
propagation_loss2.temperature1 (Annotated[float, minimum=0, units='K']) – Operating temperature for the first ring.
temperature2 (Annotated[float, minimum=0, units='K']) – Operating temperature for the second ring.
reference_temperature (Annotated[float, minimum=0, units='K']) – Reference temperature.
voltage1 (Annotated[float, units='V']) – Operating voltage for the first ring.
voltage2 (Annotated[float, units='V']) – Operating voltage for the second ring.
dn1_dv (Annotated[complex, units='1/V']) – Linear voltage-dependent effective index coefficient for the first ring.
dn2_dv (Annotated[complex, units='1/V']) – Linear voltage-dependent effective index coefficient for the second ring.
dn1_dv2 (Annotated[complex, units='1/V²']) – Quadratic voltage-dependent effective index coefficient for the first ring.
dn2_dv2 (Annotated[complex, units='1/V²']) – Quadratic voltage-dependent effective index coefficient for the second ring.
dloss_dv_1 (Annotated[float, units='dB/μm/V']) – Linear voltage-dependent propagation loss coefficient for the first ring.
dloss_dv_2 (Annotated[float, units='dB/μm/V']) – Linear voltage-dependent propagation loss coefficient for the second ring.
dloss_dv2_1 (Annotated[float, units='dB/μm/V²']) – Quadratic voltage-dependent propagation loss coefficient for the first ring.
dloss_dv2_2 (Annotated[float, units='dB/μm/V²']) – Quadratic voltage-dependent propagation loss coefficient for the second ring.
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
kappa1andkappa2can also be manually included by setting the coefficients to anInterpolator(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[, ...])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_functionFunction used to update the model.
parametric_kwargsKeyword arguments used to update the model.
propertiesObject properties.
random_variablesRandom variables associated to the model's parameters.
time_stepperTime 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"inconfig.default_kwargs.technology (Technology | None) – Component technology. If
None, the default technology is used.name (str | None) – Component name. If
Nonea default is used.
- Returns:
Component with ports and model.
- Return type:
- start(component, frequencies, temperature1=None, voltage1=None, temperature2=None, voltage2=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.
temperature1 (Annotated[float, minimum=0, units='K'] | None) – Operating temperature override for first ring.
temperature2 (Annotated[float, minimum=0, units='K'] | None) – Operating temperature override for second ring.
voltage1 (Annotated[float, units='V'] | None) – Operating voltage override for first ring.
voltage2 (Annotated[float, units='V'] | None) – Operating voltage override for second ring.
**kwargs (object) – Unused.
- Returns:
Result object with attributes
statusands_matrix.- Return type: