Nonlinearity Models
GNLSE.NonlinearityModel — Type
NonlinearityModelAbstract base type for nonlinearity models.
GNLSE.ConstantNonlinearity — Type
ConstantNonlinearity(gamma)Constant nonlinear coefficient γ [1/(W·m)].
GNLSE.FrequencyDependentNonlinearity — Type
FrequencyDependentNonlinearity(gamma_func)Frequency-dependent nonlinear coefficient where gamma_func(w) takes absolute angular frequency w [rad/s] and returns γ [1/(W·m)].
GNLSE.NonlinearityFromEffectiveArea — Type
NonlinearityFromEffectiveArea(n2, Aeff_func)Nonlinearity calculated from nonlinear index n₂ [m²/W] and a frequency-dependent effective mode area. Aeff_func takes absolute frequency w [rad/s] and returns mode area A_eff [m²].
GNLSE.build_physics_model — Function
build_physics_model(grid::Grid, params::SimParams, [template::AbstractArray])Construct PhysicsModel with pre-computed operators for GNLSE propagation.
Pre-computes all frequency-domain operators, FFT plans, and selects the appropriate nonlinear function. Called once at start of solve() to enable zero-allocation propagation in the ERK4IP stepper.
Arguments
grid: Time-frequency gridparams: Simulation parameters (medium, physics flags)
Returns
PhysicsModel struct ready for propagation
Implementation Details
- FFT plans use FFTW with FFTW.MEASURE flag for optimization
- Dispersion operator computed via
dispersion_operator(grid, medium) - Raman response computed in time domain then FFT'd to frequency domain
- Self-steepening: folded into
W(ω₀+Δω if enabled, else constant ω₀) - Nonlinear function selected via
choose_nonlinear_term(raman)
See also
build_physics_model(grid::Grid, params::SimParams{S, <:AmplifyingMedium}, [template])Construct PhysicsModel for active amplifying fiber propagation with gain saturation & ASE.
build_physics_model(grid::Grid, params::SimParams{S, <:SemiconductorMedium}, [template])Construct PhysicsModel for semiconductor waveguides (TPA & Free-Carrier Dynamics).
build_physics_model(grid::Grid, params::SimParams{S, <:BirefringentMedium}, [template::AbstractMatrix])Construct PhysicsModel for Coupled GNLSE propagation.
GNLSE.step_index_aeff — Function
step_index_aeff(core_radius_m::Real, NA::Real, lambda_m::Real) -> Float64Calculate the effective mode area A_eff(λ) [m²] for a step-index single-mode fiber using the Marcuse empirical Gaussian mode-field radius formula:
V(λ) = (2π a / λ) · NA
w(λ) = a · (0.65 + 1.619 / V^1.5 + 2.879 / V^6)
A_eff(λ) = π w(λ)²Reference: D. Marcuse, "Loss analysis of single-mode fiber splices," Bell Syst. Tech. J. 56, 703-718 (1977).
GNLSE.MarcuseAeff — Type
MarcuseAeff(core_radius_m::Real, NA::Real)Callable object representing a wavelength-dependent mode area A_eff(ω) [m²] based on Marcuse's model.
Raman Models
GNLSE.RamanModel — Type
RamanModelAbstract base type for Raman response models.
GNLSE.BlowWood — Type
BlowWood <: RamanModelSingle Lorentzian Raman response model from K. J. Blow & D. Wood.
Parameters (SI units):
- fr = 0.18: Raman fraction
- τ₁ = 12.2 fs
- τ₂ = 32 fs
Reference: K. J. Blow & D. Wood, IEEE J. Quantum Electron. 25, 2665 (1989)
GNLSE.LinAgrawal — Type
LinAgrawal <: RamanModelThree-component Raman model from Q. Lin & G. P. Agrawal.
Parameters (SI units):
- fr = 0.245: Raman fraction
- τ₁ = 12.2 fs
- τ₂ = 32 fs
- τb = 96 fs
- fb = 0.21
- fc = 0.04
Reference: Q. Lin & G. P. Agrawal, Opt. Lett. 31, 3086 (2006)
GNLSE.Hollenbeck — Type
Hollenbeck <: RamanModel13-oscillator Raman model from D. Hollenbeck & C. D. Cantrell.
Parameters:
- fr = 0.20: Raman fraction
Reference: D. Hollenbeck & C. D. Cantrell, J. Opt. Soc. Am. B 19, 2886 (2002)
GNLSE.raman_response — Function
raman_response(T::Vector{Float64}, model::BlowWood)Compute Raman response following gnlse-python raman_blowwood.
Arguments
T::Vector{Float64}: Time vector [s]model::BlowWood: Raman model with parameters
Returns
(fr, RT): Raman fraction and response function
Physics
Following gnlse-python raman_blowwood:
tau1 = 0.0122 # ps
tau2 = 0.032 # ps
ha = (tau1**2 + tau2**2) / tau1 / (tau2**2) * exp(-T/tau2) * sin(T/tau1)
RT = ha
RT[T < 0] = 0
fr = 0.18Reference: K. J. Blow & D. Wood, IEEE J. Quantum Electron. 25, 2665 (1989)
raman_response(T::Vector{Float64}, model::LinAgrawal)Compute Raman response following gnlse-python raman_linagrawal.
Arguments
T::Vector{Float64}: Time vector [s]model::LinAgrawal: Raman model with parameters
Returns
(fr, RT): Raman fraction and response function
Physics
Following gnlse-python raman_linagrawal:
tau1 = 0.0122 # ps
tau2 = 0.032 # ps
taub = 0.096 # ps
fb = 0.21
fc = 0.04
fa = 1 - fb - fc
# Anisotropic response
ha = (tau1**2 + tau2**2) / tau1 / (tau2**2) * exp(-T/tau2) * sin(T/tau1)
# Isotropic response
hb = (2*taub - T) / (taub**2) * exp(-T/taub)
# Total response
RT = (fa + fc) * ha + fb * hb
RT[T < 0] = 0
fr = 0.245Reference: Q. Lin & G. P. Agrawal, Opt. Lett. 31, 3086 (2006)
raman_response(T::Vector{Float64}, model::Hollenbeck)Compute Raman response following D. Hollenbeck & C. D. Cantrell's 13-oscillator fit.
Arguments
T::Vector{Float64}: Time vector [s]model::Hollenbeck: Raman model with Raman fraction fr
Returns
(fr, RT): Raman fractionfrand impulse responseRT(t)[1/s]
Physics
The Hollenbeck model combines 13 Lorentzian resonances with Gaussian spectral broadening to fit experimental Raman gain/loss data from silica fiber:
h(ω) = Σ Aᵢ [Lorentzian(ω - ωᵢ, Γᵢ) ⊗ Gaussian(ΔGᵢ)]Each resonance is parametrized by:
- CP: center position [cm⁻¹]
- A: peak amplitude (relative units)
- Gauss: Gaussian FWHM [cm⁻¹]
- Lorentz: Lorentzian FWHM [cm⁻¹]
The model is converted to the time domain and normalized by the Raman fraction fr (set to 0.20 by default), which represents the fractional power transfer into the Raman-shifted component.
Reference: D. Hollenbeck & C. D. Cantrell, J. Opt. Soc. Am. B 19, 2886 (2002)
raman_response(T::Vector{Float64}, model::MolecularRamanGas)Compute Raman impulse response for molecular gases (H₂, N₂).
raman_response(grid::Grid, model::RamanModel)Convenience wrapper that extracts time vector from grid.
Arguments
grid::Grid: Grid with time vector Tmodel::RamanModel: Raman model
Returns
(fr, RT): Raman fraction and response function