Skip to main content

ManakovSplitStep

Struct ManakovSplitStep 

Source
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: Medium

The fibre.

§rule: StepRule

The step size.

§nonlinear: NonlinearStep

The nonlinear step.

§max_iterations: usize

Largest number of trapezoidal iterations per step.

§tolerance: f64

Convergence tolerance of the iterations: the relative change of the fields.

Implementations§

Source§

impl ManakovSplitStep

Source

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).

Source

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

As ManakovSplitStep::run_fields.

Source

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

As ManakovSplitStep::run_fields.

Source

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).

Trait Implementations§

Source§

impl Clone for ManakovSplitStep

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ManakovSplitStep

Source§

impl Debug for ManakovSplitStep

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for ManakovSplitStep

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ManakovSplitStep

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.