optmat.solid.raman_response#

The Raman response of fused silica (TC-691, TC-692).

A glass’s delayed third-order response is a normalised shape \(h_R\) (unit integral) and a size: the Raman share \(f_R\) of the long-pulse nonlinear index \(n_2\). For an envelope, the intensity-dependent index is

\[\Delta n(t) = n_2 \left[(1 - f_R) I(t) + f_R \int_0^\infty h_R(\tau) I(t - \tau)\, d\tau\right],\]

the form of Stolen et al. (1989), Blow & Wood (1989, their envelope equation), Lin & Agrawal (2006) and optmat’s Kerr fit (optmat.solid.kerr). For a real field, in the convention of the gases (optmat.gas.raman_response),

\[P(t) = \varepsilon_0 \chi_e E^3(t) + \varepsilon_0 K E(t) \int_0^\infty h_R(\tau) E^2(t - \tau)\, d\tau, \qquad \chi_e = \tfrac{4}{3} n_0^2 \varepsilon_0 c (1 - f_R) n_2, \quad K = 2 n_0^2 \varepsilon_0 c f_R n_2,\]

because a kernel slower than the optical cycle follows only the slowly varying half of \(E^2\), while the instantaneous term also has the \(3\omega\) part: the Raman term of the field carries 2/3 of the envelope’s share (Blow & Wood’s Eqs. (2) and (8), TC-692). \(K h_R\) is the silica counterpart of a gas’s \(N h\).

The steady-state Stokes gain, pump and Stokes polarised alike, is \(g(\Omega) = 2 \omega_s n_2 f_R \operatorname{Im} H_R(\Omega) / c\), with \(H_R(\Omega) = \int_0^\infty h_R(\tau) e^{i\Omega\tau} d\tau\) (Lin & Agrawal’s \(2\gamma f_R \operatorname{Im}\tilde R\)).

The models (data/solid/raman/SiO2.toml):

  • hollenbeck_2002, the default: Hollenbeck & Cantrell’s 13 modes, \(\sum_i A_i e^{-\gamma_i t} e^{-\Gamma_i^2 t^2 / 4} \sin(\omega_i t)\), with the Raman fraction of optmat’s Kerr fit, which uses this shape. Its normalisation is analytic: \(\int_0^\infty e^{-\gamma t - \Gamma^2 t^2/4} \sin(\omega t)\, dt = (\sqrt\pi / \Gamma) \operatorname{Im} w[(\omega + i\gamma)/\Gamma]\), with \(w\) the Faddeeva function. It is copolarised only.

  • lin_2006: Lin & Agrawal’s isotropic part \(R_a = f_a h_a\) and anisotropic part \(R_b = f_b h_b + f_c h_a\), the functions \(a\) and \(b\) of Hellwarth’s form (optmat.gas.raman_response), with their \(f_R = 0.245\).

  • blow_1989: Blow & Wood’s single oscillator with its share 0.222.

The literature forms’ \(f_R\) are theirs, not the Kerr fit’s: with them the electronic part of the fitted \(n_2\) and the Raman part do not add up to the fitted \(n_2\) (paired is False).

References#

  • K. J. Blow and D. Wood, “Theoretical description of transient stimulated Raman scattering in optical fibers”, IEEE J. Quantum Electron. 25, 2665 (1989).

  • R. H. Stolen, J. P. Gordon, W. J. Tomlinson and H. A. Haus, “Raman response function of silica-core fibers”, J. Opt. Soc. Am. B 6, 1159 (1989).

  • D. Hollenbeck and C. D. Cantrell, “Multiple-vibrational-mode model for fiber-optic Raman gain spectrum and response function”, J. Opt. Soc. Am. B 19, 2886 (2002).

  • Q. Lin and G. P. Agrawal, “Raman response function for silica fibers”, Opt. Lett. 31, 3086 (2006).

Module Attributes

EVALUATION_VERSION

The version of this module's evaluation code, in the identity of every model that evaluates through it; raised whenever the code changes its output (OEP 1, section 4.8).

RAMAN_DIRECTORY

The solids' Raman response models.

Form

The functional form of a model (the module docstring).

Component

A part of the normalised response: parallel (\(h_R = a + b\)), or Hellwarth's a (isotropic) and b (anisotropic) for a model that has them.

Functions

silica_raman_response([model])

Return a Raman response model of fused silica.

silica_raman_responses()

Return every Raman response model of fused silica.

Classes

SilicaRamanResponse(name, form, ...[, ...])

A Raman response model of fused silica.

optmat.solid.raman_response.Component#

A part of the normalised response: parallel (\(h_R = a + b\)), or Hellwarth’s a (isotropic) and b (anisotropic) for a model that has them.

alias of Literal[‘parallel’, ‘a’, ‘b’]

optmat.solid.raman_response.EVALUATION_VERSION: Final = 1#

The version of this module’s evaluation code, in the identity of every model that evaluates through it; raised whenever the code changes its output (OEP 1, section 4.8).

optmat.solid.raman_response.Form#

The functional form of a model (the module docstring).

alias of Literal[‘hollenbeck’, ‘lin_agrawal’, ‘single_oscillator’]

optmat.solid.raman_response.RAMAN_DIRECTORY: Final = PosixPath('/home/docs/checkouts/optmat/checkouts/7/src/optmat/data/solid/raman')#

The solids’ Raman response models.

class optmat.solid.raman_response.SilicaRamanResponse(name, form, raman_fraction, paired, parameters, description='', sources=<factory>, reasons=<factory>, *, status='user', status_reason='', modified=(), base='')[source]#

Bases: Identified

A Raman response model of fused silica.

Attributes:
namestr

The model (hollenbeck_2002, lin_2006, blow_1989).

formstr

Its functional form (Form).

raman_fractionfloat

\(f_R\), the Raman share of the long-pulse \(n_2\).

pairedbool

True where \(f_R\) is the one optmat’s Kerr fit found with this shape.

parametersdict of str to numpy.ndarray

The shape’s constants in SI: for hollenbeck the amplitudes A, angular frequencies omega (rad/s), Gaussian Gamma and Lorentzian gamma widths (1/s); for lin_agrawal tau1, tau2, tau_b (s) and f_a, f_b, f_c; for single_oscillator tau1, tau2 (s).

descriptionstr

What the model is.

sourcesdict of str to str

The datasets and formulas behind it.

reasonsdict of str to str

Why.

statusstr

validated for the default, comparison for the other shapes.

Its overrides are the shape’s constants (``parameters``, any of them, merged
into the model’s) and ``raman_fraction``. Any override sets :attr:`paired` to
False: the fraction was found with the curated shape.
DERIVED: ClassVar[tuple[str, ...]] = ('paired',)#

Fields derived from the inputs, which an override may not name.

EVALUATES_THROUGH: ClassVar[tuple[str, ...]] = ('optmat.solid.raman_response',)#
EVALUATION_VERSION: ClassVar[int] = 1#
IDENTITY_KIND: ClassVar[str] = 'raman_response'#
INPUTS: ClassVar[tuple[str, ...]] = ('parameters', 'raman_fraction')#

The parameters with_parameters() may change.

description: str = ''#
electronic_susceptibility(wavelength)[source]#

Return \(\chi_e = \tfrac43 n_0^2 \varepsilon_0 c (1 - f_R) n_2\).

Parameters:
wavelengthfloat

Vacuum wavelength of the field, m.

Returns:
float

The instantaneous third-order susceptibility, m^2/V^2.

Warns:
ModelRangeWarning

Outside the Kerr fit’s wavelengths.

form: str#
gain(pump_wavelength, shift, *, n2=None)[source]#

Return the copolarised steady-state Stokes gain.

\(g = 2 \omega_s n_2 f_R \operatorname{Im} H_R(\Omega) / c\).

Parameters:
pump_wavelengthfloat

Vacuum wavelength of the pump, m.

shiftarray_like

The Stokes shift \(\Omega\), rad/s.

n2float, optional

The long-pulse \(n_2\), m^2/W; by default optmat’s Kerr fit at the pump wavelength.

Returns:
numpy.ndarray

The gain, m/W.

Warns:
ModelRangeWarning

Outside the Kerr fit’s wavelengths (without n2).

property has_tensor: bool#

Whether the model has an isotropic and an anisotropic part.

Returns:
bool

True for Lin & Agrawal’s form.

property index_model: Model[source]#

The linear model of silica the kernel’s size reads, bound once.

Returns:
optmat.solid.models.base.Model

The recommended model of SiO2.

property kerr_model: KerrModel[source]#

The Kerr fit whose n2 the kernel’s size reads, bound once.

Returns:
optmat.solid.kerr.KerrModel

kerr/SiO2.

name: str#
paired: bool#
parameters: Mapping[str, Float[ndarray, 'm']]#
raman_coefficient(wavelength)[source]#

Return \(K = 2 n_0^2 \varepsilon_0 c f_R n_2\), the size of the kernel.

In the real-field form of the module docstring, the delayed polarisation is \(\varepsilon_0 K E \int h_R E^2\). It includes \(n_0^2\): a code in the \(n_0 = 1\) convention of the nonlinear Schrödinger equation takes \(n_2\), \(f_R\) and \(h_R\) from a silica bundle instead (optmat.solid.bundle.silica_bundle()).

Parameters:
wavelengthfloat

Vacuum wavelength of the field, m (for \(n_0\) and \(n_2\)).

Returns:
float

\(K\), m^2/V^2.

Warns:
ModelRangeWarning

Outside the Kerr fit’s wavelengths.

raman_fraction: float#
reasons: Mapping[str, str]#
response(time, component='parallel')[source]#

Return the normalised response \(h_R(\tau)\) (or one of its parts).

Parameters:
timearray_like

Delay after the impulse, s (zero before it).

component{“parallel”, “a”, “b”}, optional

The part (Component).

Returns:
numpy.ndarray

\(h_R\), 1/s; parallel integrates to one.

Raises:
DataError

If a tensor part is asked of a copolarised model.

Examples

>>> response = silica_raman_response()
>>> t = np.arange(0.0, 3e-12, 0.05e-15)
>>> f"{np.trapezoid(response.response(t), t):.4f}"
'1.0000'
sources: Mapping[str, str]#
spectrum(omega, component='parallel')[source]#

Return \(H_R(\Omega) = \int_0^\infty h_R(\tau) e^{i\Omega\tau} d\tau\).

Parameters:
omegaarray_like

Angular frequency, rad/s.

component{“parallel”, “a”, “b”}, optional

The part (Component).

Returns:
numpy.ndarray

\(H_R\), dimensionless, complex; parallel is 1 at zero and its imaginary part is positive at a Stokes shift (gain).

Raises:
DataError

If a tensor part is asked of a copolarised model.

Examples

>>> response = silica_raman_response()
>>> f"{response.spectrum(0.0).real:.6f}"
'1.000000'
optmat.solid.raman_response.silica_raman_response(model='default')[source]#

Return a Raman response model of fused silica.

Parameters:
modelstr, optional

default (Hollenbeck & Cantrell with the Kerr fit’s f_R), lin_2006 or blow_1989.

Returns:
SilicaRamanResponse

The model.

Raises:
DataError

If the model is unknown.

Examples

>>> silica_raman_response().name
'hollenbeck_2002'
>>> f"{silica_raman_response('blow_1989').raman_fraction:.3f}"
'0.222'
optmat.solid.raman_response.silica_raman_responses()[source]#

Return every Raman response model of fused silica.

Returns:
dict of str to SilicaRamanResponse

By name.