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
CombinedLongitudinalTransverseLaserclass) 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_focUse
z_foc=0(i.e. initialize the pulse at focus) and then calllaser.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([])