10.2 In-Situ Measurements

In-situ (on-site) measurements provide direct ocean observations. From traditional CTD casts to modern Argo floats, these measurements are essential for calibrating satellites and understanding ocean interior.

Traditional Methods

CTD

Conductivity-Temperature-Depth. Standard research tool. Profiles to 6000m. Additional sensors: oxygen, fluorescence.

Water Samples

Niskin bottles on rosette. Chemistry: nutrients, CO₂, isotopes. Biology: DNA, chlorophyll.

Current Meters

Mechanical or acoustic. Moorings for time series. ADCP profiles velocity vs depth.

The Argo Program

Revolutionary global array of ~4000 profiling floats. Autonomous. Cycles every 10 days: surface → 2000m → surface (transmits via satellite).

~4000

Active floats

2000 m

Profile depth

10 days

Cycle time

Extensions: Deep Argo (6000m), BGC-Argo (biogeochemistry), OneArgo (unified global array).

Moorings & Observatories

TAO/TRITON

Tropical mooring array. ENSO monitoring. Real-time data.

OOI

Ocean Observatories Initiative. US cabled and uncabled arrays.

RAPID

Atlantic meridional overturning monitoring at 26°N.

HOT/BATS

Long-term time series stations. Hawaii, Bermuda. 30+ years data.

Python: CTD Profile

#!/usr/bin/env python3
"""in_situ.py - CTD profile analysis"""
import numpy as np
import matplotlib.pyplot as plt

def synthetic_ctd(z, T_surface=25, T_deep=2, thermocline_depth=200,
                  S_surface=35, S_deep=34.7):
    """
    Generate synthetic CTD profile
    """
    # Temperature profile
    T = T_deep + (T_surface - T_deep) * np.exp(-z / thermocline_depth)

    # Salinity (subtropical - salinity maximum)
    S = S_surface + 0.5 * np.exp(-((z - 150) / 100)**2) + \
        (S_deep - S_surface) * (1 - np.exp(-z / 500))

    return T, S

def density(T, S, simplified=True):
    """Simplified density (sigma-t)"""
    if simplified:
        return (S - 35) * 0.8 - 0.15 * (T - 10)
    # Full equation of state would go here

z = np.linspace(0, 2000, 200)
T, S = synthetic_ctd(z)
sigma = density(T, S)

fig, axes = plt.subplots(1, 3, figsize=(12, 6))

axes[0].plot(T, z, 'r-', lw=2)
axes[0].set_xlabel('Temperature (°C)')
axes[0].set_ylabel('Depth (m)')
axes[0].set_title('Temperature')
axes[0].invert_yaxis()
axes[0].grid(True, alpha=0.3)

axes[1].plot(S, z, 'b-', lw=2)
axes[1].set_xlabel('Salinity (PSU)')
axes[1].set_title('Salinity')
axes[1].invert_yaxis()
axes[1].grid(True, alpha=0.3)

axes[2].plot(sigma, z, 'g-', lw=2)
axes[2].set_xlabel('σ-t (kg/m³)')
axes[2].set_title('Density')
axes[2].invert_yaxis()
axes[2].grid(True, alpha=0.3)

plt.tight_layout()

print("Argo program statistics:")
print("  Floats deployed since 1999: >15,000")
print("  Profiles collected: >2,000,000")
print("  Countries involved: >30")