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
absorptiontable, \(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 ofn_effis 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
Interpolatorover 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
absorptiononly.chirp (float) – Chirp parameter \(\alpha_c\) as quoted on modulator datasheets. Applies to
absorptiononly.
Important
chirptakes 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 aslinewidth_enhancement_factorin 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 generateabsorptionfrom 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_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:
- 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
AnalyticWaveguideTimeStepperwhose 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 atreference_frequencysupplies every cross-section parameter not given explicitly:n_eff,n_group,dispersionand 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_specof those materials (Tidy3DKerrNonlinearityandTwoPhotonAbsorption). 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
lengthis 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 frompeak_powerandmax_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
propertieslist the values used:n_eff,n_group,dispersion,kerr_index,tpa_coefficient, and the effective areaskerr_effective_areaandtpa_effective_areain m².- Return type:
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
statusands_matrix.- Return type: