7.2 Types of Waves

Ocean waves span an enormous range of scales, from capillary ripples (millimeters) to tides (thousands of kilometers). Each type has different physics and importance.

Wave Classification by Period

Capillary Waves (<0.1s)

Surface tension dominated. Ripples. λ < 1.7 cm.

Wind Waves (0.5-10s)

Gravity waves. Local wind generation. Chaotic sea state.

Swell (10-30s)

Long-traveled waves. Regular, organized. Surfing waves.

Infragravity (30s-5min)

Bound waves, harbor resonance. Important for coastal flooding.

Tsunamis (10-60min)

Seismic/volcanic origin. Shallow water wave behavior. Devastating.

Tides (12-24hr)

Gravitational forcing. Predictable. Global scale.

Internal Waves

Waves at density interfaces (thermocline) inside the ocean. Much larger amplitude than surface waves (10-100m).

Generation

Tidal flow over topography, wind, density fronts

Importance

Mixing, nutrient transport, submarine navigation

Rogue Waves

\( H_{rogue} \geq 2 \times H_{s} \)

Definition: Height ≥ twice significant wave height

Once thought mythical, now confirmed by measurements. Caused by wave focusing, constructive interference, or current interactions.

Python: Wave Spectrum

#!/usr/bin/env python3
"""wave_types.py - Wave energy spectrum"""
import numpy as np
import matplotlib.pyplot as plt

def pierson_moskowitz_spectrum(f, U10):
    """
    Pierson-Moskowitz spectrum for fully developed sea
    f: frequency (Hz), U10: wind speed at 10m (m/s)
    """
    g = 9.81
    alpha = 0.0081
    beta = 0.74
    fp = g / (2 * np.pi * U10)  # peak frequency

    S = (alpha * g**2 / (2 * np.pi)**4 / f**5) * \
        np.exp(-beta * (fp / f)**4)
    return S

# Frequency range
f = np.linspace(0.03, 0.5, 200)  # Hz

# Different wind speeds
wind_speeds = [5, 10, 15, 20]  # m/s

plt.figure(figsize=(10, 6))
for U in wind_speeds:
    S = pierson_moskowitz_spectrum(f, U)
    plt.plot(f, S, label=f'U₁₀ = {U} m/s')

plt.xlabel('Frequency (Hz)')
plt.ylabel('Spectral Density (m²/Hz)')
plt.title('Pierson-Moskowitz Wave Spectrum')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim(0, 0.5)

# Period labels
periods = [20, 10, 5, 3]
for T in periods:
    plt.axvline(1/T, color='gray', linestyle=':', alpha=0.5)
    plt.text(1/T, plt.ylim()[1]*0.9, f'{T}s', fontsize=8)

plt.tight_layout()