6.1 Surface Currents

Surface currents are driven by wind and modified by the Coriolis effect, creating the great ocean gyres. They transport heat, influence climate, and distribute marine life across ocean basins.

Ekman Transport

\( \vec{M}_E = \frac{\vec{\tau} \times \hat{k}}{f} \)

Net transport 90° to wind (right in NH, left in SH)

Wind stress on ocean surface creates spiral of currents (Ekman spiral), with net mass transport perpendicular to wind direction.

Major Current Systems

Gulf Stream

Western boundary current. 100 km wide, 1-3 m/s. Warms Europe. 30 Sv flow.

Kuroshio

Pacific counterpart to Gulf Stream. Warms Japan. Strong and narrow.

Antarctic Circumpolar (ACC)

Largest current. 130 Sv. Circles Antarctica. Connects all oceans.

California/Canary Currents

Eastern boundary currents. Cold, slow, broad. Upwelling regions.

Ocean Gyres

Subtropical Gyres

5 major gyres. Clockwise in NH, counter-clockwise in SH. Low productivity centers.

Subpolar Gyres

Smaller, rotate opposite to subtropical. Higher productivity. Cyclonic.

Python: Ekman Spiral

#!/usr/bin/env python3
"""surface_currents.py - Ekman spiral model"""
import numpy as np
import matplotlib.pyplot as plt

def ekman_spiral(z, V0=0.1, D_E=100):
    """
    Ekman spiral velocity profile
    z: depth (m, positive downward)
    V0: surface velocity (m/s)
    D_E: Ekman depth (m)
    """
    a = np.pi / D_E
    u = V0 * np.exp(-a * z) * np.cos(np.pi/4 - a * z)
    v = V0 * np.exp(-a * z) * np.sin(np.pi/4 - a * z)
    return u, v

# Calculate spiral
z = np.linspace(0, 150, 50)
u, v = ekman_spiral(z)

# Plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# Hodograph (spiral view from above)
ax1.plot(u, v, 'b-', lw=2)
ax1.plot(u[0], v[0], 'ro', markersize=10, label='Surface')
ax1.arrow(0, 0, 0, 0.08, head_width=0.01, color='green', label='Wind')
ax1.set_xlabel('u (m/s)'); ax1.set_ylabel('v (m/s)')
ax1.set_title('Ekman Spiral (top view)')
ax1.axis('equal'); ax1.grid(True, alpha=0.3)
ax1.legend()

# Velocity vs depth
ax2.plot(np.sqrt(u**2 + v**2), z, 'b-', lw=2)
ax2.set_xlabel('Speed (m/s)'); ax2.set_ylabel('Depth (m)')
ax2.set_title('Velocity Magnitude vs Depth')
ax2.invert_yaxis()
ax2.axhline(100, color='r', linestyle='--', label='Ekman depth')
ax2.legend(); ax2.grid(True, alpha=0.3)

plt.tight_layout()