Vector (polarization-coupled) GNLSE¶
Split-step Fourier solver for the coupled two-polarization GNLSE: per-axis dispersion, XPM + coherent polarization FWM, differential group delay, the Manakov (8/9) polarization-averaged mode, and a random-birefringence engine that converges to the Manakov model. Docstrings are the source of truth, rendered with mkdocstrings (numpydoc style). See Vector GNLSE for the physics and model.
photonics_helper.vector_gnlse ¶
Vector (polarization-coupled) GNLSE solver.
Split-step Fourier solver for the coupled GNLSE on two polarization
components. The scalar :class:~photonics_helper.gnlse.SplitStepEngine
models one linearly-polarized channel; the physics that only exists when
the field is genuinely the two-component vector A = (A_x, A_y) lives
here:
- birefringent propagation — per-axis Taylor dispersion and differential group delay (polarization walk-off);
- cross-phase modulation — the
2/3anisotropy coefficient of the degenerate linearly-polarized mode pair; - coherent polarization FWM — the
(i/3)γ A⊥²A*mixing term with the birefringence phase mismatchΔβ(opt-in; it oscillates away in real high-birefringence fiber); - Manakov averaging — the
8/9polarization-averaged nonlinearity (Wai & Menyuk 1996), with a random-birefringence engine that applies the local nonlinear step in a randomly rotated polarization frame.
Scalar-limit contract: with A_y ≡ 0, coupling="incoherent" and
identical split-step structure, this engine reduces to the scalar
:class:~photonics_helper.gnlse.SplitStepEngine to machine precision
(enforced by the test suite), so the scalar engine remains the tool of
record for the single-mode/single-polarization regime and all validated
scalar reproductions are unaffected.
Physics scope (v1)
- Raman uses the scalar per-channel response
P_j = (1−f_R)|A_j|² + f_R h_R ⊛ |A_j|²; the full vector Raman response (Lin & Agrawal, Opt. Lett. 31, 3086 (2006)) is future work. - Self-steepening, TPA and free carriers are scalar-engine features and raise a clear error when requested here.
- Fixed-step propagation (
num_steps/step_size), like the scalar engine's deterministic paths.
References
G. P. Agrawal, Nonlinear Fiber Optics, 5th ed., §6.1–6.3 (coupled GNLSE); P. K. A. Wai & C. R. Menyuk, J. Lightw. Technol. 14, 148 (1996) (random evolution and the Manakov model); C. Marcos Marcos, de Sterke & Sipe et al., Opt. Express 19, 553 (2011).
VectorSplitStepEngine ¶
VectorSplitStepEngine(pulse_x: Wave, pulse_y: Wave, fiber: FiberProfile, betas: NDArray | None = None, *, betas_x: NDArray | None = None, betas_y: NDArray | None = None, betas_unit: BetasUnit = 'ps^k/m', coupling: Coupling = 'incoherent', delta_beta: float = 0.0, walkoff: float = 0.0, include_raman: bool = False, step_size: Length | None = None)
Split-step engine for the coupled two-polarization GNLSE.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
pulse_x
|
Wave
|
Envelope fields of the two polarization components
( |
required |
pulse_y
|
Wave
|
Envelope fields of the two polarization components
( |
required |
fiber
|
FiberProfile
|
Shared scalar parameters ( |
required |
betas
|
array_like
|
Taylor coefficients |
None
|
betas_x
|
array_like
|
Per-axis dispersion (overrides betas). If only |
None
|
betas_y
|
array_like
|
Per-axis dispersion (overrides betas). If only |
None
|
betas_unit
|
('ps^k/m', 's^k/m', 'SI')
|
Unit of the dispersion coefficients, as in the scalar engine. |
"ps^k/m"
|
coupling
|
('incoherent', 'coherent', 'manakov')
|
Nonlinear model (see the module docstring):
|
"incoherent"
|
delta_beta
|
float
|
Birefringent phase mismatch |
0.0
|
walkoff
|
float
|
Differential group delay |
0.0
|
include_raman
|
bool
|
Per-channel scalar Raman response. |
False
|
step_size
|
Length | None
|
Fixed step size (m). |
None
|
spectra_vs_z
property
¶
spectra_vs_z: tuple[NDArray, NDArray]
(ω [rad/s], summed spectrum |A_x|²+|A_y|²) per snapshot.
propagate ¶
propagate(num_steps: int, *, nsaves: int | None = None, show_progress: bool = False) -> None
Run the coupled split-step propagation for num_steps steps.
Snapshot semantics match
:meth:~photonics_helper.gnlse.SplitStepEngine.propagate:
nsaves evenly spaced snapshots (including z=0 and z=L);
with nsaves=None every step is saved. A total-photon-number
monitor warns on >5% drift in lossless runs.
fields_vs_z ¶
fields_vs_z() -> tuple[NDArray, NDArray]
Complex field histories: (A_x(z, t), A_y(z, t)).
Returns:
| Type | Description |
|---|---|
(NDArray, NDArray)
|
Arrays of shape |
nonlinear_phase_measure ¶
nonlinear_phase_measure(index: Literal[0, 1] = 0) -> float
Nonlinear phase of channel index, measured against the input CW.
Meaningful for CW or constant-amplitude tests; returns
arg(A_z / A_0) at the last snapshot.
RandomBirefringenceEngine ¶
RandomBirefringenceEngine(pulse_x: Wave, pulse_y: Wave, fiber: FiberProfile, betas: NDArray, *, include_raman: bool = False, step_size: Length | None = None, seed: int | None = None)
Bases: VectorSplitStepEngine
Coupled GNLSE with a random polarisation-frame evolution.
Segments of length segment_length (default: a fixed step dz) are
each propagated with :class:VectorSplitStepEngine's incoherent
nonlinearity in a randomly rotated polarisation frame: the field is
transformed by a random SU(2) rotation (uniform axis on the Poincaré
sphere, uniform rotation angle), the local coupled-nonlinear step is
applied, and the field is rotated back. Averaged over segments and
seeds this reproduces the polarization-averaged Manakov model with the
8/9 effective nonlinearity (Wai & Menyuk 1996).
This is the engine to use for validating the Manakov limit: identical ensemble spectra to the deterministic Manakov run, depolarization of the mean field, exact total-energy conservation at every step.
propagate ¶
propagate(num_steps: int, *, nsaves: int | None = None, show_progress: bool = False) -> None
Randomly rotated propagation: same signature as the base
:meth:VectorSplitStepEngine.propagate, with an SU(2) frame
rotation before/after every nonlinear step.