Seminar 2 — Gaussian Beams & Jones Calculus

Introduction

In this seminar, we explore Gaussian beam optics and polarization optics using Jones vectors. These are central concepts in modern photonics: Gaussian beams describe laser output, and Jones calculus elegantly handles polarization transformations through optical systems.


Pen & Paper Problems

Problem 1: Gaussian Beam Parameters

A TiSapphire laser produces a Gaussian beam with wavelength \(\lambda = 800\) nm and beam waist radius \(w_0 = 10\) μm.

Tasks: 1. Calculate the Rayleigh range \(z_R = \pi w_0^2 / \lambda\). 2. Calculate the divergence angle \(\theta \approx \lambda / (\pi w_0)\). 3. At distance \(z = 1\) m from the waist, what is the beam radius \(w(z) = w_0 \sqrt{1 + (z/z_R)^2}\)? 4. What is the total beam diameter at \(z = 1\) m? 5. Sketch how the beam radius grows with distance.


Problem 2: Focusing a Gaussian Beam

A Gaussian beam (waist \(w_0 = 100\) μm, \(\lambda = 800\) nm) passes through a convergent lens of focal length \(f = 50\) mm. The waist is placed \(z = 200\) mm before the lens.

Tasks: 1. The beam has a certain radius and divergence before the lens. Calculate both. 2. After the lens acts as a “telescope” to refocus the beam, estimate where the new waist will be and how tight it will be. - Use the lens formula: if the incident beam has waist \(w_0\) at distance \(z_0\) before the lens, the new waist \(w_0'\) and position \(z_0'\) can be estimated from Gaussian optics formulas. - Approximate formula (thin lens): \(\frac{1}{z_R} \approx \frac{1}{f z_R} + \frac{1}{f^2}\) for the new Rayleigh range.

Hint: This requires understanding how lenses transform Gaussian beams. Alternatively, use the ABCD matrix approach from Seminar 1.


Problem 3: Jones Vectors and Polarization

A linear polarizer aligned at 0° transmits \(x\)-polarized light. A quarter-wave plate (QWP) is then oriented at 45° to the \(x\)-axis. Finally, an analyzer at 0° (passing \(x\)-polarized light) completes the system.

Tasks: 1. Write the Jones vectors for the incident light (unpolarized → first pass through polarizer at 0°). 2. After the polarizer, the beam is \(x\)-polarized: \(\begin{pmatrix} 1 \\ 0 \end{pmatrix}\). 3. The QWP at 45° introduces a phase shift of \(\pi/2\) between fast and slow axes. Write the Jones matrix for a QWP at 45°: \[M_{\text{QWP}} = \begin{pmatrix} \cos^2 45° + i\sin^2 45° & (1-i)\cos 45° \sin 45° \\ (1-i)\cos 45° \sin 45° & \sin^2 45° + i\cos^2 45° \end{pmatrix} = \frac{1}{2}\begin{pmatrix} 1+i & 1-i \\ 1-i & 1+i \end{pmatrix}\] 4. Apply the QWP to the \(x\)-polarized beam. What is the output polarization state? 5. Apply the analyzer (which extracts the \(x\)-component). What is the transmitted intensity?

Note: This demonstrates how a QWP at 45° converts linear polarization into circular polarization.


Problem 4: Fresnel Equations for Polarization

Design a Brewster’s angle window for a laser beam entering a transparent medium at Brewster angle.

Tasks: 1. Light at Brewster angle (\(\theta_B = 56.3°\) for glass, \(n = 1.5\)) can enter the glass with zero reflection loss for \(p\)-polarized light. 2. Explain why \(R_p = 0\) at Brewster angle. At this angle, what is the relationship between \(\theta_i\) and \(\theta_t\)? 3. What is the reflection loss for \(s\)-polarized light at Brewster angle?


Problem 5: Optical Isolator Design (Challenge)

Sketch an optical isolator using: - A polarizer (transmits \(x\)-polarization) - A Faraday rotator (rotates polarization by angle \(\theta\) via Faraday effect; non-reciprocal) - An analyzer (transmits \(x\)-polarization)

Tasks: 1. For forward propagation (left to right): light enters as \(x\)-polarized, rotated by 45° (becomes circular), passes through analyzer. What fraction is transmitted? 2. For backward propagation (right to left): light enters from the analyzer as \(x\)-polarized. After the Faraday rotator (still rotating by 45°, but in same direction), it becomes elliptical. What fraction is transmitted? 3. Why is this device an “isolator”? What isolation ratio do you expect?

Hint: Use Jones matrices: - Polarizer: \(P_x = \begin{pmatrix} 1 & 0 \\ 0 & 0 \end{pmatrix}\) - Faraday rotator by angle \(\theta\): \(R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}\)


Python Exercises

Setup


Exercise 1: Gaussian Beam Profile

Calculate and visualize the intensity profile of a Gaussian beam.

Code
# Gaussian beam parameters
wavelength = 800e-9  # 800 nm
w0 = 10e-6  # 10 µm waist
z_R = np.pi * w0**2 / wavelength  # Rayleigh range

# Beam radius as function of z
z_values = np.linspace(-2*z_R, 2*z_R, 1000)
w_z = w0 * np.sqrt(1 + (z_values / z_R)**2)

# Divergence angle
divergence = wavelength / (np.pi * w0)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=get_size(14, 5))

# Plot 1: Beam envelope
ax1.plot(z_values*1e3, w_z*1e6, 'b-', linewidth=2, label='Beam radius')
ax1.fill_between(z_values*1e3, -w_z*1e6, w_z*1e6, alpha=0.3)
ax1.axvline(0, color='gray', linestyle='--', alpha=0.5)
ax1.axhline(w0*1e6, color='gray', linestyle=':', alpha=0.5)
ax1.set_xlabel('Distance from waist (mm)')
ax1.set_ylabel('Beam radius (µm)')
ax1.grid(True, alpha=0.3)
ax1.set_xlim([-2*z_R*1e3, 2*z_R*1e3])
ax1.legend(fontsize=8)

# Plot 2: Intensity profile at various z
z_slices = [0, z_R, 2*z_R]
r_profile = np.linspace(0, 50e-6, 300)

for z in z_slices:
    w_z_val = w0 * np.sqrt(1 + (z / z_R)**2)
    I = np.exp(-2 * r_profile**2 / w_z_val**2)
    ax2.plot(r_profile*1e6, I, label=f'z = {z/z_R:.1f} $z_R$', linewidth=2)

ax2.set_xlabel('Radial position (µm)')
ax2.set_ylabel('Intensity (normalized)')
ax2.grid(True, alpha=0.3)
ax2.legend(fontsize=8)

plt.tight_layout()
plt.savefig('img/gaussian_beam_profile.png', dpi=150, bbox_inches='tight')
plt.close()

print(f"Waist radius: {w0*1e6:.2f} µm")
print(f"Rayleigh range: {z_R*1e3:.3f} mm")
print(f"Divergence angle: {divergence*1e3:.3f} mrad = {divergence*180/np.pi:.4f}°")
print(f"Beam radius at 1 m: {w0*np.sqrt(1+(1/(z_R))**2)*1e3:.2f} mm")
Waist radius: 10.00 µm
Rayleigh range: 0.393 mm
Divergence angle: 25.465 mrad = 1.4590°
Beam radius at 1 m: 25.46 mm

Exercise 2: Focusing Geometry

Simulate a Gaussian beam focused by a lens.

Code
def gaussian_beam_focus(w0, wavelength, z0_before_lens, f):
    """
    Simplified model: beam waist before lens, lens focuses it.
    Returns approximate new waist position and size.
    """
    z_R = np.pi * w0**2 / wavelength

    # Parameters of beam at lens
    w_lens = w0 * np.sqrt(1 + (z0_before_lens / z_R)**2)
    theta_div = wavelength / (np.pi * w0)  # divergence

    # Geometric focusing
    R_lens = 1 / (1/f - theta_div / w_lens)  # effective radius of curvature

    # New waist approximately at focal plane (for thin lens)
    # Simplified: new waist ~ f * theta_div
    w0_new = wavelength * f / (np.pi * w_lens)

    return w0_new, f

# Parameters
w0 = 100e-6  # 100 µm
wavelength = 800e-9
z0 = 200e-3  # 200 mm before lens
f = 50e-3    # 50 mm focal length

w0_new, z0_new = gaussian_beam_focus(w0, wavelength, z0, f)

# Visualize the system
fig, ax = plt.subplots(figsize=get_size(13, 6))

# Before lens
z_before = np.linspace(-0.3, 0, 200)
z_R_before = np.pi * w0**2 / wavelength
w_before = w0 * np.sqrt(1 + (z_before / z_R_before)**2)

ax.fill_between(z_before*1e3, -w_before*1e6, w_before*1e6, alpha=0.3, color='blue', label='Incident beam')
ax.plot(z_before*1e3, w_before*1e6, 'b-', linewidth=2)
ax.plot(z_before*1e3, -w_before*1e6, 'b-', linewidth=2)

# After lens (approximate)
z_after = np.linspace(0, 0.1, 200)
w_after = w0_new * np.sqrt(1 + (z_after / (np.pi * w0_new**2 / wavelength))**2)

ax.fill_between(z_after*1e3, -w_after*1e6, w_after*1e6, alpha=0.3, color='red', label='Focused beam')
ax.plot(z_after*1e3, w_after*1e6, 'r-', linewidth=2)
ax.plot(z_after*1e3, -w_after*1e6, 'r-', linewidth=2)

# Lens position
ax.axvline(0, color='black', linestyle='-', linewidth=3, label='Lens')

ax.set_xlabel('Distance (mm)')
ax.set_ylabel('Beam radius (µm)')
ax.grid(True, alpha=0.3)
ax.legend(fontsize=8)
ax.set_xlim([-0.3, 0.1])

plt.tight_layout()
plt.savefig('img/focused_gaussian_beam.png', dpi=150, bbox_inches='tight')
plt.close()

print(f"Before lens: w0 = {w0*1e6:.1f} µm, z_R = {z_R_before*1e3:.2f} mm")
print(f"After lens: w0' ≈ {w0_new*1e9:.1f} nm (estimate)")
Before lens: w0 = 100.0 µm, z_R = 39.27 mm
After lens: w0' ≈ 24531.6 nm (estimate)

Exercise 3: Jones Vector Transformations

Trace polarization through a system of optical elements using Jones matrices.

Code
def jones_normalize(v):
    """Normalize Jones vector to unit intensity."""
    norm = np.sqrt(np.abs(v[0])**2 + np.abs(v[1])**2)
    if norm > 0:
        return v / norm
    return v

# Initial state: x-polarized light
E0 = np.array([1.0, 0.0])

# Optical elements as Jones matrices
def polarizer_at_angle(theta):
    """Linear polarizer at angle theta."""
    c, s = np.cos(theta), np.sin(theta)
    return np.array([[c**2, c*s], [c*s, s**2]])

def waveplate(retardance, theta):
    """Waveplate with retardance (in units of π) at angle theta."""
    c, s = np.cos(theta), np.sin(theta)
    # Fast axis along theta direction
    phase = 1j * retardance / 2
    J = np.array([[c**2 + s**2*np.exp(1j*retardance),
                   c*s*(1 - np.exp(1j*retardance))],
                  [c*s*(1 - np.exp(1j*retardance)),
                   s**2 + c**2*np.exp(1j*retardance)]])
    return J

def analyzer_at_angle(theta):
    """Analyzer (transmits along theta direction)."""
    return polarizer_at_angle(theta)

# System: Polarizer(0°) -> QWP(45°) -> Analyzer(0°)
P = polarizer_at_angle(0)
QWP = waveplate(np.pi/2, np.pi/4)  # π/2 retardance at 45°
A = analyzer_at_angle(0)

# Trace through system
E1 = P @ E0  # After polarizer
E1 = E1 / np.linalg.norm(E1)
print(f"After polarizer (0°): {E1}")

E2 = QWP @ E1  # After QWP
E2_norm = E2 / np.linalg.norm(E2)
print(f"After QWP (45°): {E2_norm}")

E3 = A @ E2  # After analyzer
intensity = np.abs(E3[0])**2 + np.abs(E3[1])**2
print(f"Final intensity: {intensity:.4f}")

# Visualize: scan analyzer angle
analyzer_angles = np.linspace(0, 2*np.pi, 360)
intensities = []

for angle in analyzer_angles:
    A_scan = analyzer_at_angle(angle)
    E_test = A_scan @ (QWP @ (P @ E0))
    I = np.abs(E_test[0])**2 + np.abs(E_test[1])**2
    intensities.append(I)

fig, ax = plt.subplots(figsize=get_size(12, 6))
ax.plot(analyzer_angles * 180/np.pi, intensities, linewidth=2)
ax.axhline(0.5, color='red', linestyle='--', alpha=0.5, label='50% transmission')
ax.set_xlabel('Analyzer angle (°)')
ax.set_ylabel('Transmitted intensity (normalized)')
ax.grid(True, alpha=0.3)
ax.legend(fontsize=8)
ax.set_xlim([0, 360])
ax.set_xticks([0, 90, 180, 270, 360])

plt.tight_layout()
plt.savefig('img/polarization_transmission.png', dpi=150, bbox_inches='tight')
plt.close()

print(f"\nMaximum transmission: {np.max(intensities):.4f}")
print(f"Minimum transmission: {np.min(intensities):.4f}")
After polarizer (0°): [1. 0.]
After QWP (45°): [0.5+0.5j 0.5-0.5j]
Final intensity: 0.5000

Maximum transmission: 0.5000
Minimum transmission: 0.5000

Exercise 4: Optical Isolator

Simulate an optical isolator with Faraday rotation.

Code
def rotation_matrix(theta):
    """Jones matrix for rotation by angle theta."""
    c, s = np.cos(theta), np.sin(theta)
    return np.array([[c, -s], [s, c]])

def analyze_isolator(faraday_angle):
    """
    Optical isolator: Polarizer -> Faraday rotator -> Analyzer
    All aligned at 0° except Faraday rotates by faraday_angle.
    """
    # Forward path (left to right)
    P = polarizer_at_angle(0)  # x-polarized
    FR = rotation_matrix(faraday_angle)  # Faraday rotator
    A = analyzer_at_angle(0)  # x-analyzer

    E_forward = A @ FR @ (P @ np.array([1, 0]))
    I_forward = np.abs(E_forward[0])**2 + np.abs(E_forward[1])**2

    # Backward path (right to left): light enters from analyzer side
    # Direction is reversed, but Faraday effect does NOT reverse (non-reciprocal)
    E_backward = P @ FR @ (A @ np.array([1, 0]))
    I_backward = np.abs(E_backward[0])**2 + np.abs(E_backward[1])**2

    return I_forward, I_backward

# Optimal isolator: Faraday angle = 45°
angles = np.linspace(0, 90, 91)
I_fwd_list = []
I_bwd_list = []
isolation_ratio = []

for angle_deg in angles:
    angle_rad = angle_deg * np.pi / 180
    I_fwd, I_bwd = analyze_isolator(angle_rad)
    I_fwd_list.append(I_fwd)
    I_bwd_list.append(I_bwd)
    if I_bwd > 1e-6:
        isolation_ratio.append(I_fwd / I_bwd)
    else:
        isolation_ratio.append(np.inf)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=get_size(14, 5))

# Plot 1: Transmission
ax1.plot(angles, I_fwd_list, 'b-', linewidth=2, label='Forward transmission')
ax1.plot(angles, I_bwd_list, 'r-', linewidth=2, label='Backward transmission')
ax1.axvline(45, color='green', linestyle='--', alpha=0.7, label='Optimal (45°)')
ax1.set_xlabel('Faraday rotation angle (°)')
ax1.set_ylabel('Transmission (normalized)')
ax1.grid(True, alpha=0.3)
ax1.legend(fontsize=8)
ax1.set_xlim([0, 90])

# Plot 2: Isolation ratio
isolation_ratio_clipped = np.clip(isolation_ratio, 1, 100)
ax2.semilogy(angles, isolation_ratio_clipped, 'g-', linewidth=2)
ax2.axvline(45, color='green', linestyle='--', alpha=0.7)
ax2.set_xlabel('Faraday rotation angle (°)')
ax2.set_ylabel('Isolation ratio (log scale)')
ax2.grid(True, alpha=0.3)
ax2.set_xlim([0, 90])

plt.tight_layout()
plt.savefig('img/optical_isolator.png', dpi=150, bbox_inches='tight')
plt.close()

I_fwd_opt, I_bwd_opt = analyze_isolator(45 * np.pi / 180)
print(f"At optimal 45° rotation:")
print(f"  Forward transmission: {I_fwd_opt:.4f}")
print(f"  Backward transmission: {I_bwd_opt:.4f}")
print(f"  Isolation ratio: {I_fwd_opt/I_bwd_opt:.1f}:1 (dB = {10*np.log10(I_fwd_opt/I_bwd_opt):.2f})")
At optimal 45° rotation:
  Forward transmission: 0.5000
  Backward transmission: 0.5000
  Isolation ratio: 1.0:1 (dB = 0.00)

Solutions Guide

Problem 1: Calculate using the given formulas. At \(z = 1\) m for an 800 nm laser with 10 μm waist, the Rayleigh range is ~0.4 mm, so the beam diverges significantly.

Problem 2: The beam before the lens diverges as \(\theta \approx \lambda/(\pi w_0)\). After focusing, the new waist size is approximately \(w_0' \sim \lambda f / (\pi w_0)\), producing a tight focus.

Problem 3: A QWP at 45° converts \(x\)-polarized light into circular polarization. The Jones vector after the QWP should be proportional to \(\begin{pmatrix} 1 \\ i \end{pmatrix}\) (right circular) or \(\begin{pmatrix} 1 \\ -i \end{pmatrix}\) (left circular), depending on convention.

Problem 4: At Brewster angle, \(\tan\theta_B = n_2/n_1\), which makes \(\theta_i + \theta_t = 90°\). The \(p\)-wave has zero reflection because the reflected and refracted waves would be perpendicular, destroying the reflected wave.

Problem 5: With a 45° Faraday rotator, forward light (x-polarized) becomes circular, transmitting half-intensity through the analyzer. Backward light undergoes another 45° rotation, becoming \(s\)-polarized, transmitting near zero. This produces high isolation.


Summary

Gaussian beam optics and Jones calculus are indispensable tools in modern photonics. You now understand beam propagation, focusing, and polarization control—all essential for laser design, alignment, and optical communication systems.