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