6.3 Upwelling & Downwelling
Upwelling brings cold, nutrient-rich deep water to the surface, fueling some of Earth's most productive ecosystems. Downwelling carries surface water and oxygen to the deep ocean.
Types of Upwelling
Coastal Upwelling
Wind-driven Ekman transport moves surface water offshore. Deep water rises to replace it. California, Peru, Benguela, Canary systems.
Equatorial Upwelling
Trade winds cause divergence at equator (Coriolis changes sign). Cold tongue in E. Pacific.
Open Ocean Upwelling
Wind-driven divergence (cyclonic gyres, ACC). Slower but covers large areas.
Upwelling Dynamics
\( w = \frac{1}{\rho f} \nabla \times \vec{\tau} \cdot \hat{k} \)
Ekman pumping velocity from wind stress curl
50-300 m
Upwelling depth
1-10 m/day
Vertical velocity
5-10ยฐC
Surface cooling
Biological Importance
High Productivity
Upwelling regions are <1% of ocean area but support >20% of fish catch
Food Web Support
Nutrients fuel phytoplankton โ zooplankton โ fish โ seabirds/marine mammals
Major upwelling fisheries: Peruvian anchoveta, California sardine, Namibian hake
Python: Upwelling Model
#!/usr/bin/env python3
"""upwelling.py - Coastal upwelling model"""
import numpy as np
import matplotlib.pyplot as plt
def upwelling_velocity(tau, rho=1025, f=1e-4, L=50e3):
"""
Estimate upwelling velocity from wind stress
tau: alongshore wind stress (N/mยฒ)
L: width of upwelling zone (m)
"""
# Ekman transport
M_E = tau / (rho * f) # mยฒ/s
# Upwelling velocity
w = M_E / L
return w * 86400 # Convert to m/day
def nutrient_supply(w, dN_dz=0.1):
"""
Nutrient flux from upwelling
w: vertical velocity (m/day)
dN_dz: nutrient gradient (ยตM/m)
"""
return w * dN_dz # ยตM/day
# Wind stress range
tau = np.linspace(0, 0.2, 100) # N/mยฒ
w = upwelling_velocity(tau)
N_flux = nutrient_supply(w)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.plot(tau, w, 'b-', lw=2)
ax1.set_xlabel('Wind Stress (N/mยฒ)')
ax1.set_ylabel('Upwelling Velocity (m/day)')
ax1.set_title('Coastal Upwelling')
ax1.grid(True, alpha=0.3)
ax2.plot(tau, N_flux, 'g-', lw=2)
ax2.set_xlabel('Wind Stress (N/mยฒ)')
ax2.set_ylabel('Nutrient Flux (ยตM/day)')
ax2.set_title('Nutrient Supply')
ax2.grid(True, alpha=0.3)
plt.tight_layout()
print("Major upwelling regions:")
print(" Peru/Chile: ~0.5% of ocean, ~20% of fish catch")
print(" California: 0.1% of ocean, 3% of US fish catch")