Chapter 5 Coastal Engineering: Non-Linear waves#
1. Introduction#
🌊 Nonlinear Coastal Waves and Stokes Theory — Overview for Coastal Engineering#
Several wave theories are used to characterize the profile, kinematics, energy, and other dynamic parameters of water waves. These theories are typically categorized based on the linearity of the wave motion.
Linear Wave Theory#
Airy (Linear) Theory - Assumes wave symmetry about the still water level. - Described using a cosine function. - Models only oscillatory waves. - Applicable to deep water and low-amplitude conditions. - Simple and widely used in engineering design. - May oversimplify results due to idealized assumptions.
Nonlinear Wave Theories#
Stokes Theory - Suitable for intermediate to deep water. - Handles moderate wave steepness. - Solutions increase in complexity with each higher-order term. - Commonly used up to 3rd-order; tabulated solutions available.
Cnoidal Wave Theory - Best for shallow water and long-period waves. - Accounts for asymmetric wave profiles. - Solutions derived from tabulated values.
Solitary Wave Theory - Models purely translatory waves. - Assumes infinite wavelength. - Useful for tsunami modeling and wave propagation in channels.
Dean Stream Function Theory - Empirical model based on observed data. - Applicable to a wide range of wave types. - Captures both oscillatory and translatory components.
Applicability Criteria#
Wave theory selection depends on:
Water depth - Wave height - Wave steepness
Refer to the Le Méhauté chart for guidance on choosing the appropriate theory based on these parameters.
📌 What Are Nonlinear Coastal Waves?#
Nonlinear waves refer to wave motions where amplitude affects shape and dynamics—unlike linear (Airy) theory which assumes small amplitude waves with symmetric profiles. Nonlinear behavior includes:
Wave shape asymmetry: steeper crests, flatter troughs
Amplitude-dependent speed: wave velocity depends on height
Energy concentration: higher harmonics introduced in wave profile
Wave-wave interactions: superposition isn’t perfectly linear
These effects become significant when wave steepness \(( \left(\frac{H}{L}\right) \)) exceeds ~0.03–0.05.
📘 Stokes Theory — Nonlinear Approximation for Deep Water Waves#
Stokes theory expands the wave surface elevation ( \eta(x,t) ) as a series of harmonics. It is applicable to intermediate and deep water with moderate wave steepness.
✅ Assumptions#
Fluid is incompressible and inviscid
Flow is irrotational
Waves are periodic, propagating in 1D
Water depth is greater than half wavelength: deep water assumption
Moderate steepness: nonlinear but not breaking
🔢 Orders of Stokes Approximation#
Order |
Features |
When to Use |
---|---|---|
1st (Airy) |
Symmetric sinusoidal wave |
Very small amplitudes, deep water |
2nd |
Accounts for crest-trough asymmetry |
Basic coastal modeling |
3rd |
Enhances vertical profile distortion |
More accurate for moderate steepness |
4th |
Adds sharper crest behavior |
Precision modeling, pre-breaking wave shape |
Each higher order includes additional harmonic components, revealing nonlinear steepening, energy transfer, and phase velocity shifts.
🏗️ Importance in Coastal Engineering#
Why Nonlinear Models Matter:#
📈 Predicting wave run-up & overtopping on structures
🧱 Designing seawalls, breakwaters, and harbor entrances
🌀 Estimating wave forces on offshore platforms and pipelines
🌿 Modeling sediment transport and morphology changes
⚠️ Anticipating wave breaking and energy dissipation zones
Implications:#
Linear models underpredict impact pressures and wave height
Nonlinear wave models help optimize resilience and safety
Crucial for extreme wave event assessment (e.g., storm surge design)
Stokes theory offers a powerful lens into the physics of nonlinear wave evolution—giving engineers tools to anticipate, design, and adapt coastal infrastructure for real-world wave behavior.
References#
[of Engineers, 1984] introduces Airy (linear) wave theory and applies it to coastal design, forming the basis for wave force calculations on structures. [] provides a rigorous yet accessible treatment of nonlinear wave mechanics, including derivations, applicability limits, and engineering implications. It provides a foundational treatment of nonlinear wave theories—including Stokes, cnoidal, solitary, and stream function models—emphasizing analytical solutions, tabulated values, and engineering applicability across various water depths. Their work is widely used in education and design for its clarity and practical focus. In contrast, [Fenton, 1999] advances the numerical modeling of nonlinear waves using Fourier series and iterative techniques, offering high-order accuracy and fully nonlinear solutions suitable for research and complex coastal applications. Together, these references form a complementary framework: Dean for conceptual understanding and design, Fenton for precision modeling and computational implementation.
2. Simulation#
🌊 Stokes vs Airy Wave Profiles — Interactive Visualization Tool#
🧠 What It Is#
An interactive Python tool that compares wave surface profiles using:
Airy (linear) wave theory
Stokes theory (2nd, 3rd, 4th order nonlinear)
It dynamically plots and calculates wave properties: wavelength, wave speed, and group velocity.
⚙️ How It Works#
Computes deep-water wavelength (L) from wave period (T)
Calculates phase speed (c = L / T) and group speed (c_g = c / 2)
Generates wave profiles at time
t
for:Airy wave (small amplitude)
Stokes waves (nonlinear approximations up to 4th order)
Uses sliders to control:
Wave height (H)
Wave period (T)
Time (t)
Water depth (h — used for regime guidance)
🎛️ Inputs#
Input |
Description |
---|---|
|
Wave height (m) |
|
Wave period (s) |
|
Time snapshot for wave evaluation (s) |
|
Water depth (m) |
📊 Outputs#
📈 Surface elevation plots for Airy and 2nd–4th order Stokes waves
📏 Wavelength, phase speed, and group speed values
📌 Wave regime guidance for theory applicability
🧭 How to Interpret#
Airy wave: symmetrical sinusoid, valid for small H and deep water
Stokes waves: increasingly nonlinear with crest steepening and trough flattening, useful for intermediate steepness
Greater H or smaller L → nonlinearity becomes more pronounced
If
h > L/2
, deep water assumption holds; otherwise, consider shallow water theories
Use this tool to explore how wave shape and speed evolve across linear and nonlinear theories for ocean engineering or physical oceanography.
# 🌊 Stokes vs Airy Wave Profiles — Interactive Tool with Wave Properties
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display, clear_output
# ⚙️ Constants
g = 9.81
# 🧠 Deep water dispersion: wavelength from period
def compute_wavelength(T):
return g * T**2 / (2 * np.pi)
# 🔢 Wave speed and group speed
def compute_wave_properties(T):
L = compute_wavelength(T)
c = L / T
c_g = c / 2 # deep water assumption
return L, c, c_g
# 🔢 Stokes Wave Approximations
def stokes_wave(x, t, H, T, order):
L = compute_wavelength(T)
k = 2 * np.pi / L
omega = 2 * np.pi / T
A = H / 2
phase = k * x - omega * t
eta = A * np.cos(phase)
if order >= 2:
eta += (3/8) * A**2 * k * np.cos(2 * phase)
if order >= 3:
eta += (1/3) * A**3 * k**2 * np.cos(3 * phase)
if order >= 4:
eta += (5/64) * A**4 * k**3 * np.cos(4 * phase)
return eta
# 💧 Airy Wave Theory (Linear)
def airy_wave(x, t, H, T):
L = compute_wavelength(T)
k = 2 * np.pi / L
omega = 2 * np.pi / T
return (H / 2) * np.cos(k * x - omega * t)
# 🔁 Plot comparison + wave properties
def plot_comparison(H, T, t, h):
clear_output(wait=True)
L, c, c_g = compute_wave_properties(T)
x = np.linspace(0, L, 1000)
plt.figure(figsize=(12, 5))
plt.plot(x, airy_wave(x, t, H, T), label='Airy (Linear)', lw=2, color='black', linestyle='--')
for order in [2, 3, 4]:
eta = stokes_wave(x, t, H, T, order)
plt.plot(x, eta, label=f'Stokes {order}ᵗʰ Order', lw=2)
plt.title(f"🌊 Wave Profile Comparison — t = {t:.2f}s, H = {H:.2f}m, T = {T:.2f}s")
plt.xlabel("Distance [m]")
plt.ylabel("Surface Elevation [m]")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
# 📌 Wave parameters
print(f"📏 Wavelength (L): {L:.2f} m")
print(f"🚀 Phase Speed (c = L / T): {c:.2f} m/s")
print(f"📡 Group Speed (c_g = c / 2): {c_g:.2f} m/s")
# 📌 Guidance
print("\n🧠 Wave Regime Guidance:")
print("- Airy theory is valid for small amplitude and deep water (h >> H).")
print("- Stokes theory adds nonlinear corrections; use when wave steepness is moderate (H/L ~ 0.05+).")
print("- This tool assumes deep water: h > L/2.")
# 🎛️ Sliders
H_slider = widgets.FloatSlider(value=1.0, min=0.2, max=3.0, step=0.1, description='Wave Height (H)')
T_slider = widgets.FloatSlider(value=8.0, min=4.0, max=20.0, step=0.5, description='Wave Period (T)')
t_slider = widgets.FloatSlider(value=0.0, min=0.0, max=20.0, step=0.2, description='Time (t)')
h_slider = widgets.FloatSlider(value=50.0, min=5.0, max=100.0, step=1.0, description='Water Depth (h)')
ui = widgets.VBox([H_slider, T_slider, t_slider, h_slider])
out = widgets.interactive_output(plot_comparison, {
'H': H_slider, 'T': T_slider, 't': t_slider, 'h': h_slider
})
display(ui, out)
3. Simulation#
🌊 Cnoidal Wave Generator — Summary & Theory#
🧠 What It Is#
An interactive Python tool that models nonlinear shallow-water wave profiles using cnoidal wave theory, appropriate for long-period waves over shallow coasts.
⚙️ How It Works#
Computes wave elevation using Jacobi elliptic functions
Approximates wavelength from shallow water theory: ( L = \sqrt{g h} \cdot T )
Uses elliptic modulus ( m ≈ 1 ) to generate steep crests and flat troughs
Updates wave elevation ( \eta(x, t) ) over space and time
Outputs are plotted for selected wave height (
H
), period (T
), depth (h
), and time (t
)
🎛️ Inputs#
Parameter |
Description |
---|---|
|
Wave height (m) |
|
Wave period (s) |
|
Snapshot time (s) |
|
Water depth (m) |
📊 Output#
Line plot of wave elevation vs. horizontal position
Printout of approximated wavelength and interpretation notes
📐 How to Interpret#
As wave height increases and depth decreases, nonlinearity intensifies
Cnoidal waves become solitary-like when modulus approaches 1 → sharp crest, long flat trough
For smaller
H
or deeperh
, results resemble linear (Airy) wave shapes
📘 Theoretical Background#
🌊 Cnoidal Waves — Origin#
Derived from the Korteweg–de Vries (KdV) equation, which governs weakly nonlinear, dispersive waves in shallow water:
Cnoidal solutions emerge when wave nonlinearity and dispersion are both retained.
✅ Assumptions#
Shallow water: ( h \ll L )
Long waves: wavelength ≫ depth
Moderate to strong nonlinearity: ( H/h ) not negligible
Periodic or solitary behavior depending on elliptic modulus
🏗️ Applicability in Coastal Engineering#
Modeling tidal bores, shoaling, and wave transformation
Capturing pre-breaking shapes in surf zones
Designing structures for wave run-up and overtopping
Predicting long wave energy flux and sediment transport
Cnoidal waves offer essential insights into nonlinear shallow-water dynamics — bridging between linear sinusoidal waves and solitary pulses for coastal design and analysis.
# 🌊 Cnoidal Wave Generator — Nonlinear Shallow Water Profile
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display, clear_output
from scipy.special import ellipj, ellipk
# ⚙️ Constants
g = 9.81
# 📐 Cnoidal Wave Function
def cnoidal_wave(x, t, H, T, h):
# Compute necessary parameters
L = np.sqrt(g * h) * T # Shallow-water approximation for wavelength
m = 0.99 # Elliptic modulus close to 1 for long waves (nearly solitary)
K = ellipk(m) # Complete elliptic integral
# Scaling factor and wavenumber
A = H / (m * K**2) # Amplitude scaling from elevation
omega = 2 * np.pi / T
k = 2 * np.pi / L
# Phase
phi = k * x - omega * t
# Evaluate Jacobi elliptic functions
sn, cn, dn, _ = ellipj(phi, m)
eta = A * dn**2 # Cnoidal elevation shape
return L, eta
# 🔁 Plot function
def plot_cnoidal(H, T, t, h):
clear_output(wait=True)
x = np.linspace(0, 100, 1000)
L, eta = cnoidal_wave(x, t, H, T, h)
plt.figure(figsize=(12, 5))
plt.plot(x, eta, label='Cnoidal Wave', lw=2, color='navy')
plt.title(f'🌊 Cnoidal Wave Profile — t = {t:.2f}s, H = {H:.2f}m, T = {T:.2f}s, h = {h:.2f}m')
plt.xlabel("Distance [m]")
plt.ylabel("Surface Elevation [m]")
plt.grid(True)
plt.tight_layout()
plt.legend()
plt.show()
# 📌 Characteristics
print(f"📏 Approximated Wavelength: {L:.2f} m (Shallow Water)")
print("\n🧠 Interpretation:")
print("- Cnoidal waves model long-period, nonlinear waves in shallow water.")
print("- As modulus → 1, the wave resembles a solitary wave (sharp crest, flat trough).")
print("- For smaller H and deeper h, cnoidal waves converge toward linear Airy form.")
print("- Used in coastal modeling of tidal bores, shoaling waves, and breaking onset.")
# 🎛️ Interactive sliders
H_slider = widgets.FloatSlider(value=1.0, min=0.2, max=2.0, step=0.1, description="Wave Height (H)")
T_slider = widgets.FloatSlider(value=10.0, min=4.0, max=30.0, step=0.5, description="Wave Period (T)")
t_slider = widgets.FloatSlider(value=0.0, min=0.0, max=30.0, step=0.2, description="Time (t)")
h_slider = widgets.FloatSlider(value=3.0, min=0.5, max=10.0, step=0.1, description="Water Depth (h)")
ui = widgets.VBox([H_slider, T_slider, t_slider, h_slider])
out = widgets.interactive_output(plot_cnoidal, {
'H': H_slider, 'T': T_slider, 't': t_slider, 'h': h_slider
})
display(ui, out)
4. Simulation#
🌊 Trochoidal vs Airy Wave Comparison — Summary#
🧠 What It Is#
An interactive tool that compares two surface wave models:
Airy wave theory: linear, sinusoidal waves for deep water and small amplitudes
Trochoidal (Gerstner) wave: fully nonlinear wave model with rotational particle motion and steep crests
⚙️ How It Works#
Calculates surface elevation \(( \eta(x,t) \)) using:
Airy: cosine-based formula assuming irrotational flow
Trochoidal: sine-based formula with circular particle paths
Uses wave height
H
, periodT
, and timet
as adjustable inputsPlots both wave profiles over one wavelength for comparison
🎛️ Inputs#
Parameter |
Description |
---|---|
|
Wave height (m) |
|
Wave period (s) |
|
Time snapshot for evaluation (s) |
📊 Outputs#
Line plots of Airy and Trochoidal wave profiles
Surface elevation along horizontal distance
Wave shape comparison at selected time
🧭 How to Interpret#
Airy wave: smooth, symmetric sinusoid — ideal for low amplitude, deep water conditions
Trochoidal wave: sharper crests, flatter troughs — better for steep non-breaking waves
Differences highlight effects of wave nonlinearity and rotational motion
Useful for visualizing how wave shape affects coastal processes or engineering design
Trochoidal waves model more realistic particle motion and steepness, while Airy waves serve as foundational linear approximations. This tool visually contrasts their behavior under matched conditions.
# 🌊 Comparing Trochoidal (Gerstner) and Airy Waves — Surface Profiles
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display, clear_output
# ⚙️ Constants
g = 9.81
# 🧮 Airy (Linear) Wave Model
def airy_wave(x, t, H, T):
L = g * T**2 / (2 * np.pi) # deep water wavelength
k = 2 * np.pi / L
omega = 2 * np.pi / T
eta = (H / 2) * np.cos(k * x - omega * t)
return eta
# 🔵 Trochoidal Wave (Gerstner Wave)
def trochoidal_wave(x, t, H, T):
L = g * T**2 / (2 * np.pi)
k = 2 * np.pi / L
omega = 2 * np.pi / T
a = H / 2 # Radius of circular particle path
theta = k * x - omega * t
eta = a * np.sin(theta) # Surface elevation follows trochoid curve
return eta
# 📊 Plotting function
def plot_waves(H, T, t):
clear_output(wait=True)
L = g * T**2 / (2 * np.pi)
x = np.linspace(0, L, 1000)
eta_airy = airy_wave(x, t, H, T)
eta_troch = trochoidal_wave(x, t, H, T)
plt.figure(figsize=(12, 5))
plt.plot(x, eta_airy, label='Airy (Linear) Wave', linestyle='--', lw=2)
plt.plot(x, eta_troch, label='Trochoidal (Gerstner) Wave', lw=2)
plt.title(f"🌊 Wave Profile Comparison — H = {H:.2f}m, T = {T:.2f}s, t = {t:.2f}s")
plt.xlabel("Distance [m]")
plt.ylabel("Surface Elevation [m]")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
print("🧠 Wave Theory Summary:")
print("- **Airy wave theory**: Linear approximation, small amplitude, symmetric sinusoidal shape.")
print("- **Trochoidal wave (Gerstner)**: Fully nonlinear model with rotational particle motion and sharper crests.")
print("- Trochoidal waves capture steep wave profiles and orbital motion without vertical particle displacement.")
print("\n✅ Applicability:")
print("- Use Airy theory for deep water, small amplitude waves.")
print("- Use Trochoidal theory for steep, non-breaking waves in deeper water where rotational effects matter.")
print("- Trochoidal waves are often used for visualizing orbital motion and surface sharpness in ocean simulators.")
# 🎛️ Sliders
H_slider = widgets.FloatSlider(value=1.0, min=0.2, max=3.0, step=0.1, description='Wave Height (H)')
T_slider = widgets.FloatSlider(value=8.0, min=4.0, max=20.0, step=0.5, description='Wave Period (T)')
t_slider = widgets.FloatSlider(value=0.0, min=0.0, max=30.0, step=0.2, description='Time (t)')
ui = widgets.VBox([H_slider, T_slider, t_slider])
out = widgets.interactive_output(plot_waves, {
'H': H_slider, 'T': T_slider, 't': t_slider
})
display(ui, out)
5. Self-Assessment#
📚 Quiz: Nonlinear Coastal Waves — Stokes and Cnoidal Theory#
🧠 Conceptual & Reflective Questions#
✨ Reflective Prompts#
How might nonlinear wave steepness influence the design of coastal infrastructure differently than linear wave assumptions?
In what scenarios would higher-order Stokes corrections materially affect wave load predictions?
What key visual or physical characteristics help you distinguish cnoidal waves from sinusoidal waves in field observations?
How does increasing elliptic modulus in cnoidal wave theory change the wave shape, and what might that imply about wave behavior near shore?
What are the risks of relying solely on linear theory when modeling nearshore wave transformation and run-up?
📊 Multiple Choice Questions#
✅ Choose the correct answer:#
1. What distinguishes nonlinear waves from linear waves?
Symmetric profile
Amplitude-dependent speed and crest-trough asymmetry
Valid only in deep water
No wave interactions
2. Why is Stokes theory nonlinear?
Based on rotational flow
Includes higher-order harmonics
Only models breaking waves
Simplifies shallow-water equations
3. Which assumption does NOT apply to Stokes theory?
Incompressible, inviscid fluid
Irrotational flow
Water depth < wavelength
Moderate wave steepness
4. What is the core difference between Stokes and cnoidal wave theory?
Cnoidal for deep water
Stokes: deep/moderate steepness; Cnoidal: shallow/strong nonlinearity
Only valid for breaking waves
Cnoidal is linear
5. What function describes cnoidal wave profiles?
Sine/cosine
Jacobi elliptic
Logarithmic
Exponential
6. Why do cnoidal waves resemble solitary waves at high elliptic modulus?
Infinite period
Sharp crest, flat trough
Decreasing steepness
Deep water conditions
7. What do higher-order terms in Stokes theory accomplish?
Model wave breaking
Improve nonlinear shape, phase velocity
Remove boundary condition need
Simplify equations
8. When is cnoidal wave theory preferred?
Deep water, small amplitude
Shallow water, long waves, strong nonlinearity
Surf zone breakers
Tidal deep ocean
9. What happens to Stokes wave phase speed as amplitude increases?
Decreases
Constant
Increases
Oscillates
10. Key feature of cnoidal waves:
Symmetric sinusoid
Circular motion
Sharp crests, flat troughs
Constant phase speed
11. Why is cnoidal theory ideal for tidal bores?
Deep water application
Strong nonlinearity in shallow water
Symmetric and periodic
Small amplitude
12. Steepness parameter used in both theories:
Wave height ( H )
Wavelength ( L )
Steepness ( \frac{H}{L} )
Period ( T )
13. Why can’t Stokes theory handle breaking waves?
Assumes small amplitudes
Ignores dissipation
Only for shallow water
Assumes rotation
14. What advantage does Stokes theory offer over linear theory?
Simplifies shallow water equations
Captures nonlinear crest asymmetry and speed
Removes boundary conditions
Models breaking waves
15. Role of elliptic modulus ( m ) in cnoidal waves:
Controls amplitude
Defines wave steepness and shape
Determines wavelength
Sets phase velocity