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, k2=, k3=, dloss_dv=.0, dloss_dv2=, absorption=None, confinement_factor=1.0, chirp=0.0)[source]

Analytic model for waveguides, bends, and EO modulators.

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^{\frac{1}{2}\ln T_\alpha} e^{j (\beta \ell + \phi_{eo} + \phi_\alpha)}\\L &= L_0 + \ell \left(L_p + \frac{{\rm d}L_p}{{\rm d}V} V + \frac{{\rm d}^2L_p}{{\rm d}V^2} V^2 \right)\\\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}} + k_2 V^2 \ell + k_3 V^3 \ell\\\ln T_\alpha &= -\Gamma \alpha(\lambda, V) \ell\\\phi_\alpha = -\frac{\alpha_c}{2} \ln T_\alpha\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} \]

Without an absorption table, \(T_\alpha = 1\). With one, the bias- and wavelength-dependent electro-absorption multiplies the transmission, and the chirp parameter \(\alpha_c\) ties a phase to it. It coexists with the polynomial loss terms, which default to 0, so the user chooses either loss description (or, knowingly, both).

Parameters:
  • n_eff (complex | Sequence[complex] | Interpolator) – 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] | 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 \(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}\).

  • k2 (Annotated[float, units='rad/μm/V²']) – Quadratic nonlinear phase coefficient.

  • k3 (Annotated[float, units='rad/μm/V³']) – Cubic nonlinear phase 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.

  • absorption (Interpolator | None) – Material absorption in 1/μm, as an Interpolator over voltage and wavelength, for electro-absorption sections.

  • confinement_factor (Annotated[float, maximum=1, minimum=0]) – Fraction of the optical mode overlapping the absorbing region, between 0 and 1. Applies to absorption only.

  • chirp (float) – Chirp parameter \(\alpha_c\) as quoted on modulator datasheets. Applies to absorption only.

Important

chirp takes the value quoted on a datasheet unchanged. In the time domain it gives the frequency deviation \(\delta\nu = (\alpha_c/4\pi)\,{\rm d}\ln P/{\rm d}t\), so a positive value blue-shifts the rising optical edge, the same sign convention as linewidth_enhancement_factor in the laser and semiconductor amplifier models. In this model, with the \(e^{-j\omega t}\) time convention, it appears as the phase \(\phi_\alpha\), which grows with the absorption for \(\alpha_c > 0\).

Note

Absorption queries outside the sampled range are clamped to it. An Interpolator of two variables cannot carry extrapolation="constant", and extrapolating an absorption edge gives nonsense.

See also

franz_keldysh_absorption() can be used to generate absorption from tabulated measured data.

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.

nonlinear(*, reference_frequency[, ...])

Waveguide model with a nonlinear time stepper, from physical parameters.

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

classmethod nonlinear(*, reference_frequency, port_spec=None, technology=None, n_eff=None, n_group=None, dispersion=None, dispersion_slope=0.0, effective_area=one, length=None, propagation_loss=0.0, extra_loss=0.0, kerr_index=one, tpa_coefficient=None, fca_cross_section=one, fcd_coefficients=None, fcd_exponents=None, carrier_lifetime=None, peak_power=None, sections=None, max_phase=0.05, mesh_refinement=None, verbose=True)[source]

Waveguide model with a nonlinear time stepper, from physical parameters.

The returned model carries an AnalyticWaveguideTimeStepper whose perturbations describe the Kerr effect, two-photon absorption (TPA) and the free carriers TPA generates, with the carrier density \(N\) relaxing with the carrier lifetime:

\[ \begin{align}\begin{aligned}&\Delta n_\text{K} = \frac{n_2 P}{A} + i\frac{\lambda}{4\pi}\frac{\beta P}{A}\\&\tau_c\frac{{\rm d}N}{{\rm d}t} + N = \frac{\tau_c\beta}{2h\nu}\left(\frac{P}{A}\right)^2\\&\Delta n_\text{fc} = c_e N^{e_e} + c_h N^{e_h} + i\frac{\lambda}{4\pi}\sigma N\end{aligned}\end{align} \]

With port_spec, a mode solve at reference_frequency supplies every cross-section parameter not given explicitly: n_eff, n_group, dispersion and the nonlinear effective areas. The areas use the vectorial, power-normalised definition,

\[\frac{n_2}{A} = \frac{\int n^2 n_2 \left(2|E|^4 + |E\cdot E|^2\right)/3\,{\rm d}S} {Z_0^2 \left(\int {\rm Re}(E\times H^*)\cdot\hat{z}\, {\rm d}S\right)^2},\]

and the same for \(\beta/A\), integrated over the nonlinear materials only. Coefficients not given explicitly are read from the nonlinear_spec of those materials (Tidy3D KerrNonlinearity and TwoPhotonAbsorption). If no material has one, the explicit coefficients apply to the highest-index material. The free-carrier terms use the TPA effective area.

The model length is left to the component unless length is set, so the model can be added to a routed waveguide or turned into a black box.

Parameters:
  • reference_frequency (Annotated[float, minimum=0, units='Hz']) – Frequency at which the cross-section and nonlinear parameters apply.

  • port_spec (str | PortSpec | None) – Port specification (or its name in the technology) of the waveguide cross-section, for the mode solve.

  • technology (Technology | None) – Technology used for the mode solve. If None, the default technology is used.

  • n_eff (complex | None) – Effective index. Required without port_spec.

  • n_group (float | None) – Group index. Required without port_spec.

  • dispersion (Annotated[float, units='s/μm²'] | None) – Chromatic dispersion \(D\). Without port_spec, zero if not given.

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

  • effective_area (Annotated[float, exclusiveMinimum=0, units='m²'] | None) – Nonlinear effective area used for every effect, instead of the ones computed from the mode.

  • length (Annotated[float, units='μm'] | None) – Waveguide length. If None, it is measured from the component.

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

  • extra_loss (Annotated[float, minimum=0, units='dB']) – Length-independent loss.

  • kerr_index (Annotated[float, units='m²/W'] | None) – Kerr coefficient \(n_2\).

  • tpa_coefficient (Annotated[float, minimum=0, units='m/W'] | None) – Two-photon absorption coefficient \(\beta\).

  • fca_cross_section (Annotated[float, minimum=0, units='m²'] | None) – Free-carrier absorption cross-section \(\sigma\), for electrons and holes together.

  • fcd_coefficients (tuple[float, float] | None) – Free-carrier dispersion coefficients \((c_e, c_h)\), in m^(3 e_e) and m^(3 e_h).

  • fcd_exponents (tuple[float, float] | None) – Free-carrier dispersion exponents \((e_e, e_h)\). If None, 1 for both.

  • carrier_lifetime (Annotated[float, minimum=0, units='s'] | None) – Free-carrier lifetime \(\tau_c\). Zero disables the free carriers.

  • peak_power (Annotated[float, minimum=0, units='W'] | None) – Highest optical power expected at the input, used to choose the number of sections.

  • sections (Annotated[int, exclusiveMinimum=0] | None) – Number of sections. If None, chosen from peak_power and max_phase.

  • max_phase (Annotated[float, exclusiveMinimum=0, units='rad']) – Largest nonlinear phase per section when the number of sections is chosen automatically.

  • mesh_refinement (Annotated[float, exclusiveMinimum=0] | None) – Minimal number of mesh elements per wavelength used for the mode solve.

  • verbose (bool) – Flag controlling mode solver verbosity.

Returns:

Waveguide model with its nonlinear time stepper attached. Its properties list the values used: n_eff, n_group, dispersion, kerr_index, tpa_coefficient, and the effective areas kerr_effective_area and tpa_effective_area in m².

Return type:

AnalyticWaveguideModel

Note

The mode solve runs once per call, on the Tidy3D mode solver.

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