Chapter 5 Coastal Engineering: Vertical Structures Using Minikin Method

Contents

Chapter 5 Coastal Engineering: Vertical Structures Using Minikin Method#

  1. Introduction: Breaking Wave Force

  2. Simulation: Minikin vs. Goda Methods

  3. Simulation: Minikin Force and moment correction for low wall

  4. Simulation: Breaking Wave Force

  5. Self-Assessment

1. Introduction#

Descriptive alt text for accessibility

Fig. 35 **Figure 5.17 **: Wave Force Exerted by Breaking Waves on Vertical Structure.#

🌊 Wave Forces on Coastal Structures#

Wave forces vary significantly depending on the wave condition:

Wave Type

Description

Force Characteristics

Design Implications

Non-breaking

Waves retain sinusoidal shape; linear theory applies

Distributed pressure; predictable; lower magnitude

Use linear wave theory (e.g., Airy, Stokes)

Breaking

Wave crest collapses; high momentum transfer

Sudden impact; high peak pressures; impulsive

Use Goda method; design for impact loads

Broken

Turbulent bore; post-breaking propagation

Lower peak pressure; more distributed force

Use bore models; less impulsive but still erosive

📐 Typical Pressure Distribution#

  • Non-breaking wave: Smooth hydrostatic + hydrodynamic pressure gradient

  • Breaking wave: High impulsive force at crest impact zone

  • Broken wave: Turbulent bore with distributed pressure

🌊 Wave Load Calculation on Vertical Structures Using the Minikin Method#

This guide outlines the steps for calculating wave forces from breaking waves on vertical coastal structures using the Minikin method, with corrections and clarifications for three structural configurations.


⚙️ Assumptions#

  • Linear Wave Theory applies unless otherwise specified.

  • Figures referenced (e.g., 7-3, 7-4, etc. from [of Engineers, 1984]).

  • w = unit weight of water

  • ds = water depth at structure

  • T = wave period

  • Ho = deepwater wave height

  • Hb = breaking wave height

  • Rm = dynamic force

  • rm = force reduction factor

  • θ = angle of inclination from vertical


1️⃣ Non-Overtopping Vertical Structure#

Step-by-Step Procedure#

  1. Wave Characteristics

    • Calculate wavelength and deepwater wave height (Ho) using Linear Wave Theory if not provided.

  2. Design Breaking Wave Height

    • Compute dimensionless parameter:
      $\( \frac{ds}{gT^2} \)$

    • Use Figure 7-4 from [of Engineers, 1984] to find design breaking wave height (Hb) at the structure.

  3. Available Breaking Wave Height

    • Compute:
      $\( \frac{Ho}{gT^2} \)$

    • Use Figure 7-3 from the Shore Protection manual to find available breaking wave height.

  4. Applicability Check

    • Confirm that breaking wave theory is valid for the given conditions.

  5. Pressure Ratio

    • Use
      $\( \frac{ds}{gT^2} \)$
      to obtain pressure ratio from Figure 7-100 from [of Engineers, 1984].

  6. Dynamic Pressure

    • Multiply pressure ratio by unit weight (w) and design breaking wave height (Hb):
      $\( P = \text{ratio} \times w \times Hb \)$

  7. Dynamic Force

    • Compute:
      $\( Rm = P \times \frac{Hb}{3} \)$

  8. Dynamic Moment

    • Compute:
      $\( M_m = Rm \times ds \)$

  9. Total Force

    • Add dynamic force to static force:
      $\( F_{\text{total}} = Rm + \frac{w(ds + \frac{1}{2}Hb)^2}{2} \)$

  10. Total Moment

    • Add dynamic moment to static moment:
      $\( M_{\text{total}} = M_m + \frac{w(ds + \frac{1}{2}Hb)^3}{6} \)$


2️⃣ Overtopping Vertical Structure#

Step-by-Step Procedure#

1–4. Repeat Steps 1–4 from the non-overtopping case.

  1. Force Reduction Factor

    • Use Figure 7-102 to obtain force reduction factor (rm).

  2. Reduced Dynamic Force

    • Multiply dynamic force (Rm) by reduction factor:
      $\( Rm_{\text{reduced}} = rm \times Rm \)$

  3. Reduced Moment

    • Use Figure 7-103 to obtain parameter a, then compute:
      $\( M'_m = ds \cdot Rm - (ds + a)(1 - rm) \cdot Rm \)$

  4. Total Wave Loading

    • Add dynamic wave loadings to hydrostatic components.


3️⃣ Slightly Inclined Non-Overtopping Vertical Structure#

Step-by-Step Procedure#

1–8. Repeat Steps 1–8 from the non-overtopping case.

  1. Reduced Dynamic Force

    • Apply inclination correction:
      $\( Rm_{\text{inclined}} = Rm \cdot \sin^2(\theta) \)$

  2. Reduced Dynamic Moment

    • Apply inclination correction:
      $\( M_m^{\text{inclined}} = M_m \cdot \sin^2(\theta) \)$

  3. Total Wave Loading

    • Add dynamic wave loadings to hydrostatic components.


✅ Notes and Corrections#

  • Ensure consistent units (e.g., SI or Imperial) throughout.

  • Use appropriate figures from validated coastal engineering references.

  • For inclined structures, angle θ should be measured from vertical.

  • Always verify applicability of breaking wave theory based on wave steepness and depth.### Wave Load Calculation on Vertical Structures Using Minikin Method

This guide outlines the steps for calculating wave forces from breaking waves on vertical co [] presents refined wave pressure formulas using probabilistic approaches, suitable for composite breakwaters and modern design standards. It models both breaking and non-breaking wave loads with trapezoidal distributions and accounts for wave directionality and randomness.[of Engineers, 1984] offers conservative design guidance using the Minikin method, emphasizing impulsive forces from breaking waves on vertical walls. It provides empirical charts and procedures rooted in linear wave theory, widely used in U.S. coastal infrastructure design. three structural configurations.


Assumptions#

  • Linear Wave Theory applies unless otherwise specified.

  • Figures referenced (e.g., 7-3, 7-4, etc.) are from standard coastal engineering design manuals (e.g., Shore Protection Manual or Coastal Engineering Manual).

  • w = unit weight of water

  • ds = water depth at structure

  • T = wave period

  • Ho = deepwater wave height

  • Hb = breaking wave height

  • Rm = dynamic force

  • rm = force reduction factor

  • θ = angle of inclination from vertical



✅ Notes and Corrections#

  • Ensure consistent units (e.g., SI or Imperial) throughout.

  • Use appropriate figures from validated coastal engineering references.

  • For inclined structures, angle θ should be measured from vertical.

  • Always verify the applicability of the breaking wave theory based on wave steepness and depth.

Wave Load Calculation on Vertical Structures Using Minikin Method#

This guide outlines the steps for calculating wave forces from breaking waves on vertical coastal structures using the Minikin method, with corrections and clarifications for three structural configurations.


Assumptions#

  • Linear Wave Theory applies unless otherwise specified.

  • Figures referenced (e.g., 7-3, 7-4, etc.) are from standard coastal engineering design manuals (e.g., Shore Protection Manual or Coastal Engineering Manual).

  • w = unit weight of water

  • ds = water depth at structure

  • T = wave period

  • Ho = deepwater wave height

  • Hb = breaking wave height

  • Rm = dynamic force

  • rm = force reduction factor

  • θ = angle of inclination from vertical


✅ Notes and Corrections#

  • Ensure consistent units (e.g., SI or Imperial) throughout.

  • Use appropriate figures from validated coastal engineering references.

  • For inclined structures, angle θ should be measured from vertical.

  • Always verify applicability of breaking wave theory based on wave steepness and depth.

Note: Breaking wave forces can be 10–50× greater than non-breaking wave forces. Proper site selection and structural adaptation are critical.

📘 Reference#

  • Goda, Y. (2000). Random Seas and Design of Maritime Structures. World Scientific.

2. Simulation#

🌊 Wave Force & Moment Estimator — Minikin vs. Goda Methods#

This Python-based simulator calculates and visualizes the hydrodynamic pressure, resultant force, and overturning moment exerted by breaking waves on a vertical coastal structure using two classic engineering approaches.


🧠 What It Does#

  • Uses input wave and structure parameters to:

    • Solve for wave length using linear Airy theory

    • Estimate pressure, force, and moment via:

      • Minikin method (simplified empirical formula)

      • Goda method (accounts for wave angle, structure geometry, and dispersive effects)

  • Outputs numerical comparisons and bar chart visualization


🎛️ User Inputs#

Parameter

Description

Hb

Breaker wave height (m)

ds

Water depth at toe of structure (m)

T

Wave period (s)

slope

Beach slope (tan β)

structure_height

Total structure height (m)

structure_width

Width of structure (m)

β (deg)

Wave angle relative to structure face


📊 Outputs#

🔹 Minikin Method#

  • Max Pressure: Simplified estimate based on wave height/depth

  • Resultant Force: Horizontal wave thrust on structure

  • Overturning Moment: Moment exerted about base of structure

🔹 Goda Method#

  • Pressure p1: Peak hydrodynamic pressure at wave crest

  • Reduced Pressure p3: Adjusted for depth/dispersion

  • Resultant Force & Moment: Similar to above but more nuanced

📈 Visualization#

  • Wave profile sketch and structure geometry

  • Bar chart comparing overturning moments between methods


🧭 How to Interpret#

  • Higher Hb or lower ds leads to stronger impact forces

  • Minikin method is quicker but less detailed

  • Goda method includes wave angle and depth refinement

  • Use outputs to inform structural resilience, footing stability, or wave defense design

This tool brings coastal force estimation into an accessible, visual format—bridging theory and real-world design.

# 🌊 Wave Pressure & Moment Estimation using Minikin and Goda Methods

import numpy as np
import matplotlib.pyplot as plt

# 📐 Physical constants
g = 9.81          # gravity (m/s²)
gamma = 1025      # unit weight of seawater (kg/m³)
# 🌊 Wave parameters
#Hb=input("breakwer wave height")
#ds=input("water depth at toe")
#structure_height = input("height of structure")#8.0  # total height of structure (m)
#structure_width = input("width of structure")2#.0   # width of structure (m)

Hb = 3.0      # breaker wave height (m)
ds = 5.0      # water depth at toe (m)
structure_height = 5.0  # total height of structure (m)
structure_width = 2.0   # width of structure (m)
T = 8.0           # wave period (s)
slope = 0.02      # beach slope (tan β)

# 📊 Input parameters
#Hb = 3.0          # breaker wave height (m)
#ds = 5.0          # water depth at toe (m)
#d1 = 6.0          # depth one wavelength in front of wall (m)
#Ld1 = 20.0        # wavelength at d1 (m)
beta_deg = 0      # wave angle (degrees)
beta = np.radians(beta_deg)

# 📐 Airy wave theory: dispersion relation solver
def calculate_wavelength(T, h, tol=1e-6, max_iter=100):
    omega = 2 * np.pi / T
    k = omega**2 / g  # initial guess
    for _ in range(max_iter):
        k_new = omega**2 / (g * np.tanh(k * h))
        if abs(k_new - k) < tol:
            break
        k = k_new
    return 2 * np.pi / k

# 📏 Calculate wavelength at depth ds
Ld1 = calculate_wavelength(T, ds)

# 📏 Estimate depth one wavelength in front of structure
d1 = ds +slope * Ld1
d1 = max(d1, 0.1)  # prevent negative or zero depth

# 📐 Structure coordinates
wall_x = [0, 0, structure_width, structure_width, 0]
wall_y = [0, structure_height, structure_height, 0, 0]

# 🌊 Wave crest and trough
wave_x = np.linspace(-10, 0, 100)
wave_y = Hb * np.sin(2 * np.pi * wave_x / 10) + ds

# 🖼️ Plot setup
plt.figure(figsize=(10, 6))
plt.plot(wave_x, wave_y, label='Wave Profile', color='blue')
plt.fill(wall_x, wall_y, color='gray', label='Vertical Structure')
plt.axhline(ds, color='cyan', linestyle='--', label='Still Water Level')

# 📏 Annotations
plt.text(-9, ds + Hb + 0.5, f'Wave Height = {Hb} m', color='blue')
plt.text(1.5, structure_height / 2, 'Structure', rotation=90, color='white', backgroundcolor='gray')

# 🧭 Labels and legend
plt.xlabel('Horizontal Distance (m)')
plt.ylabel('Elevation (m)')
plt.title('Wave Impact on Vertical Coastal Structure')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()


# 📦 Minikin Method
pm_minikin = 101 * gamma * Hb / ds * (d1 + ds) / Ld1
Rm_minikin = pm_minikin * Hb / 3
Mm_minikin = Rm_minikin * ds

# 📦 Goda Method (simplified)
alpha1 = 0.6 + 2 / np.sinh(4 * np.pi * ds / Ld1)
alpha2 = min((ds - d1) / (3 * ds), 2 * ds / Hb)
alpha3 = 1 - d1 / ds

Hmax = Hb  # assuming design wave height equals breaker height
p1 = gamma * (1 + np.cos(beta)) * (alpha1 + alpha2 * np.cos(beta)**2) * Hmax / 2
p3 = alpha3 * p1

# Resultant force and moment (Goda)
Rm_goda = p1 * Hb / 3
Mm_goda = Rm_goda * ds

# 🧮 Print results
print("🔹 Minikin Method:")
print(f"  Max Pressure: {pm_minikin:.2f} Pa")
print(f"  Resultant Force: {Rm_minikin:.2f} N/m")
print(f"  Overturning Moment: {Mm_minikin:.2f} Nm/m")

print("\n🔹 Goda Method:")
print(f"  Max Pressure p1: {p1:.2f} Pa")
print(f"  Reduced Pressure p3: {p3:.2f} Pa")
print(f"  Resultant Force: {Rm_goda:.2f} N/m")
print(f"  Overturning Moment: {Mm_goda:.2f} Nm/m")

# 📈 Visualization
methods = ['Minikin', 'Goda']
moments = [Mm_minikin, Mm_goda]

plt.figure(figsize=(8, 5))
plt.bar(methods, moments, color=['skyblue', 'salmon'])
plt.ylabel('Overturning Moment (Nm/m)')
plt.title('Comparison of Wave-Induced Moments on Structure')
plt.grid(True)
plt.tight_layout()
plt.show()
../_images/32cda5a72ae163d80b4615a8f27d82b4311cf71d1da55f431c42c4c27cdaf738.png
🔹 Minikin Method:
  Max Pressure: 12944.16 Pa
  Resultant Force: 12944.16 N/m
  Overturning Moment: 64720.81 Nm/m

🔹 Goda Method:
  Max Pressure p1: 5782.41 Pa
  Reduced Pressure p3: -1227.75 Pa
  Resultant Force: 5782.41 N/m
  Overturning Moment: 28912.03 Nm/m
../_images/5658a56ce3716762cc5d6a273d4fe0117a691fd288b86ec9162f3b464197af73.png

3. Simulation#

🏗️ Coastal Structure Interaction Model — Minikin Force and moment correction for low wall#

This script estimates wave-induced sediment transport potential near a sloped coastal structure using empirical physics-based relationships.


🧠 What It Does#

  1. Collects user inputs for structure geometry, wave conditions, and beach slope

  2. Computes:

    • Breaking wave height and depth

    • Wave celerity (Cg) in shallow water

    • Wave energy flux (Ef) — total power per unit crest length

    • Sediment transport potential (Qs) using structure slope and wave interaction


🎛️ Inputs#

Parameter

Description

structure_slope

Slope ratio (e.g., 0.2 for 1V:5H)

structure_height

Structure crest elevation (m)

wave_height

Significant offshore wave height (m)

wave_period

Wave period (s)

beach_slope

Tan(β), beach steepness


📊 Outputs#

  • 📏 Estimated Breaking Depth (db)

  • 🔋 Wave Energy Flux (Ef) — proxy for nearshore wave power

  • 🚢 Longshore Transport Potential (Qs_structure) — sediment drift estimate in W/m

  • 🧭 Qualitative Interpretation:

    • If Qs_structure > 0 → sediment likely drifts downdrift

    • If Qs_structure ≤ 0 → minimal transport, reevaluate orientation


🧭 Use Cases#

  • Rapid assessment of wave-structure-sediment interaction

  • Planning for groynes, jetties, and other sloped defenses

  • Teaching wave-induced transport concepts

Oblique waves + sloped structures = sediment mobility trigger. Zero transport may indicate shielding or poor alignment.

import numpy as np
import ipywidgets as widgets
from ipywidgets import interact, FloatSlider

def minikin_extended(ds, T, beach_slope, structure_height):
    scaled_depth = ds / (9.81 * T**2)

    Ap = 3.0 + 6.5 * beach_slope
    Bp = 55 + 80 * beach_slope
    Af = 2.6 + 4.5 * beach_slope
    Bf = 40 + 60 * beach_slope

    Cp = Ap * np.exp(-Bp * scaled_depth)
    Cf = Af * np.exp(-Bf * scaled_depth)

    Hb = 0.78 * Cp * ds
    db = Hb / beach_slope
    alpha = structure_height / Hb
    two_a_over_Hb = 0.66 * alpha**2 + 0.37 * alpha - 0.0391
    a = 0.5 * Hb * two_a_over_Hb
    Cm = Cf * (db + a) - a

    return Cp, Cf, Cm

def interactive_minikin(ds, T, beach_slope, structure_height):
    Cp, Cf, Cm = minikin_extended(ds, T, beach_slope, structure_height)
    print(f"\n🧮 Minikin Dimensionless Coefficients:")
    print(f"🌊 Cp (Pressure Coeff.): {Cp:.3f}")
    print(f"🌊 Cf (Force Coeff.):    {Cf:.3f}")
    print(f"📐 Cm (Moment Coeff.):   {Cm:.2f}")

slider_style = {'description_width': '220px'}
slider_layout = widgets.Layout(width='450px')

interact(
    interactive_minikin,
    ds=FloatSlider(value=10.0, min=1.0, max=30.0, step=0.5,
                   description="Depth to Structure Base (m)",
                   style=slider_style, layout=slider_layout),
    T=FloatSlider(value=8.0, min=4.0, max=15.0, step=0.5,
                  description="Wave Period T (s)",
                  style=slider_style, layout=slider_layout),
    beach_slope=FloatSlider(value=0.1, min=0.01, max=0.3, step=0.01,
                            description="Beach Slope tan(β)",
                            style=slider_style, layout=slider_layout),
    structure_height=FloatSlider(value=5.0, min=1.0, max=10.0, step=0.5,
                                 description="Structure Crest Elevation (m)",
                                 style=slider_style, layout=slider_layout)
)
<function __main__.interactive_minikin(ds, T, beach_slope, structure_height)>

4. Simulation#

import ipywidgets as widgets
from ipywidgets import interact, FloatSlider
import numpy as np
def Hb_Ho_SPM(Ho, T, beach_slope):
    g = 9.81
    steepness = (2 * np.pi * Ho) / (g * T**2)

    # Empirical fit from digitized SPM Figure 7-3
    # These coefficients should be calibrated from actual data
    A = 0.78 + 0.35 * beach_slope      # max index increases with slope
    B = 20 + 90 * beach_slope          # decay rate increases with slope

    Hb_Ho = A * np.exp(-B * steepness)
    Hb = Hb_Ho * Ho
    db = Hb / beach_slope

    return Hb_Ho, Hb, db, steepness

def interactive_spm_model(Ho, T, beach_slope):
    Hb_Ho, Hb, db, steepness = Hb_Ho_SPM(Ho, T, beach_slope)
    Lo = (9.81 * T**2) / (2 * np.pi)

    print(f"\n🌊 Deepwater Wavelength Lo: {Lo:.2f} m")
    print(f"📉 Wave Steepness Ho/Lo: {steepness:.4f}")
    print(f"📐 Breakwater Height Index Hb/Ho: {Hb_Ho:.3f}")
    print(f"🌊 Breaking Wave Height Hb: {Hb:.2f} m")
    print(f"📏 Estimated Breaking Depth db: {db:.2f} m")

interact(
    interactive_spm_model,
    Ho=FloatSlider(value=2.0, min=0.5, max=6.0, step=0.1,
                   description="Deepwater Wave Height Ho (m)",
                   style={'description_width': '220px'}, layout=widgets.Layout(width='450px')),
    T=FloatSlider(value=8.0, min=4.0, max=15.0, step=0.5,
                  description="Wave Period T (s)",
                  style={'description_width': '220px'}, layout=widgets.Layout(width='450px')),
    beach_slope=FloatSlider(value=0.1, min=0.01, max=0.3, step=0.01,
                            description="Beach Slope tan(β)",
                            style={'description_width': '220px'}, layout=widgets.Layout(width='450px'))
)
<function __main__.interactive_spm_model(Ho, T, beach_slope)>

5. Simulation#

📘 Breaking Height Index vs. Deepwater Steepness (Ho/gT^2)#

This plot shows how the breaking height index ( Hb/Ho ) varies with deepwater steepness ( Ho/gT^2 ) for different beach slopes ( \tan\beta ). Each slope is represented by a distinct color and marker:

Color

Marker

Slope ( \tan\beta )

Data Points ( Hb/Ho )

🔵 Blue

0.02

[2.2, 1.6, 1.3, 1.1, 0.8, 1.0]

🟢 Green

0.03

[2.4, 1.75, 1.4, 1.18, 1.0, 1.0]

🟠 Orange

0.06

[2.5, 1.8, 1.55, 1.2, 1.10, 1.0]

🔴 Red

0.10

[2.75, 2.0, 1.65, 1.25, 1.12, 1.0]

X-axis: Deepwater Steepness ( Ho/Lo ) (log scale)
Y-axis: Breaking Height Index ( Hb/Ho )

This legend helps visually associate each slope with its corresponding data and interpret the decay trend across increasing steepness.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 📉 Exponential decay model
def decay_model(x, A, B):
    return A * np.exp(-B * x)

# 📊 Digitized data
steepness = np.array([0.0004, 0.001, 0.002, 0.006, 0.01, 0.03])
Hb_Ho_02 = np.array([2.2, 1.6, 1.3, 1.1, 0.8, 1.0])
Hb_Ho_03 = np.array([2.4, 1.75, 1.4, 1.18, 1.0, 1.0])
Hb_Ho_06 = np.array([2.5, 1.8, 1.55, 1.2, 1.10, 1.0])
Hb_Ho_10 = np.array([2.75, 2.0, 1.65, 1.25, 1.12, 1.0])

# 📐 Fit curves
params_02, _ = curve_fit(decay_model, steepness, Hb_Ho_02)
params_03, _ = curve_fit(decay_model, steepness, Hb_Ho_03)
params_06, _ = curve_fit(decay_model, steepness, Hb_Ho_06)
params_10, _ = curve_fit(decay_model, steepness, Hb_Ho_10)

# 📊 Plot
plt.figure(figsize=(9,6))

# 🖍️ Color-coded scatter points with labels
plt.scatter(steepness, Hb_Ho_02, color='blue', marker='o', label='Slope 0.02')
plt.scatter(steepness, Hb_Ho_03, color='green', marker='s', label='Slope 0.03')
plt.scatter(steepness, Hb_Ho_06, color='orange', marker='^', label='Slope 0.06')
plt.scatter(steepness, Hb_Ho_10, color='red', marker='d', label='Slope 0.10')

# 📊 Axis and legend
plt.xscale('log')
plt.xlabel('Deepwater Steepness Ho/Lo (log scale)')
plt.ylabel('Breaking Height Index Hb/Ho')
plt.title('Unified Fit with Slope-Specific Data (SPM 7-3)')
plt.grid(True, which='both', linestyle='--', alpha=0.5)
plt.legend(title='Beach Slope tan(β)', loc='best')  # 👈 Legend summary
plt.tight_layout()
plt.show()
../_images/e3065b202552a26bc29a391d43ee5c3e3290dcd83aac3b50921a42d80db864d0.png
## 6. Simulation

🔍 Explore SPM Figure 7-4: Effect of Beach Slope on Breakwater Design#

Use the interactive plot to explore how the dimensionless breakwater height ( Hb/d_s ) changes with:

  • Beach slope \(( \tan\beta \))

  • Wave period \(( T \))

Questions to Consider:#

  • How does increasing beach slope affect the required breakwater height?

  • Why does a steeper beach lead to a higher initial ( Hb/d_s )?

  • What physical processes might explain the faster decay with depth for steeper slopes?

This tool helps visualize how coastal geometry influences wave-structure interaction and guides design decisions for rubble mound breakwaters.

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, FloatSlider

# 📉 Empirical model from SPM Figure 7-4 with slope-dependent coefficients
def breakwater_height_index(ds, T, beach_slope):
    g = 9.81  # gravity (m/s²)
    x = ds / (g * T**2)
    
    # 📐 Coefficients vary with beach slope (tanβ)
    A = 2.8 + 4.0 * beach_slope
    B = 45 + 60 * beach_slope
    
    return A * np.exp(-B * x)

# 🎛️ Interactive plot function
def plot_breakwater_vs_depth(beach_slope=0.05, T=8.0):
    ds_vals = np.linspace(2, 15, 200)
    Hb_ds_vals = breakwater_height_index(ds_vals, T, beach_slope)
    x_vals = ds_vals / (9.81 * T**2)

    plt.figure(figsize=(8,6))
    plt.plot(x_vals, Hb_ds_vals, color='darkorange', lw=2,
             label=f'tan(β) = {beach_slope:.2f}')
    plt.xlabel('Relative Depth at Structure (ds / gT²)')
    plt.ylabel('Dimensionless Breakwater Height (Hb / ds)')
    plt.title('SPM Figure 7-4: Hb/ds vs. ds / gT² for Varying Beach Slopes')
    plt.grid(True, linestyle='--', alpha=0.6)
    plt.legend()
    plt.tight_layout()
    plt.show()

# 🎚️ Controls
interact(plot_breakwater_vs_depth,
         beach_slope=FloatSlider(value=0.05, min=0.01, max=0.3, step=0.01, description='Beach Slope tan(β)'),
         T=FloatSlider(value=8.0, min=4.0, max=15.0, step=0.5, description='Wave Period T (s)'));

7. Simulation#

🌊 Influence of Water Depth on Wave Breaking and Coastal Structure Design#

The depth of water in front of a coastal structure plays a critical role in determining both the height and location at which waves break. This interaction is governed by the ratio \(( d_B / H_B \)), where:

  • \(( d_B \)) = depth at breaking

  • \(( H_B \)) = breaking wave height

  • \(( H_B / gT^2 \)) = dimensionless wave steepness

📈 Observed Relationship:#

  • As dimensionless wave height \(( H_B / gT^2 \)) increases, waves become steeper and break closer to shore.

  • For gentle beach slopes, waves break deeper and more gradually.

  • For steeper slopes, waves break at shallower depths and with greater intensity.

🧠 Design Implications:#

  • Shallow breaking near steep structures increases wave forces and sediment transport.

  • Designers must account for wave energy concentration at the toe of the structure.

  • Breaker depth ratio curves help estimate:

    • Required crest elevation

    • Foundation depth

    • Armor stability

  • Structures in deeper water may experience lower breaking forces, but require larger footprints and higher cost.

🛠️ Application:#

Use empirical relationships (e.g., from SPM Figure 7-2) to estimate:

  • Breaking depth \(( d_B \))

  • Breaking wave height \(( H_B \))

  • Energy flux and sediment drift potential

This information guides the design of breakwaters, seawalls, and revetments to ensure stability, minimize scour, and optimize sediment management.

import numpy as np
import matplotlib.pyplot as plt

# X-axis values: HB / gT²
x_vals = np.array([0, 0.002, 0.004, 0.006, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018])

# Y-axis values: dB / HB for each slope
db_Hb_data = {
    "0.01": [1.20, 1.22, 1.23, 1.25, 1.25, 1.26, 1.27, 1.35, 1.39, 1.526],
    "0.02": [1.10, 1.12, 1.13, 1.14, 1.16, 1.18, 1.21, 1.34, 1.37, 1.540],
    "0.03": [1.00, 1.02, 1.03, 1.04, 1.05, 1.07, 1.27, 1.33, 1.36, 1.540],
    "0.04": [0.80, 0.82, 0.82, 0.83, 0.84, 0.86, 1.26, 1.32, 1.35, 1.543],
    "0.05": [0.78, 0.80, 0.80, 0.81, 0.82, 0.84, 1.23, 1.32, 1.34, 1.549],
    "0.07": [0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 1.18, 1.27, 1.33, 1.514],
    "0.1":  [0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 1.10, 1.21, 1.33, 1.464],
    "0.2":  [0.65, 0.66, 0.67, 0.68, 0.68, 0.70, 1.00, 1.10, 1.21, 1.331]
}

# Plot only data points
plt.figure(figsize=(10,6))
for label, y_vals in db_Hb_data.items():
    plt.plot(x_vals, y_vals, 'o', label=f'Slope {label}')

plt.xlabel('Dimensionless Breaker Wave Height (HB / gT²)')
plt.ylabel('Breaker Depth Ratio (dB / HB)')
plt.title('Raw Data: Breaker Depth Ratio vs. HB / gT²')
plt.grid(True)
plt.legend(title='Beach Slope tan(β)')
plt.tight_layout()
plt.show()
../_images/066a260f73bab39b5603b0d17edfb5a511bb1ff580328770bdf627ac65433cdf.png

8. Simulation#

Minikin forece wall on rubble mound#

import numpy as np
from ipywidgets import interact, FloatSlider
import ipywidgets as widgets

# 🌊 Physical Constants
g = 9.81       # gravity (m/s²)
rho = 1025     # seawater density (kg/m³)
gamma = 1025   # unit weight of seawater (N/m³)

def coastal_structure_model(structure_slope, structure_height, wave_height, wave_period, beach_slope):
    # 📏 Breaking conditions
    Hb = 0.78 * wave_height            # breaking wave height
    db = Hb / beach_slope              # breaking depth
    Lo = (g * wave_period**2) / (2 * np.pi)
    d1 = db + beach_slope * Lo

    # ⚡ Energy Flux & Sediment Transport
    Cg = np.sqrt(g * db)              # celerity approximation
    Ef = (1/8) * rho * g * wave_height**2 * Cg
    theta = np.arctan(structure_slope)
    Qs_structure = 0.77 * Ef * np.sin(2 * theta)

    # 📐 Uncorrected Minikin force
    F_uncorrected = 101 * gamma * Hb / db * (d1 + db) / Lo

    # 📉 Empirical force reduction factor
    alpha = structure_height / Hb
    Rf = -0.5547 * alpha**2 + 1.8 * alpha - 0.2
    Rf = np.clip(Rf, 0, 1)

    # 📉 Empirical moment offset
    two_a_over_Hb = 0.66 * alpha**2 + 0.37 * alpha - 0.0391
    a = 0.5 * Hb * two_a_over_Hb

    # 📐 Corrected force and moment
    F_corrected = F_uncorrected * Rf
    M_corrected = F_corrected * (db + a) - a

    # 🖨️ Outputs
    print(f"🌊 Hb: {Hb:.2f} m | db: {db:.2f} m | Lo: {Lo:.2f} m")
    print(f"🚢 Longshore Transport Proxy Qs: {Qs_structure:,.2f} W/m")
    print(f"\n🔩 Minikin Force (uncorrected): {F_uncorrected:,.2f} N/m")
    print(f"🔧 Empirical Reduction Factor Rf: {Rf:.3f}")
    print(f"📏 Offset Distance a: {a:.2f} m")
    print(f"📐 Corrected Force: {F_corrected:,.2f} N/m")
    print(f"📐 Corrected Moment: {M_corrected:,.2f} Nm/m")

    print("\n🧭 Sediment Drift Interpretation:")
    if Qs_structure > 0:
        print("→ Sediment likely to drift downdrift due to oblique wave incidence.")
    else:
        print("→ Minimal transport expected. Consider revising alignment or wave angle.")

# 🎛️ Interactive Controls
interact(
    coastal_structure_model,
    structure_slope=FloatSlider(value=0.2, min=0.05, max=1.0, step=0.05, description="Structure Slope", style={'description_width': '180px'}, layout=widgets.Layout(width='400px')),
    structure_height=FloatSlider(value=3.5, min=1.0, max=10.0, step=0.5, description="Structure Height (m)", style={'description_width': '180px'}, layout=widgets.Layout(width='400px')),
    wave_height=FloatSlider(value=2.0, min=0.5, max=5.0, step=0.1, description="Wave Height Hs (m)", style={'description_width': '180px'}, layout=widgets.Layout(width='400px')),
    wave_period=FloatSlider(value=8.0, min=4.0, max=15.0, step=0.5, description="Wave Period T (s)", style={'description_width': '180px'}, layout=widgets.Layout(width='400px')),
    beach_slope=FloatSlider(value=0.1, min=0.01, max=0.3, step=0.01, description="Beach Slope tan(β)", style={'description_width': '180px'}, layout=widgets.Layout(width='400px'))
)
<function __main__.coastal_structure_model(structure_slope, structure_height, wave_height, wave_period, beach_slope)>

4. Simulation#

🏗️ Coastal Structure Interaction Model — Wave Break, Energy & Sediment Drift#

This script estimates wave-induced sediment transport potential near a sloped coastal structure using empirical physics-based relationships.


🧠 What It Does#

  1. Collects user inputs for structure geometry, wave conditions, and beach slope

  2. Computes:

    • Breaking wave height and depth

    • Wave celerity (Cg) in shallow water

    • Wave energy flux (Ef) — total power per unit crest length

    • Sediment transport potential (Qs) using structure slope and wave interaction


🎛️ Inputs#

Parameter

Description

structure_slope

Slope ratio (e.g., 0.2 for 1V:5H)

structure_height

Structure crest elevation (m)

wave_height

Significant offshore wave height (m)

wave_period

Wave period (s)

beach_slope

Tan(β), beach steepness


📊 Outputs#

  • 📏 Estimated Breaking Depth (db)

  • 🔋 Wave Energy Flux (Ef) — proxy for nearshore wave power

  • 🚢 Longshore Transport Potential (Qs_structure) — sediment drift estimate in W/m

  • 🧭 Qualitative Interpretation:

    • If Qs_structure > 0 → sediment likely drifts downdrift

    • If Qs_structure ≤ 0 → minimal transport, reevaluate orientation


🧭 Use Cases#

  • Rapid assessment of wave-structure-sediment interaction

  • Planning for groynes, jetties, and other sloped defenses

  • Teaching wave-induced transport concepts

Oblique waves + sloped structures = sediment mobility trigger. Zero transport may indicate shielding or poor alignment.

import numpy as np

def minikin_rubble_wall_coefficients(Hb, ds, T, wall_slope=1.0):
    """
    Estimate dimensionless pressure and horizontal force coefficients
    on a vertical wall backed by rubble mound per SPM Fig. 7-701.

    Parameters:
        Hb : float - breaking wave height (m)
        ds : float - water depth in front of rubble mound base (m)
        T  : float - wave period (s)
        wall_slope : float - optional slope modifier for wall (1.0 = vertical)

    Returns:
        Cp : float - dimensionless pressure coefficient
        Cf : float - dimensionless horizontal force coefficient
    """

    # 🌊 Dimensionless base depth
    scaled_depth = ds / (9.81 * T**2)

    # 📉 Empirical curve fits based on rubble mound trends (SPM 7-701)
    # These coefficients reflect reduced forcing due to wave dissipation over armor
    Ap_rubble = 2.3  # reduced initial pressure due to armor protection
    Bp_rubble = 45.0 # moderate decay rate

    Af_rubble = 2.0  # lower horizontal force initiation
    Bf_rubble = 38.0 # smoother decay profile

    # 📊 Apply exponential decay
    Cp = Ap_rubble * np.exp(-Bp_rubble * scaled_depth) * wall_slope
    Cf = Af_rubble * np.exp(-Bf_rubble * scaled_depth) * wall_slope

    return Cp, Cf

5. Self-Assessment#

📘 Conceptual Questions#

  • What physical processes are captured by the Airy wave theory used in the calculate_wavelength function?

  • Why is the dispersion relation nonlinear, and how does the iterative solver address this?

  • How does wave period \(( T \)) influence wavelength \(( L \)), and what implications does this have for wave loading?

Force Estimation Methods#

  • What are the key assumptions behind the Minikin method for estimating wave pressure and force?

  • How does the Goda method incorporate wave angle and overtopping effects that the Minikin method does not?

  • Why is wall angle correction applied in the Minikin method but not explicitly in the Goda method?

Structural Interaction#

  • How does the depth at the toe \(( d_s \)) affect the magnitude of wave-induced forces and moments?

  • What role does the structure height play in determining overtopping and pressure distribution?

  • Why is the overturning moment a critical metric for structural stability?


Reflective Questions#

  • In what coastal scenarios might the Minikin method be more appropriate than the Goda method, and vice versa?

  • How would the results change if the structure were submerged or if the wave height exceeded the structure height significantly?

  • What are the limitations of using linear wave theory (Airy) in this context, especially for high-energy wave events?

  • How could this model be extended to include dynamic wave loading or time-varying wave trains?

  • What are the implications of assuming a constant seawater density and unit weight across all scenarios?


❓ Quiz Questions#

Multiple Choice#

  1. Which parameter most directly affects the wavelength in the dispersion relation?
    A. Breaker height \(( H_b \))
    B. Wave period \(( T \))
    C. Structure width
    D. Wall angle
    Answer: B

  2. In the Goda method, which factor reduces the pressure due to overtopping?
    A. Wall angle
    B. Beach slope
    C. \(( \lambda_{\text{overtop}} \))
    D. Structure width
    Answer: C

  3. The Minikin method calculates pressure using which of the following expressions?
    A. \(( \gamma H_b / ds \cdot (d_1 + ds)/L \))
    B. \(( \rho g H_b^2 / L \))
    C. \(( \gamma H_b \cdot \cos(\theta) \))
    D. \(( \gamma H_b / L \cdot \tan(\beta) \))
    Answer: A

True/False#

  1. The Goda method accounts for wave angle effects using cosine terms.
    Answer: True

  2. The Minikin method includes overtopping correction by default.
    Answer: False

  3. Increasing the wall angle reduces the resultant force in the Minikin method.
    Answer: True

Short Answer#

  1. Explain why the overturning moment is calculated as force × depth. What does this represent physically?
    Answer: It represents the torque exerted by wave forces about the base of the structure, which influences its rotational stability.

  2. How does increasing the beach slope affect the effective depth \(( d_1 \)) and wave loading?
    Answer: A steeper slope increases \(( d_1 \)), which can reduce wave steepness and alter pressure distribution.