pub fn logarithmic_steps(
alpha_np_km: f64,
length_km: f64,
n: usize,
) -> Result<Vec<f64>>Expand description
The n steps (km) of the logarithmic step-size distribution of Bosco et al. (2000,
eq. (6)) over a fibre of length_km with the power attenuation $\alpha$ =
alpha_np_km (Np/km), in the order of the propagation:
$$ \Delta z_{k} = -\frac{1}{\alpha} \ln \frac{1 - k\sigma}{1 - (k - 1)\sigma}, \qquad \sigma = \frac{1 - e^{-\alpha L}}{n}, \qquad k = 1 \dots n $$
(the paper writes the field attenuation, half of $\alpha$). Every step carries the same
integrated power, $\int e^{-\alpha z} dz = \sigma/\alpha$ (the same effective length): the
steps are short at the start of the span, where the power is high. The phases of the
spurious four-wave mixing of the split-step method then add incoherently, so that its
efficiency stays below $1/n$ of the true one instead of the peaks of equal steps
(Bosco et al., eq. (5) and Fig. 3). Without loss ($\alpha L < 10^{-12}$) the steps are
equal; they add up to length_km exactly.
§Errors
Error::Config for no step, a length that is not positive and finite, or an
attenuation that is negative or not finite.
§Examples
use comnum_math::nlse::logarithmic_steps;
let alpha = 0.2 / (10.0 * std::f64::consts::E.log10()); // 0.2 dB/km in Np/km
let h = logarithmic_steps(alpha, 80.0, 4).unwrap();
assert!(h[0] < h[1] && h[1] < h[2] && h[2] < h[3]);
assert!((h.iter().sum::<f64>() - 80.0).abs() < 1e-12);
// the same effective length (1 - e^{-a h}) e^{-a z} / a for every step
let mut z = 0.0;
let leff: Vec<f64> = h.iter().map(|&s| { let l = (1.0 - (-alpha * s).exp()) * (-alpha * z).exp() / alpha; z += s; l }).collect();
assert!(leff.iter().all(|l| (l - leff[0]).abs() < 1e-9));§References
- G. Bosco, A. Carena, V. Curri, R. Gaudino, P. Poggiolini and S. Benedetto, “Suppression of spurious tones induced by the split-step method in fiber systems simulation,” IEEE Photon. Technol. Lett., 12(5), 489–491, 2000, eq. (6).