pub struct ManakovSplitStep {
pub medium: Medium,
pub rule: StepRule,
pub nonlinear: NonlinearStep,
pub max_iterations: usize,
pub tolerance: f64,
}Expand description
The symmetric split-step solver of the Manakov equation (see the module).
With NonlinearStep::Trapezoidal (OptiCommPy’s scheme) the solver is second order
but its error on a collision of two solitons 800 GHz apart is 6.4 times that of
NonlinearStep::Midpoint (the default) at the same steps (validation/tests/fiber/sinkin2003.rs),
and it underestimates the cross-channel interference of a WDM link whose channels
walk off within a step.
Fields§
§medium: MediumThe fibre.
rule: StepRuleThe step size.
nonlinear: NonlinearStepThe nonlinear step.
max_iterations: usizeLargest number of trapezoidal iterations per step.
tolerance: f64Convergence tolerance of the iterations: the relative change of the fields.
Implementations§
Source§impl ManakovSplitStep
impl ManakovSplitStep
Sourcepub fn new(medium: Medium) -> ManakovSplitStep
pub fn new(medium: Medium) -> ManakovSplitStep
The step rule of Musetti et al. (StepRule::FWM_DEFAULT: about 0.01 dB of error
on the SNR whatever the power), the nonlinear phase at the middle of the step; with
NonlinearStep::Trapezoidal, OptiCommPy’s iterations: at most 10, tolerance
$10^{-5}$. OptiCommPy’s own step, 0.02 rad of nonlinear phase, is
StepRule::NonlinearPhase(2e-2): it depends on the power and is not converged in
every WDM link (specs/raman_wdm.yaml).
Sourcepub fn run(
&self,
x: &mut [C64],
y: &mut [C64],
length_km: f64,
fs: f64,
) -> Result<usize>
pub fn run( &self, x: &mut [C64], y: &mut [C64], length_km: f64, fs: f64, ) -> Result<usize>
Propagate the two polarisations (√W, time domain, equal lengths) over
length_km of fibre sampled at fs, in place: the number of steps (none for a
length that is not positive).
§Errors
Sourcepub fn run_with_gain(
&self,
x: &mut [C64],
y: &mut [C64],
length_km: f64,
fs: f64,
gain: FieldGain<'_>,
) -> Result<usize>
pub fn run_with_gain( &self, x: &mut [C64], y: &mut [C64], length_km: f64, fs: f64, gain: FieldGain<'_>, ) -> Result<usize>
ManakovSplitStep::run with a distributed gain (see
SplitStep::run_with_gain): the medium carries no attenuation, gain holds the
power profile of the span.
§Errors
Sourcepub fn run_fields(
&self,
fields: &mut [&mut [C64]],
length_km: f64,
fs: f64,
options: &PropagationOptions<'_>,
) -> Result<usize>
pub fn run_fields( &self, fields: &mut [&mut [C64]], length_km: f64, fs: f64, options: &PropagationOptions<'_>, ) -> Result<usize>
Propagate one field (the scalar NLSE, nonlinear coefficient $\gamma$) or two (the
Manakov equation, $\frac{8}{9}\gamma$) over length_km sampled at fs, in place,
with the additions of options: the engine of every forward propagation
(docs/adr/0014-one-fibre-propagator.md). The steps follow ManakovSplitStep::rule
and are cut at the boundaries of the sections of a birefringence; a fixed step
covers every stretch with equal steps of at most that length. Returns the number
of steps.
§Errors
Error::Shape for no field, more than two, fields of different lengths, a
birefringence with one field or sections that do not cover the length;
Error::Config for a fixed step, a rotation or a phase that is not positive or
a length that is not finite; Error::Numerical if a step vanishes (a non-finite
field).