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