DMLaserTimeStepper

class photonforge.DMLaserTimeStepper(*, quantum_efficiency, spontaneous_emission_factor, carrier_lifetime, gain_compression_factor, transparency_carrier_density, differential_gain, n_group, linewidth_enhancement_factor, confinement_factor, photon_lifetime, active_region_volume, rel_intensity_noise=0, linewidth=0, thermal_impedance=0, thermal_time_constant=1e-6, characteristic_temperature=0, gain_temperature_coefficient=0, dwavelength_dT=0, injection_temperature=0, turn_on_voltage=0, series_resistance=, reflection=0, z0=None, mesh_refinement=None, verbose=True, seed=None)[source]

Time-stepper for a directly modulated laser source.

This model solves the single-mode semiconductor laser rate equations for photon density (\(p\)), carrier density (\(n\)), and optical phase (\(\phi\)). The model includes gain compression, intensity and phase noises, and optional self-heating.

The rate equations are:

\[ \begin{align}\begin{aligned}\frac{{\rm d} p}{{\rm d} t} &= \Gamma G(p) (n-n_0) p - \frac{p}{\tau_p} + \frac{\beta\Gamma}{\tau_n}n\\\frac{{\rm d} n}{{\rm d} t} &= \frac{I(t)}{q V_a} - G(p) (n-n_0) p - \frac{n}{\tau_n}\\\frac{{\rm d} \phi}{{\rm d} t} &= \frac{\alpha}{2} \left(\Gamma v_g a_0 (n-n_0) - \frac{1}{\tau_p}\right)\\G(p) &= \frac{c_0}{n_g} \frac{a_0}{1 + \epsilon p}\end{aligned}\end{align} \]

The junction temperature follows a first-order thermal circuit:

\[ \begin{align}\begin{aligned}\tau_{\rm th}\frac{{\rm d}\Delta T}{{\rm d}t} + \Delta T = R_{\rm th}\left(I V(I) - P_{\rm out}\right)\\V(I) = V_0 + I R_s\end{aligned}\end{align} \]

and acts on the rate equations through:

\[ \begin{align}\begin{aligned}n_0(\Delta T) &= n_0\,e^{\Delta T/T_0}\\a_0(\Delta T) &= a_0\left(1 - c_g \Delta T\right)\\\eta_i(\Delta T) &= e^{-\Delta T/T_1}\\\lambda(\Delta T) &= \lambda + \frac{{\rm d}\lambda}{{\rm d}T}\Delta T\end{aligned}\end{align} \]
Parameters:
  • quantum_efficiency (Annotated[float, minimum=0]) – Differential quantum efficiency.

  • spontaneous_emission_factor (Annotated[float, minimum=0]) – Fraction of spontaneous emission coupled into the lasing mode.

  • carrier_lifetime (Annotated[float, exclusiveMinimum=0, units='s']) – Carrier lifetime.

  • gain_compression_factor (Annotated[float, minimum=0, units='m³']) – Nonlinear gain suppression coefficient.

  • transparency_carrier_density (Annotated[float, minimum=0, units='m⁻³']) – Carrier density at transparency.

  • differential_gain (Annotated[float, minimum=0, units='m²']) – Gain cross-section.

  • n_group (Annotated[float, minimum=0]) – Group index of the cavity mode.

  • linewidth_enhancement_factor (Annotated[float, minimum=0]) – Henry factor coupling gain to phase.

  • confinement_factor (Annotated[float, exclusiveMinimum=0]) – Optical confinement factor.

  • photon_lifetime (Annotated[float, exclusiveMinimum=0, units='s']) – Cavity photon lifetime.

  • active_region_volume (Annotated[float, exclusiveMinimum=0, units='m³']) – Volume of the active region.

  • rel_intensity_noise (Annotated[float, minimum=0, units='1/Hz']) – One-sided relative intensity noise.

  • linewidth (Annotated[float, minimum=0, units='Hz']) – Lorentzian linewidth used for phase noise.

  • thermal_impedance (Annotated[float, minimum=0, units='K/W']) – Junction-to-ambient thermal resistance \(R_{\rm th}\). Zero disables self-heating entirely.

  • thermal_time_constant (Annotated[float, exclusiveMinimum=0, units='s']) – Thermal time constant \(\tau_{\rm th}\).

  • characteristic_temperature (Annotated[float, minimum=0, units='K']) – \(T_0\) governing the threshold rise. Zero holds the threshold fixed.

  • gain_temperature_coefficient (Annotated[float, minimum=0, units='1/K']) – Fractional loss of differential gain per kelvin. Zero holds the gain fixed.

  • dwavelength_dT (Annotated[float, units='m/K']) – Emission wavelength temperature drift.

  • injection_temperature (Annotated[float, minimum=0, units='K']) – characteristic temperature of carrier leakage \(T_1\). Zero disables leakage.

  • turn_on_voltage (Annotated[float, minimum=0, units='V']) – Diode voltage drop \(V_0\), used together with series_resistance to compute the dissipated power.

  • series_resistance (Annotated[float, minimum=0, units='Ω']) – Series resistance \(R_s\).

  • reflection (complex) – Reflection coefficient for fields on the optical port.

  • z0 (Annotated[complex, units='Ω'] | Interpolator | None) – Reference impedance of the electrical port.

  • mesh_refinement (Annotated[float, exclusiveMinimum=0] | None) – Mesh refinement factor used when the port impedance must be computed by a mode solve.

  • verbose (bool) – Print progress of any background impedance computation.

  • seed (Annotated[int, minimum=0] | None) – Random number generator seed.

Methods

reset()

Reset internal state.

setup(component, time_step, *[, ...])

Initialize the time stepper.

setup_state(*, component, time_step, ...[, ...])

Initialize internal state.

step([inputs, steps, time_step, show_progress])

Compute the outputs of this time stepper, given inputs.

step_single(inputs, outputs, time_index, ...)

Take a single time step on the given inputs.

threshold_current(*[, ...])

Cold threshold current of a rate-equation laser, in A.

update(*args, **kwargs)

Update this time stepper.

write_verilog_a(path, *[, backend, ...])

Write this configured time stepper as one Verilog-A module.

Attributes

junction_temperature

Present junction temperature rise above ambient, in K.

parametric_function

Function used to update the time stepper.

parametric_kwargs

Keyword arguments used to update the time stepper.

properties

Object properties.

random_variables

Random variables associated to the time stepper's parameters.

status

property junction_temperature: float

Present junction temperature rise above ambient, in K.

Exposed because the thermal wavelength shift usually cannot be read off the output field. A rise of a few tens of kelvin moves the emission by a few nanometres, which is hundreds of gigahertz, and the coarse time step that makes thermal simulation affordable puts the Nyquist limit far below that. Reading the temperature and applying dwavelength_dT gives the shift at any time step:

\[\Delta\lambda = \frac{{\rm d}\lambda}{{\rm d}T} \,\Delta T\]
Returns:

Temperature rise in kelvin, zero when self-heating is disabled.

reset()[source]

Reset internal state.

Return type:

None

setup_state(*, component, time_step, carrier_frequency, verbose=None, **kwargs)[source]

Initialize internal state.

Parameters:
  • component (Component) – Component representing the laser source.

  • time_step (Annotated[float, minimum=0, units='s']) – The interval between time steps (in seconds).

  • carrier_frequency (Annotated[float, minimum=0, units='Hz']) – The carrier frequency used to determine the photon energy in the model.

  • verbose (bool | None) – If set, overrides the time stepper’s verbose attribute.

  • kwargs (object) – Unused.

Return type:

object

step_single(inputs, outputs, time_index, update_state, shutdown)[source]

Take a single time step on the given inputs.

Parameters:
  • inputs (ndarray) – Input values at the current time step. Must be a 1D array of complex values ordered according to keys.

  • outputs (ndarray) – Pre-allocated output array where results will be stored. Same size and type as inputs.

  • time_index (int) – Time series index for the current input.

  • update_state (bool) – Whether to update the internal stepper state.

  • shutdown (bool) – Whether this is the last call to the single stepping function for the provided TimeSeries.

Return type:

None

static threshold_current(*, transparency_carrier_density=e24, differential_gain=e-20, confinement_factor=0.04, photon_lifetime=2.5e-12, active_region_volume=.71e-19, carrier_lifetime=1e-9, n_group=3.6)[source]

Cold threshold current of a rate-equation laser, in A.

Gain equals loss at threshold, which fixes the carrier density and hence the current needed to sustain it:

\[ \begin{align}\begin{aligned}n_{\rm th} = n_0 + \frac{1}{\Gamma v_g a_0 \tau_p}\\I_{\rm th} = \frac{q V_a n_{\rm th}}{\tau_n}\end{aligned}\end{align} \]

Useful for choosing active_region_volume to hit a target threshold, since the two are proportional. Arguments are in the SI units this class takes; the abstract builders quote values 1e18 away (μm⁻³, μm³, and nm² for the gain cross-section).

Parameters:
  • transparency_carrier_density (Annotated[float, minimum=0, units='m⁻³']) – \(n_0\).

  • differential_gain (Annotated[float, exclusiveMinimum=0, units='m²']) – \(a_0\).

  • confinement_factor (Annotated[float, exclusiveMinimum=0]) – \(\Gamma\).

  • photon_lifetime (Annotated[float, exclusiveMinimum=0, units='s']) – \(\tau_p\).

  • active_region_volume (Annotated[float, minimum=0, units='m³']) – \(V_a\).

  • carrier_lifetime (Annotated[float, exclusiveMinimum=0, units='s']) – \(\tau_n\).

  • n_group (Annotated[float, exclusiveMinimum=0]) – Group index \(v_g\).

Returns:

Threshold current in A.

Return type:

float