Chapter 5 Coastal Engineering: Non-Linear waves#

  1. Introduction: Non-Linear Waves

  2. Simulation: Deep Water Non-linenar Waves

  3. Simulation: Shallow Water Non-linenar Waves

  4. Simulation: Trochoidal Waves

  5. Self-Assessment

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

H

Wave height (m)

T

Wave period (s)

t

Time snapshot for wave evaluation (s)

h

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

H

Wave height (m)

T

Wave period (s)

t

Snapshot time (s)

h

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 deeper h, 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:

\[ \frac{\partial \eta}{\partial t} + c_0 \frac{\partial \eta}{\partial x} + \alpha \eta \frac{\partial \eta}{\partial x} + \beta \frac{\partial^3 \eta}{\partial x^3} = 0 \]

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, period T, and time t as adjustable inputs

  • Plots both wave profiles over one wavelength for comparison


🎛️ Inputs#

Parameter

Description

H

Wave height (m)

T

Wave period (s)

t

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#

  1. How might nonlinear wave steepness influence the design of coastal infrastructure differently than linear wave assumptions?

  2. In what scenarios would higher-order Stokes corrections materially affect wave load predictions?

  3. What key visual or physical characteristics help you distinguish cnoidal waves from sinusoidal waves in field observations?

  4. How does increasing elliptic modulus in cnoidal wave theory change the wave shape, and what might that imply about wave behavior near shore?

  5. 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