SemiconductorAmplifierTimeStepper

class photonforge.SemiconductorAmplifierTimeStepper(*, small_signal_gain=20.0, saturation_power=None, carrier_lifetime=200e-12, linewidth_enhancement_factor=0.0, noise_figure=None, substeps=1, ports=None, seed=None)[source]

Time-stepper for a semiconductor optical amplifier (SOA).

Unidirectional travelling-wave amplifier with gain saturation, finite carrier recovery, carrier-induced self-phase modulation, and amplified spontaneous emission (ASE). The reverse optical path is absorbed, as in OpticalAmplifierTimeStepper.

The single state variable is the gain integrated over the device length, \(h(t) = \int_0^L \Gamma g\,{\rm d}z\), so that the instantaneous power gain is \(G = e^h\). It obeys

\[\frac{{\rm d}h}{{\rm d}t} = \frac{h_0 - h}{\tau_c} - \left(e^h - 1\right) \frac{|A_\text{in}|^2}{E_\text{sat}}\]

with \(h_0 = \ln G_0\) the unsaturated integrated gain, \(\tau_c\) the carrier lifetime, and \(E_\text{sat} = P_\text{sat}\tau_c\) the saturation energy. The output field carries both the gain and the coupled phase:

\[A_\text{out} = A_\text{in} \exp\!\left[\frac{h}{2}\left(1 - j\alpha_H\right)\right]\]

in which \(\alpha_H\) is the linewidth enhancement factor.

On the chirp sign: an envelope factor \(e^{-2\pi j f_0 t}\) corresponds to the physical frequency \(f_c + f_0\), so the instantaneous frequency deviation is \(\delta\nu = -\frac{1}{2\pi}\frac{{\rm d}\phi}{{\rm d}t}\). With \(\phi = -\alpha_H h / 2\) this gives

\[\delta\nu = \frac{\alpha_H}{4\pi}\frac{{\rm d}h}{{\rm d}t}\]

so gain depletion (\({\rm d}h/{\rm d}t < 0\)) red-shifts the leading edge of a pulse and gain recovery blue-shifts the trailing edge. That is opposite in sign to Kerr self-phase modulation in fibre, and it is the established SOA behaviour.

Parameters:
  • small_signal_gain (Annotated[float, units='dB']) – Unsaturated power gain \(G_0\).

  • saturation_power (Annotated[float, exclusiveMinimum=0, units='W'] | None) – Internal saturation power \(P_\text{sat}\). If None, saturation is disabled and the model reduces to a constant-gain amplifier.

  • carrier_lifetime (Annotated[float, exclusiveMinimum=0, units='s']) – Carrier recovery time \(\tau_c\).

  • linewidth_enhancement_factor (Annotated[float, minimum=0]) – Henry’s \(\alpha_H\), coupling gain change to phase. A value of 0 disables chirp.

  • noise_figure (Annotated[float, units='dB'] | None) – Noise figure (NF). If None, ASE is disabled.

  • substeps (Annotated[int, exclusiveMinimum=0]) – Number of splitting substeps per time step, a count. The integrator is unconditionally stable at any value; increase only to reduce the second-order splitting error when the time step is comparable to the carrier lifetime.

  • ports (Annotated[Sequence[str], maxItems=2, minItems=2] | None) – Input and output port names, in that order. If not set, the sorted list of optical port names from the component is used.

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

Notes

saturation_power is the internal saturation power appearing in the equations above, not the 3 dB output saturation power quoted on datasheets. The two differ by a factor of order \(\ln 2 \cdot G_0/(G_0-2)\); use saturation_output_power() to convert self-consistently.

Wavelength dependence of the gain is not modelled: a single band at the carrier frequency is assumed. Sub-picosecond effects (carrier heating, spectral hole burning) and counter-propagating signals are also outside the model.

References

  1. Agrawal, G. P., & Olsson, N. A. (1989). Self-phase modulation and spectral broadening of optical pulses in semiconductor laser amplifiers. IEEE Journal of Quantum Electronics, 25(11), 2297-2306.

  2. Agrawal, G. P. (2010). Fiber-Optic Communication Systems. Wiley.

Methods

reset()

Reset internal state to the unsaturated gain.

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.

update(*args, **kwargs)

Update this time stepper.

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

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

Attributes

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.

reset()[source]

Reset internal state to the unsaturated gain.

Return type:

None

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

Initialize internal state.

Parameters:
  • component (Component) – Component representing the amplifier.

  • 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 construct the time stepper. Required to set the ASE photon energy.

  • kwargs (object) – Unused.

Return type:

None

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 photonforge.TimeSeries.

Return type:

None