GNLSE.GNLSE — Module
GNLSENumerical 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)
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 / Model | Description | Reference Module |
|---|---|---|
| Chromatic dispersion | Taylor 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 scattering | Delayed silica response (Blow–Wood, Lin–Agrawal, Hollenbeck) | BlowWood, Hollenbeck |
| Self-steepening | Frequency-dependent shock term $\gamma \omega / \omega_0$ | SimParams |
| Commercial Fiber Catalog | Built-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 PCF | Marcatili-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 / Vectorial | Coupled GNLSE: SPM + XPM + coherent FWM across fast and slow axes | BirefringentMedium, VectorialPulse |
| Cascaded System Dynamics | Multi-stage propagation & lumped element processing (Amplifier, Attenuator, Filter) | LumpedElement, solve |
Solvers
| Solver | Type | Description |
|---|---|---|
ERK4IP | Adaptive | Embedded Runge–Kutta 4(3) in the Interaction Picture (default) |
SSFM | Fixed-step | Symmetric Split-Step Fourier Method |
AdaptiveSSFM | Adaptive | Phase-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
- Physics Background
- Basic Usage Guide
- Dispersion Models
- Raman Scattering Models
- Wavelength-Dependent Nonlinearity
- Cascaded Propagation & Piping
- Birefringent & Vectorial Propagation
- Commercial Fiber Library & Glass Presets
- Active Amplifying Fibers (EDFA / YDFA / TDFA)
- Gas-Filled Hollow-Core PCF & Molecular Raman
- Semiconductor Waveguides & Silicon Photonics
- Noise and Stochastic Modeling
- Examples Overview & Literature Benchmarks
- Medium
- Grid
- Pulses
- Solvers
- Dispersion
- Nonlinearity Models
- Raman Models
- Lumped Elements
- Commercial Fibers & Glass Presets
- Analysis Functions