Skip to content

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

beta2 instance-attribute

beta2: float

gamma instance-attribute

gamma: float

P0 instance-attribute

P0: float

T0 instance-attribute

T0: float

L_D property

L_D: float

L_NL property

L_NL: float

sqrt_LD_LNL property

sqrt_LD_LNL: float

z_WB property

z_WB: float

Analytic wave-breaking distance in m.

steepness

steepness(field: NDArray, t: NDArray) -> float

Edge steepness of a single field (see :func:edge_steepness).

steepness_curve

steepness_curve(fields: Sequence[NDArray], t: NDArray) -> NDArray

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.