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