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