7.4 Tidal Patterns
Real tides are complex combinations of many harmonics. Geography, basin shape, and resonance create diverse tidal patterns around the world, from nearly tideless to extreme 16m ranges.
Tidal Types
Semidiurnal
Two high/low tides per day of similar height. Atlantic coast. Period ~12.42 hr.
Diurnal
One high/low tide per day. Gulf of Mexico. Period ~24 hr.
Mixed
Two unequal high/low tides per day. US Pacific coast. Most common globally.
Tidal Constituents
Tides are decomposed into harmonic constituents (like Fourier analysis):
M₂ (Principal Lunar)
Period: 12.42 hr. Largest component. ~45% of tidal range.
S₂ (Principal Solar)
Period: 12.00 hr. ~20% of M₂. Causes spring/neap.
K₁ (Luni-solar Diurnal)
Period: 23.93 hr. Largest diurnal. ~42% of M₂.
O₁ (Principal Lunar Diurnal)
Period: 25.82 hr. ~32% of M₂.
Extreme Tides
Bay of Fundy
16+ m range! Resonance with M₂ period. Funnel shape amplifies.
Bristol Channel
14 m range. Second largest. Funnel geometry.
Mediterranean
<1 m range. Semi-enclosed. Near amphidromic point.
Gulf of Mexico
~0.5 m range. Diurnal type. Semi-enclosed basin.
Python: Tidal Prediction
#!/usr/bin/env python3
"""tidal_patterns.py - Harmonic tidal prediction"""
import numpy as np
import matplotlib.pyplot as plt
def tidal_prediction(t, constituents):
"""
Predict tide height from harmonic constituents
t: time in hours
constituents: list of (amplitude, period, phase)
"""
eta = 0
for A, T, phi in constituents:
omega = 2 * np.pi / T # rad/hr
eta += A * np.cos(omega * t - phi)
return eta
# Major tidal constituents (simplified)
# (amplitude in m, period in hr, phase in rad)
constituents_semidiurnal = [
(1.0, 12.42, 0), # M2
(0.46, 12.00, 0.5), # S2
(0.19, 12.66, 0.2), # N2
]
constituents_mixed = [
(0.8, 12.42, 0), # M2
(0.37, 12.00, 0.5), # S2
(0.5, 23.93, 0.3), # K1
(0.4, 25.82, 0.1), # O1
]
# Time: 30 days in hours
t = np.linspace(0, 30*24, 1000)
# Calculate tides
eta_semi = tidal_prediction(t, constituents_semidiurnal)
eta_mixed = tidal_prediction(t, constituents_mixed)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)
ax1.plot(t/24, eta_semi, 'b-')
ax1.set_ylabel('Height (m)')
ax1.set_title('Semidiurnal Tide (Atlantic Type)')
ax1.grid(True, alpha=0.3)
ax2.plot(t/24, eta_mixed, 'g-')
ax2.set_xlabel('Time (days)')
ax2.set_ylabel('Height (m)')
ax2.set_title('Mixed Tide (Pacific Type)')
ax2.grid(True, alpha=0.3)
plt.tight_layout()