10.1 Satellite Oceanography

Satellites revolutionized oceanography by providing global, repeated measurements. They observe sea surface temperature, height, color, salinity, and windsβ€”essential for understanding ocean dynamics and climate.

Key Satellite Measurements

Sea Surface Temperature (SST)

Infrared + microwave radiometers. MODIS, VIIRS. Β±0.3Β°C accuracy. Weather, climate, fisheries.

Sea Surface Height (SSH)

Radar altimetry. Jason, Sentinel-6. Β±2 cm accuracy. Currents, eddies, sea level rise.

Ocean Color

Visible spectrometers. SeaWiFS, MODIS, OLCI. Chlorophyll, productivity, water quality.

Sea Surface Salinity (SSS)

Microwave radiometry. Aquarius, SMOS, SMAP. Β±0.2 PSU. Water cycle, circulation.

Altimetry Principles

\( SSH = h_{orbit} - R - \sum \text{corrections} \)

horbit: satellite altitude, R: radar range to surface

Corrections

Ionosphere, troposphere, tides, inverse barometer

Applications

Geostrophic currents, mesoscale eddies, El NiΓ±o monitoring

Major Satellite Missions

TOPEX/Poseidon β†’ Jason β†’ Sentinel-6

Altimetry. 1992-present. 10-day repeat. Sea level reference.

MODIS (Terra/Aqua)

SST, ocean color. 2000-present. Daily global.

Sentinel-3

ESA. SST, color, altimetry. Operational oceanography.

SWOT (2022)

Wide-swath altimetry. Submesoscale features. Revolutionary.

Python: SSH & Currents

#!/usr/bin/env python3
"""satellite_oceanography.py - SSH to geostrophic current"""
import numpy as np
import matplotlib.pyplot as plt

def geostrophic_velocity(ssh, dx, f=1e-4, g=9.81):
    """
    Calculate geostrophic velocity from SSH gradient
    u = -(g/f) * d(SSH)/dy
    v = (g/f) * d(SSH)/dx
    """
    dssh_dy = np.gradient(ssh, dx, axis=0)
    dssh_dx = np.gradient(ssh, dx, axis=1)

    u = -(g / f) * dssh_dy
    v = (g / f) * dssh_dx

    return u, v

# Create synthetic SSH field with an eddy
nx, ny = 50, 50
dx = 10e3  # 10 km
x = np.arange(nx) * dx
y = np.arange(ny) * dx
X, Y = np.meshgrid(x, y)

# Gaussian eddy (anticyclonic - positive SSH)
x0, y0 = nx*dx/2, ny*dx/2
R = 100e3
ssh = 0.2 * np.exp(-((X - x0)**2 + (Y - y0)**2) / R**2)

# Calculate currents
u, v = geostrophic_velocity(ssh, dx)
speed = np.sqrt(u**2 + v**2)

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# SSH
im1 = axes[0].contourf(X/1e3, Y/1e3, ssh*100, levels=20, cmap='RdBu_r')
plt.colorbar(im1, ax=axes[0], label='SSH (cm)')
axes[0].set_xlabel('x (km)'); axes[0].set_ylabel('y (km)')
axes[0].set_title('Sea Surface Height')

# Currents
skip = 3
axes[1].quiver(X[::skip, ::skip]/1e3, Y[::skip, ::skip]/1e3,
               u[::skip, ::skip], v[::skip, ::skip])
im2 = axes[1].contourf(X/1e3, Y/1e3, speed, levels=10, cmap='viridis', alpha=0.5)
plt.colorbar(im2, ax=axes[1], label='Speed (m/s)')
axes[1].set_xlabel('x (km)')
axes[1].set_title('Geostrophic Currents')

plt.tight_layout()