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