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")