Classes | Enumerations

ocsOptFiberLocalError.hh File Reference

#include "ocsOptSignal.hh"
#include "ocsRamanAmp.hh"

Go to the source code of this file.

Classes

class  OptFiberLocalError
 The OptFiberLocalError class solves the scalar and vector generalized nonlinear Schroedinger equation (NLSE) and the Manakov-PMD equation for propagation of an optical signal in optical fibers. It also solves the scalar Haus master equation (HME) for propagation in lasers. Users are encouraged to first read the document On the use and validation of the OptFiberLocalError class in PhoSSiL More...

Enumerations

enum  typeRamanAmplification {
  NO_RAMAN = 0, SIMPLE_RAMAN = 1, FULL_RAMAN = 2, NO_RAMAN = 0,
  SIMPLE_RAMAN = 1, FULL_RAMAN = 2, NO_RAMAN = 0, SIMPLE_RAMAN = 1,
  FULL_RAMAN = 2
}
 

The type of Raman Amplification.

More...
enum  typeFiberLossGain {
  LOSSY_FIBER = 0, FIBER_AMPLIFIER = 1, LOSSY_FIBER = 0, FIBER_AMPLIFIER = 1,
  LOSSY_FIBER = 0, FIBER_AMPLIFIER = 1
}
 

The type of loss or gain in the fiber.

More...
enum  typeFiberAmplifierNoise {
  FIBER_AMP_NOISE_OFF = 0, FIBER_AMP_NOISE_GAUSSIAN_WHITE = 2, FIBER_AMP_NOISE_OFF = 0, FIBER_AMP_NOISE_GAUSSIAN_WHITE = 2,
  FIBER_AMP_NOISE_OFF = 0, FIBER_AMP_NOISE_GAUSSIAN_WHITE = 2
}
 

The type of noise used when OptFiberLocalError::TypeFiberLossGain = FIBER_AMPLIFIER.

More...
enum  typeFiberAmplifierGain {
  FIBER_AMP_UNSATURATED_FLAT_GAIN = 0, FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN = 1, FIBER_AMP_UNSATURATED_FLAT_GAIN = 0, FIBER_AMP_SATURABLE_PARABOLIC_GAIN = 1,
  FIBER_AMP_UNSATURATED_FLAT_GAIN = 0, FIBER_AMP_SATURABLE_PARABOLIC_GAIN = 1
}
enum  typeFastSaturableAbsorption { QUADRATIC_ANALYTIC = 0, QUADRATIC = 1 }
 

An enumeration type for the functional form of the fast saturable absoprtion.

More...
enum  typeStepSizes {
  LOCAL_ERROR_3RD = 1, LOCAL_ERROR_2ND = 2, WALK_OFF = 3, CONSTANT = 4,
  LOCAL_ERROR_3RD = 1, LOCAL_ERROR_2ND = 2, WALK_OFF = 3, CONSTANT = 4,
  LOCAL_ERROR_3RD = 1, LOCAL_ERROR_2ND = 2, WALK_OFF = 3, CONSTANT = 4
}
 

An enumeration type for the step size selection criterion.

More...
enum  { APPLY_ONCE = 0, APPLY_TWICE = 1 }

Enumeration Type Documentation

anonymous enum

An unnamed enumeration type used in OptFiberLocalError::ApplyFreqDomainOperator

Enumerator:
APPLY_ONCE 
APPLY_TWICE 

An enumeration type for the functional form of the fast saturable absoprtion.

  • QUADRATIC_ANALYTIC = 0 (use analytical formula for exact solution of fast saturable absorber with a quadratic nonlinearity)
  • QUADRATIC = 1 (fast saturable absorber with a quadratic nonlinearity ie, du/dz = |u|^2 u. In each step of our nested split-step scheme, we use Heun's method to solve this equation numerically.)
Enumerator:
QUADRATIC_ANALYTIC 
QUADRATIC 

The type of gain used when OptFiberLocalError::TypeFiberLossGain = FIBER_AMPLIFIER

An enumeration type

  • FIBER_AMP_UNSATURATED_FLAT_GAIN = 0 (default value)
  • FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN = 1
See also:
enum typeFiberLossGain for more details.

When OptFiberLocalError::TypeFiberAmplifierGain == FIBER_AMP_UNSATURATED_FLAT_GAIN the gain coefficient is the only parameter. We set the gain by choosing a negative value for the input parameter OptFiberLocalError::AttenuationFiber in dB/m, or NepperAttenuationFiber in m^(-1) or a value of TotalLinearAttenuationFiber that is less than 1.

When OptFiberLocalError::TypeFiberAmplifierGain == FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN we replace the constant gain term in the NLS by a term of the form

u_z = -0.5*l + 0.5*g(z)*(u+ (-1)^{n+1}*(u^{(2n)}/ (FiberAmplifierSuperGaussFiltGainCoefficient^{2n})))

where l is a loss coefficient and g(z) is the gain coefficient both in units of inverse length and OptFiberLocalError::FiberAmplifierSuperGaussFiltGainCoefficient is in units of inverse time. Here the integer n=FiberAmplifierSuperGaussFiltOrder is the order of the super Gaussian filter. n=1 corresponds to standard Gaussian filter, and is the default value.

See also:
enum typeFiberLossGain

We include the loss term to enable modeling of a laser using Haus's Master equation in which all effects are assumed to act continuously throughout the laser cavity. (See for example "Noise of mode-locked lasers" by Haus and Mecozzi, IEEE J. Quantum Electronics, 29 (3), March 1993, p983-996.)

The loss parameter is set using the input parameter AttenuationFiber, and is given in dB/m or using the input parameter NepperAttenuationFiber in m^(-1) (these two must be non-negative) or equivalently a value greater than one for OptFiberLocalError::TotalLinearAttenuationFiber.

The saturable power gain function is

g(z) = OptFiberLocalError::FiberAmplifierUnsaturatedNepperGainPerLength/ (1+ OptSignal::GetTotalEnergy() / OptFiberLocalError::FiberAmplifierSaturationEnergy),

where OptSignal::GetTotalEnergy() is the total energy at point z along the fiber.

Here FiberAmplifierUnsaturatedNepperGainPerLength = log(dB2Linear(FiberAmplifierUnsaturatedGaindBPerLength)) = FiberAmplifierUnsaturatedGaindBPerUnitLength*log(10)/10

We input one of three equivalent parameters: FiberAmplifierUnsaturatedGaindBPerLength (dB/m), FiberAmplifierUnsaturatedNepperGainPerLength, (m^(-1)) or FiberAmplifierUnsaturatedTotalLinearGain. We also input FiberAmplifierSaturationEnergy (J)

FiberAmplifierUnsaturatedTotalLinearGain = exp(FiberAmplifierUnsaturatedNepperGainPerLength*FiberLength).

(If we are in the unsaturated regime FiberAmplifierUnsaturatedGain plays the same role as -AttenuationFiber in the unsaturated fiber amplifier.)

We use energy rather than average power to compute the gain since energy is independent of the time and frequency windows. For communications simulations in which there is a fixed bit rate and half the bits are marks the average power will be independent of the time window, but for laser systems in which a single pulse is being simulated the average power will inversely proportional to the time window.

We implement this additional term by adding an imaginary term to the chromatic gain coefficient in the method OptFiberLocalError::ComputeFreqDomainOperator()

For a step along the fiber of size delta_z we use Heun's Method (aka Modified Euler Method or 2nd-order Runga-Kutta) to update the field u in the frequency domain. We use a split-step algorithm in the frequency domain (1/2 step chromatic dispersion and loss, 1 step saturable gain, 1/2 step chromatic dispersion and loss) to update the Fourier transform of the field u. The chromatic dispersion and loss update is exact, the saturable absorption step is locally third-order accurate. Since the update in time (Kerr nonlinearity and fast saturable absorption) is also locally third-order accurate, the split-step algorithm gaurantees that the entire step is third-order accurate, and hence with constant step size the global error is second-order, ie, proportional to the square of the step size. We have verified this for the Haus-Mecozzi chirped soliton.

To ensure the step sizes are small enough, in addition to any other step size selection criteria, we choose the step size small enough so that Power(z+delta_z)/Power(z) < FiberAmplifierGainSaturationMaxGainPerStep

This will hold if

delta_z < log(FiberAmplifierGainSaturationMaxGainPerStep)*2/ FiberAmplifierUnsaturatedNepperGainPerLength.

See also:
double FiberAmplifierGainSaturationMaxGainPerStep.

Note that we do not allow TypeStepSizes=LOCAL_ERROR_3RD when TypeFiberAmplifierGain = FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN, since this would require the saturable absorption step to be locally 4-th order accurate, which we have not (yet) implemented.

Enumerator:
FIBER_AMP_UNSATURATED_FLAT_GAIN 
FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN 
FIBER_AMP_UNSATURATED_FLAT_GAIN 
FIBER_AMP_SATURABLE_PARABOLIC_GAIN 
FIBER_AMP_UNSATURATED_FLAT_GAIN 
FIBER_AMP_SATURABLE_PARABOLIC_GAIN 

The type of noise used when OptFiberLocalError::TypeFiberLossGain = FIBER_AMPLIFIER.

An enumeration type

  • FIBER_AMP_NOISE_OFF = 0 (default value)
  • FIBER_AMP_NOISE_GAUSSIAN_WHITE = 2
See also:
enum typeFiberLossGain for more details.

We use the same noise types as in the OptAmplifier class.

We need the step sizes along the fiber to be chosen small enough so that adding noise at start of each step gives a result that is close to what would occur if noise was added continuosly. For this to be the case, we would need that if we added noise with step size delta_z/2 we would get approximately the same noise power as if we used step size delta_z. The noise power added in each step of size delta_z is proportional to exp(delta_z*g)-1, where g is the gain coefficient in units of inverse length. So for the output noise power to be independent of step size we would the approximation exp(delta_z*g)-1 ~ delta_z*g to hold. So we need delta_z << 1/g.

See also:
OptFiberLocalError::FiberAmplifierNoiseMaxStepSizeFactor.

When OptFiberLocalError::TypeFiberAmplifierGain == FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN the gain g in the previous paragragh is the unsaturated electric field gain, OptFiberLocalError::FiberAmplifierUnsaturatedNepperGain/2.

See also:
OptFiberLocalError::FiberAmplifierComputeNoiseAmplitudeFactor
Enumerator:
FIBER_AMP_NOISE_OFF 
FIBER_AMP_NOISE_GAUSSIAN_WHITE 
FIBER_AMP_NOISE_OFF 
FIBER_AMP_NOISE_GAUSSIAN_WHITE 
FIBER_AMP_NOISE_OFF 
FIBER_AMP_NOISE_GAUSSIAN_WHITE 

The type of loss or gain in the fiber.

An enumeration type

  • LOSSY_FIBER = 0 (Default)
  • FIBER_AMPLIFIER = 1

The OptFiberLocalError class allows one to model both fibers with loss (which for example are used in telecommunications applications) and fiber amplifiers.

The fiber amplifier model is a simplified one which simply assumes the propagating signal undergoes a given (possibly saturable and frequency-dependent) gain per unit length along the fiber. For the two gain models we have implemented

See also:
enum typeFiberAmplifierGain.

When OptFiberLocalError::TypeFiberLossGain = FIBER_AMPLIFIER, noise may also be added prior to each step along the fiber.

See also:
enum typeFiberAmplifierNoise for more details on this noise.

For now OptFiberLocalError::TypeFiberLossGain = FIBER_AMPLIFIER has only been verified when OptSignal::TypeSolver = SCALAR_NLS.

Enumerator:
LOSSY_FIBER 
FIBER_AMPLIFIER 
LOSSY_FIBER 
FIBER_AMPLIFIER 
LOSSY_FIBER 
FIBER_AMPLIFIER 

The type of Raman Amplification.

An enumeration type

  • NO_RAMAN = 0 (Default)
  • SIMPLE_RAMAN = 1 (Done within OptFiberLocalError)
  • FULL_RAMAN = 2 (Raman gain precomputed by class RamanAmp)
Enumerator:
NO_RAMAN 
SIMPLE_RAMAN 
FULL_RAMAN 
NO_RAMAN 
SIMPLE_RAMAN 
FULL_RAMAN 
NO_RAMAN 
SIMPLE_RAMAN 
FULL_RAMAN 

An enumeration type for the step size selection criterion.

See Oleg Sinkin's JLT paper for details

  • LOCAL_ERROR_3RD = 1 (3rd order local error method)
  • LOCAL_ERROR_2ND = 2 (2nd order local error method)
  • WALK_OFF = 3
  • CONSTANT = 4

The local error options are explained in documentation for the class OptFiberLocalError. The method is controlled by two input parameters, OptFiberLocalError::RelativeErrorGoal and OptFiberLocalError::DeltaZMax.

See also:
OptFiberLocalError::ComputeDeltaZMax()

For CONSTANT step sizes the user specifies the step size by setting the parameter OptFiberLocalError::NumStepsBetweenScatterings.

In simulations without PMD, the step size is then set to be OptFiberLocalError::DeltaZ = OptFiberLocalError::LengthFiber/NumStepsBetweenScatterings.

In simulations with PMD, the step size is then set to be OptFiberLocalError::DeltaZ = OptFiberLocalError::ScatteringStepSize/NumStepsBetweenScatterings, where ScatteringStepSize is an input parameter that specifies the distance between random rotations on the Poincar'e sphere, i.e. the lengths of the sections in the coarse-step method for solving the Manakov PDE.

For the WALK_OFF method the user specifies OptFiberLocalError::WalkOffParameter in the input parameter file.

OptFiberLocalError::DeltaZ = OptFiberLocalError::WalkOffParameter / abs( D_1 lambda_1 - D_2 lambda_2 )

where D_1 and D_2 are the dispersions in ps/nm-km at wavelengths lambda_1 and lambda_2.

We choose lambda_1,2 as follows:

WDM Case: lambda_1,2 are the central wavelengths of the edge channels

Single Channel Case: lambda_1,2 correspond to frequencies

freq_1,2 = CenterFreq +- RootMeanSquare spectral width of signal.

Of course for the last step we may need to choose a smaller step size so that the overall propagation distance is correct.

Enumerator:
LOCAL_ERROR_3RD 
LOCAL_ERROR_2ND 
WALK_OFF 
CONSTANT 
LOCAL_ERROR_3RD 
LOCAL_ERROR_2ND 
WALK_OFF 
CONSTANT 
LOCAL_ERROR_3RD 
LOCAL_ERROR_2ND 
WALK_OFF 
CONSTANT