GNLSE.GNLSEModule
GNLSE

Numerical solver for the Generalized Nonlinear Schrödinger Equation (GNLSE) following gnlse-python conventions for optical pulse propagation in nonlinear dispersive media.

Physical Effects

  • Dispersion: Arbitrary-order Taylor expansion β₂, β₃, β₄, ... [ps^n/m]
  • Kerr nonlinearity: Self-phase modulation, γ|A|² [1/(W·m)]
  • Raman scattering: Delayed nonlinear response (BlowWood, LinAgrawal, Hollenbeck models)
  • Self-steepening: Shock term for sub-100 fs pulses
  • Fiber loss: α(ω) [dB/m]

Solvers

  • solve(): Adaptive ERK4IP (embedded RK4 in interaction picture) following gnlse-python

Units

Natural SI units throughout:

  • Time: s (seconds)
  • Wavelength: m (meters)
  • Frequency: rad/s
  • Power: W (watts)
  • Distance: m (meters)
  • Dispersion: s^n/m
  • Nonlinearity: 1/(W·m)
  • Loss: dB/m

Usage

using GNLSE

# Define grid (natural SI units)
grid = create_grid(2^13, 12.5e-12, 835e-9)  # resolution, time_window [s], λ [m]

# Define medium: Medium(L[m], γ[1/W/m], loss[dB/m], betas[sⁿ/m], λ[m])
medium = Medium(0.15, 0.11, 0.0, [-11.83e-27], 835e-9)

# Create pulse
pulse = sech_pulse(grid, 10000.0, 50e-15)  # Pmax [W], FWHM [s]

# Setup parameters
params = SimParams(; medium=medium, z_saves=200, raman_model=BlowWood())

# Solve
solution = solve(pulse, params)

Main Exports

Types: Medium, Grid, Pulse, SimParams, Solution, RamanModel, BlowWood, LinAgrawal, Hollenbeck, SellmeierDispersion

Pulses: sech_pulse, gaussian_pulse, lorentzian_pulse, cw_pulse

Grids: create_grid

Solvers: solve

Physics: dispersion_operator, raman_response, build_physics_model

References

Adapted from gnlse-python (https://github.com/WUST-FOG/gnlse-python) G. P. Agrawal, "Nonlinear Fiber Optics" (Academic Press, 2019)

source

GNLSE.jl

Generalized Nonlinear Schrödinger Equation solver in Julia


GNLSE.jl is a high-performance Julia package for simulating the propagation of ultrashort optical pulses in nonlinear dispersive media such as optical fibers, waveguides, and birefringent media.

It implements the Generalized Nonlinear Schrödinger Equation (GNLSE) in natural SI units, with a rich physical model and a modern, composable API.

Physical Effects & Capabilities

Feature / ModelDescriptionReference Module
Chromatic dispersionTaylor expansion ($\beta_2, \beta_3, \dots$), tabulated, or Sellmeier glass presets (FusedSilica, SF6, SF57)TaylorDispersion, Sellmeier
Kerr nonlinearity (SPM)Self-phase modulation ($i \gamma |A|^2 A$)Medium
Raman scatteringDelayed silica response (Blow–Wood, Lin–Agrawal, Hollenbeck)BlowWood, Hollenbeck
Self-steepeningFrequency-dependent shock term $\gamma \omega / \omega_0$SimParams
Commercial Fiber CatalogBuilt-in presets (Corning_SMF28, NKT_NL_PM_750, Thorlabs_PM780, etc.)commercial_fiber
Active Amplifiers (EDFA/YDFA)Dynamic gain saturation $g(z)$ & quantum ASE noise seeding ($F_{\text{dB}}$)AmplifyingMedium
Gas Hollow-Core PCFMarcatili-Schmeltzer capillary model, noble & molecular gas Raman ($\text{H}_2, \text{N}_2$)HollowCoreFiber, MolecularRamanGas
Silicon Photonics (PICs)Two-Photon Absorption (TPA $\alpha_2$), Free-Carrier Absorption (FCA), & Refraction (FCR)SemiconductorMedium
Birefringence / VectorialCoupled GNLSE: SPM + XPM + coherent FWM across fast and slow axesBirefringentMedium, VectorialPulse
Cascaded System DynamicsMulti-stage propagation & lumped element processing (Amplifier, Attenuator, Filter)LumpedElement, solve

Solvers

SolverTypeDescription
ERK4IPAdaptiveEmbedded Runge–Kutta 4(3) in the Interaction Picture (default)
SSFMFixed-stepSymmetric Split-Step Fourier Method
AdaptiveSSFMAdaptivePhase-controlled adaptive Split-Step Fourier Method

Installation

using Pkg
Pkg.add("GNLSE")

Or from the GitHub repository:

Pkg.add(url="https://github.com/brian-sinquin/GNLSE.jl")

Quick Start

using GNLSE

# 1. Define time-frequency grid
grid = create_grid(2^13, 12.5e-12, 835e-9)

# 2. Select commercial fiber or custom medium
medium = commercial_fiber("Corning_SMF28"; length=1.0, lambda0=1550e-9)

# 3. Generate initial pulse
pulse = sech_pulse(grid, 100.0, 100e-15)

# 4. Solve GNLSE
sol = solve(pulse, SimParams(; medium=medium, raman_model=BlowWood()))

Documentation Contents