Source code for lasy.profiles.combined_profile
from .profile import Profile
[docs]
class CombinedLongitudinalTransverseProfile(Profile):
r"""
Class that combines a longitudinal and transverse laser profile.
The combined profile is defined as the product of the longitudinal and transverse
profile.
More precisely, the electric field corresponds to:
.. math::
E_u(\boldsymbol{x}_\perp,t) = Re\left[ E_0\, \mathcal{T}(x, y)
\times \mathcal{L}(t) e^{-i\omega_0 t} \times p_u \right]
where :math:`u` is either :math:`x` or :math:`y`, :math:`p_u` is
the polarization vector, :math:`Re` represent the real part.
The other parameters in this formula are defined below.
Parameters
----------
wavelength : float (in meter)
The main laser wavelength :math:`\lambda_0` of the laser, which
defines :math:`\omega_0` in the above formula, according to
:math:`\omega_0 = 2\pi c/\lambda_0`.
pol : list of 2 complex numbers (dimensionless)
Polarization vector. It corresponds to :math:`p_u` in the above
formula ; :math:`p_x` is the first element of the list and
:math:`p_y` is the second element of the list. Using complex
numbers enables elliptical polarizations.
long_profile : :class:`.LongitudinalProfile`
Defines the longitudinal envelope of the laser, i.e. the
function :math:`\mathcal{L}(t)` in the above formula.
transverse_profile : :class:`.TransverseProfile`
Defines the transverse envelope of the laser, i.e. the
function :math:`\mathcal{T}(x, y)` in the above formula.
laser_energy : float (in Joule)
The total energy of the laser pulse. The amplitude of the laser
field (:math:`E_0` in the above formula) is automatically
calculated so that the pulse has the prescribed energy.
peak_fluence : float (in J/m^2)
The peak fluence of the laser pulse. The amplitude of the laser
field (:math:`E_0` in the above formula) is automatically
calculated so that the pulse has the prescribed peak fluence.
Required for a CW (monochromatic) profile.
peak_power : float (in W)
The peak power of the laser pulse. The amplitude of the laser
field (:math:`E_0` in the above formula) is automatically
calculated so that the pulse has the prescribed peak power.
Required for a plane wave profile.
"""
def __init__(
self,
wavelength,
pol,
long_profile,
trans_profile,
laser_energy=None,
peak_fluence=None,
peak_power=None,
):
super().__init__(wavelength, pol)
assert (
(laser_energy is not None)
^ (peak_fluence is not None)
^ (peak_power is not None)
), "Exactly one of laser_energy, peak_fluence, or peak_power must be specified"
if long_profile.is_cw:
assert peak_fluence is not None
self.peak_fluence = peak_fluence
self.__update_is_cw__(long_profile.is_cw)
elif trans_profile.is_plane_wave:
assert peak_power is not None
self.peak_power = peak_power
self.__update_is_plane_wave__(trans_profile.is_plane_wave)
else:
assert laser_energy is not None
self.laser_energy = laser_energy
self.long_profile = long_profile
self.trans_profile = trans_profile
[docs]
def evaluate(self, x, y, t):
"""
Return the envelope field of the laser.
Parameters
----------
x, y, t : 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, t
"""
envelope = self.trans_profile.evaluate(x, y) * self.long_profile.evaluate(t)
return envelope