AnalyticMZIModel¶
- class photonforge.AnalyticMZIModel(*, n_eff1, n_eff2=None, length1, length2=None, tau1=None, tau2=None, kappa1=-1j * 2**-0.5, kappa2=-1j * 2**-0.5, propagation_loss1=0.0, propagation_loss2=0.0, extra_loss1=0.0, extra_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, v_piL1=e, v_piL2=e, ports=None)[source]¶
Analytic model for a 4-port Mach-Zehnder interferometer.
The S matrix for the MZI for each mode is given by:
\[ \begin{align}\begin{aligned}S_{31} &= \tau_1 t_1 \tau_2 + \kappa_1 t_2 \kappa_2\\S_{41} &= \tau_1 t_1 \kappa_2 + \kappa_1 t_2 \tau_2\\S_{32} &= \kappa_1 t_1 \tau_2 + \tau_1 t_2 \kappa_2\\S_{42} &= \kappa_1 t_1 \kappa_2 + \tau_1 t_2 \tau_2\end{aligned}\end{align} \]with remaining coefficients zero and transmissions $t_1$ and $t_2$ calculated through an
AnalyticWaveguideModel.- Parameters:
n_eff1 (complex | Sequence[complex]) – Effective refractive index for the first arm (loss can be included here by using complex values).
n_eff2 (complex | Sequence[complex] | None) – Effective refractive index for the second arm. If
None, defaults ton_eff1.length1 (Annotated[float, units='μm']) – Length of the first arm.
length2 (Annotated[float, units='μm'] | None) – Length of the second arm. If
None, defaults tolength1.tau1 (complex | Sequence[complex] | Sequence[Sequence[complex]] | None) – Transmission coefficient for the first coupler. If
None, it is calculated based on the magnitude ofkappa1and its phase plus 90°.tau2 (complex | Sequence[complex] | Sequence[Sequence[complex]] | None) – Transmission coefficient for the second coupler. If
None, it is calculated based on the magnitude ofkappa2and its phase plus 90°.kappa1 (complex | Sequence[complex] | Sequence[Sequence[complex]]) – Coupling coefficient for the first coupler.
kappa2 (complex | Sequence[complex] | Sequence[Sequence[complex]]) – Coupling coefficient for the second coupler.
propagation_loss1 (Annotated[float, minimum=0, units='dB/μm'] | Sequence[Annotated[float, minimum=0, units='dB/μm']]) – Propagation loss for the first arm.
propagation_loss2 (Annotated[float, minimum=0, units='dB/μm'] | Sequence[Annotated[float, minimum=0, units='dB/μm']]) – Propagation loss for the second arm.
extra_loss1 (Annotated[float, minimum=0, units='dB'] | Sequence[Annotated[float, minimum=0, units='dB']]) – Length-independent loss for the first arm.
extra_loss2 (Annotated[float, minimum=0, units='dB'] | Sequence[Annotated[float, minimum=0, units='dB']]) – Length-independent loss for the second arm.
n_group1 (float | Sequence[float] | None) – Group index for the first arm.
n_group2 (float | Sequence[float] | None) – Group index for the second arm.
dispersion1 (Annotated[float, units='s/μm²'] | Sequence[Annotated[float, units='s/μm²']]) – Chromatic dispersion coefficient for the first arm.
dispersion2 (Annotated[float, units='s/μm²'] | Sequence[Annotated[float, units='s/μm²']]) – Chromatic dispersion coefficient for the second arm.
dispersion_slope1 (Annotated[float, units='s/μm³'] | Sequence[Annotated[float, units='s/μm³']]) – Chromatic dispersion slope for the first arm.
dispersion_slope2 (Annotated[float, units='s/μm³'] | Sequence[Annotated[float, units='s/μm³']]) – Chromatic dispersion slope for the second arm.
reference_frequency (Annotated[float, minimum=0, units='Hz'] | None) – Reference frequency for the 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 arm.
temperature2 (Annotated[float, minimum=0, units='K']) – Operating temperature for the second arm.
reference_temperature (Annotated[float, minimum=0, units='K']) – Reference temperature.
voltage1 (Annotated[float, units='V']) – Operating voltage for the first arm.
voltage2 (Annotated[float, units='V']) – Operating voltage for the second arm.
v_piL1 (Annotated[float, units='V·μm'] | None) – Electro-optic phase coefficient for the first arm.
v_piL2 (Annotated[float, units='V·μm'] | None) – Electro-optic phase coefficient for the second arm.
ports (Sequence[str] | 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
tau1,tau2,kappa1, andkappa2can also be manually included by setting the coefficients to 2D arrays 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
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.
update(*args, **kwargs)Update this model.
Attributes
parametric_functionFunction used to update a parametric component.
parametric_kwargsKeyword arguments used to update a parametric component.
propertiesObject properties.
random_variablesRandom variables associated to this modles'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 arm.
temperature2 (Annotated[float, minimum=0, units='K'] | None) – Operating temperature override for second arm.
voltage1 (Annotated[float, units='V'] | None) – Operating voltage override for first arm.
voltage2 (Annotated[float, units='V'] | None) – Operating voltage override for second arm.
**kwargs – Unused.
- Returns:
Result object with attributes
statusands_matrix.- Return type: