4.4 Jet Streams

Jet streams are narrow bands of fast-moving air at high altitudes. They are critical for weather development and are used by aircraft for fuel efficiency.

Types of Jet Streams

Polar Jet Stream

Location: 30-60°N/S at ~300 hPa (9-12 km)

Speed: 100-200 kt, highly variable

Associated with polar front and cyclones

Subtropical Jet Stream

Location: ~30°N/S at ~200 hPa (10-16 km)

Speed: 80-150 kt, more steady

Associated with Hadley cell boundary

Formation: Thermal Wind Relationship

$$|\vec{v}_T| = \frac{R}{f}\ln\left(\frac{p_0}{p_1}\right)|\nabla_p \bar{T}|$$

Strong temperature gradients → strong jet streams

The polar jet exists because of the strong temperature contrast between tropical and polar air. Jet streams are strongest in winter when this contrast is greatest.

Rossby Waves

The jet stream meanders in large-scale waves called Rossby waves or planetary waves. These waves are crucial for weather pattern development.

Ridge

Northward bulge, high pressure, fair weather

Trough

Southward dip, low pressure, stormy weather

Python: Jet Stream Visualization

#!/usr/bin/env python3
"""
jet_streams.py - Visualize jet stream and Rossby waves

Run: python3 jet_streams.py
Requires: pip install numpy matplotlib
"""
import numpy as np
import matplotlib.pyplot as plt

# Create a simplified jet stream visualization
fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# Zonal cross-section of jet stream
ax1 = axes[0]
lat = np.linspace(0, 90, 100)
p = np.linspace(1000, 100, 100)
LAT, P = np.meshgrid(lat, p)

# Jet stream core at ~30° and ~60°, around 200-300 hPa
# Polar jet
polar_jet = 50 * np.exp(-((LAT - 50)**2/100 + (P - 250)**2/5000))
# Subtropical jet
subtr_jet = 40 * np.exp(-((LAT - 30)**2/80 + (P - 200)**2/4000))
u_wind = polar_jet + subtr_jet

cf = ax1.contourf(LAT, P, u_wind, levels=20, cmap='hot_r')
plt.colorbar(cf, ax=ax1, label='Wind Speed (m/s)')
cs = ax1.contour(LAT, P, u_wind, levels=[20, 30, 40, 50], colors='black')
ax1.clabel(cs, inline=True, fontsize=8)

ax1.set_xlabel('Latitude (°N)', fontsize=12)
ax1.set_ylabel('Pressure (hPa)', fontsize=12)
ax1.set_title('Jet Stream Cross-Section', fontsize=14)
ax1.invert_yaxis()

# Add labels
ax1.annotate('Polar Jet', (50, 270), fontsize=10, fontweight='bold', color='white')
ax1.annotate('Subtropical Jet', (30, 180), fontsize=10, fontweight='bold', color='white')

# Map view with Rossby waves
ax2 = axes[1]
lon = np.linspace(-180, 180, 360)
lat_base = 45  # Mean jet latitude
n_waves = 5  # Number of Rossby waves
amplitude = 15  # Degrees latitude

# Jet stream path with waves
jet_lat = lat_base + amplitude * np.sin(n_waves * np.radians(lon))

# Plot
ax2.plot(lon, jet_lat, 'b-', linewidth=3, label='Polar Jet')
ax2.fill_between(lon, jet_lat - 5, jet_lat + 5, alpha=0.3, color='blue')

# Mark ridges and troughs
for i, l in enumerate([-144, -72, 0, 72, 144]):
    if np.sin(n_waves * np.radians(l)) > 0.9:
        ax2.annotate('R', (l, lat_base + amplitude + 3), fontsize=12,
                    fontweight='bold', color='red', ha='center')
    elif np.sin(n_waves * np.radians(l)) < -0.9:
        ax2.annotate('T', (l, lat_base - amplitude - 5), fontsize=12,
                    fontweight='bold', color='blue', ha='center')

# Add lat/lon grid
ax2.set_xlim(-180, 180)
ax2.set_ylim(20, 70)
ax2.set_xlabel('Longitude', fontsize=12)
ax2.set_ylabel('Latitude (°N)', fontsize=12)
ax2.set_title('Jet Stream with Rossby Waves (Plan View)', fontsize=14)
ax2.axhline(y=lat_base, color='gray', linestyle='--', alpha=0.5)
ax2.grid(True, alpha=0.3)

# Add arrows showing flow direction
for l in range(-150, 180, 60):
    idx = np.argmin(np.abs(lon - l))
    ax2.annotate('', xy=(l+20, jet_lat[idx+20]), xytext=(l, jet_lat[idx]),
                arrowprops=dict(arrowstyle='->', color='blue', lw=2))

ax2.text(0, 22, 'R = Ridge (fair), T = Trough (stormy)', ha='center', fontsize=10)

plt.tight_layout()
plt.savefig('jet_streams.png', dpi=150, bbox_inches='tight')
plt.show()

print("Jet Stream Characteristics:")
print("-" * 40)
print("Polar Jet:")
print("  Latitude: 40-60°N (varies seasonally)")
print("  Altitude: ~300 hPa (9-12 km)")
print("  Speed: 100-200 kt (max 250+ kt)")
print()
print("Subtropical Jet:")
print("  Latitude: ~30°N")
print("  Altitude: ~200 hPa (10-16 km)")
print("  Speed: 80-150 kt")
print()
print("Rossby waves: 4-6 typically circle the globe")