Source code for lasy.propagators.nonlinear_phase_shift
from copy import deepcopy
import numpy as np
from scipy.constants import c, epsilon_0
[docs]
class NonlinearKerrStep:
r"""
Class that represents a propagation step with Kerr nonlinearity.
This allows to calculate spectral broadening or self-focusing due to self phase modulation.
.. math::
E (x,y,t) = E(x,y,t) \times \exp(i\,n_2\,k_0\,I(x,y,t))
where :math:`I(x,y,t)` is the intensity profile of the pulse.
Parameters
----------
n2 : float
Nonlinear (intensity dependent) refractive index.
k0 : float
Wave vector at the carrier frequency.
"""
def __init__(self, n2, k0):
self.update(n2=n2, k0=k0)
[docs]
def update(self, n2, k0):
"""
Update the nonlinear refractive index and/or the wave vector.
Parameters
----------
n2 : float
Nonlinear (intensity dependent) refractive index.
k0 : float
Wave vector at the carrier frequency.
"""
self.n2 = n2 if n2 is not None else self.n2
self.k0 = k0 if k0 is not None else self.k0
[docs]
def apply(self, grid_in, distance, grid_out=None, n2=None, k0=None):
"""
Apply intensity dependent phase shift to the field.
Parameters
----------
grid : Grid
Input grid to which the phase shift is applie.
distance : float
Distance over which the pulse propagates the field.
grid_out : Grid, optional
Grid object on which the laser pulse after applying the phase
is defined. Can be different from laser grid before applying.
"""
self.update(n2=n2, k0=k0)
if grid_out is None:
grid_out = deepcopy(grid_in)
temporal_field = grid_in.get_temporal_field()
intensity = 0.5 * c * epsilon_0 * abs(temporal_field) ** 2
phase = self.n2 * self.k0 * intensity * distance
grid_out.set_temporal_field(temporal_field * np.exp(1j * phase))
return grid_out