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
- 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.
- The
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 functionadd_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 thatzf=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)