Optical wave breaking¶
OWB diagnostics (Tomlinson et al. 1985). Docstrings are the source of truth, rendered with mkdocstrings (numpydoc style).
photonics_helper.wave_breaking ¶
Optical wave breaking in the normal-dispersion regime.
When self-phase modulation (SPM) chirps a pulse in the normal-dispersion
regime (β₂ > 0), group-velocity dispersion converts the chirp into a time shift
and the pulse develops steep (shock) edges, then a flat top, and finally
oscillations. For a Gaussian input A(0,T) = sqrt(P0) exp(-T²/2T₀²) the
SPM chirp after a distance z is
.. math::
\delta\omega(T) = -\frac{2\gamma P_0 z}{T_0^2}\,
T e^{-T^2/T_0^2},
so each spectral component is displaced to T' = T + β₂ z δω(T). Wave
breaking is the point where this map becomes non-monotonic, which gives
.. math::
z_{WB} = \frac{T_0}{\sqrt{2\beta_2\gamma P_0}}
= \frac{e^{3/4}}{2}\sqrt{L_D L_{NL}},
\qquad
L_D = \frac{T_0^2}{\beta_2}, \quad
L_{NL} = \frac{1}{\gamma P_0}.
The dimensionless edge steepness
.. math::
S = \frac{\max_T |\partial I/\partial T|\, T_0}{I_{peak}}
grows from the Gaussian value sqrt(2) e^{-1/2} ≈ 0.8578; its departure marks
the wave-breaking onset.
References
- W. J. Tomlinson, R. H. Stolen, A. M. Johnson, Opt. Lett. 10, 457 (1985).
- G. P. Agrawal, Nonlinear Fiber Optics, 5th ed., Sec. 4.1.3.
- D. Anderson, M. Desaix, M. Lisak, M. L. Quiroga-Teixeiro, JOSA B 9, 1358 (1992).
gaussian_edge_steepness
module-attribute
¶
gaussian_edge_steepness = float(np.sqrt(2.0) * np.exp(-0.5))
WaveBreaking
dataclass
¶
WaveBreaking(beta2: float, gamma: float, P0: float, T0: float)
Wave-breaking diagnostics for a pulse in a normal-dispersion fibre.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
beta2
|
float — GVD in s²/m (> 0).
|
|
required |
gamma
|
float — nonlinear coefficient in 1/(W·m).
|
|
required |
P0
|
float — peak power in W.
|
|
required |
T0
|
float — Gaussian half-width in s.
|
|
required |
steepness ¶
steepness(field: NDArray, t: NDArray) -> float
Edge steepness of a single field (see :func:edge_steepness).
analyze ¶
analyze(z_array: NDArray, fields: Sequence[NDArray], t: NDArray, *, steepening_factor: float = 1.1) -> dict
Detect the steepening and oscillation onsets along a propagation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
z_array
|
distances in m for each stored field.
|
|
required |
fields
|
sequence of complex envelope fields.
|
|
required |
t
|
time grid in s.
|
|
required |
steepening_factor
|
threshold relative to the Gaussian steepness.
|
|
1.1
|
Returns:
| Type | Description |
|---|---|
dict with ``z_onset_m``, ``z_oscillation_m``, ``peak_steepness``,
|
|
``z_WB_m``, ``L_D_m``, ``L_NL_m`` and the steepness array under
|
|
``"steepness"``.
|
|
dispersion_length ¶
dispersion_length(beta2: float, T0: float) -> float
Dispersion length L_D = T₀²/β₂ in m (β₂ in s²/m).
nonlinear_length ¶
nonlinear_length(gamma: float, P0: float) -> float
Nonlinear length L_NL = 1/(γP₀) in m.
wave_breaking_distance ¶
wave_breaking_distance(beta2: float, gamma: float, P0: float, T0: float) -> float
Analytic optical wave-breaking distance z_WB in m.
Valid for the normal-dispersion regime (β₂ > 0). Derived from the
chirp-folding criterion 1 + β₂ z ∂δω/∂T = 0 for a Gaussian pulse.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
beta2
|
float — group-velocity dispersion in s²/m (> 0, normal dispersion).
|
|
required |
gamma
|
float — nonlinear coefficient in 1/(W·m).
|
|
required |
P0
|
float — peak power in W.
|
|
required |
T0
|
float — Gaussian half-width (1/e intensity radius) in s.
|
|
required |
edge_steepness ¶
edge_steepness(field: NDArray | None = None, t: NDArray | None = None, T0: float = 1.0, *, intensity: NDArray | None = None) -> float
Normalised edge steepness max|∂I/∂T|·T₀ / I_peak.
Pass either a complex field (intensity is |field|²) or a precomputed
intensity array. t is the time grid and T₀ the input pulse
width. Returns the Gaussian value 0.8578 for a transform-limited
Gaussian.
detect_steepening_onset ¶
detect_steepening_onset(z_array: NDArray, steepness: NDArray, *, factor: float = 1.1, reference: float = gaussian_edge_steepness) -> float
First distance where the edge steepness exceeds factor × reference.
detect_oscillation_onset ¶
detect_oscillation_onset(z_array: NDArray, fields: Sequence[NDArray], *, prominence: float = 0.01) -> float
First distance where an intensity profile develops more than one local maximum.