Hermite Gaussian Transverse Profile#

Used to define a Hermite-Gaussian transverse laser profile. Hermite-Gaussian modes are a family of solutions to the paraxial wave equation written in cartesian coordinates. The modes are characterised by two transverse indices \(m\) and \(n\).


class lasy.profiles.transverse.HermiteGaussianTransverseProfile(w_0x, w_0y, m, n, wavelength, z_foc=0)[source]#

A high-order Gaussian laser pulse expressed in the Hermite-Gaussian formalism.

Definition is according to Siegman “Lasers” pg. 646 eq. 60, as explicitly given in https://doi.org/10.1364/JOSAB.489884 eq. 3, with the beam center upon the optical axis, \(x_0,y_0 = (0,0)\).

More precisely, the transverse envelope (to be used in the CombinedLongitudinalTransverseLaser class) corresponds to:

\[\mathcal{T}(x, y) = \, \mathcal{H}_m (x) \, \mathcal{H}_n(y) \, \exp(i \left ( \Phi_x(z) + \Phi_y(z)\right ) )\]

with

\[ \begin{align}\begin{aligned}\mathcal{H}_p(q) = A_p h_p \left ( \frac{\sqrt{2}q}{w_q(z)} \right) \exp{\left( -\frac{q^2}{w_q^2(z)}\right)} \exp{ \left ( -i k_0 \frac{q^2}{2 R_q(z)} \right )}\\\Phi_q(z) = \left(p+\frac{1}{2}\right) \arctan\left({\frac{z}{Z_q}}\right)\\w_q(z) = w_{0,q} \sqrt{1 + \left( \frac{z}{Z_q}\right)^2}\\Z_q = \frac{\pi w_{0,q}^2}{\lambda_0}\\A_p = \frac{1}{\sqrt{w_q(z) 2^{p-1/2} p!\sqrt{\pi}}}\\R_q(z) = z + \frac{Z_q^2}{z}\end{aligned}\end{align} \]

where \(h_{p}\) is the Hermite polynomial of order \(p\), \(w_q(z)\) is the spot size of the laser along the \(q\) axis (\(q\) is \(x\) or \(y\)), \(Z_q\) is the corresponding Rayleigh length and, \(\lambda_0\) and \(k_0\) are the wavelength and central wavenumber of the laser respectively.

The z-dependence shown in the above equations is required to correctly define the electric field of the transverse profile relative to that of the pulse at the focus. The absolute z position will be overwritten when creating a laser object.

Parameters:
w_0xfloat (in meter)

The waist of the laser pulse in the x direction,

w_0yfloat (in meter)

The waist of the laser pulse in the y direction,

mint (dimensionless)

The order of hermite polynomial in the x direction

nint (dimensionless)

The order of hermite polynomial in the y direction

wavelengthfloat (in meter), optional

The main laser wavelength \(\lambda_0\) of the laser.

z_focfloat (in meter), optional

Position of the focal plane. (The laser pulse is initialized at z=0.)

Warning

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.

Examples

>>> import matplotlib.pyplot as plt
>>> from lasy.backend import xp, to_cpu
>>> from lasy.profiles.transverse.hermite_gaussian_profile import (
...     HermiteGaussianTransverseProfile,
... )
>>> # Create evaluation grid
>>> xy = xp.linspace(-30e-6, 30e-6, 200)
>>> X, Y = xp.meshgrid(xy, xy)
>>> # Create an array of plots
>>> fig, ax = plt.subplots(3, 6, figsize=(10, 5), tight_layout=True)
>>> extent = (1e6 * xy[0], 1e6 * xy[-1], 1e6 * xy[0], 1e6 * xy[-1])
>>> for m in range(3):
>>>     for n in range(3):
>>>         transverse_profile = HermiteGaussianTransverseProfile(
...             w_0x = 10e-6, # m
...             w_0y = 15e-6, # m
...             m = m, #
...             n = n, #
...             wavelength = 0.8e-6, # m
...         )
...         intensity = xp.abs(transverse_profile.evaluate(X,Y))**2
...         vmax_intensity = xp.max(intensity)
>>>         ax[m,n].imshow(to_cpu(intensity),extent=extent,cmap='bone_r',vmin=0,vmax=vmax_intensity)
>>>         ax[m,n].set_title('Inten: m,n = %i,%i' %(m,n))
>>>         phase = xp.angle(transverse_profile.evaluate(X,Y))
...         vmax_phase = xp.max(xp.abs(phase))
>>>         ax[m,n+3].imshow(to_cpu(phase),extent=extent,cmap='seismic',vmin=-vmax_phase,vmax=vmax_phase)
>>>         ax[m,n+3].set_title('Phase: m,n = %i,%i' %(m,n))
>>>         if m==2:
>>>             ax[m,n].set_xlabel("x (µm)")
>>>             ax[m,n+3].set_xlabel("x (µm)")
>>>         else:
>>>             ax[m,n].set_xticks([])
>>>             ax[m,n+3].set_xticks([])
>>>         if n==0:
>>>             ax[m,n].set_ylabel("y (µm)")
>>>             ax[m,n+3].set_yticks([])
>>>         else:
>>>             ax[m,n].set_yticks([])
>>>             ax[m,n+3].set_yticks([])
../../../_images/hermite_gaussian_profile-1.png