Note
Go to the end to download the full example code.
Allen et al.: orbital angular momentum of a Laguerre-Gaussian vortex#
Les Allen and coworkers showed that Laguerre-Gaussian light modes carrying
a helical (spiral) phase front \(e^{il\phi}\) possess a well-defined
orbital angular momentum of \(l\hbar\) per photon – an intrinsic,
mechanical property of light entirely separate from the spin angular
momentum carried by polarization. The discovery opened the field of
structured light and optical vortices.
laguerre_gaussian_mode() constructs the
\(\mathrm{LG}_p^l\) mode amplitude
directly, with \(w(z)\) the beam radius, \(R(z)\) the wavefront radius of curvature, \(\zeta(z)\) the Gouy phase, \(L_p^{|l|}\) the associated Laguerre polynomial, azimuthal index \(l\), and radial index \(p\). The radial factor \((r\sqrt2/w(z))^{|l|}\) vanishes on-axis for any \(l\ne0\), producing the doughnut-shaped, on-axis-dark intensity profile, while the \(e^{il\phi}\) term winds the phase through \(2\pi l\) once around the axis – the helical wavefront that carries the orbital angular momentum. This is compared below against the ordinary (\(l=0,\ p=0\)) Gaussian mode’s single bright spot and flat on-axis phase.
import matplotlib.pyplot as plt
import numpy as np
from physicskit.optics.gaussian import GaussianBeam, laguerre_gaussian_mode
The l=0 fundamental mode vs. an l=1 optical vortex, same beam parameters#
The vortex’s doughnut intensity (dark core on-axis, since the LG amplitude carries a factor r^|l| that vanishes at r=0) and its helical phase (a 2*pi phase winding around the axis, absent for l=0).
fig, axes = plt.subplots(2, 2, figsize=(7, 7))
axes[0, 0].imshow(np.abs(u_gaussian) ** 2, extent=[-2, 2, -2, 2])
axes[0, 0].set_title("l=0 intensity")
axes[0, 1].imshow(np.angle(u_gaussian), extent=[-2, 2, -2, 2], cmap="twilight")
axes[0, 1].set_title("l=0 phase")
axes[1, 0].imshow(np.abs(u_vortex) ** 2, extent=[-2, 2, -2, 2])
axes[1, 0].set_title("l=1 intensity (donut, dark core)")
axes[1, 1].imshow(np.angle(u_vortex), extent=[-2, 2, -2, 2], cmap="twilight")
axes[1, 1].set_title("l=1 phase (helical, 2*pi winding)")
fig.tight_layout()
center = len(coords) // 2
I_gaussian_axis = np.abs(u_gaussian[center, center]) ** 2
I_vortex_axis = np.abs(u_vortex[center, center]) ** 2
# Phase sampled around a small circle of radius r around the axis: for l=1
# this should wind through 2*pi once; for l=0 it should stay flat.
theta_ring = np.linspace(0, 2 * np.pi, 400, endpoint=False)
r_ring = 0.5
u_ring_vortex = laguerre_gaussian_mode(r_ring, theta_ring, 0.0, beam, l=1, p=0)
phase_unwrapped = np.unwrap(np.angle(u_ring_vortex))
winding = (phase_unwrapped[-1] - phase_unwrapped[0]) / (2 * np.pi)
print(f"on-axis intensity, l=0 (single bright spot): {I_gaussian_axis:.6f}")
print(f"on-axis intensity, l=1 (dark core): {I_vortex_axis:.2e}")
print(f"phase winding around the l=1 vortex axis: {winding:.3f} x 2*pi (predicted: 1.0)")
print("orbital angular momentum per photon: L_z = l*hbar -> nonzero only for l != 0")

on-axis intensity, l=0 (single bright spot): 0.999284
on-axis intensity, l=1 (dark core): 7.15e-04
phase winding around the l=1 vortex axis: 0.998 x 2*pi (predicted: 1.0)
orbital angular momentum per photon: L_z = l*hbar -> nonzero only for l != 0
Total running time of the script: (0 minutes 0.134 seconds)