Laser initialization

There are two functions that allow to introduce a laser pulse in an FBPIC simulation:

  • The generic function add_laser_pulse, which can introduce an arbitrary laser profile.

  • The compact function add_laser, which can only introduce a Gaussian profile.

The generic function is presented first here. This page also explains how to define laser profiles in FBPIC. Finally the compact function is described at the end of this page.

Both of the above functions support two types of methods, in order to introduce the laser in the simulation box:

  • The direct method:

    In this case, the entire laser pulse is initialized in the simulation box, immediately when the function is called.

    Note

    When using this method, FBPIC will always initialize the laser field on the grid in a self-consistent manner (e.g. such that the equations \(\boldsymbol{\nabla} \cdot \boldsymbol{E} = 0\) and \(\boldsymbol{\nabla} \cdot \boldsymbol{B} = 0\) are automatically satisfied, for the added laser field).

  • The antenna method:

    In this case, the laser pulse is progressively emitted by a virtual antenna during the simulation. This can be advantageous when the simulation box is too small to contain the initial laser pulse entirely.

    Note

    Due to the details of its implementation, the laser antenna always emits two laser pulses that propagate in opposite directions (one on each side of the plane of the antenna). One of these two pulses is usually unwanted. However, when using a moving window that follows the only pulse of interest, the other (unwanted) pulse rapidly exits the simulation box.

Generic function for arbitrary laser profile

fbpic.lpa_utils.laser.add_laser_pulse(sim, laser_profile, gamma_boost=None, method='direct', z0_antenna=None, v_antenna=0.0)[source]

Introduce a laser pulse in the simulation.

The laser is either added directly to the interpolation grid initially (method= direct) or it is progressively emitted by an antenna (method= antenna).

Parameters:
  • sim (a Simulation object) – The structure that contains the simulation.

  • laser_profile (a valid laser profile object) – Laser profiles can be imported from fbpic.lpa_utils.laser

  • gamma_boost (float, optional) – When initializing the laser in a boosted frame, set the value of gamma_boost to the corresponding Lorentz factor. In this case, laser_profile should be initialized with all its physical quantities (wavelength, etc…) given in the lab frame, and the function add_laser_pulse will automatically convert these properties to their boosted-frame value.

  • method (string, optional) – Whether to initialize the laser directly in the box (method= direct) or through a laser antenna (method= antenna). Default: direct

  • z0_antenna (float, optional (meters)) – Required for the antenna method: initial position (in the lab frame) of the antenna.

  • v_antenna (float, optional (meters per second)) – Only used for the antenna method: velocity of the antenna (in the lab frame)

Example

In order to initialize a Laguerre-Gauss profile with a waist of 5 microns and a duration of 30 femtoseconds, centered at \(z=3\) microns initially:

from fbpic.lpa_utils.laser import add_laser_pulse, LaguerreGaussLaser

profile = LaguerreGaussLaser(a0=0.5, waist=5.e-6, tau=30.e-15, z0=3.e-6, p=1, m=0)

add_laser_pulse( sim, profile )

Laser profiles

This section lists the available laser profiles in FBPIC. Note that you can also combine these laser profiles (by summing them), or even create your own custom laser profiles.

Combining (summing) laser profiles

Laser profiles can be combined by summing them together, so as to create new laser profiles.

For instance, one might want to use a circularly-polarized laser pulse, but FBPIC only provides linearly-polarized laser profiles. However, it turns out that a circularly-polarized pulse can be decomposed as the sum of two linearly-polarized pulses, with orthogonal polarization and a \(\pi/2\) phase shift. In FBPIC, this can be done in the following way:

import math
from fbpic.lpa_utils.laser import add_laser_pulse, GaussianLaser
w0 = 5.e-6; z0 = 3.e-6; tau = 30.e-15; a0 = 1

linear_profile1 = GaussianLaser( a0/math.sqrt(2), waist, tau, z0,
                            theta_pol=0., cep_phase=0. )
linear_profile2 = GaussianLaser( a0/math.sqrt(2), waist, tau, z0,
                            theta_pol=math.pi/2, cep_phase=math.pi/2 )

circular_profile = linear_profile1 + linear_profile2
add_laser_pulse( sim, circular_profile )

Creating your own custom laser profile

If you have some experience with Python programming, you can also define your own laser profile, inside your input script. To do so, you can have a look at how the existing laser profiles that are implemented here.

Compact function for a Gaussian pulse

Using this function is equivalent to using the more generic add_laser_pulse function, with a GaussianLaser profile.

fbpic.lpa_utils.laser.add_laser(sim, a0, w0, ctau, z0, zf=None, lambda0=8e-07, cep_phase=0.0, phi2_chirp=0.0, theta_pol=0.0, gamma_boost=None, method='direct', fw_propagating=True, update_spectral=True, z0_antenna=None, v_antenna=0.0)[source]

Introduce a linearly-polarized, Gaussian laser in the simulation.

More precisely, the electric field near the focal plane is given by:

\[E(\boldsymbol{x},t) = a_0\times E_0\, \exp\left( -\frac{r^2}{w_0^2} - \frac{(z-z_0-ct)^2}{c^2\tau^2} \right) \cos[ k_0( z - z_0 - ct ) - \phi_{cep} ]\]

where \(k_0 = 2\pi/\lambda_0\) is the wavevector and where \(E_0 = m_e c^2 k_0 / q_e\) is the field amplitude for \(a_0=1\).

Note

The additional terms that arise far from the focal plane (Gouy phase, wavefront curvature, …) are not included in the above formula for simplicity, but are of course taken into account by the code, when initializing the laser pulse away from the focal plane.

The laser is either added directly to the interpolation grid initially (method= direct) or it is progressively emitted by an antenna (method= antenna).

Parameters:
  • sim (a Simulation object) – The structure that contains the simulation.

  • a0 (float (dimensionless)) – The peak normalized vector potential at the focal plane, defined as \(a_0\) in the above formula.

  • w0 (float (in meter)) – Laser waist at the focal plane, defined as \(w_0\) in the above formula.

  • ctau (float (in meter)) – The duration of the laser (in the lab frame), defined as \(c\tau\) in the above formula.

  • z0 (float (in meter)) – The initial position of the centroid of the laser (in the lab frame), defined as \(z_0\) in the above formula.

  • zf (float (in meter), optional) – The position of the focal plane (in the lab frame). If zf is not provided, the code assumes that zf=z0, i.e. that the laser pulse is at the focal plane initially.

  • theta_pol (float (in radian), optional) – The angle of polarization with respect to the x axis.

  • lambda0 (float (in meter), optional) – The wavelength of the laser (in the lab frame), defined as \(\lambda_0\) in the above formula.

  • cep_phase (float (in radian), optional) – The Carrier Enveloppe Phase (CEP), defined as \(\phi_{cep}\) in the above formula (i.e. the phase of the laser oscillation, at the position where the laser enveloppe is maximum)

  • phi2_chirp (float (in second^2)) – The amount of temporal chirp, at focus (in the lab frame) Namely, a wave packet centered on the frequency \((\omega_0 + \delta \omega)\) will reach its peak intensity at \(z(\delta \omega) = z_0 - c \phi^{(2)} \, \delta \omega\). Thus, a positive \(\phi^{(2)}\) corresponds to positive chirp, i.e. red part of the spectrum in the front of the pulse and blue part of the spectrum in the back.

  • gamma_boost (float, optional) – When initializing the laser in a boosted frame, set the value of gamma_boost to the corresponding Lorentz factor. All the other quantities (ctau, zf, etc.) are to be given in the lab frame.

  • method (string, optional) – Whether to initialize the laser directly in the box (method=`direct`) or through a laser antenna (method=`antenna`)

  • fw_propagating (bool, optional) – Whether the laser is propagating in the forward or backward direction.

  • update_spectral (bool, optional) – Only for the direct method: Wether to update the fields in spectral space after modifying the fields on the interpolation grid.

  • z0_antenna (float, optional (meters)) – Only for the antenna method: initial position (in the lab frame) of the antenna. If not provided, then the z0_antenna is set to zf.

  • v_antenna (float, optional (meters per second)) – Only used for the antenna method: velocity of the antenna (in the lab frame)