8.1 Ocean-Atmosphere Interaction
The ocean and atmosphere are coupled through exchanges of heat, moisture, momentum, and gases. These interactions drive weather patterns, regulate climate, and control the global energy balance.
Heat Exchange
\( Q_{net} = Q_{sw} - Q_{lw} - Q_H - Q_E \)
Net heat flux = solar - longwave - sensible - latent
Solar Radiation
~170 W/m² avg absorbed by ocean. Concentrated in tropics.
Latent Heat
Evaporation: ~80 W/m² global. Largest heat loss. Drives atmospheric circulation.
Moisture Exchange
Ocean evaporates ~500,000 km³/year. Most returns as precipitation over ocean, but ~40,000 km³ falls on land (water cycle).
~90%
Of evaporation from ocean
~78%
Of precipitation on ocean
~8%
Ocean to land transfer
Momentum Exchange
Wind Stress
τ = ρ_air C_D U² drives surface currents, Ekman transport, upwelling
Wave Generation
Wind energy → wave energy. Increases surface roughness, enhances exchange.
Python: Air-Sea Fluxes
#!/usr/bin/env python3
"""ocean_atmosphere.py - Air-sea flux calculations"""
import numpy as np
import matplotlib.pyplot as plt
def bulk_heat_flux(T_sea, T_air, U, q_sea, q_air, rho_air=1.2):
"""
Calculate sensible and latent heat flux (bulk formulae)
"""
C_H = 1.2e-3 # Sensible heat transfer coefficient
C_E = 1.2e-3 # Latent heat transfer coefficient
c_p = 1005 # Specific heat of air (J/kg/K)
L_v = 2.5e6 # Latent heat of vaporization (J/kg)
# Sensible heat flux
Q_H = rho_air * c_p * C_H * U * (T_sea - T_air)
# Latent heat flux
Q_E = rho_air * L_v * C_E * U * (q_sea - q_air)
return Q_H, Q_E
def wind_stress(U, rho_air=1.2, C_D=1.3e-3):
"""Wind stress (N/m²)"""
return rho_air * C_D * U**2
# Example: Tropical ocean
T_sea = 28 # °C
T_air = 26 # °C
U = np.linspace(1, 20, 50) # Wind speed m/s
q_sea = 0.020 # Specific humidity at SST
q_air = 0.015 # Air specific humidity
Q_H, Q_E = bulk_heat_flux(T_sea, T_air, U, q_sea, q_air)
tau = wind_stress(U)
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
axes[0].plot(U, Q_H, 'r-', lw=2)
axes[0].set_xlabel('Wind Speed (m/s)')
axes[0].set_ylabel('Sensible Heat (W/m²)')
axes[0].set_title('Sensible Heat Flux')
axes[1].plot(U, Q_E, 'b-', lw=2)
axes[1].set_xlabel('Wind Speed (m/s)')
axes[1].set_ylabel('Latent Heat (W/m²)')
axes[1].set_title('Latent Heat Flux')
axes[2].plot(U, tau, 'g-', lw=2)
axes[2].set_xlabel('Wind Speed (m/s)')
axes[2].set_ylabel('Wind Stress (N/m²)')
axes[2].set_title('Wind Stress')
for ax in axes:
ax.grid(True, alpha=0.3)
plt.tight_layout()