raman_profile¶
- photonforge.fiber.raman_profile(length_km, *, pump_power=0.0, signal_power=1e-3, efficiency=.4, signal_attenuation=0.2, pump_attenuation=0.25, pump_wavelength=.45, signal_wavelength=.55, backward=True, points=400)[source]¶
Solve the coupled Raman power equations along the fibre.
\[ \begin{align}\begin{aligned}\frac{{\rm d}P_s}{{\rm d}z} &= C_R P_p P_s - \alpha_s P_s\\\pm\frac{{\rm d}P_p}{{\rm d}z} &= -\frac{\nu_p}{\nu_s}C_R P_p P_s - \alpha_p P_p\end{aligned}\end{align} \]The \(\nu_p/\nu_s\) on the pump depletion is the photon bookkeeping: one pump photon makes one signal photon, and the energy difference goes into an optical phonon. Dropping it violates photon number by the 7% that the wavelengths differ by, which is the sort of error that hides for a long time.
Counter-pumping (
backward=True, the usual choice) makes this a two-point boundary value problem, since the pump enters at the far end. It is solved by alternating: integrate the signal forward through the current pump profile, then the pump backward through the current signal, until neither moves. Each half is exact in log power given the other, and each integrates along its own direction of decay. Two details are load bearing. Shooting on a boundary instead would integrate the counter-propagating pump along +z, where it grows exponentially, and overflow before converging. And the update is damped by taking the geometric mean with the previous iterate: the bare fixed point diverges once the undepleted gain is large, because a hotter signal drains the pump, which cools the signal, and the two overshoot. With damping it converges even at 96% pump depletion. Non-convergence raises rather than returning a profile that is not self consistent.- Parameters:
length_km (Annotated[float, exclusiveMinimum=0]) – Span length, in km.
pump_power (Annotated[float, minimum=0, units='W']) – Pump power launched, in W.
signal_power (Annotated[float, minimum=0, units='W']) – Signal power launched at z = 0, in W.
efficiency (Annotated[float, minimum=0, units='1/(W·km)']) – Raman gain efficiency at the pump-signal shift, in 1/(W km). Use
raman_efficiency_at_shift()to get it from the spacing.signal_attenuation (Annotated[float, minimum=0, units='dB/km']) – Fibre loss at the signal, in dB/km.
pump_attenuation (Annotated[float, minimum=0, units='dB/km']) – Fibre loss at the pump, in dB/km. Higher than the signal’s, since the pump sits at a shorter wavelength.
pump_wavelength (Annotated[float, exclusiveMinimum=0, units='μm']) – Pump wavelength, in μm.
signal_wavelength (Annotated[float, exclusiveMinimum=0, units='μm']) – Signal wavelength, in μm.
backward (bool) – Counter-pump if
True, co-pump ifFalse.points (int) – Samples along the fibre in the returned profile.
- Returns:
Dict with
z_km,pump,signal(all arrays), pluson_off_gain_db,net_gain_dbandpump_depletion.- Return type:
dict