Source code for lasy.profiles.transverse.gaussian_profile

from lasy.backend import xp

from .transverse_profile import TransverseProfile


[docs] class GaussianTransverseProfile(TransverseProfile): r""" Class for the analytic profile of a Gaussian laser pulse. More precisely, at focus (``z_foc=0``), the transverse envelope (to be used in the :class:`.CombinedLongitudinalTransverseLaser` class) corresponds to: .. math:: \mathcal{T}(x, y) = \exp\left( -\frac{x^2 + y^2}{w_0^2} \right) Parameters ---------- w0 : float (in meter) The waist of the laser pulse, i.e. :math:`w_0` in the above formula. wavelength : float (in meter), optional The main laser wavelength :math:`\lambda_0` of the laser. (Only needed if ``z_foc`` is different than 0.) z_foc : float (in meter), optional Position of the focal plane. (The laser pulse is initialized at ``z=0``.) Warnings -------- In order to initialize the pulse out of focus, you can either: - Use a non-zero ``z_foc`` - Use ``z_foc=0`` (i.e. initialize the pulse at focus) and then call ``laser.propagate(-z_foc)`` Both methods are in principle equivalent, but note that the first method uses the paraxial approximation, while the second method does not make this approximation. """ def __init__(self, w0, wavelength=None, z_foc=0): super().__init__() self.w0 = w0 if z_foc == 0: self.z_foc_over_zr = 0 else: assert wavelength is not None, ( "You need to pass the wavelength, when `z_foc` is non-zero." ) self.z_foc_over_zr = z_foc * wavelength / (xp.pi * w0**2) def _evaluate(self, x, y): """ Return the transverse envelope. Parameters ---------- x, y : ndarrays of floats Define points on which to evaluate the envelope These arrays need to all have the same shape. Returns ------- envelope : ndarray of complex numbers Contains the value of the envelope at the specified points This array has the same shape as the arrays x, y """ # Term for wavefront curvature + Gouy phase diffract_factor = 1.0 - 1j * self.z_foc_over_zr # Calculate the argument of the complex exponential exp_argument = -(x**2 + y**2) / (self.w0**2 * diffract_factor) # Get the transverse profile envelope = xp.exp(exp_argument) / diffract_factor return envelope