solprop.tools.phase_matching#

Dispersive-wave phase matching: the mismatch and its roots in wavelength.

Module Attributes

NonlinearPhase

Choose the constituent, supplied-power or linear RDW phase model.

Functions

lambda_rdw(mode, wavelength, *[, ...])

Return the phase-matched dispersive-wave wavelength nearest the pump.

lambda_rdw_all(mode, wavelength, *[, ...])

Return every phase-matched wavelength in a window, shortest first.

phase_mismatch(mode, omega, wavelength, *[, ...])

Return the phase mismatch between a soliton and a dispersive wave.

solprop.tools.phase_matching.NonlinearPhase#

Choose the constituent, supplied-power or linear RDW phase model.

alias of Literal[‘largest’, ‘supplied_power’, ‘linear’]

solprop.tools.phase_matching.lambda_rdw(mode, wavelength, *, soliton_mode=None, z=0.0, peak_power=None, gamma=None, fwhm=None, shape='sech', nonlinear_phase='largest', wavelength_limits=None)[source]#

Return the phase-matched dispersive-wave wavelength nearest the pump.

Parameters:
modeMode

The mode the dispersive wave is emitted into.

wavelengthfloat

Wavelength of the soliton in m, > 0.

soliton_modeMode or None, optional

The soliton’s mode; None is mode.

zfloat, optional

Position along the waveguide, m.

peak_powerfloat or None, optional

Peak power in W for the nonlinear term; see phase_mismatch().

gammafloat or None, optional

Nonlinear coefficient in rad/(W m) for the nonlinear term.

fwhmfloat or None, optional

Input power FWHM in s, positive; required with power for the default phase.

shape{‘sech’, ‘gauss’}, optional

Unchirped input shape for the largest constituent.

nonlinear_phase{‘largest’, ‘supplied_power’, ‘linear’}, optional

Default uses the largest constituent. Supplied power uses gamma P0/2 and requires omitting fwhm. Linear requires omitting all pulse numbers. Without pulse numbers the default is also linear.

wavelength_limitstuple of float or None, optional

Window searched, m; None is 100 nm to 0.9 of the pump wavelength.

Returns:
float

The longest root inside the window in m, which with the default window is the short-wavelength dispersive wave nearest the pump. lambda_rdw_all() returns all of them.

Raises:
ToolsError

If the window holds no root, rather than returning a missing value that would propagate silently.

Examples

>>> from solprop.modes import MarcatiliMode
>>> from solprop.tools import lambda_rdw
>>> mode = MarcatiliMode(125e-6, "He", 1.0, cladding=1.45)
>>> f"{lambda_rdw(mode, 800e-9) * 1e9:.1f}"
'200.1'
solprop.tools.phase_matching.lambda_rdw_all(mode, wavelength, *, soliton_mode=None, z=0.0, peak_power=None, gamma=None, fwhm=None, shape='sech', nonlinear_phase='largest', wavelength_limits=None)[source]#

Return every phase-matched wavelength in a window, shortest first.

Parameters:
modeMode

The mode the dispersive wave is emitted into.

wavelengthfloat

Wavelength of the soliton in m, > 0.

soliton_modeMode or None, optional

The soliton’s mode; None is mode.

zfloat, optional

Position along the waveguide, m.

peak_powerfloat or None, optional

Peak power in W for the nonlinear term; see phase_mismatch().

gammafloat or None, optional

Nonlinear coefficient in rad/(W m) for the nonlinear term.

fwhmfloat or None, optional

Input power FWHM in s, positive; required with power for the default phase.

shape{‘sech’, ‘gauss’}, optional

Unchirped input shape for the largest constituent.

nonlinear_phase{‘largest’, ‘supplied_power’, ‘linear’}, optional

Default uses the largest constituent. Supplied power uses gamma P0/2 and requires omitting fwhm. Linear requires omitting all pulse numbers. Without pulse numbers the default is also linear.

wavelength_limitstuple of float or None, optional

Shortest and longest wavelength searched, m. None is 100 nm to 0.9 of the pump wavelength, which keeps the double root at the pump out.

Returns:
tuple of float

The roots in m, ascending; empty when there is none. The mismatch is sampled on 2048 frequencies across the window, each sign change is refined with Brent’s method, and roots closer than one sample are not separated. A sign change through a resonance of the guide, where the mismatch has a pole or is not a number, is not a root and is skipped.

Raises:
ToolsError

If the window is not positive and ordered.

Examples

>>> from solprop.modes import MarcatiliMode
>>> from solprop.tools import lambda_rdw_all
>>> mode = MarcatiliMode(125e-6, "He", 1.0, cladding=1.45)
>>> [f"{root * 1e9:.0f}" for root in lambda_rdw_all(mode, 800e-9)]
['200']
solprop.tools.phase_matching.phase_mismatch(mode, omega, wavelength, *, soliton_mode=None, z=0.0, peak_power=None, gamma=None, fwhm=None, shape='sech', nonlinear_phase='largest')[source]#

Return the phase mismatch between a soliton and a dispersive wave.

\[\Delta\beta(\omega) = \beta_{\rm dw}(\omega) - \beta_{\rm s}(\omega_0) - \beta_{1,\rm s}(\omega_0)(\omega-\omega_0) - k_{\rm NL} .\]
Parameters:
modeMode

The mode the dispersive wave is emitted into.

omeganumpy.ndarray

Angular frequencies in rad/s, shape (n_omega,).

wavelengthfloat

Wavelength of the soliton in m, > 0.

soliton_modeMode or None, optional

The mode the soliton travels in; None is mode. A different one gives intermodal phase matching.

zfloat, optional

Position along the waveguide, m.

peak_powerfloat or None, optional

Input peak power in W. With gamma and fwhm, adds the soliton’s nonlinear wavenumber; both None (the default) gives the linear condition.

gammafloat or None, optional

Nonlinear coefficient of the soliton’s mode in rad/(W m) (nonlinear_coefficient()).

fwhmfloat or None, optional

Input power FWHM in s, positive; required with power for the default phase.

shape{‘sech’, ‘gauss’}, optional

Unchirped input shape for the largest constituent.

nonlinear_phase{‘largest’, ‘supplied_power’, ‘linear’}, optional

Default uses the largest constituent. Supplied power uses gamma P0/2 and requires omitting fwhm. Linear requires omitting all pulse numbers. Without pulse numbers the default is also linear.

Returns:
numpy.ndarray

Mismatch in 1/m, shape (n_omega,). It vanishes at the pump in the linear case, with zero slope there.

Raises:
ToolsError

If pulse arguments are incomplete or contradictory, or the largest constituent does not exist in anomalous dispersion.

Notes —– The default nonlinear term is gamma times the largest constituent’s
power / 2 (soliton_content()). The supplied-power
option treats the quoted power as a fundamental soliton, advancing as exp(i gamma P0
z / 2) (Akhmediev and Karlsson, Phys. Rev. A 51, 2602 (1995)). Both are local
estimates; loss, higher-order dispersion, Raman, chirp and plasma evolution are not
included.

Examples

>>> import numpy as np
>>> from solprop.modes import MarcatiliMode
>>> from solprop.tools import phase_mismatch
>>> mode = MarcatiliMode(125e-6, "He", 1.0)
>>> pump = 2 * np.pi * 299792458.0 / 800e-9
>>> abs(float(phase_mismatch(mode, np.array([pump]), 800e-9)[0])) < 1e-6
True