Public Member Functions | Public Attributes | Private Member Functions | Private Attributes

OptFiberLocalError Class Reference

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

#include <ocsOptFiberLocalError.hh>

List of all members.

Public Member Functions

 OptFiberLocalError (string InFileName, OptSignal *oOptSignal, RanNumGen *RNG2, string Job2)
 Constructor.
void SetRamanAmpPointer (RamanAmp *oRaman2)
 ~OptFiberLocalError (void)
 Destructor.
void Propagate (double *PropagatedLength, int *ZStepNum)
 Propagates OptSignal object through an optical fiber.
void PropagateWithRaman (double *PropagatedLength, int *ZStepNum, double RamanStartingLength2)
string WriteTypeSolver (void)
string WriteTypeStepSizes (void)
string WriteTypeFiberLossGain (void)
string WriteTypeFiberAmplifierNoise (void)
string WriteTypeFiberAmplifierGain (void)
void OpenStepSizesFile (string StepSizesFileName, int Mode)
void WriteStepSizes (double PropagatedLength)
void WriteAveragePowerdBm (double PropagatedLength2)
double GetFirstOrderDispersion ()
double GetSecondOrderDispersion ()
double GetFiberLength ()
double GetNepperAttenuationFiber ()
double GetNonLinIndexFiber ()
double GetGamma ()
double GetDeltaZ ()
int GetNumStepsBetweenScatterings ()
void SetNumStepsBetweenScatterings (int value)
double GetDispersion (double Wavelength)
 Returns value of Dispersion in s/m^2 at Wavelength in m.
void SetTypeStepSizes (int TypeStepSizes2)
void SetWalkOffParameter (double WalkOffParameter2)
void SetConstantDeltaZ (double DeltaZValue)
void SetOutputStepSizesFlag (int OutputStepSizesFlag2)
void SetRelativeErrorGoal (double RelativeErrorGoal2)
void SetFstOrDispFiber (double FstOrDispFiber2)
void SetSndOrDispFiber (double SndOrDispFiber2)
void RecoverSndOrDispFiber ()
void SetDispersion (double DispersionFiberRefWavelength, double DispSlopeFiberRefWavelength)
void SetGammaFiber (double gamma2)
void RecoverGammaFiber ()
void SetAttenuationdB (double AttenuationFiber2)
void SetNepperAttenuation (double NepperAttenuation2)
void SetFiberAmplifierUnsaturatedNepperGain (double FiberAmplifierUnsaturatedNepperGain2)
 Enables user to set unsaturated Nepper gain.
void ComputeDeltaZMax (void)
void SetWriteAveragePowerdBmFlag (int Value)
void SetWritePulseWidthFlag (int Value)
void SetFiberLength (double Value)
void SetScatteringStepSize (double Value)
void GetNewFiberRealization (void)
void SetFiberRealization (int SectionNumber, double Theta2, double Phi2, double Psi2)
void ApplyPMDCompleteScatteringFreqDomainOperator (int ScatteringSectionIndex)
void ComputeEulerMatrixAndUpdateOutputPDVector (int ScatteringSectionIndex)
void GetEulerMatrix (double theta, double phi, double psi)
void SetFiberLengthsForPMD (void)
void SetMeanDGDPerSqrtLength (double MeanDGDPerSqrtLength2)
void SetPMD (double PMD2)
double GetFreqDerivativeOfBirefringence (void)
double GetDGD (void)
 Returns the Differential Group Delay.
void PropagateOutputPDVector (double Freq, double theta, double phi, double psi)
double GetExpectedDGD ()
double GetExpectedSndOrderDGD ()
double GetMeanDGD_SqrtLength (void)
void UpdateJonesMatrixAfterBiregringence (double StepSizeZ)
 OptFiberLocalError (string InFileName, OptSignal *oOptSignal, RanNumGen *RNG2, string Job2)
 Constructor.
void SetRamanAmpPointer (RamanAmp *oRaman2)
 ~OptFiberLocalError (void)
 Destructor.
void Propagate (double *PropagatedLength, int *ZStepNum)
 Propagates OptSignal object through an optical fiber.
void PropagateWithRaman (double *PropagatedLength, int *ZStepNum, double RamanStartingLength2)
string WriteTypeSolver (void)
string WriteTypeStepSizes (void)
string WriteTypeFiberLossGain (void)
string WriteTypeFiberAmplifierNoise (void)
string WriteTypeFiberAmplifierGain (void)
void OpenStepSizesFile (string StepSizesFileName, int Mode)
void WriteStepSizes (double PropagatedLength)
void WriteAveragePowerdBm (double PropagatedLength2)
double GetFirstOrderDispersion ()
double GetSecondOrderDispersion ()
double GetFiberLength ()
double GetNepperAttenuationFiber ()
double GetNonLinIndexFiber ()
double GetGamma ()
double GetDeltaZ ()
int GetNumStepsBetweenScatterings ()
void SetNumStepsBetweenScatterings (int value)
double GetDispersion (double Wavelength)
 Returns value of Dispersion in s/m^2 at Wavelength in m.
void SetTypeStepSizes (int TypeStepSizes2)
void SetWalkOffParameter (double WalkOffParameter2)
void SetConstantDeltaZ (double DeltaZValue)
void SetOutputStepSizesFlag (int OutputStepSizesFlag2)
void SetRelativeErrorGoal (double RelativeErrorGoal2)
void SetFstOrDispFiber (double FstOrDispFiber2)
void SetSndOrDispFiber (double SndOrDispFiber2)
void RecoverSndOrDispFiber ()
void SetDispersion (double DispersionFiberRefWavelength, double DispSlopeFiberRefWavelength)
void SetGammaFiber (double gamma2)
void RecoverGammaFiber ()
void SetAttenuationdB (double AttenuationFiber2)
void SetNepperAttenuation (double NepperAttenuation2)
void SetFiberAmplifierUnsaturatedNepperGain (double FiberAmplifierUnsaturatedNepperGain2)
 Enables user to set unsaturated Nepper gain.
void ComputeDeltaZMax (void)
void SetWriteAveragePowerdBmFlag (int Value)
void SetWritePulseWidthFlag (int Value)
void SetFiberLength (double Value)
void SetScatteringStepSize (double Value)
void GetNewFiberRealization (void)
void SetFiberRealization (int SectionNumber, double Theta2, double Phi2, double Psi2)
void ApplyPMDCompleteScatteringFreqDomainOperator (int ScatteringSectionIndex)
void ComputeEulerMatrixAndUpdateOutputPDVector (int ScatteringSectionIndex)
void GetEulerMatrix (double theta, double phi, double psi)
void SetFiberLengthsForPMD (void)
void SetMeanDGDPerSqrtLength (double MeanDGDPerSqrtLength2)
void SetPMD (double PMD2)
double GetFreqDerivativeOfBirefringence (void)
double GetDGD (void)
void PropagateOutputPDVector (double Freq, double theta, double phi, double psi)
double GetExpectedDGD ()
double GetExpectedSndOrderDGD ()
double GetMeanDGD_SqrtLength (void)
void UpdateJonesMatrixAfterBiregringence (double StepSizeZ)
 OptFiberLocalError (string InFileName, OptSignal *oOptSignal, RanNumGen *RNG2, string Job2)
 Constructor.
void SetRamanAmpPointer (RamanAmp *oRaman2)
 ~OptFiberLocalError (void)
 Destructor.
void Propagate (double *PropagatedLength, int *ZStepNum)
 Propagates OptSignal object through an optical fiber.
void PropagateWithRaman (double *PropagatedLength, int *ZStepNum, double RamanStartingLength2)
string WriteTypeSolver (void)
string WriteTypeStepSizes (void)
string WriteTypeFiberLossGain (void)
string WriteTypeFiberAmplifierNoise (void)
string WriteTypeFiberAmplifierGain (void)
void OpenStepSizesFile (string StepSizesFileName, int Mode)
void WriteStepSizes (double PropagatedLength)
void WriteAveragePowerdBm (double PropagatedLength2)
double GetFirstOrderDispersion ()
double GetSecondOrderDispersion ()
double GetFiberLength ()
double GetNepperAttenuationFiber ()
double GetNonLinIndexFiber ()
double GetGamma ()
double GetDeltaZ ()
int GetNumStepsBetweenScatterings ()
void SetNumStepsBetweenScatterings (int value)
double GetDispersion (double Wavelength)
 Returns value of Dispersion in s/m^2 at Wavelength in m.
void SetTypeStepSizes (int TypeStepSizes2)
void SetWalkOffParameter (double WalkOffParameter2)
void SetConstantDeltaZ (double DeltaZValue)
void SetOutputStepSizesFlag (int OutputStepSizesFlag2)
void SetRelativeErrorGoal (double RelativeErrorGoal2)
void SetFstOrDispFiber (double FstOrDispFiber2)
void SetSndOrDispFiber (double SndOrDispFiber2)
void RecoverSndOrDispFiber ()
void SetDispersion (double DispersionFiberRefWavelength, double DispSlopeFiberRefWavelength)
void SetGammaFiber (double gamma2)
void RecoverGammaFiber ()
void SetAttenuationdB (double AttenuationFiber2)
void SetNepperAttenuation (double NepperAttenuation2)
void SetFiberAmplifierUnsaturatedNepperGain (double FiberAmplifierUnsaturatedNepperGain2)
 Enables user to set unsaturated Nepper gain.
void ComputeDeltaZMax (void)
void SetWriteAveragePowerdBmFlag (int Value)
void SetWritePulseWidthFlag (int Value)
void SetFiberLength (double Value)
void SetScatteringStepSize (double Value)
void GetNewFiberRealization (void)
void SetFiberRealization (int SectionNumber, double Theta2, double Phi2, double Psi2)
void ApplyPMDCompleteScatteringFreqDomainOperator (int ScatteringSectionIndex)
void ComputeEulerMatrixAndUpdateOutputPDVector (int ScatteringSectionIndex)
void GetEulerMatrix (double theta, double phi, double psi)
void SetFiberLengthsForPMD (void)
void SetMeanDGDPerSqrtLength (double MeanDGDPerSqrtLength2)
void SetPMD (double PMD2)
double GetFreqDerivativeOfBirefringence (void)
double GetDGD (void)
void PropagateOutputPDVector (double Freq, double theta, double phi, double psi)
double GetExpectedDGD ()
double GetExpectedSndOrderDGD ()
double GetMeanDGD_SqrtLength (void)
void UpdateJonesMatrixAfterBiregringence (double StepSizeZ)

Public Attributes

RamanAmpoRaman

Private Member Functions

void PropagateWithPMD (double *PropagatedLength, int *ZStepNum)
void PropagateWithoutPMD (double *PropagatedLength, int *ZStepNum)
void PropagateLocalError (double *PropagatedLength, int *ZStepNum)
void PropagateConstStepSizeOrWalkOff (double *PropagatedLength, int *ZStepNum)
void ResetVolatileVariables (void)
void UpdateFreq (void)
void UpdateTime (void)
void ComputeWalkOffStepSize (void)
void ComputeDispersionOperator (double StepSizeZ)
void ApplyDispersionOperator (bool ApplyTwiceFlag)
void ApplySaturableGainOperator (double StepSizeZ)
void ApplyFreqDomainOperator (bool ApplyDispersionTwiceFlag, double GainSatStepSizeZ)
void ApplyRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void ApplyTimeDomainOperator (double StepSizeZ)
void ApplyKerrNonlinearityOperator (double StepSizeZ)
void ApplyFastSaturableAbsorptionOperator (double StepSizeZ)
void ApplyFastSaturableAbsorptionQuadraticAnalytic (double StepSizeZ)
void ApplyFastSaturableAbsorptionHeunsMethod (double StepSizeZ)
cplx FastSaturableAbsorptionFunction (cplx u)
double ComputeMaxPower (void)
void CopyFftMatricesFreqData (fftMatrices *OrigData, fftMatrices *CopyOfData)
double ComputeThirdOrderSolutionAndRelativeError (void)
double ComputeThirdOrderSolutionAndRelativeErrorOLD (void)
void UpdateAccumulatedFirstOrderDispersion (double StepSize)
void UpdateAccumulatedSecondOrderDispersion (double StepSize)
void FiberAmplifierComputeSaturableGain (void)
double FiberAmplifierComputeSaturableGainForHeunsMethod (bool FirstStep)
double FiberAmplifierGetEnergyForHeunsMethod (bool FirstStep)
void FiberAmplifierComputeNoiseAmplitudeFactor (double StepSize)
void FiberAmplifierAddMonteCarloNoise (double StepSize)
void AllocateMemoryForEulerAngles (void)
void ApplySimpleRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void ApplyFullRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void PropagateWithPMD (double *PropagatedLength, int *ZStepNum)
void PropagateWithoutPMD (double *PropagatedLength, int *ZStepNum)
void PropagateLocalError (double *PropagatedLength, int *ZStepNum)
void PropagateConstStepSizeOrWalkOff (double *PropagatedLength, int *ZStepNum)
void ResetVolatileVariables (void)
void UpdateFreq (void)
void UpdateTime (void)
void ComputeWalkOffStepSize (void)
void ComputeFreqDomainOperator (double StepSizeZ)
void ApplyFreqDomainOperator (bool ApplyTwiceFlag)
void ApplyRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void ApplyTimeDomainOperator (double StepSizeZ)
double ComputeMaxPower (void)
void CopyFftMatricesFreqData (fftMatrices *OrigData, fftMatrices *CopyOfData)
double ComputeThirdOrderSolutionAndRelativeError (void)
double ComputeThirdOrderSolutionAndRelativeErrorOLD (void)
void UpdateAccumulatedFirstOrderDispersion (double StepSize)
void UpdateAccumulatedSecondOrderDispersion (double StepSize)
void FiberAmplifierComputeSaturableGain (void)
void FiberAmplifierComputeNoiseAmplitudeFactor (double StepSize)
void FiberAmplifierAddMonteCarloNoise (double StepSize)
void AllocateMemoryForEulerAngles (void)
void ApplySimpleRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void ApplyFullRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void PropagateWithPMD (double *PropagatedLength, int *ZStepNum)
void PropagateWithoutPMD (double *PropagatedLength, int *ZStepNum)
void PropagateLocalError (double *PropagatedLength, int *ZStepNum)
void PropagateConstStepSizeOrWalkOff (double *PropagatedLength, int *ZStepNum)
void ResetVolatileVariables (void)
void UpdateFreq (void)
void UpdateTime (void)
void ComputeWalkOffStepSize (void)
void ComputeDispersionOperator (double StepSizeZ)
void ApplyDispersionOperator (bool ApplyTwiceFlag)
void ApplySaturableParabolicGainOperator (double StepSizeZ)
void ApplyFreqDomainOperator (bool ApplyDispersionTwiceFlag, double GainSatStepSizeZ)
void ApplyRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void ApplyTimeDomainOperator (double StepSizeZ)
double ComputeMaxPower (void)
void CopyFftMatricesFreqData (fftMatrices *OrigData, fftMatrices *CopyOfData)
double ComputeThirdOrderSolutionAndRelativeError (void)
double ComputeThirdOrderSolutionAndRelativeErrorOLD (void)
void UpdateAccumulatedFirstOrderDispersion (double StepSize)
void UpdateAccumulatedSecondOrderDispersion (double StepSize)
void FiberAmplifierComputeSaturableGain (void)
double FiberAmplifierComputeSaturableGainForHeunsMethod (bool FirstStep)
double FiberAmplifierGetEnergyForHeunsMethod (bool FirstStep)
void FiberAmplifierComputeNoiseAmplitudeFactor (double StepSize)
void FiberAmplifierAddMonteCarloNoise (double StepSize)
void AllocateMemoryForEulerAngles (void)
void ApplySimpleRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)
void ApplyFullRamanOperator (double CurrentZValueWithinFiber2, double ZStep2)

Private Attributes

ofstream StepSizesFile
int OutputStepSizesFlag
int StepSizesFileMode
string Job
typeSimulation TypeSimulation
typeSolver TypeSolver
 Specifies precisely which PDE is to be solved.
typeStepSizes TypeStepSizes
typeFiberLossGain TypeFiberLossGain
typeFiberAmplifierNoise TypeFiberAmplifierNoise
double FiberAmplifierSpontaneousEmissionFactor
double FiberAmplifierNoiseMaxStepSizeFactor
 The max step size for a fiber amplifier.
double FiberAmplifierGainSaturationMaxGainPerStep
 Used to control maximum step size for saturable gain.
double FiberAmplifierNoiseAmplitudeFactor
 Analogous to OptAmplifier::NoiseAmplitudeFactor.
typeFiberAmplifierGain TypeFiberAmplifierGain
 See enum typeFiberAmplifierGain.
double FiberAmplifierSuperGaussFiltGainCoefficient
int FiberAmplifierSuperGaussFiltOrder
double FiberAmplifierUnsaturatedNepperGain
double FiberAmplifierSaturationEnergy
double FiberAmplifierSaturableGainPerLength
 Internal parameter for FiberAmplifier with saturable gain.
typeFastSaturableAbsorption TypeFastSaturableAbsorption
double FastSaturableAbsorptionCoefficient
 Coefficient for FastSaturableAbsorption.
bool DoFastSaturableAbsorptionFlag
bool DoTimeOperatorExactlyFlag
 Input variable used in method ApplyTimeDomainOperator.
bool DispersionOperatorValid
 Flag that controls when to recompute DispersionOperator.
int ScalarSolverEightNinthsFlag
OptSignaloOptSignal
RanNumGenRNG
cfftwfft
fftMatrices sfftM
cplxFreqDomainOperatorX
cplxFreqDomainOperatorY
cplxSqFreqDomainOperatorX
cplxSqFreqDomainOperatorY
fftMatrices sfftM_Start
fftMatrices sfftM_Coarse
cplxLaserWorkX
cplxLaserWorkY
double LengthFiber
double RamanStartingLength
double PropagatedLengthStartFiber
int NumStepsBetweenScatterings
double ReferenceFreq
double ReferenceWavelength
double DispersionFiberCenterWavelength
double DispSlopeFiberCenterWavelength
bool SetFstSndOrDispDirectlyFlag
double FstOrDispFiber
double SndOrDispFiber
double SndOrDispFiber_Save
double NonLinIndexFiber
int WithNonLin
double EffectAreaFiber
double AttenuationFiber
 The fiber optical power attenuation (or gain) parameter in dB/m.
double NepperAttenuationFiber
typeRamanAmplification TypeRamanAmplification
double RamanOnOffGaindB
double NepperRamanGain
double NepperRamanPumpLoss
double CenterFreq
int qtPoints
double DeltaFreq
double gamma
double gamma_Save
double CurrentZValueWithinFiber
double DeltaZ
 The step size taken in each step.
double DeltaZMaxInfile
double DeltaZMax
double DeltaZInitial
 Used to set initial step size for the fiber when using Local Error method.
bool InitializedDeltaZInitialFlag
double WalkOffStepSize
double WalkOffLastStepSize
int WalkOffNumSteps
double WalkOffParameter
double MaxPower
double FWHM_Pulse
bool TimeDataValid
bool FreqDataValid
double RelativeError
double RelativeErrorGoal
int LocalErrorFreqLimit
int WriteAveragePowerdBmFlag
int WritePulseWidthFlag
double * OutputPDVector
double * InputPDVector
double PMD
double MeanDGDPerSqrtLength
double ScatteringStepSize
cplx EulerMatrix [2][2]
int NumberScatterings
double TotalLengthFiber
double LengthFiberExceptLast
double LengthFiberLast
double * Theta
double * Phi
double * Psi
double * PDVectorHai
cplxJonesMatrix
int NumberOfChannels
double * FreqChannels
double FiberAmplifierParabolicGainCoefficient
bool FreqDomainOperatorValid
 Flag that controls when to recompute FreqDomainOperator.

Detailed Description

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

This class is used to propagate an optical signal through a fiber with first- and second-order chromatic dispersion, Kerr nonlinearity, fiber loss, fiber amplification (with optional saturable gain, parabolic gain shape and noise), fast saturable absorption, polarization-mode dispersion (PMD), and Raman amplification.

The class allows for SCALAR or VECTOR signals, although not all physical effects are verified/implemented for VECTOR signals.

Warning:
The implementation of PMD in this class is quite rudimentary and has not been carefully tested. Users are instead encouraged to use the class OptFiber for modeling of PMD, which can be done there in conjunction with first- and second-order chromatic dispersion, Kerr nonlinearity, and fiber loss.
See also:
enum typeSolver
enum typeFiberLossGain
enum typeFiberAmplifierGain
enum typeFiberAmplifierNoise
enum typeRamanAmplification
RamanAmp
OptFiber

This class was written by John Zweck, based on the following references:

  1. O.V. Sinkin, R. Holzloehner, J. Zweck, and C.R. Menyuk, "Optimization of the split-step Fourier method in modeling optical fiber communications systems", Journal of Lightwave Technology, vol. 21, no. 1, pp. 61-68, 2003.
  2. C.R. Menyuk, "Application of Multiple Length-Scale Methods to the Study of Optical Fiber Transmission," J. Engin. Math. vol. 36, pp. 113-136, 1999.
  3. H.A. Haus, J.G. Fujimoto, E.P. Ippen, "Structures for additive pulse mode locking", J. Opt. Soc. Am., vol. 8, no. 10, pp 2068-2076, 1991.
  4. H.A. Haus and A. Mecozzi, "Noise of mode-locked lasers", IEEE J. Qunatum Elec., vol. 29, no. 3, p 983-996, 1993.

Example Input Parameter Files

SMF.in

HausMasterEquationFiber.in

Example Application Code

The files linked below are an application code with input parameter files for a simple application of the OptFiberLocalError class. This application solves the Haus Master Equation using an initial chirped sech pulse. In the references above Haus gives an analytical formula for the solution which we have coded up in the matlab files below. The agreement with PhoSSiL is excellent. The matlab code should first be used to determine the parameters of the input chirped sech pulse for a given choice of fiber parameters.

SechLaser.cc

StartupSechLaser.cc

StartupSechLaser.hh

Input parameter files [.tar.gz]

Matlab Files [.tar.gz]

The files linked below show how to model a realistic optical fiber communications system, loosely based on a WDM system of Tyco's from about 1998.

The file LinearnTyco.cc contains several functions. The simplest is the first, TycoNoiseFree().

LinearnTyco.cc

StartupLinearn.cc

StartupLinearn.hh

Input parameter files [.tar.gz]

Step Size Selection Algorithms

To explain the step-size selection algorithms used we first consider the case that there is no PMD, ie when OptFiberLocalError::TypeSolver = SCALAR_NLS, or OptFiberLocalError::TypeSolver = VECTOR_MANAKOV_NO_PMD. We use the second-order symmetric split-step scheme to solve the PDE, as explained in Agrawal's book and in Oleg Sinkin's JLT paper referenced above.

The input parameter OptFiberLocalError::TypeStepSizes specifies which step size selection algorithm to use.

The WALK_OFF and CONSTANT step size algorithms are explained in OptFiberLocalError::TypeStepSizes.

We now explain the LOCAL_ERROR_3RD and LOCAL_ERROR_2ND step size selection criteria. We assume the user has read Oleg Sinkin's JLT paper on these algorithms referenced above.

The most important feature of the algorithm is that for each step along the fiber the step size is automatically chosen to satisfy a local error bound.

We first take a coarse split-step step of size OptFiberLocalError::DeltaZ, which we compare to the result of taking two fine steps each of size DeltaZ/2 starting from the same point that we started the coarse step from.

We compare the coarse step and fine step solutions and compute the local L^2 error of that step which is

OptFiberLocalError::RelativeError = sqrt( integral | coarse - fine | ^2 \ integral | fine | ^2 ).

The integral is done in the frequency domain over the number of modes OptSignal::RelevantNumModesOFLE, which is computed in void OptSignal::ComputeRelevantNumModesOFLE(void)

Warning:
If you have one channel which is not at or very close to the center frequency set OptSignal::ComputeRelevantNumModesOFLEFlag = 0 due to a bug in void OptSignal::ComputeRelevantNumModesOFLE(void) in this situation.

If TypeStepSizes == LOCAL_ERROR_3RD then the solution at the end of the step is set to be:

third-order solution = 4/3 coarse solution - 1/2 fine solution.

If TypeStepSizes == LOCAL_ERROR_2ND then the solution at the end of the step is set to be the fine solution.

The step sizes are controlled using a single input parameter OptFiberLocalError::RelativeErrorGoal.

The value of RelativeError is used to decide whether to accept the step or reject it.

If RelativeError > 2.0*RelativeErrorGoal

  1. Reject the step
  2. Halve the step size
  3. Throw away the solution and go back to the beginning of the step

Else

  1. Accept the step and adjust the step size for the next step.
  2. If RelativeError > RelativeErrorGoal
    1. Reduce DeltaZ by a factor of sqrt(2)
  3. Else
    1. If RelativeError < 0.5*RelativeErrorGoal
      1. Increase DeltaZ by a factor of sqrt(2)
    2. Else
      1. Keep DeltaZ the same

Each time we propagate through a particular fiber, we first try to take a step of size OptFiberLocalError::DeltaZInitial. (A step with this size may or may not be accepted.)

We set DeltaZInitial as follows. The very first time through the fiber the first step size we try is

DeltaZInitial = 0.5*OptFiberLocalErrorDeltaZMax. (This is very ad-hoc).

See also:
OptFiberLocalError::ComputeDeltaZMax()

At the end of the first step we actually take in the fiber, DeltaZInitial is set to the coarse step size that we actually took.

The next time through the fiber we try a coarse step of size DeltaZInitial.

One final point. At the start of each step we make sure that the coarse-step step size DeltaZ does not exceed the input parameter OptFiberLocalError::DeltaZMax. We also make sure that the total propagation distance does not exceed OptFiberLocalError::LengthFiber.

Overall, we need 6 FFTs per step: 2 for the coarse step plus 4 for the fine step, plus 1 to update the time domain when the end of the fiber leg is reached.

Modeling PMD

For simulations with PMD (TypeSolver = VECTOR_MANAKOV_PMD) we use the following adaptation by Zweck and Marks of the coarse-step algorithm of Marcuse, Menyuk and Wai (and others).

The basic idea is to divide up the fiber into sections. Within each section we propagate as in the case of TypeSolver = VECTOR_MANAKOV_NO_PMD as described above, using one of the four options for TypeStepSizes. At the start of each section we randomly rotate light on the Poincar'e sphere.

Also, if TypeSolver = VECTOR_MANAKOV_PMD, we model the birefringence as follows. In each step of the split-step algorithm we implement this walk-off between orthogonal polarization states in the frequency domain in the method OptFiberLocalError::ComputeFreqDomainOperator().

For a single section without a random rotation the X-polarization state is the fast axis and the Y-polarization the slow axis. This means that if we launch with Stokes parameters (1,0,0), i.e, X-polarized, then the signal is shifted left by PMD/2. Why left? Well we work with retarded time, t_ret = t - v_g z. If we launch in the fast axis, then v_g is larger and so t_ret of the center of a pulse will be smaller than would be the case without PMD.

We introduce a new parameter OptFiberLocalError::TotalLengthFiber = OptFiberLocalError::LengthFiber. The lengths of the sections are determined from the input parameter OptFiberLocalError::ScatteringStepSize in the method OptFiberLocalError::SetFiberLengthsForPMD(). This method sets the lengths of the sections using the variables

  1. OptFiberLocalError::NumberScatterings
  2. OptFiberLocalError::LengthFiberExceptLast
  3. OptFiberLocalError::LengthFiberLast

OptFiberLocalError::SetFiberLengthsForPMD() also allocates memory to store the Euler angles parametrizing the random rotation for each section, and calls OptFiberLocalError::GetNewFiberRealization() to get a new realization of the fiber rotations. We choose the Euler angles randomly so that the rotations are uniformily distributed on the Poincar'e sphere, as in the method OptFiber::GetFiberSampleCompleteScatt().

For propagation through each of the NumberScatterings sections we set OptFiberLocalError::LengthFiber using either LengthFiberExceptLast or LengthFiberLast. We then call the methods

  1. OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator()
  2. OptFiberLocalError::PropagateWithoutPMD()

For the two LOCAL_ERROR step size selection methods, for the first section of fiber we choose DeltaZInitial as in the case of no PMD. For subsequent sections, we choose DeltaZInitial to be the size of the last step in the previous section. In this way, if there the PMD was negligible we would get the same distribution of step sizes as when we would run VECTOR_MANAKOV_NO_PMD.

In addition to doing propagation the code solves the concatenation equations for the output polarization dispersion vector in the method OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector() which is called from OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator().

To compute the OutputPDVector for propagation through an entire system, not just through a single fiber, the OutputPDVector is really a variable in the OptSignal class, OptSignal::OutputPDVectorOFLE.

The total DGD up to the present point in the system can be obtained by calling OptFiberLocalError::GetDGD(), which just computes the length of the OutputPDVector. When you regenerate the optical signal for a new pass through the system in OptSignal::RegenerateSignalString(), the OutputPDVector and InputPDVectors are reset by calling OptSignal::ResetPDVectorOFLE().

Todo:
Compute InputPDVector, 2nd order PMD, Autocorrelation function and test. Add in ability to track oOptSignal->oReduOptSignal for GaussianReceiver class.

This class is used to propagate an optical signal through a fiber with first- and second-order chromatic dispersion, Kerr nonlinearity, fiber loss, fiber amplification (with optional saturable gain, parabolic gain shape and noise), fast saturable absorption, polarization-mode dispersion (PMD), and Raman amplification.

The class allows for SCALAR or VECTOR signals, although not all physical effects are implemented for VECTOR signals.

Warning:
The implementation of PMD in this class is quite rudimentary and has not been carefully tested. Users are instead encouraged to use the class OptFiber for modeling of PMD, which can be done there in conjunction with first- and second-order chromatic dispersion, Kerr nonlinearity, and fiber loss.
See also:
enum typeSolver
enum typeFiberLossGain
enum typeFiberAmplifierGain
enum typeFiberAmplifierNoise
enum typeRamanAmplification
RamanAmp
OptFiber

This class was written by John Zweck, based on the following references:

  1. O.V. Sinkin, R. Holzloehner, J. Zweck, and C.R. Menyuk, "Optimization of the split-step Fourier method in modeling optical fiber communications systems", Journal of Lightwave Technology, vol. 21, no. 1, pp. 61-68, 2003.
  2. C.R. Menyuk, "Application of Multiple Length-Scale Methods to the Study of Optical Fiber Transmission," J. Engin. Math. vol. 36, pp. 113-136, 1999.
  3. H.A. Haus, J.G. Fujimoto, E.P. Ippen, "Structures for additive pulse mode locking", J. Opt. Soc. Am., vol. 8, no. 10, pp 2068-2076, 1991.
  4. H.A. Haus and A. Mecozzi, "Noise of mode-locked lasers", IEEE J. Qunatum Elec., vol. 29, no. 3, p 983-996, 1993.

Example Input Parameter Files

SMF.in

HausMasterEquationFiber.in

Example Application Code

The files linked below are an application code with input parameter files for a simple application of the OptFiberLocalError class. This application solves the Haus Master Equation using an initial chirped sech pulse. In the references above Haus gives an analytical formula for the solution which we have coded up in the matlab files below. The agreement with PhoSSiL is excellent. The matlab code should first be used to determine the parameters of the input chirped sech pulse for a given choice of fiber parameters.

SechLaser.cc

StartupSechLaser.cc

StartupSechLaser.hh

Input parameter files [.tar.gz]

Matlab Files [.tar.gz]

The files linked below show how to model a realistic optical fiber communications system, loosely based on a WDM system of Tyco's from about 1998.

The file LinearnTyco.cc contains several functions. The simplest is the first, TycoNoiseFree().

LinearnTyco.cc

StartupLinearn.cc

StartupLinearn.hh

Input parameter files [.tar.gz]

Step Size Selection Algorithms

To explain the step-size selection algorithms used we first consider the case that there is no PMD, ie when OptFiberLocalError::TypeSolver = SCALAR_NLS, or OptFiberLocalError::TypeSolver = VECTOR_MANAKOV_NO_PMD. We use the second-order symmetric split-step scheme to solve the PDE, as explained in Agrawal's book and in Oleg Sinkin's JLT paper referenced above.

The input parameter OptFiberLocalError::TypeStepSizes specifies which step size selection algorithm to use.

The WALK_OFF and CONSTANT step size algorithms are explained in OptFiberLocalError::TypeStepSizes.

We now explain the LOCAL_ERROR_3RD and LOCAL_ERROR_2ND step size selection criteria. We assume the user has read Oleg Sinkin's JLT paper on these algorithms referenced above.

The most important feature of the algorithm is that for each step along the fiber the step size is automatically chosen to satisfy a local error bound.

We first take a coarse split-step step of size OptFiberLocalError::DeltaZ, which we compare to the result of taking two fine steps each of size DeltaZ/2 starting from the same point that we started the coarse step from.

We compare the coarse step and fine step solutions and compute the local L^2 error of that step which is

OptFiberLocalError::RelativeError = sqrt( integral | coarse - fine | ^2 \ integral | fine | ^2 ).

The integral is done in the frequency domain over the number of modes OptSignal::RelevantNumModesOFLE, which is computed in void OptSignal::ComputeRelevantNumModesOFLE(void)

Warning:
If you have one channel which is not at or very close to the center frequency set OptSignal::ComputeRelevantNumModesOFLEFlag = 0 due to a bug in void OptSignal::ComputeRelevantNumModesOFLE(void) in this situation.

If TypeStepSizes == LOCAL_ERROR_3RD then the solution at the end of the step is set to be:

third-order solution = 4/3 coarse solution - 1/2 fine solution.

If TypeStepSizes == LOCAL_ERROR_2ND then the solution at the end of the step is set to be the fine solution.

The step sizes are controlled using a single input parameter OptFiberLocalError::RelativeErrorGoal.

The value of RelativeError is used to decide whether to accept the step or reject it.

If RelativeError > 2.0*RelativeErrorGoal

  1. Reject the step
  2. Halve the step size
  3. Throw away the solution and go back to the beginning of the step

Else

  1. Accept the step and adjust the step size for the next step.
  2. If RelativeError > RelativeErrorGoal
    1. Reduce DeltaZ by a factor of sqrt(2)
  3. Else
    1. If RelativeError < 0.5*RelativeErrorGoal
      1. Increase DeltaZ by a factor of sqrt(2)
    2. Else
      1. Keep DeltaZ the same

Each time we propagate through a particular fiber, we first try to take a step of size OptFiberLocalError::DeltaZInitial. (A step with this size may or may not be accepted.)

We set DeltaZInitial as follows. The very first time through the fiber the first step size we try is

DeltaZInitial = 0.5*OptFiberLocalErrorDeltaZMax. (This is very ad-hoc).

See also:
OptFiberLocalError::ComputeDeltaZMax()

At the end of the first step we actually take in the fiber, DeltaZInitial is set to the coarse step size that we actually took.

The next time through the fiber we try a coarse step of size DeltaZInitial.

One final point. At the start of each step we make sure that the coarse-step step size DeltaZ does not exceed the input parameter OptFiberLocalError::DeltaZMax. We also make sure that the total propagation distance does not exceed OptFiberLocalError::LengthFiber.

Overall, we need 6 FFTs per step: 2 for the coarse step plus 4 for the fine step, plus 1 to update the time domain when the end of the fiber leg is reached.

Modeling PMD

For simulations with PMD (TypeSolver = VECTOR_MANAKOV_PMD) we use the following adaptation by Zweck and Marks of the coarse-step algorithm of Marcuse, Menyuk and Wai (and others).

The basic idea is to divide up the fiber into sections. Within each section we propagate as in the case of TypeSolver = VECTOR_MANAKOV_NO_PMD as described above, using one of the four options for TypeStepSizes. At the start of each section we randomly rotate light on the Poincar'e sphere.

Also, if TypeSolver = VECTOR_MANAKOV_PMD, we model the birefringence as follows. In each step of the split-step algorithm we implement this walk-off between orthogonal polarization states in the frequency domain in the method OptFiberLocalError::ComputeFreqDomainOperator().

For a single section without a random rotation the X-polarization state is the fast axis and the Y-polarization the slow axis. This means that if we launch with Stokes parameters (1,0,0), i.e, X-polarized, then the signal is shifted left by PMD/2. Why left? Well we work with retarded time, t_ret = t - v_g z. If we launch in the fast axis, then v_g is larger and so t_ret of the center of a pulse will be smaller than would be the case without PMD.

We introduce a new parameter OptFiberLocalError::TotalLengthFiber = OptFiberLocalError::LengthFiber. The lengths of the sections are determined from the input parameter OptFiberLocalError::ScatteringStepSize in the method OptFiberLocalError::SetFiberLengthsForPMD(). This method sets the lengths of the sections using the variables

  1. OptFiberLocalError::NumberScatterings
  2. OptFiberLocalError::LengthFiberExceptLast
  3. OptFiberLocalError::LengthFiberLast

OptFiberLocalError::SetFiberLengthsForPMD() also allocates memory to store the Euler angles parametrizing the random rotation for each section, and calls OptFiberLocalError::GetNewFiberRealization() to get a new realization of the fiber rotations. We choose the Euler angles randomly so that the rotations are uniformily distributed on the Poincar'e sphere, as in the method OptFiber::GetFiberSampleCompleteScatt().

For propagation through each of the NumberScatterings sections we set OptFiberLocalError::LengthFiber using either LengthFiberExceptLast or LengthFiberLast. We then call the methods

  1. OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator()
  2. OptFiberLocalError::PropagateWithoutPMD()

For the two LOCAL_ERROR step size selection methods, for the first section of fiber we choose DeltaZInitial as in the case of no PMD. For subsequent sections, we choose DeltaZInitial to be the size of the last step in the previous section. In this way, if there the PMD was negligible we would get the same distribution of step sizes as when we would run VECTOR_MANAKOV_NO_PMD.

In addition to doing propagation the code solves the concatenation equations for the output polarization dispersion vector in the method OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector() which is called from OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator().

To compute the OutputPDVector for propagation through an entire system, not just through a single fiber, the OutputPDVector is really a variable in the OptSignal class, OptSignal::OutputPDVectorOFLE.

The total DGD up to the present point in the system can be obtained by calling OptFiberLocalError::GetDGD(), which just computes the length of the OutputPDVector. When you regenerate the optical signal for a new pass through the system in OptSignal::RegenerateSignalString(), the OutputPDVector and InputPDVectors are reset by calling OptSignal::ResetPDVectorOFLE().

Todo:
Compute InputPDVector, 2nd order PMD, Autocorrelation function and test. Add in ability to track oOptSignal->oReduOptSignal for GaussianReceiver class.

This class is used to propagate an optical signal through a fiber with first- and second-order chromatic dispersion, Kerr nonlinearity, fiber loss, fiber amplification (with optional saturable gain, parabolic gain shape and noise), fast saturable absorption, polarization-mode dispersion (PMD), and Raman amplification.

The class allows for SCALAR or VECTOR signals, although not all physical effects are implemented for VECTOR signals.

Warning:
The implementation of PMD in this class is quite rudimentary and has not been carefully tested. Users are instead encouraged to use the class OptFiber for modeling of PMD, which can be done there in conjunction with first- and second-order chromatic dispersion, Kerr nonlinearity, and fiber loss.
See also:
enum typeSolver
enum typeFiberLossGain
enum typeFiberAmplifierGain
enum typeFiberAmplifierNoise
enum typeRamanAmplification
RamanAmp
OptFiber

This class was written by John Zweck, based on the following references:

  1. O.V. Sinkin, R. Holzloehner, J. Zweck, and C.R. Menyuk, "Optimization of the split-step Fourier method in modeling optical fiber communications systems", Journal of Lightwave Technology, vol. 21, no. 1, pp. 61-68, 2003.
  2. C.R. Menyuk, "Application of Multiple Length-Scale Methods to the Study of Optical Fiber Transmission," J. Engin. Math. vol. 36, pp. 113-136, 1999.
  3. H.A. Haus, J.G. Fujimoto, E.P. Ippen, "Structures for additive pulse mode locking", J. Opt. Soc. Am., vol. 8, no. 10, pp 2068-2076, 1991.
  4. H.A. Haus and A. Mecozzi, "Noise of mode-locked lasers", IEEE J. Qunatum Elec., vol. 29, no. 3, p 983-996, 1993.

Example Input Parameter Files

SMF.in

HausMasterEquationFiber.in

Example Application Code

The files linked below are an application code with input parameter files for a simple application of the OptFiberLocalError class. This application solves the Haus Master Equation using an initial chirped sech pulse. In the references above Haus gives an analytical formula for the solution which we have coded up in the matlab files below. The agreement with PhoSSiL is excellent. The matlab code should first be used to determine the parameters of the input chirped sech pulse for a given choice of fiber parameters.

SechLaser.cc

StartupSechLaser.cc

StartupSechLaser.hh

Input parameter files [.tar.gz]

Matlab Files [.tar.gz]

The files linked below show how to model a realistic optical fiber communications system, loosely based on a WDM system of Tyco's from about 1998.

The file LinearnTyco.cc contains several functions. The simplest is the first, TycoNoiseFree().

LinearnTyco.cc

StartupLinearn.cc

StartupLinearn.hh

Input parameter files [.tar.gz]

Step Size Selection Algorithms

To explain the step-size selection algorithms used we first consider the case that there is no PMD, ie when OptFiberLocalError::TypeSolver = SCALAR_NLS, or OptFiberLocalError::TypeSolver = VECTOR_MANAKOV_NO_PMD. We use the second-order symmetric split-step scheme to solve the PDE, as explained in Agrawal's book and in Oleg Sinkin's JLT paper referenced above.

The input parameter OptFiberLocalError::TypeStepSizes specifies which step size selection algorithm to use.

The WALK_OFF and CONSTANT step size algorithms are explained in OptFiberLocalError::TypeStepSizes.

We now explain the LOCAL_ERROR_3RD and LOCAL_ERROR_2ND step size selection criteria. We assume the user has read Oleg Sinkin's JLT paper on these algorithms referenced above.

The most important feature of the algorithm is that for each step along the fiber the step size is automatically chosen to satisfy a local error bound.

We first take a coarse split-step step of size OptFiberLocalError::DeltaZ, which we compare to the result of taking two fine steps each of size DeltaZ/2 starting from the same point that we started the coarse step from.

We compare the coarse step and fine step solutions and compute the local L^2 error of that step which is

OptFiberLocalError::RelativeError = sqrt( integral | coarse - fine | ^2 \ integral | fine | ^2 ).

The integral is done in the frequency domain over the number of modes OptSignal::RelevantNumModesOFLE, which is computed in void OptSignal::ComputeRelevantNumModesOFLE(void)

Warning:
If you have one channel which is not at or very close to the center frequency set OptSignal::ComputeRelevantNumModesOFLEFlag = 0 due to a bug in void OptSignal::ComputeRelevantNumModesOFLE(void) in this situation.

If TypeStepSizes == LOCAL_ERROR_3RD then the solution at the end of the step is set to be:

third-order solution = 4/3 coarse solution - 1/2 fine solution.

If TypeStepSizes == LOCAL_ERROR_2ND then the solution at the end of the step is set to be the fine solution.

The step sizes are controlled using a single input parameter OptFiberLocalError::RelativeErrorGoal.

The value of RelativeError is used to decide whether to accept the step or reject it.

If RelativeError > 2.0*RelativeErrorGoal

  1. Reject the step
  2. Halve the step size
  3. Throw away the solution and go back to the beginning of the step

Else

  1. Accept the step and adjust the step size for the next step.
  2. If RelativeError > RelativeErrorGoal
    1. Reduce DeltaZ by a factor of sqrt(2)
  3. Else
    1. If RelativeError < 0.5*RelativeErrorGoal
      1. Increase DeltaZ by a factor of sqrt(2)
    2. Else
      1. Keep DeltaZ the same

Each time we propagate through a particular fiber, we first try to take a step of size OptFiberLocalError::DeltaZInitial. (A step with this size may or may not be accepted.)

We set DeltaZInitial as follows. The very first time through the fiber the first step size we try is

DeltaZInitial = 0.5*OptFiberLocalErrorDeltaZMax. (This is very ad-hoc).

See also:
OptFiberLocalError::ComputeDeltaZMax()

At the end of the first step we actually take in the fiber, DeltaZInitial is set to the coarse step size that we actually took.

The next time through the fiber we try a coarse step of size DeltaZInitial.

One final point. At the start of each step we make sure that the coarse-step step size DeltaZ does not exceed the input parameter OptFiberLocalError::DeltaZMax. We also make sure that the total propagation distance does not exceed OptFiberLocalError::LengthFiber.

Overall, we need 6 FFTs per step: 2 for the coarse step plus 4 for the fine step, plus 1 to update the time domain when the end of the fiber leg is reached.

Modeling PMD

For simulations with PMD (TypeSolver = VECTOR_MANAKOV_PMD) we use the following adaptation by Zweck and Marks of the coarse-step algorithm of Marcuse, Menyuk and Wai (and others).

The basic idea is to divide up the fiber into sections. Within each section we propagate as in the case of TypeSolver = VECTOR_MANAKOV_NO_PMD as described above, using one of the four options for TypeStepSizes. At the start of each section we randomly rotate light on the Poincar'e sphere.

Also, if TypeSolver = VECTOR_MANAKOV_PMD, we model the birefringence as follows. In each step of the split-step algorithm we implement this walk-off between orthogonal polarization states in the frequency domain in the method OptFiberLocalError::ComputeFreqDomainOperator().

For a single section without a random rotation the X-polarization state is the fast axis and the Y-polarization the slow axis. This means that if we launch with Stokes parameters (1,0,0), i.e, X-polarized, then the signal is shifted left by PMD/2. Why left? Well we work with retarded time, t_ret = t - v_g z. If we launch in the fast axis, then v_g is larger and so t_ret of the center of a pulse will be smaller than would be the case without PMD.

We introduce a new parameter OptFiberLocalError::TotalLengthFiber = OptFiberLocalError::LengthFiber. The lengths of the sections are determined from the input parameter OptFiberLocalError::ScatteringStepSize in the method OptFiberLocalError::SetFiberLengthsForPMD(). This method sets the lengths of the sections using the variables

  1. OptFiberLocalError::NumberScatterings
  2. OptFiberLocalError::LengthFiberExceptLast
  3. OptFiberLocalError::LengthFiberLast

OptFiberLocalError::SetFiberLengthsForPMD() also allocates memory to store the Euler angles parametrizing the random rotation for each section, and calls OptFiberLocalError::GetNewFiberRealization() to get a new realization of the fiber rotations. We choose the Euler angles randomly so that the rotations are uniformily distributed on the Poincar'e sphere, as in the method OptFiber::GetFiberSampleCompleteScatt().

For propagation through each of the NumberScatterings sections we set OptFiberLocalError::LengthFiber using either LengthFiberExceptLast or LengthFiberLast. We then call the methods

  1. OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator()
  2. OptFiberLocalError::PropagateWithoutPMD()

For the two LOCAL_ERROR step size selection methods, for the first section of fiber we choose DeltaZInitial as in the case of no PMD. For subsequent sections, we choose DeltaZInitial to be the size of the last step in the previous section. In this way, if there the PMD was negligible we would get the same distribution of step sizes as when we would run VECTOR_MANAKOV_NO_PMD.

In addition to doing propagation the code solves the concatenation equations for the output polarization dispersion vector in the method OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector() which is called from OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator().

To compute the OutputPDVector for propagation through an entire system, not just through a single fiber, the OutputPDVector is really a variable in the OptSignal class, OptSignal::OutputPDVectorOFLE.

The total DGD up to the present point in the system can be obtained by calling OptFiberLocalError::GetDGD(), which just computes the length of the OutputPDVector. When you regenerate the optical signal for a new pass through the system in OptSignal::RegenerateSignalString(), the OutputPDVector and InputPDVectors are reset by calling OptSignal::ResetPDVectorOFLE().

Todo:
Compute InputPDVector, 2nd order PMD, Autocorrelation function and test. Add in ability to track oOptSignal->oReduOptSignal for GaussianReceiver class.

Constructor & Destructor Documentation

OptFiberLocalError::OptFiberLocalError ( string  InFileName,
OptSignal oOptSignal,
RanNumGen RNG2,
string  Job2 
)

Constructor.

References AttenuationFiber, CenterFreq, ComputeDeltaZMax(), CONSTANT, cfftw::delta_f, DeltaFreq, DeltaZ, DeltaZInitial, DeltaZMaxInfile, DoFastSaturableAbsorptionFlag, DoTimeOperatorExactlyFlag, EffectAreaFiber, FastSaturableAbsorptionCoefficient, OptSignal::fft, fft, FIBER_AMP_NOISE_OFF, FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN, FIBER_AMPLIFIER, FiberAmplifierGainSaturationMaxGainPerStep, FiberAmplifierNoiseMaxStepSizeFactor, FiberAmplifierSaturationEnergy, FiberAmplifierSpontaneousEmissionFactor, FiberAmplifierSuperGaussFiltGainCoefficient, FiberAmplifierSuperGaussFiltOrder, FiberAmplifierUnsaturatedNepperGain, fftMatrices::fOptSignalX, fftMatrices::fOptSignalY, FreqChannels, OptFiberLocalErrorWorkSpace::FreqDomainOperatorX, FreqDomainOperatorX, OptFiberLocalErrorWorkSpace::FreqDomainOperatorY, FreqDomainOperatorY, Frequency2Wavelength(), FstOrDispFiber, FULL_RAMAN, FWHM_Pulse, gamma, OptSignal::GetCenterFreq(), OptSignal::GetFrequency(), OptSignal::GetFWHM_Pulse(), OptSignal::GetNumChannels(), OptSignal::GetRelevantNumModesOFLE(), OptSignal::GetTypeSimulation(), OptSignal::GetUsingOptFiberLocalError(), cfftw::give_N(), InitializedDeltaZInitialFlag, Job, JonesMatrix, OptSignal::JonesMatrixChannel, OptFiberLocalErrorWorkSpace::LaserWorkX, LaserWorkX, OptFiberLocalErrorWorkSpace::LaserWorkY, LaserWorkY, LengthFiber, LightSpeed, LOCAL_ERROR_3RD, LocalErrorFreqLimit, log(), LogFile, LogFileSeparator(), LOWER_AND_UPPER, LOWER_ONLY, MANDATORY, MeanDGDPerSqrtLength, NepperAttenuationFiber, NepperRamanGain, NepperRamanPumpLoss, NO_BOUNDS, NO_RAMAN, NonLinIndexFiber, NumberOfChannels, NumStepsBetweenScatterings, OptSignal::OFLEWork, oOptSignal, OPTIONAL_NO_WARNING, OPTIONAL_WARNING, OutputPDVector, OptSignal::OutputPDVectorOFLE, OutputStepSizesFlag, PDVectorHai, Phi, pi, PMD, Psi, qtPoints, RamanOnOffGaindB, ReadDouble(), ReadInt(), ReferenceFreq, ReferenceWavelength, RelativeErrorGoal, ResetVolatileVariables(), RNG, SCALAR, SCALAR_NLS, ScalarSolverEightNinthsFlag, ScatteringStepSize, SetAttenuationdB(), SetDispersion(), SetFiberLengthsForPMD(), SetFstSndOrDispDirectlyFlag, SetGammaFiber(), SetMeanDGDPerSqrtLength(), SetNepperAttenuation(), SetPMD(), OptSignal::sfftM, sfftM, OptFiberLocalErrorWorkSpace::sfftM_Coarse, sfftM_Coarse, OptFiberLocalErrorWorkSpace::sfftM_Start, sfftM_Start, SIMPLE_RAMAN, SndOrDispFiber, OptFiberLocalErrorWorkSpace::SqFreqDomainOperatorX, SqFreqDomainOperatorX, OptFiberLocalErrorWorkSpace::SqFreqDomainOperatorY, SqFreqDomainOperatorY, sqrt(), StepSizesFileMode, Theta, TypeFastSaturableAbsorption, TypeFiberAmplifierGain, TypeFiberAmplifierNoise, TypeFiberLossGain, TypeRamanAmplification, TypeSimulation, TypeSolver, TypeStepSizes, VECTOR, VECTOR_MANAKOV_NO_PMD, VECTOR_MANAKOV_PMD, WALK_OFF, WalkOffParameter, Wavelength2Frequency(), WithNonLin, WriteAveragePowerdBmFlag, WritePulseWidthFlag, WriteTypeFiberAmplifierGain(), WriteTypeFiberAmplifierNoise(), WriteTypeFiberLossGain(), WriteTypeSolver(), and WriteTypeStepSizes().

OptFiberLocalError::~OptFiberLocalError ( void   ) 

Destructor.

OptFiberLocalError::OptFiberLocalError ( string  InFileName,
OptSignal oOptSignal,
RanNumGen RNG2,
string  Job2 
)

Constructor.

OptFiberLocalError::~OptFiberLocalError ( void   ) 

Destructor.

OptFiberLocalError::OptFiberLocalError ( string  InFileName,
OptSignal oOptSignal,
RanNumGen RNG2,
string  Job2 
)

Constructor.

OptFiberLocalError::~OptFiberLocalError ( void   ) 

Destructor.


Member Function Documentation

void OptFiberLocalError::AllocateMemoryForEulerAngles ( void   )  [private]

References cerror(), NumberScatterings, Phi, Psi, and Theta.

Referenced by SetFiberLengthsForPMD().

void OptFiberLocalError::AllocateMemoryForEulerAngles ( void   )  [private]
void OptFiberLocalError::AllocateMemoryForEulerAngles ( void   )  [private]
void OptFiberLocalError::ApplyDispersionOperator ( bool  ApplyTwiceFlag  )  [private]
void OptFiberLocalError::ApplyDispersionOperator ( bool  ApplyTwiceFlag  )  [private]
void OptFiberLocalError::ApplyFastSaturableAbsorptionHeunsMethod ( double  StepSizeZ  )  [private]

Scalar Case:

du/dz = F(u)*u

where in QUADRATIC case F(x)= sq(abs(x))

with Heun's Method (aka Modified Euler, RK2) is

v_{n+1} = u_n + h*F(u_n)*u_n u_{n+1}= u_n + 0.5*h*(F(u_n)+F(v_{n+1}).

Vector Case:

U=(u_X,u_Y)^T

dU/dz = F(U)*U

where in QUADRATIC case F(U) = F(u_X) + F(u_Y)

References FastSaturableAbsorptionFunction(), LaserWorkX, LaserWorkY, qtPoints, SCALAR_NLS, sfftM, fftMatrices::tOptSignalX, fftMatrices::tOptSignalY, TypeSolver, VECTOR_MANAKOV_NO_PMD, and VECTOR_MANAKOV_PMD.

Referenced by ApplyFastSaturableAbsorptionOperator().

void OptFiberLocalError::ApplyFastSaturableAbsorptionOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplyFastSaturableAbsorptionQuadraticAnalytic ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplyFreqDomainOperator ( bool  ApplyDispersionTwiceFlag,
double  GainSatStepSizeZ 
) [private]
void OptFiberLocalError::ApplyFreqDomainOperator ( bool  ApplyTwiceFlag  )  [private]
void OptFiberLocalError::ApplyFreqDomainOperator ( bool  ApplyDispersionTwiceFlag,
double  GainSatStepSizeZ 
) [private]
void OptFiberLocalError::ApplyFullRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplyFullRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplyFullRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplyKerrNonlinearityOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator ( int  ScatteringSectionIndex  ) 
void OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator ( int  ScatteringSectionIndex  ) 
void OptFiberLocalError::ApplyPMDCompleteScatteringFreqDomainOperator ( int  ScatteringSectionIndex  ) 
void OptFiberLocalError::ApplyRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplyRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplyRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplySaturableGainOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplySaturableParabolicGainOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplySimpleRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplySimpleRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplySimpleRamanOperator ( double  CurrentZValueWithinFiber2,
double  ZStep2 
) [private]
void OptFiberLocalError::ApplyTimeDomainOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplyTimeDomainOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ApplyTimeDomainOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ComputeDeltaZMax ( void   ) 
void OptFiberLocalError::ComputeDeltaZMax ( void   ) 

The value of DeltaZmax is determined in this method from input parameter DeltaZMaxInfile and, if TypeFiberLossGain == FIBER_AMPLIFIER, from the gain and noise parameters of the fiber amplifier.

See also:
enum typeFiberAmplifierGain, enum typeFiberAmplifierNoise
void OptFiberLocalError::ComputeDeltaZMax ( void   ) 

The value of DeltaZmax is determined in this method from input parameter DeltaZMaxInfile and, if TypeFiberLossGain == FIBER_AMPLIFIER, from the gain and noise parameters of the fiber amplifier.

See also:
enum typeFiberAmplifierGain, enum typeFiberAmplifierNoise
void OptFiberLocalError::ComputeDispersionOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ComputeDispersionOperator ( double  StepSizeZ  )  [private]
void OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector ( int  ScatteringSectionIndex  ) 
void OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector ( int  ScatteringSectionIndex  ) 
void OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector ( int  ScatteringSectionIndex  ) 
void OptFiberLocalError::ComputeFreqDomainOperator ( double  StepSizeZ  )  [private]
double OptFiberLocalError::ComputeMaxPower ( void   )  [private]
double OptFiberLocalError::ComputeMaxPower ( void   )  [private]
double OptFiberLocalError::ComputeMaxPower ( void   )  [private]
double OptFiberLocalError::ComputeThirdOrderSolutionAndRelativeError ( void   )  [private]
double OptFiberLocalError::ComputeThirdOrderSolutionAndRelativeError ( void   )  [private]
double OptFiberLocalError::ComputeThirdOrderSolutionAndRelativeError ( void   )  [private]
double OptFiberLocalError::ComputeThirdOrderSolutionAndRelativeErrorOLD ( void   )  [private]
double OptFiberLocalError::ComputeThirdOrderSolutionAndRelativeErrorOLD ( void   )  [private]
double OptFiberLocalError::ComputeThirdOrderSolutionAndRelativeErrorOLD ( void   )  [private]
void OptFiberLocalError::ComputeWalkOffStepSize ( void   )  [private]
void OptFiberLocalError::ComputeWalkOffStepSize ( void   )  [private]
void OptFiberLocalError::ComputeWalkOffStepSize ( void   )  [private]

For the WALK_OFF method we choose the step size to be constant within each fiber as follows.

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

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

We choose ,2 as follows:

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

Single Channel Case: ,2 correspond to frequencies

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

Note: For simulations with PMD, we recompute WalkOff step size for each section. For single channel simulations since RootMeanSquare spectral width of signal may change slightly it's possible that the different sections of the same fiber have different step sizes.

References OptSignal::ComputeRMSSpectralWidth(), DeltaZMax, DispersionOperatorValid, FIBER_AMP_NOISE_OFF, FIBER_AMPLIFIER, Frequency2Wavelength(), OptSignal::GetCenterFreq(), GetDispersion(), OptSignal::GetFrequency(), OptSignal::GetNumChannels(), LengthFiber, oOptSignal, TypeFiberAmplifierNoise, TypeFiberLossGain, WalkOffLastStepSize, WalkOffNumSteps, WalkOffParameter, and WalkOffStepSize.

void OptFiberLocalError::CopyFftMatricesFreqData ( fftMatrices OrigData,
fftMatrices CopyOfData 
) [private]
void OptFiberLocalError::CopyFftMatricesFreqData ( fftMatrices OrigData,
fftMatrices CopyOfData 
) [private]
void OptFiberLocalError::CopyFftMatricesFreqData ( fftMatrices OrigData,
fftMatrices CopyOfData 
) [private]
cplx OptFiberLocalError::FastSaturableAbsorptionFunction ( cplx  u  )  [private]

Fast Saturable Absortion is du/dz = F(u)u where F=FastSaturableAbsorptionFunction

References FastSaturableAbsorptionCoefficient, QUADRATIC, sq(), and TypeFastSaturableAbsorption.

Referenced by ApplyFastSaturableAbsorptionHeunsMethod().

void OptFiberLocalError::FiberAmplifierAddMonteCarloNoise ( double  StepSize  )  [private]

Adds random noise realization at beginning of current split step in a FIBER_AMPLIFIER

void OptFiberLocalError::FiberAmplifierAddMonteCarloNoise ( double  StepSize  )  [private]
void OptFiberLocalError::FiberAmplifierAddMonteCarloNoise ( double  StepSize  )  [private]

Adds random noise realization at beginning of current split step in a FIBER_AMPLIFIER

void OptFiberLocalError::FiberAmplifierComputeNoiseAmplitudeFactor ( double  StepSize  )  [private]

Computes the noise amplitude factor for SCALAR signals that are to be propagated through a z-step of size StepSize in a FIBER_AMPLIFIER. Called by OptFiberLocalError::FiberAmplifierAddMonteCarloNoise()

When we have a saturable amplifier with parabolic gain shape we compute the noise amplitude factor at point z along the fiber using the gain g(z) at that point. Hence we ignore both the parabolic gain shape (FIX THIS!) and any loss in this computation.

For a flat gain amplifier we compute the noise amplitude factor from the flat gain parameter, which is specified by a negative fiber attenuation.

See also:
AttenuationFiber
void OptFiberLocalError::FiberAmplifierComputeNoiseAmplitudeFactor ( double  StepSize  )  [private]

Computes the noise amplitude factor for SCALAR signals that are to be propagated through a z-step of size StepSize in a FIBER_AMPLIFIER. Called by OptFiberLocalError::FiberAmplifierAddMonteCarloNoise()

When we have a saturable amplifier with parabolic gain shape we compute the noise amplitude factor at point z along the fiber using the gain g(z) at that point. Hence we ignore both the parabolic gain shape (FIX THIS!) and any loss in this computation.

For a flat gain amplifier we compute the noise amplitude factor from the flat gain parameter, which is specified by a negative fiber attenuation.

See also:
AttenuationFiber

References DeltaFreq, FIBER_AMP_NOISE_OFF, FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN, FIBER_AMP_UNSATURATED_FLAT_GAIN, FIBER_AMPLIFIER, FiberAmplifierNoiseAmplitudeFactor, FiberAmplifierSaturableGainPerLength, FiberAmplifierSpontaneousEmissionFactor, hPlanck, NepperAttenuationFiber, SCALAR_NLS, sqrt(), TypeFiberAmplifierGain, TypeFiberAmplifierNoise, TypeFiberLossGain, and TypeSolver.

Referenced by FiberAmplifierAddMonteCarloNoise().

void OptFiberLocalError::FiberAmplifierComputeNoiseAmplitudeFactor ( double  StepSize  )  [private]

Computes the noise amplitude factor for SCALAR signals that are to be propagated through a z-step of size StepSize in a FIBER_AMPLIFIER. Called by OptFiberLocalError::FiberAmplifierAddMonteCarloNoise()

When we have a saturable amplifier with parabolic gain shape we compute the noise amplitude factor at point z along the fiber using the gain g(z) at that point. Hence we ignore both the parabolic gain shape (FIX THIS!) and any loss in this computation.

For a flat gain amplifier we compute the noise amplitude factor from the flat gain parameter, which is specified by a negative fiber attenuation.

See also:
AttenuationFiber
void OptFiberLocalError::FiberAmplifierComputeSaturableGain ( void   )  [private]

Computes the saturable gain per unit length at start of step. Used by FiberAmplifierComputeNoiseAmplitudeFactor and ComputeFreqDomainOperator.

void OptFiberLocalError::FiberAmplifierComputeSaturableGain ( void   )  [private]

Computes the saturable gain per unit length at start of step. Used by FiberAmplifierComputeNoiseAmplitudeFactor and ComputeFreqDomainOperator.

References FiberAmplifierSaturableGainPerLength, FiberAmplifierSaturationEnergy, FiberAmplifierUnsaturatedNepperGain, OptSignal::GetTotalEnergy(), and oOptSignal.

Referenced by PropagateLocalError().

void OptFiberLocalError::FiberAmplifierComputeSaturableGain ( void   )  [private]

Computes the saturable gain per unit length at start of step. Used by FiberAmplifierComputeNoiseAmplitudeFactor and ComputeFreqDomainOperator.

double OptFiberLocalError::FiberAmplifierComputeSaturableGainForHeunsMethod ( bool  FirstStep  )  [private]

Computes the saturable gain per unit length in first and second steps of Heun's method discretization implemented in ApplySaturableGainOperator.

References FiberAmplifierGetEnergyForHeunsMethod(), FiberAmplifierSaturationEnergy, and FiberAmplifierUnsaturatedNepperGain.

Referenced by ApplySaturableGainOperator().

double OptFiberLocalError::FiberAmplifierComputeSaturableGainForHeunsMethod ( bool  FirstStep  )  [private]

Computes the saturable gain per unit length in first and second steps of Heun's method discretization implemented in ApplySaturableParabolicGainOperator.

double OptFiberLocalError::FiberAmplifierGetEnergyForHeunsMethod ( bool  FirstStep  )  [private]

Computes energy in frequency domain, called by FiberAmplifierComputeSaturableGainForHeunsMethod

References fftMatrices::fOptSignalX, fftMatrices::fOptSignalY, OptSignal::GetTimeWindow(), LaserWorkX, LaserWorkY, oOptSignal, qtPoints, sfftM, sq(), TypeSimulation, and VECTOR.

Referenced by FiberAmplifierComputeSaturableGainForHeunsMethod().

double OptFiberLocalError::FiberAmplifierGetEnergyForHeunsMethod ( bool  FirstStep  )  [private]

Computes energy in frequency domain, called by FiberAmplifierComputeSaturableGainForHeunsMethod

double OptFiberLocalError::GetDeltaZ (  )  [inline]

References DeltaZ.

double OptFiberLocalError::GetDeltaZ (  )  [inline]

References DeltaZ.

double OptFiberLocalError::GetDeltaZ (  )  [inline]

References DeltaZ.

double OptFiberLocalError::GetDGD ( void   ) 
double OptFiberLocalError::GetDGD ( void   ) 
double OptFiberLocalError::GetDGD ( void   ) 

Returns the Differential Group Delay.

Computes the DGD at the absolute frequency given in oOptSignal::FreqForPDVectorOFLE for propagation over all fibers from where oOptSignal::ResetPDVectorOFLE() was called to the current position.

The method simply returns the length of the vector given by OptFiberLocalError::OutputPDVector.

See also OptFiberLocalError::PropagateOutputPDVector

References OutputPDVector, PDVectorHai, sq(), and sqrt().

double OptFiberLocalError::GetDispersion ( double  Wavelength  ) 

Returns value of Dispersion in s/m^2 at Wavelength in m.

References CenterFreq, DispersionFiberCenterWavelength, DispSlopeFiberCenterWavelength, and Frequency2Wavelength().

Referenced by ComputeWalkOffStepSize().

double OptFiberLocalError::GetDispersion ( double  Wavelength  ) 

Returns value of Dispersion in s/m^2 at Wavelength in m.

double OptFiberLocalError::GetDispersion ( double  Wavelength  ) 

Returns value of Dispersion in s/m^2 at Wavelength in m.

void OptFiberLocalError::GetEulerMatrix ( double  theta,
double  phi,
double  psi 
)
void OptFiberLocalError::GetEulerMatrix ( double  theta,
double  phi,
double  psi 
)
void OptFiberLocalError::GetEulerMatrix ( double  theta,
double  phi,
double  psi 
)
double OptFiberLocalError::GetExpectedDGD ( void   )  [inline]

References LengthFiber, pi, PMD, and sqrt().

double OptFiberLocalError::GetExpectedDGD ( void   )  [inline]

References LengthFiber, pi, PMD, and sqrt().

Referenced by GetExpectedSndOrderDGD().

double OptFiberLocalError::GetExpectedDGD ( void   )  [inline]

References LengthFiber, pi, PMD, and sqrt().

double OptFiberLocalError::GetExpectedSndOrderDGD ( void   )  [inline]

References GetExpectedDGD(), sq(), and sqrt().

double OptFiberLocalError::GetExpectedSndOrderDGD ( void   )  [inline]

References GetExpectedDGD(), sq(), and sqrt().

double OptFiberLocalError::GetExpectedSndOrderDGD ( void   )  [inline]

References GetExpectedDGD(), sq(), and sqrt().

double OptFiberLocalError::GetFiberLength (  )  [inline]
double OptFiberLocalError::GetFiberLength (  )  [inline]

References LengthFiber.

double OptFiberLocalError::GetFiberLength (  )  [inline]

References LengthFiber.

double OptFiberLocalError::GetFirstOrderDispersion (  )  [inline]

References FstOrDispFiber.

double OptFiberLocalError::GetFirstOrderDispersion (  )  [inline]

References FstOrDispFiber.

double OptFiberLocalError::GetFirstOrderDispersion (  )  [inline]

References FstOrDispFiber.

Referenced by NoiseCovariance::Propagator().

double OptFiberLocalError::GetFreqDerivativeOfBirefringence ( void   ) 
double OptFiberLocalError::GetFreqDerivativeOfBirefringence ( void   ) 
double OptFiberLocalError::GetFreqDerivativeOfBirefringence ( void   ) 
double OptFiberLocalError::GetGamma (  )  [inline]
double OptFiberLocalError::GetGamma (  )  [inline]

References gamma.

double OptFiberLocalError::GetGamma (  )  [inline]

References gamma.

double OptFiberLocalError::GetMeanDGD_SqrtLength ( void   )  [inline]

References MeanDGDPerSqrtLength, and sqrt().

double OptFiberLocalError::GetMeanDGD_SqrtLength ( void   )  [inline]

References MeanDGDPerSqrtLength, and sqrt().

double OptFiberLocalError::GetMeanDGD_SqrtLength ( void   )  [inline]

References MeanDGDPerSqrtLength, and sqrt().

double OptFiberLocalError::GetNepperAttenuationFiber (  )  [inline]
double OptFiberLocalError::GetNepperAttenuationFiber (  )  [inline]
double OptFiberLocalError::GetNepperAttenuationFiber (  )  [inline]
void OptFiberLocalError::GetNewFiberRealization ( void   ) 
void OptFiberLocalError::GetNewFiberRealization ( void   ) 
void OptFiberLocalError::GetNewFiberRealization ( void   ) 
double OptFiberLocalError::GetNonLinIndexFiber (  )  [inline]

References NonLinIndexFiber.

double OptFiberLocalError::GetNonLinIndexFiber (  )  [inline]

References NonLinIndexFiber.

double OptFiberLocalError::GetNonLinIndexFiber (  )  [inline]

References NonLinIndexFiber.

int OptFiberLocalError::GetNumStepsBetweenScatterings (  )  [inline]
int OptFiberLocalError::GetNumStepsBetweenScatterings (  )  [inline]
int OptFiberLocalError::GetNumStepsBetweenScatterings (  )  [inline]
double OptFiberLocalError::GetSecondOrderDispersion (  )  [inline]

References SndOrDispFiber.

double OptFiberLocalError::GetSecondOrderDispersion (  )  [inline]

References SndOrDispFiber.

double OptFiberLocalError::GetSecondOrderDispersion (  )  [inline]

References SndOrDispFiber.

Referenced by NoiseCovariance::Propagator().

void OptFiberLocalError::OpenStepSizesFile ( string  StepSizesFileName,
int  Mode 
)
void OptFiberLocalError::OpenStepSizesFile ( string  StepSizesFileName,
int  Mode 
)
void OptFiberLocalError::OpenStepSizesFile ( string  StepSizesFileName,
int  Mode 
)
void OptFiberLocalError::Propagate ( double *  PropagatedLength,
int *  ZStepNum 
)
void OptFiberLocalError::Propagate ( double *  PropagatedLength,
int *  ZStepNum 
)

Propagates OptSignal object through an optical fiber.

void OptFiberLocalError::Propagate ( double *  PropagatedLength,
int *  ZStepNum 
)

Propagates OptSignal object through an optical fiber.

void OptFiberLocalError::PropagateConstStepSizeOrWalkOff ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateConstStepSizeOrWalkOff ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateConstStepSizeOrWalkOff ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateLocalError ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateLocalError ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateLocalError ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateOutputPDVector ( double  Freq,
double  theta,
double  phi,
double  psi 
)
void OptFiberLocalError::PropagateOutputPDVector ( double  Freq,
double  theta,
double  phi,
double  psi 
)

Propagates output polarization dispersion vector through a single step of the coarse-step method for PMD.

Input parameters are

  1. Freq: The absolute frequency at which OptFiberLocalError::OutputPDVector is to be computed
  2. theta, phi, psi: The Euler angles of the current step

Algorithm:

Let PDV_{n} denote the polarization dispersion vector after the n-th section in the coarse step method. From Gordon and Kogelnick's review paper on PMD in Proc. Nat. Acad. Sci., we have that

PDV_{n} = DeltaPDV + T_{n} PDV_{n-1}

where DeltaPDV is the PDV due to the n-th section and T_{n} is the matrix which transforms the Stokes vector at the input to the n-th section to the Stokes vector at the output of the n-th section.

For the case we have of a random rotation given by an Euler matrix followed by a birefringence rotation in Stokes space we have

DeltaPDV = -2*b'*2*pi*Freq*ScatteringStepSize, where b' = OptFiberLocalError::GetFreqDerivativeOfBirefringence()

and

T_{n} = R_x(2b'ScatteringStepSize*Freq) R_x(Psi)R_y(-Theta)R_x(Phi)

where the first factor in the product is the birefringence rotation and the other three factors are the rotation by the Euler angles in Stokes space.

At the start of the system (z=0) we have OutputPDVector = (0,0,0) since there DGD = length(OutputPDVector) = 0.

OptFiberLocalError::PropagateOutputPDVector is called by OptFiberLocalError::ComputeEulerMatrixAndUpdateOutputPDVector(int ScatteringSectionIndex) which is called by OptFiberLocalError::PropagateWithPMD().

The method OptSignal::ResetPDVectorOFLE() resets the PDVectors to (0,0,0). This method is called by OptSignal::RegenerateSignalString();

References GetFreqDerivativeOfBirefringence(), OutputPDVector, pi, RotatesAboutX(), RotatesAboutY(), and ScatteringStepSize.

Referenced by ComputeEulerMatrixAndUpdateOutputPDVector().

void OptFiberLocalError::PropagateOutputPDVector ( double  Freq,
double  theta,
double  phi,
double  psi 
)
void OptFiberLocalError::PropagateWithoutPMD ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateWithoutPMD ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateWithoutPMD ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateWithPMD ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateWithPMD ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateWithPMD ( double *  PropagatedLength,
int *  ZStepNum 
) [private]
void OptFiberLocalError::PropagateWithRaman ( double *  PropagatedLength,
int *  ZStepNum,
double  RamanStartingLength2 
)

Propagates OptSignal object through an optical fiber with Raman amplification

References Propagate(), PropagatedLengthStartFiber, and RamanStartingLength.

void OptFiberLocalError::PropagateWithRaman ( double *  PropagatedLength,
int *  ZStepNum,
double  RamanStartingLength2 
)

Propagates OptSignal object through an optical fiber with Raman amplification

void OptFiberLocalError::PropagateWithRaman ( double *  PropagatedLength,
int *  ZStepNum,
double  RamanStartingLength2 
)

Propagates OptSignal object through an optical fiber with Raman amplification

void OptFiberLocalError::RecoverGammaFiber (  ) 

References gamma, gamma_Save, and WithNonLin.

void OptFiberLocalError::RecoverGammaFiber (  ) 
void OptFiberLocalError::RecoverGammaFiber (  ) 
void OptFiberLocalError::RecoverSndOrDispFiber (  ) 
void OptFiberLocalError::RecoverSndOrDispFiber (  ) 
void OptFiberLocalError::RecoverSndOrDispFiber (  ) 
void OptFiberLocalError::ResetVolatileVariables ( void   )  [private]
void OptFiberLocalError::ResetVolatileVariables ( void   )  [private]
void OptFiberLocalError::ResetVolatileVariables ( void   )  [private]
void OptFiberLocalError::SetAttenuationdB ( double  AttenuationFiber2  ) 

Sets optical power attenuation parameter in dB/m.

See also:
AttenuationFiber
void OptFiberLocalError::SetAttenuationdB ( double  AttenuationFiber2  ) 

Sets optical power attenuation parameter in dB/m.

See also:
AttenuationFiber

References AttenuationFiber, ComputeDeltaZMax(), log(), and NepperAttenuationFiber.

Referenced by OptFiberLocalError().

void OptFiberLocalError::SetAttenuationdB ( double  AttenuationFiber2  ) 

Sets optical power attenuation parameter in dB/m.

See also:
AttenuationFiber
void OptFiberLocalError::SetConstantDeltaZ ( double  DeltaZValue  ) 
void OptFiberLocalError::SetConstantDeltaZ ( double  DeltaZValue  ) 
void OptFiberLocalError::SetConstantDeltaZ ( double  DeltaZValue  ) 

References DeltaZ, and LengthFiber.

void OptFiberLocalError::SetDispersion ( double  DispersionFiberRefWavelength,
double  DispSlopeFiberRefWavelength 
)
void OptFiberLocalError::SetDispersion ( double  DispersionFiberRefWavelength,
double  DispSlopeFiberRefWavelength 
)
void OptFiberLocalError::SetDispersion ( double  DispersionFiberRefWavelength,
double  DispSlopeFiberRefWavelength 
)
void OptFiberLocalError::SetFiberAmplifierUnsaturatedNepperGain ( double  FiberAmplifierUnsaturatedNepperGain2  ) 

Enables user to set unsaturated Nepper gain.

References ComputeDeltaZMax(), and FiberAmplifierUnsaturatedNepperGain.

void OptFiberLocalError::SetFiberAmplifierUnsaturatedNepperGain ( double  FiberAmplifierUnsaturatedNepperGain2  ) 

Enables user to set unsaturated Nepper gain.

void OptFiberLocalError::SetFiberAmplifierUnsaturatedNepperGain ( double  FiberAmplifierUnsaturatedNepperGain2  ) 

Enables user to set unsaturated Nepper gain.

void OptFiberLocalError::SetFiberLength ( double  Value  ) 
void OptFiberLocalError::SetFiberLength ( double  Value  ) 
void OptFiberLocalError::SetFiberLength ( double  Value  ) 
void OptFiberLocalError::SetFiberLengthsForPMD ( void   ) 

Sets the lengths of each section in the coarse-step method for propagation with PMD.

We divide the fiber into lengths of size ScatteringStepSize. The method

void OptFiberLocalError::PropagateWithoutPMD(double * PropagatedLength, int * ZStepNum)

will be applied to each section of length OptFiberLocalError::ScatteringStepSize. For each ScatteringStep before calling PropagateWithoutPMD the Signal will undergo a random rotation on the Poincare sphere.

If TotalLengthFiber < ScatteringStepSize

  1. ScatteringStepSize = TotalLengthFiber
  2. NumberScatterings = 1.

If TotalLengthFiber >= ScatteringStepSize

  1. If TotalLengthFiber = NumberScatterings*ScatteringStepSize
    1. LengthFiberExceptLast = LengthFiberLast = ScatteringStepSize
  2. Else
    1. NumberScatterings = floor(TotalLengthFiber/ScatteringStepSize)
    2. LengthFiberExceptLast = ScatteringStepSize;
    3. LengthFiberLast = TotalLengthFiber - NumberScatterings*ScatteringStepSize
    4. NumberScatterings += 1
    5. But if LengthFiberLast < 0.5*ScatteringStepSize we make one less step and make the last step longer.

References AllocateMemoryForEulerAngles(), CONSTANT, DeltaZ, GetNewFiberRealization(), LengthFiber, LengthFiberExceptLast, LengthFiberLast, LogFile, NumberScatterings, NumStepsBetweenScatterings, ScatteringStepSize, TotalLengthFiber, TypeSolver, TypeStepSizes, and VECTOR_MANAKOV_PMD.

Referenced by OptFiberLocalError(), SetFiberLength(), SetNumStepsBetweenScatterings(), SetScatteringStepSize(), and SetTypeStepSizes().

void OptFiberLocalError::SetFiberLengthsForPMD ( void   ) 
void OptFiberLocalError::SetFiberLengthsForPMD ( void   ) 
void OptFiberLocalError::SetFiberRealization ( int  SectionNumber,
double  Theta2,
double  Phi2,
double  Psi2 
)
void OptFiberLocalError::SetFiberRealization ( int  SectionNumber,
double  Theta2,
double  Phi2,
double  Psi2 
)
void OptFiberLocalError::SetFiberRealization ( int  SectionNumber,
double  Theta2,
double  Phi2,
double  Psi2 
)

References NumberScatterings, Phi, Psi, and Theta.

void OptFiberLocalError::SetFstOrDispFiber ( double  FstOrDispFiber2  ) 

Sets First order dispersion, i.e., Beta'', in s^2/m. Note that X ps^2/km = X*1e-27 s^2/m

void OptFiberLocalError::SetFstOrDispFiber ( double  FstOrDispFiber2  ) 

Sets First order dispersion, i.e., Beta'', in s^2/m. Note that X ps^2/km = X*1e-27 s^2/m

void OptFiberLocalError::SetFstOrDispFiber ( double  FstOrDispFiber2  ) 

Sets First order dispersion, i.e., Beta'', in s^2/m. Note that X ps^2/km = X*1e-27 s^2/m

References FstOrDispFiber.

Referenced by PulseEvolutionAnalyzer::LinearlyCompressPulses().

void OptFiberLocalError::SetGammaFiber ( double  gamma2  ) 

Sets nonlinear coefficient gamma in m^(-1)W^(-1). X km^(-1)W^(-1) = X*1e-3 m^(-1)W^(-1)

void OptFiberLocalError::SetGammaFiber ( double  gamma2  ) 

Sets nonlinear coefficient gamma in m^(-1)W^(-1). X km^(-1)W^(-1) = X*1e-3 m^(-1)W^(-1)

void OptFiberLocalError::SetGammaFiber ( double  gamma2  ) 

Sets nonlinear coefficient gamma in m^(-1)W^(-1). X km^(-1)W^(-1) = X*1e-3 m^(-1)W^(-1)

References gamma, gamma_Save, and WithNonLin.

Referenced by OptFiberLocalError().

void OptFiberLocalError::SetMeanDGDPerSqrtLength ( double  MeanDGDPerSqrtLength2  ) 
void OptFiberLocalError::SetMeanDGDPerSqrtLength ( double  MeanDGDPerSqrtLength2  ) 

References MeanDGDPerSqrtLength, pi, PMD, and sqrt().

Referenced by OptFiberLocalError().

void OptFiberLocalError::SetMeanDGDPerSqrtLength ( double  MeanDGDPerSqrtLength2  ) 
void OptFiberLocalError::SetNepperAttenuation ( double  NepperAttenuation2  ) 

Sets linear optical power attenuation parameter in m^(-1). This is attenuation parameter in NLSE and HME (up to a sign)

See also:
AttenuationFiber
NepperAttenuation
void OptFiberLocalError::SetNepperAttenuation ( double  NepperAttenuation2  ) 

Sets linear optical power attenuation parameter in m^(-1). This is attenuation parameter in NLSE and HME (up to a sign)

See also:
AttenuationFiber
NepperAttenuation
void OptFiberLocalError::SetNepperAttenuation ( double  NepperAttenuation2  ) 

Sets linear optical power attenuation parameter in m^(-1). This is attenuation parameter in NLSE and HME (up to a sign)

See also:
AttenuationFiber
NepperAttenuation

References AttenuationFiber, ComputeDeltaZMax(), log(), and NepperAttenuationFiber.

Referenced by OptFiberLocalError().

void OptFiberLocalError::SetNumStepsBetweenScatterings ( int  value  )  [inline]
void OptFiberLocalError::SetNumStepsBetweenScatterings ( int  value  )  [inline]
void OptFiberLocalError::SetNumStepsBetweenScatterings ( int  value  )  [inline]
void OptFiberLocalError::SetOutputStepSizesFlag ( int  OutputStepSizesFlag2  ) 
void OptFiberLocalError::SetOutputStepSizesFlag ( int  OutputStepSizesFlag2  ) 
void OptFiberLocalError::SetOutputStepSizesFlag ( int  OutputStepSizesFlag2  ) 
void OptFiberLocalError::SetPMD ( double  PMD2  ) 
void OptFiberLocalError::SetPMD ( double  PMD2  ) 

References MeanDGDPerSqrtLength, pi, PMD, and sqrt().

Referenced by OptFiberLocalError().

void OptFiberLocalError::SetPMD ( double  PMD2  ) 
void OptFiberLocalError::SetRamanAmpPointer ( RamanAmp oRaman2  ) 

References oRaman.

void OptFiberLocalError::SetRamanAmpPointer ( RamanAmp oRaman2  ) 
void OptFiberLocalError::SetRamanAmpPointer ( RamanAmp oRaman2  ) 
void OptFiberLocalError::SetRelativeErrorGoal ( double  RelativeErrorGoal2  ) 
void OptFiberLocalError::SetRelativeErrorGoal ( double  RelativeErrorGoal2  ) 
void OptFiberLocalError::SetRelativeErrorGoal ( double  RelativeErrorGoal2  ) 

References RelativeErrorGoal.

void OptFiberLocalError::SetScatteringStepSize ( double  Value  ) 
void OptFiberLocalError::SetScatteringStepSize ( double  Value  ) 
void OptFiberLocalError::SetScatteringStepSize ( double  Value  ) 
void OptFiberLocalError::SetSndOrDispFiber ( double  SndOrDispFiber2  ) 

Sets Second order dispersion, i.e., Beta''', in s^3/m. Note that X ps^3/km = X*1e-39 s^2/m

void OptFiberLocalError::SetSndOrDispFiber ( double  SndOrDispFiber2  ) 

Sets Second order dispersion, i.e., Beta''', in s^3/m. Note that X ps^3/km = X*1e-39 s^2/m

void OptFiberLocalError::SetSndOrDispFiber ( double  SndOrDispFiber2  ) 

Sets Second order dispersion, i.e., Beta''', in s^3/m. Note that X ps^3/km = X*1e-39 s^2/m

References SndOrDispFiber, and SndOrDispFiber_Save.

Referenced by PulseEvolutionAnalyzer::LinearlyCompressPulses().

void OptFiberLocalError::SetTypeStepSizes ( int  TypeStepSizes2  ) 
void OptFiberLocalError::SetTypeStepSizes ( int  TypeStepSizes2  ) 
void OptFiberLocalError::SetTypeStepSizes ( int  TypeStepSizes2  ) 
void OptFiberLocalError::SetWalkOffParameter ( double  WalkOffParameter2  ) 
void OptFiberLocalError::SetWalkOffParameter ( double  WalkOffParameter2  ) 

References WalkOffParameter.

void OptFiberLocalError::SetWalkOffParameter ( double  WalkOffParameter2  ) 
void OptFiberLocalError::SetWriteAveragePowerdBmFlag ( int  Value  ) 
void OptFiberLocalError::SetWriteAveragePowerdBmFlag ( int  Value  ) 
void OptFiberLocalError::SetWriteAveragePowerdBmFlag ( int  Value  ) 
void OptFiberLocalError::SetWritePulseWidthFlag ( int  Value  )  [inline]
void OptFiberLocalError::SetWritePulseWidthFlag ( int  Value  )  [inline]

References WritePulseWidthFlag.

void OptFiberLocalError::SetWritePulseWidthFlag ( int  Value  )  [inline]

References WritePulseWidthFlag.

void OptFiberLocalError::UpdateAccumulatedFirstOrderDispersion ( double  StepSize  )  [private]
void OptFiberLocalError::UpdateAccumulatedFirstOrderDispersion ( double  StepSize  )  [private]
void OptFiberLocalError::UpdateAccumulatedFirstOrderDispersion ( double  StepSize  )  [private]
void OptFiberLocalError::UpdateAccumulatedSecondOrderDispersion ( double  StepSize  )  [private]
void OptFiberLocalError::UpdateAccumulatedSecondOrderDispersion ( double  StepSize  )  [private]
void OptFiberLocalError::UpdateAccumulatedSecondOrderDispersion ( double  StepSize  )  [private]

Referenced by PropagateLocalError().

void OptFiberLocalError::UpdateFreq ( void   )  [inline, private]
void OptFiberLocalError::UpdateFreq ( void   )  [inline, private]
void OptFiberLocalError::UpdateFreq ( void   )  [inline, private]
void OptFiberLocalError::UpdateJonesMatrixAfterBiregringence ( double  StepSizeZ  ) 
void OptFiberLocalError::UpdateJonesMatrixAfterBiregringence ( double  StepSizeZ  ) 
void OptFiberLocalError::UpdateJonesMatrixAfterBiregringence ( double  StepSizeZ  ) 
void OptFiberLocalError::UpdateTime ( void   )  [inline, private]
void OptFiberLocalError::UpdateTime ( void   )  [inline, private]
void OptFiberLocalError::UpdateTime ( void   )  [inline, private]
void OptFiberLocalError::WriteAveragePowerdBm ( double  PropagatedLength2  ) 
void OptFiberLocalError::WriteAveragePowerdBm ( double  PropagatedLength2  ) 
void OptFiberLocalError::WriteAveragePowerdBm ( double  PropagatedLength2  ) 
void OptFiberLocalError::WriteStepSizes ( double  PropagatedLength  ) 
void OptFiberLocalError::WriteStepSizes ( double  PropagatedLength  ) 
void OptFiberLocalError::WriteStepSizes ( double  PropagatedLength  ) 
string OptFiberLocalError::WriteTypeFiberAmplifierGain ( void   ) 
string OptFiberLocalError::WriteTypeFiberAmplifierGain ( void   ) 
string OptFiberLocalError::WriteTypeFiberAmplifierGain ( void   ) 
string OptFiberLocalError::WriteTypeFiberAmplifierNoise ( void   ) 
string OptFiberLocalError::WriteTypeFiberAmplifierNoise ( void   ) 
string OptFiberLocalError::WriteTypeFiberAmplifierNoise ( void   ) 
string OptFiberLocalError::WriteTypeFiberLossGain ( void   ) 
string OptFiberLocalError::WriteTypeFiberLossGain ( void   ) 
string OptFiberLocalError::WriteTypeFiberLossGain ( void   ) 
string OptFiberLocalError::WriteTypeSolver ( void   ) 
string OptFiberLocalError::WriteTypeSolver ( void   ) 
string OptFiberLocalError::WriteTypeSolver ( void   ) 
string OptFiberLocalError::WriteTypeStepSizes ( void   ) 
string OptFiberLocalError::WriteTypeStepSizes ( void   ) 
string OptFiberLocalError::WriteTypeStepSizes ( void   ) 

Member Data Documentation

The fiber optical power attenuation (or gain) parameter in dB/m.

This parameter plays several differetn rols depending on the context.

  • If TypeFiberLossGain == LOSSY_FIBER this is the fiber attenuation
  • If TypeFiberLossGain == FIBER_AMPLIFIER and TypeFiberAmplifierGain == FIBER_AMP_UNSATURATED_FLAT_GAIN this is the negative of the fiber gain.
  • If TypeFiberLossGain == FIBER_AMPLIFIER and TypeFiberAmplifierGain == FIBER_AMP_SATURABLE_SUPERGAUSSFILT_GAIN this is the attenuation, which we include to implement Haus's Master Equation with distributed gain and loss.

This parameter plays several differetn rols depending on the context.

  • If TypeFiberLossGain == LOSSY_FIBER this is the fiber attenuation
  • If TypeFiberLossGain == FIBER_AMPLIFIER and TypeFiberAmplifierGain == FIBER_AMP_UNSATURATED_FLAT_GAIN this is the negative of the fiber gain.
  • If TypeFiberLossGain == FIBER_AMPLIFIER and TypeFiberAmplifierGain == FIBER_AMP_SATURABLE_PARABOLIC_GAIN this is the attenuation, which we include to implement Haus's Master Equation with distributed gain and loss.

Referenced by OptFiberLocalError(), SetAttenuationdB(), and SetNepperAttenuation().

double OptFiberLocalError::DeltaZ [private]

The step size taken in each step.

For the LOCAL_ERROR methods DeltaZ is the size of a coarse step The solution is actually the one taken using the fine steps of size DeltaZ/2.

Referenced by GetDeltaZ(), OptFiberLocalError(), PropagateLocalError(), PropagateWithPMD(), SetConstantDeltaZ(), SetFiberLengthsForPMD(), and WriteStepSizes().

Used to set initial step size for the fiber when using Local Error method.

Referenced by OptFiberLocalError(), PropagateLocalError(), and PropagateWithPMD().

Flag that controls when to recompute DispersionOperator.

We only compute the DispersionOperator at the start of each call to the PropagateLocalError() and PropagateWalkOffOrConst() methods and if DeltaZ changes. At the start of these methods and whenever DeltaZ changes we set DispersionOperatorValid = false.

Referenced by ComputeDispersionOperator(), ComputeWalkOffStepSize(), PropagateLocalError(), and ResetVolatileVariables().

Referenced by GetDispersion(), and SetDispersion().

Internal variable that is set to 1 whenever FastSaturableAbsorptionCoefficient is nonzero

Referenced by ApplyTimeDomainOperator(), and OptFiberLocalError().

Input variable used in method ApplyTimeDomainOperator.

Flag to do time operator exactly by multiplying by exp(arg) rather than by approximating exp(arg) by a 4th-order Taylor polynomial. Input variable used in method ApplyTimeDomainOperator.

In constructor we set DoTimeOperatorExactlyFlag = 1 when DoFastSaturableAbsorptionFlag == 1. (Could change this)

Referenced by ApplyKerrNonlinearityOperator(), and OptFiberLocalError().

Referenced by OptFiberLocalError().

Referenced by GetEulerMatrix().

Coefficient for FastSaturableAbsorption.

Coefficient in Haus's master equation for fast saturable absorption.

In case TypeFastSaturableAbsorption is QUADRATIC or QUADRATIC_ANALYTIC we add a term of the form

u_z = FastSaturableAbsorptionCoefficient*|u|^2*u

to the standard NLS. FastSaturableAbsorptionCoefficient should be positive and is typically a small compared to the nonlinear Kerr coefficient, gamma.

Flag to do time operator exactly by multiplying by exp(arg) rather than by approximating exp(arg) by a 4th-order Taylor polynomial

We add a term of the form

u_z = FastSaturableAbsorptionCoefficient*|u|^2*u

to the standard NLS. FastSaturableAbsorptionCoefficient should be positive and is typically a small compared to the nonlinear Kerr coefficient, gamma.

Referenced by ApplyFastSaturableAbsorptionQuadraticAnalytic(), FastSaturableAbsorptionFunction(), and OptFiberLocalError().

Used to control maximum step size for saturable gain.

Referenced by ComputeDeltaZMax(), and OptFiberLocalError().

The max step size for a fiber amplifier.

When TypeFiberLossGain = FIBER_AMPLIFIER and TypeFiberAmplifierNoise != FIBER_AMP_NOISE_OFF the max step size is given by

DeltaZMax = FiberAmplifierNoiseMaxStepSizeFactor/(abs(NepperAttenuationFiber))

Default value is FiberAmplifierNoiseMaxStepSizeFactor = 0.1

See also:
enum typeFiberAmplifierNoise
double FiberAmplifierGainSaturationMaxGainPerStep

Referenced by ComputeDeltaZMax(), and OptFiberLocalError().

ParaboicGainCoefficient for FiberAmplifier. See enum typeFiberAmplifierGain.

Referenced by ComputeFreqDomainOperator().

Internal parameter for FiberAmplifier with saturable gain.

Referenced by ComputeFreqDomainOperator(), FiberAmplifierComputeNoiseAmplitudeFactor(), FiberAmplifierComputeSaturableGain(), and WriteStepSizes().

Saturation energy in Joules for saturable gain FiberAmplifier

See also:
enum typeFiberAmplifierGain

Referenced by FiberAmplifierComputeSaturableGain(), FiberAmplifierComputeSaturableGainForHeunsMethod(), and OptFiberLocalError().

The spontaneous emission factor when TypeFiberLossGain = FIBER_AMPLIFIER and TypeFiberAmplifierNoise != NO_NOISE

Referenced by FiberAmplifierComputeNoiseAmplitudeFactor(), and OptFiberLocalError().

SuperGaussFiltGainCoefficient for FiberAmplifier. Determines filter width. See enum typeFiberAmplifierGain.

Referenced by ApplySaturableGainOperator(), and OptFiberLocalError().

SuperGaussFiltOrder for FiberAmplifier. Value of 1 gives standard Gaussian filtering. The higher the value, the more flat-topped the filter.

Referenced by ApplySaturableGainOperator(), and OptFiberLocalError().

Flag that controls when to recompute FreqDomainOperator.

We only compute the FreqDomainOperator at the start of each call to the PropagateLocalError() and PropagateWalkOffOrConst() methods and if DeltaZ changes. At the start of these methods and whenever DeltaZ changes we set FreqDomainOperatorValid = false.

Referenced by ComputeFreqDomainOperator().

Referenced by OptFiberLocalError().

double OptFiberLocalError::gamma [private]

Referenced by RecoverGammaFiber(), and SetGammaFiber().

string OptFiberLocalError::Job [private]
double OptFiberLocalError::MaxPower [private]

Referenced by ComputeMaxPower(), and WriteStepSizes().

The fiber optical power attenuation (or gain) parameter in m^(-1) The terms of the NLS or Master equation that involve this parameter are of the form u_z = -0.5*NepperAttenuationFiber*u

Referenced by ComputeDeltaZMax(), ComputeDispersionOperator(), FiberAmplifierComputeNoiseAmplitudeFactor(), GetNepperAttenuationFiber(), OptFiberLocalError(), Propagate(), SetAttenuationdB(), and SetNepperAttenuation().

double * OptFiberLocalError::PDVectorHai [private]

Referenced by GetDGD(), and OptFiberLocalError().

double * OptFiberLocalError::Phi [private]
double OptFiberLocalError::PMD [private]
double * OptFiberLocalError::Psi [private]

Referenced by OptFiberLocalError().

Set to 1 if want the scalar NLS solver to have 8/9 factor with nonlinearity, Set to 0 if want factor of 1. The factor of 8/9 is appropriate when you are modeling fiber with rapidly and randomly varying birefringence but in which the the characteristic length over which PMD becomes important is larger than the system length so that one can use a scalar model. The equation with the 8/9 factor in it is a scalar reduction of the vector Manakov-PMD equation. See Menyuk, J. Eng. Math. Vol 36, pp 113-136, 1999, and in particular p 132 of that paper. Also see Wai Menyuk and Chen, Optics Letters Vol 16 No 16, 1991 p 1231-1233; Wai and Menyuk, JLT Vol 14 No 2, 1996 pp 148-157, especially pages 154-155; and Marcuse Menyuk and Wai, JLT Vol 15 No 9 1997, pp 1735-1746. The factor 1 is appropriate when are modeling fiber with zero birefringence.

Referenced by ApplyKerrNonlinearityOperator(), and OptFiberLocalError().

If true read in FstOrDispFiber and SndOrDispFiber from infile rather than reading in Dispersion and DispersionSlope at Ref Freq.

Referenced by OptFiberLocalError(), and SetDispersion().

double * OptFiberLocalError::Theta [private]

Referenced by ComputeWalkOffStepSize().

Referenced by ComputeWalkOffStepSize().

Referenced by ComputeWalkOffStepSize().

Flag that takes value 1 if at least one of NonLinIndex or FastSaturableAbsorptionCoefficient is nonzero

Referenced by OptFiberLocalError(), PropagateLocalError(), RecoverGammaFiber(), and SetGammaFiber().


The documentation for this class was generated from the following files: