8.3 Ocean Heat Content
The ocean has absorbed over 90% of the excess heat from global warming. Ocean heat content (OHC) is the most reliable measure of Earth's energy imbalance and climate change.
Heat Storage
\( OHC = \int_0^H \rho c_p T(z) \, dz \)
Ocean heat content (J/m²) integrated over depth
~93%
Of warming absorbed by ocean
~0.9 W/m²
Current planetary imbalance
~400 ZJ
Added since 1970
Depth Distribution
Upper Ocean (0-700m)
Most warming observed here. Well-measured by Argo floats since 2005.
Intermediate (700-2000m)
Significant warming detected. Increasingly measured by Deep Argo.
Abyssal (>2000m)
Warming slower but measurable. Antarctic Bottom Water pathway.
Consequences
Thermal Expansion
~1/3 of sea level rise. Water expands as it warms.
Marine Heatwaves
More frequent and intense. Coral bleaching. Ecosystem disruption.
Stratification
Stronger layering reduces mixing, ventilation, nutrient supply.
Climate Inertia
Ocean heat commitment means warming continues even if emissions stop.
Python: OHC Trend
#!/usr/bin/env python3
"""ocean_heat_content.py - OHC change analysis"""
import numpy as np
import matplotlib.pyplot as plt
# Simplified OHC data (0-2000m, relative to 1971)
years = np.arange(1960, 2025)
# Approximate trend: accelerating heat uptake
ohc = 10 * (years - 1970) + 0.1 * (years - 1970)**2 # ZJ
ohc = np.where(years < 1970, 0, ohc)
# Add some variability (ENSO, decadal)
np.random.seed(42)
variability = 10 * np.sin(2 * np.pi * years / 4) + np.random.normal(0, 5, len(years))
ohc += variability
ohc = np.cumsum(np.diff(np.append(0, ohc)) * 0.8) # Smooth
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(years, ohc, 'r-', lw=2)
plt.fill_between(years, 0, ohc, alpha=0.3, color='red')
plt.xlabel('Year')
plt.ylabel('OHC Anomaly (ZJ)')
plt.title('Ocean Heat Content (0-2000m)')
plt.grid(True, alpha=0.3)
plt.axhline(0, color='black', linestyle='-', alpha=0.3)
# Depth profile of warming
depths = np.array([0, 100, 300, 500, 700, 1000, 1500, 2000, 3000, 4000])
warming = np.array([0.8, 0.6, 0.4, 0.25, 0.15, 0.08, 0.04, 0.02, 0.01, 0.005]) # °C since 1970
plt.subplot(1, 2, 2)
plt.plot(warming, depths, 'b-o', lw=2)
plt.xlabel('Warming (°C)')
plt.ylabel('Depth (m)')
plt.title('Temperature Change Profile')
plt.gca().invert_yaxis()
plt.grid(True, alpha=0.3)
plt.tight_layout()
print("Ocean Heat Content Facts:")
print(" 0-2000m: ~90% of ocean warming")
print(" Rate: ~10 ZJ/year (recent)")
print(" Equivalent to: ~6 Hiroshima bombs/second")