7.6 Coastal Processes
Waves transform dramatically as they approach shore: shoaling, refraction, breaking. These processes shape coastlines, drive sediment transport, and create the surf conditions we experience at beaches.
Wave Transformation
Shoaling
Waves slow in shallow water. Energy conserved โ height increases. H โ hโปยน/โด.
Refraction
Waves bend toward shallow water (speed depends on depth). Focus energy on headlands.
Diffraction
Waves bend around obstacles (breakwaters, islands). Spreads energy into shadow zones.
Wave Breaking
\( \frac{H_b}{h_b} \approx 0.78 \)
Waves break when H/h โ 0.78 (McCowan criterion)
Spilling
Gentle slope. Foam cascades down. Long surf zone.
Plunging
Moderate slope. Classic "tube." Best for surfing.
Surging
Steep slope. Wave doesn't break, surges up beach.
Sediment Transport
Longshore Drift
Waves approach at angle. Swash/backwash create zigzag motion. Net transport along coast.
Cross-shore Transport
Onshore/offshore movement. Storm waves move sand offshore. Summer waves rebuild beaches.
Surf Zone Dynamics
Rip Currents
Narrow, fast offshore flow. Dangerous for swimmers. Form at gaps in sandbars.
Longshore Currents
Flow parallel to beach. 0.3-1 m/s typical. Transport sediment and swimmers.
Python: Wave Refraction
#!/usr/bin/env python3
"""coastal_processes.py - Wave refraction model"""
import numpy as np
import matplotlib.pyplot as plt
g = 9.81
def wave_speed(T, h):
"""
Wave phase speed accounting for depth
Intermediate water approximation
"""
L0 = g * T**2 / (2 * np.pi) # deep water wavelength
k0 = 2 * np.pi / L0
# Newton-Raphson for dispersion relation
k = k0
for _ in range(10):
k = k0 / np.tanh(k * h)
return (2 * np.pi / T) / k
def snells_law(theta_0, c_0, c):
"""Refraction angle from Snell's law"""
sin_theta = (c / c_0) * np.sin(theta_0)
sin_theta = np.clip(sin_theta, -1, 1)
return np.arcsin(sin_theta)
# Approach angle and depth
theta_0 = np.radians(45) # 45ยฐ initial angle
T = 10 # seconds
depths = np.linspace(100, 1, 50)
# Calculate refraction
c_deep = wave_speed(T, 100)
angles = []
speeds = []
for h in depths:
c = wave_speed(T, h)
theta = snells_law(theta_0, c_deep, c)
angles.append(np.degrees(theta))
speeds.append(c)
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(depths, angles, 'b-', lw=2)
plt.xlabel('Depth (m)')
plt.ylabel('Wave Angle (degrees)')
plt.title('Wave Refraction')
plt.gca().invert_xaxis()
plt.grid(True, alpha=0.3)
plt.subplot(1, 2, 2)
plt.plot(depths, speeds, 'g-', lw=2)
plt.xlabel('Depth (m)')
plt.ylabel('Phase Speed (m/s)')
plt.title('Wave Speed vs Depth')
plt.gca().invert_xaxis()
plt.grid(True, alpha=0.3)
plt.tight_layout()
print(f"10s wave approaching at 45ยฐ:")
print(f" Deep water angle: 45ยฐ")
print(f" At 10m depth: {angles[-10]:.1f}ยฐ")
print(f" At 1m depth: {angles[-1]:.1f}ยฐ")