Multimode (few-mode) coupled GNLSE¶
Split-step Fourier solver for N coupled modal channels: per-mode dispersion and group delay, LP/isotropic SPM-XPM coefficients, opt-in pump-driven inter-modal FWM with angular-momentum gating. Docstrings are the source of truth, rendered with mkdocstrings (numpydoc style). See multimode GNLSE for the physics and references.
photonics_helper.multimode_gnlse ¶
Multimode (few-mode fiber) coupled GNLSE.
Split-step Fourier solver for N simultaneously-guided spatial modes:
structured.py gives static LG/OAM portraits; this module propagates
their modal envelopes nonlinearly.
Model (all channels coupled through one shared scalar γ):
- linear: per-mode Taylor dispersion
β_k^(m), shared scalar losse^{−α dz/2}, and modal group delay (walk-off in the retarded frame of channel 0); - nonlinear SPM/XPM with a selectable coefficient set — degenerate
linearly-polarized (LP) spatial modes: SPM
1, XPM2/3(Agrawal §6.4 LP limit) — or the isotropic all-ones model (Manakov-like, for randomly-coupled bases); - opt-in inter-modal four-wave mixing
iγ·f·A_n A_p A_q*(RK4IP frequency-domain substep, Strang-split around the diagonal phase), restricted by angular momentum conservationℓ_m = ℓ_n + ℓ_p − ℓ_qwhen OAM indices are supplied; - optional pump depletion: the full Manley–Rowe-consistent exchange
(creation arms
+iγ f A_n²A_q*/+iγ f A_n²A_m*and the back-conversion pump arm+2iγ f* A_m A_q A_n*), which conservesΣ|A|²to RK4 round-off (Mumtaz Eq. 6 three-recoupling structure); - optional mode-specific nonlinear overlap weights (Mumtaz Eq. 8 /
Poletti & Horak Eq. 7):
xpm_weights(N×N, SPM/XPM slot) andfwm_weights(N×N×N×N, FWM slot) override the uniformcoef_modelfactors mode-pair-wise.
The degenerate two-channel strip-down of this engine is the variety
implemented in :mod:photonics_helper.vector_gnlse (the two polarization
axes of one mode); the multimode engine generalizes the same machinery to
arbitrary mode counts.
References
G. P. Agrawal, Nonlinear Fiber Optics, 5th ed. §6.4 (scalar XPM 2/3, FWM);
M. Poletti & P. Horak, "Description of ultrashort pulse propagation in
multimode optical fibers," J. Opt. Soc. Am. B 25, 1645 (2008),
doi:10.1364/JOSAB.25.001645 (vector modal equations, overlap tensors,
photon-number conservation Eq. 15); S. Mumtaz, R.-J. Essiambre & G. P.
Agrawal, "Nonlinear propagation in multimode and multicore fibers:
generalization of the Manakov equations," J. Lightwave Technol. 31, 398
(2013), doi:10.1109/JLT.2012.2235414 (Eq. 6/8: f_lmnp overlap tensor,
γ/3 coherent mixing + 2γ/3 SPM/XPM structure; arXiv:1207.6645);
L. G. Wright et al., Nat. Commun. 6, 6682 (2015) (resonant inter-modal
FWM).
MultimodeSplitStepEngine ¶
MultimodeSplitStepEngine(waves, fiber: FiberProfile, betas, *, betas_unit: BetasUnit = 'ps^k/m', group_delays: list[float] | None = None, phase_offsets: list[float] | None = None, coef_model: CoeffModel = 'lp_degenerate', include_fwm: bool = False, oam_l: list[int] | None = None, xpm_weights=None, fwm_weights=None, fwm_pump_depletion: bool = False, step_size: Length | None = None)
Split-step engine for N coupled modal channels (few-mode GNLSE).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
waves
|
sequence of Wave
|
One input envelope per guided mode. All channels must share one
:class: |
required |
fiber
|
FiberProfile
|
Shared scalar parameters ( |
required |
betas
|
array_like or sequence of array_like
|
Taylor coefficients |
required |
betas_unit
|
BetasUnit
|
Unit of the dispersion coefficients. Default |
'ps^k/m'
|
group_delays
|
list[float] | None
|
Modal group delay |
None
|
phase_offsets
|
sequence of float
|
Modal propagation-constant offset |
None
|
coef_model
|
('lp_degenerate', 'isotropic')
|
Nonlinear coefficients:
|
"lp_degenerate"
|
include_fwm
|
bool
|
Opt-in inter-modal four-wave mixing. Default False — the standard averaged few-mode model keeps only SPM/XPM (the heterodyne FWM beats wash out over the group-delay walk-off in real fiber). |
False
|
oam_l
|
sequence of int
|
OAM azimuthal order ℓ of each channel. When supplied (and FWM is
on) FWM triples are restricted to This gate is the Poletti & Horak Eq. (18) type-2 spatial
selection rule, not merely an approximation of it: their Two caveats:
|
None
|
xpm_weights
|
array_like
|
Mode-specific SPM/XPM overlap weights (Mumtaz Eq. 8 style), an
|
None
|
fwm_weights
|
array_like
|
Mode-specific FWM overlap weights, an |
None
|
fwm_pump_depletion
|
bool
|
Include the Manley–Rowe-consistent back-conversion pump arm
|
False
|
step_size
|
Length | None
|
Fixed step size (m); |
None
|
group_delays
instance-attribute
¶
group_delays = None if group_delays is None else list(group_delays)
phase_offsets
instance-attribute
¶
phase_offsets = None if phase_offsets is None else list(phase_offsets)
xpm_weights
instance-attribute
¶
xpm_weights = None if xpm_weights is None else np.asarray(xpm_weights, dtype=float).copy()
fwm_weights
instance-attribute
¶
fwm_weights = None if fwm_weights is None else np.asarray(fwm_weights, dtype=float).copy()
spectra_vs_z
property
¶
spectra_vs_z: tuple[NDArray, NDArray]
(ω [rad/s], total summed spectrum over all channels) per snapshot.
propagate ¶
propagate(num_steps: int, *, nsaves: int | None = None, show_progress: bool = False) -> None
Run the split-step propagation for num_steps steps.
Snapshot semantics match the scalar engine: nsaves evenly
spaced snapshots (including z=0 and z=L), every step when
nsaves=None; a total-photon-number monitor warns on >5% drift
in lossless runs.
fields_vs_z ¶
fields_vs_z() -> list[NDArray]
Complex field histories: one (n_saves, N) array per channel.
nonlinear_phase_measure ¶
nonlinear_phase_measure(m: int) -> float
Nonlinear phase of channel m measured against its own input CW.
Returns arg(A_m(t₀, z) / A_m(t₀, 0)) at the last snapshot for
CW or constant-amplitude inputs.