AnalyticWaveguideModel

class photonforge.AnalyticWaveguideModel(*, n_eff, length=None, propagation_loss=0.0, extra_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, v_piL=e)[source]

Analytic model for waveguides, bends, and EO phase-shifters.

This model for 2-port components includes dispersion and temperature sensitivity for single- and multi-mode waveguides. For each mode, the transmission between ports at frequency \(f\) is:

\[ \begin{align}\begin{aligned}S_{12} &= S_{21} = 10^{-\frac{L}{20}} e^{j (\beta \ell + \phi_{eo})}\\L &= L_0 + L_p \ell\\\beta &= \beta_0 + \beta_1 \Delta\omega + \frac{\beta_2}{2} \Delta\omega^2 + \frac{\beta_3}{6} \Delta\omega^3\\\beta_0 &= \frac{\omega_0}{c_0} n_\text{eff}\\\beta_1 &= \frac{n_\text{group}}{c_0}\\\beta_2 &= -\frac{\lambda_0}{\omega_0} D\\\beta_3 &= \left(\frac{\lambda_0}{\omega_0}\right)^2 \left(S + \frac{2}{\lambda_0} D\right)\\\phi_{eo} &= \frac{\pi V \ell}{V_{\pi L}}\end{aligned}\end{align} \]

in which \(\lambda_0 = c_0 f_0^{-1}\), \(\omega_0 = 2 \pi f_0\), \(\Delta\omega = 2 \pi (f - f_0)\), and the temperature dependence is taken into account through:

\[ \begin{align}\begin{aligned}n_\text{eff}(T) &= n_\text{eff}(T_0) + \frac{{\rm d}n_\text{eff}}{{\rm d}T} (T - T_0)\\L_p(T) &= L_p(T_0) + \frac{{\rm d}L_p}{{\rm d}T} (T - T_0)\end{aligned}\end{align} \]
Parameters:
  • n_eff (complex | Sequence[complex]) – Effective refractive index (loss can be included here by using complex values).

  • length (Annotated[float, units='μm'] | None) – Length \(\ell\) of the waveguide. If not provided, the length is measured by route_length() or ports distance.

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

  • extra_loss (Annotated[float, minimum=0, units='dB'] | Sequence[Annotated[float, minimum=0, units='dB']]) – Length-independent loss \(L_0\). This can be used, for example, to model bending losses.

  • n_group (float | Sequence[float] | 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 \(D\).

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

  • reference_frequency (Annotated[float, minimum=0, units='Hz'] | None) – Reference frequency \(f_0\) 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 \(T\).

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

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

  • v_piL (Annotated[float, units='V·μm'] | None) – Electro-optic phase coefficient \(V_{\pi L}\).

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[, temperature, ...])

Start computing the S matrix response from a component.

update(*args, **kwargs)

Update this model.

Attributes

parametric_function

Function used to update a parametric component.

parametric_kwargs

Keyword arguments used to update a parametric component.

properties

Object properties.

random_variables

Random variables associated to this modles'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 – Unused.

Returns:

Result object with attributes status and s_matrix.

Return type:

SMatrix