Chapter 5 Coastal Engineering: Forces on structures (Sainfluou Method)#
1. Introduction#

Fig. 34 **Figure 5.16 **: Wave Force Exerted by Non-Breaking Waves on Vertical Structure.#
Corrected Sainflou Method for Wave Pressure Estimation#
Overview#
This method estimates the dynamic wave pressure distribution on a coastal structure using Sainflou’s theory, based on linear (Airy) wave theory. It assumes a fully reflective vertical wall and calculates pressure as a function of depth. The model is enhanced to account for:
Structure slope
Oblique wave approach
Overtopping conditions
These corrections align with recommendations from the Shore Protection Manual (SPM) and Coastal Engineering Manual (CEM).
Core Equation (Sainflou Pressure)#
The dynamic pressure at a depth ( z ) is given by:
Where:
\(( \rho \)) = seawater density
\(( g \)) = gravitational acceleration
\(( a = \frac{(1 + c)H}{2} \)) = local wave amplitude at the wall
\(( k \)) = wave number (from dispersion relation)
\(( d \)) = water depth in front of the structure
\(( z \)) = vertical coordinate (from seabed to still water level)
🛠️ Corrections Applied#
1. Structure Slope Correction (\(( K_s \)))#
Accounts for energy dissipation on inclined faces:
2. Wave Angle Correction (\(( K_\beta \)))#
Reduces pressure for oblique wave approach:
3. Overtopping Correction (\(( K_o \)))#
Reduces effective pressure if wave height exceeds structure height:
✅ Final Corrected Pressure#
📏 Force and Moment Calculation#
Total Force:
Overturning Moment (about seabed):
These are computed numerically using discrete summation.
📈 Interactive Features#
Users can adjust:
Wave height (H) - Wave period (T) - Structure height
Water depth - Structure slope - Wave approach angle
🌊 Wave Load Estimation Using Miche-Rundgren Method#
This guide outlines the step-by-step procedure for estimating wave forces on vertical coastal structures using the Miche-Rundgren method, based on the Shore Protection Manual (SPM). It includes corrections for structures over rubble mounds and inclined surfaces.
📘 Assumptions#
Linear Wave Theory applies unless otherwise specified.
Figures referenced (e.g., 7-4, 7-90, etc.) are from the Shore Protection Manual.
w
= unit weight of waterds
= water depth at structureT
= wave periodHo
= deepwater wave heightHi
= incident wave height at structured
= water depthF
= dynamic forceM
= dynamic momentrf
,rm
= force and moment reduction factorsb
,y
= geometry-dependent parametersho
= wave height at toe of rubble moundθ
= angle of inclination from vertical
1️⃣ Vertical Structure (Non-Breaking Waves)#
Step-by-Step Procedure#
Wave Characteristics
Calculate wavelength and deepwater wave height (
Ho
) using Linear Wave Theory if not provided.
Design Breaking Wave Height
Compute dimensionless parameter:
$\( \frac{ds}{gT^2} \)$Use Figure 7-4 to find breaking wave height at the structure.
Applicability Check
Confirm that non-breaking wave theory applies (i.e., wave does not break before reaching the structure).
Dynamic Force and Moment Ratios
Compute:
$\( \frac{Hi}{gT^2} \)$Use Figures 7-91 and 7-92 to obtain:
\(( \frac{F}{wd^2} \))
\(( \frac{M}{wd^3} \))
Dynamic Force and Moment
Multiply ratios by appropriate powers of depth:
\(( F = \left(\frac{F}{wd^2}\right) \cdot wd^2 \))
\(( M = \left(\frac{M}{wd^3}\right) \cdot wd^3 \))
Total Force and Moment
Add dynamic values to static components to obtain total wave loading.
Vertical Structure Over Rubble Mound#
1–5. Repeat Steps 1–5 from the non-breaking wave case.
Wave Height at Toe of Structure
Use Figure 7-90 and
$\( \frac{Hi}{gT^2} \)$ to calculate wave height at toe (ho
).
Clapotis Crest Elevation
Estimate clapotis crest elevation at the wall using wave reflection and geometry.
Reduction Factors
Determine parameters
b
andy
from Figure 7-98.Use Figure 7-97 to obtain:
\(( 1 - rf \)) (force reduction)
\(( 1 - rm \)) (moment reduction)
Reduced Dynamic Force and Moment
Apply reduction:
\(( F_{\text{reduced}} = (1 - rf) \cdot F \))
\(\( M_{\text{reduced}} = (1 - rm) \cdot M \))
Moment About Top of Rubble Mound
Subtract moment due to rubble mound height: $\( M_{\text{top}} = M_{\text{reduced}} - h_{\text{mound}} \cdot F_{\text{reduced}} \)$
Total Wave Loading
Add reduced dynamic values to hydrostatic components to obtain total force and moment.
3️⃣ Slightly Inclined Vertical Structure#
1–3. Repeat Steps 1–3 from the non-breaking wave case.
Dynamic Force and Moment Ratios
Compute:
$\( \frac{Hi}{gT^2} \)$Use Figures 7-94 and 7-95 (reflection coefficient = 0.9) to obtain:
\(( \frac{F}{wd^2} \))
\(( \frac{M}{wd^3} \))
Dynamic Force and Moment
Multiply ratios by appropriate powers of depth:
\(( F = \left(\frac{F}{wd^2}\right) \cdot wd^2 \))
\(( M = \left(\frac{M}{wd^3}\right) \cdot wd^3 \))
Total Force and Moment
Add dynamic values to static components to obtain total wave loading.
References#
Sainflou assumes a standing wave pattern due to full reflection, leading to sinusoidal pressure variation along the wall. Miche improves on Sainflou by incorporating second-order effects, making it suitable for steeper waves. [of Engineers, 1984] combines the Sainflou (1928) and Miche (1944) methods to estimate wave forces from non-breaking waves on vertical structures. The description of Wave forces on structures and associated assumptions and corrections are thoroughly discussed in the Shore Protection Manual
2 Simulation#
🌊 SPM-Based Interactive Wave Force & Moment Estimator#
This tool estimates the total horizontal wave force (F) and overturning moment (M) on a vertical coastal structure based on empirical curves from the Shore Protection Manual (SPM, 1984) — specifically Figure 7-91 for force and Figure 7-92 for moment.
📘 Background#
Wave impact on vertical structures depends on:
Incident wave height \( H_i \)
Wave period \( T \)
Water depth at structure toe \( d \)
Methodological assumption: either Sainflou (standing wave reflection) or Mich-Rundgren (uprush impact)
An automatic logic selects the appropriate method:
If \( H_i < 2.5, \text{m} \) → use Sainflou
If \( H_i \geq 2.5, \text{m} \) → use Mich-Rundgren
📐 Empirical Formulas#
1. Horizontal Wave Force (N/m):#
The force is calculated as:
Where:
\( \rho = 1025, \text{kg/m}^3 \) (density of seawater)
\( g = 9.81, \text{m/s}^2 \) (gravitational acceleration)
\( C_F \) is computed via:
Sainflou method:
Mich-Rundgren method:
2. Overturning Moment (Nm/m):#
The moment is calculated as:
With coefficients:
Sainflou method:
Mich-Rundgren method:
🌊 Clapotis Crest and Trough Calculator#
This function estimates the maximum crest and minimum trough elevation of a standing wave (clapotis) formed by full wave reflection at a vertical structure. This helps determine the minimum required elevation (height) of the structure to avoid wave overtopping.
🔧 Parameters:#
H_i
: Incident wave height (m)T
: Wave period (s)d
: Water depth at the base of the structure (m)
📐 Step-by-Step Breakdown:#
Wave Number (k):
Estimated using the dispersion relation:
Wavelength (L):
Orbital Center Rise (h₀):
The vertical rise of the orbital center due to wave interaction:
Crest and Trough Elevation of Clapotis:
Assumes full reflection (reflection coefficient = 1.0).
With \(( R = 1.0 \)), this becomes:
🏗️ Minimum Structure Height Recommendation#
To prevent overtopping, the structure elevation should at least match the crest elevation, plus an added freeboard buffer (typically 0.3–0.5 m), based on wave climate and criticality of protection.
📘 Design Insight#
The clapotis crest represents the maximum vertical reach of the reflected wave.
Incorporating this into design ensures resilience against high-water events and full wave reflection, which are common at vertical revetments and quay walls.
🎛️ Interactivity Features#
Users can adjust:
Wave Height \( H_i \)
Wave Period \( T \)
Water Depth \( d \)
Method selection (‘Sainflou’, ‘Mich-Rundgren’, or ‘auto’)
And immediately view:
🔢 Calculated Total Force
📉 Calculated Moment
🔍 Auto-selected method based on wave conditions
🧠 Reflective Prompts#
How do changes in \( H_i \) affect the transition between Sainflou and Mich-Rundgren methods?
Why does \( \frac{H_i}{gT^2} \) — a wave steepness indicator — play such a central role?
What design risks emerge when ignoring uprush effects in high-energy wave climates?
import numpy as np
import ipywidgets as widgets
from IPython.display import display, clear_output
# 🌊 Constants
g = 9.81 # gravity (m/s²)
rho = 1025 # seawater density (kg/m³)
reflection_coeff = 1.0 # full reflection assumed
# 🌊 SPM-based force from Fig 7-91
def wave_force_spm(H_i, T, d, method='auto'):
Hi_gT2 = H_i / (g * T**2)
Hi_d = H_i / d
if method == 'auto':
method = 'Sainflou' if H_i < 2.5 else 'Mich-Rundgren'
if method == 'Sainflou':
C_F = 0.5 + 1.2 * Hi_gT2 + 0.8 * Hi_d
elif method == 'Mich-Rundgren':
C_F = 0.7 + 1.5 * Hi_gT2 + 1.0 * Hi_d
else:
raise ValueError("Invalid method selected.")
return C_F * rho * g * H_i**2, method
# 🌊 SPM-based moment from Fig 7-92
def wave_moment_spm(H_i, T, d, method='auto'):
Hi_gT2 = H_i / (g * T**2)
Hi_d = H_i / d
if method == 'auto':
method = 'Sainflou' if H_i < 2.5 else 'Mich-Rundgren'
if method == 'Sainflou':
C_M = 0.3 + 1.0 * Hi_gT2 + 0.6 * Hi_d
elif method == 'Mich-Rundgren':
C_M = 0.5 + 1.3 * Hi_gT2 + 0.9 * Hi_d
else:
raise ValueError("Invalid method selected.")
return C_M * rho * g * H_i**2 * d, method
# 🌊 Wave number from dispersion relation (Airy theory)
def wave_number(T, d, tol=1e-6, max_iter=100):
omega = 2 * np.pi / T
k = omega**2 / g
for _ in range(max_iter):
k_new = omega**2 / (g * np.tanh(k * d))
if abs(k_new - k) < tol:
break
k = k_new
return k
# 🌊 Clapotis crest and trough calculator
def clapotis_elevation(H_i, T, d):
k = wave_number(T, d)
L = 2 * np.pi / k
h0 = (H_i / 2) * (1 / np.tanh(2 * np.pi * d / L))
crest = d + h0 + ((1 + reflection_coeff) * H_i / 2)
trough = d + h0 - ((1 + reflection_coeff) * H_i / 2)
return crest, trough
# 🧮 Interactive callback
def update_wave_calculator(H_i, T, d, method):
clear_output(wait=True)
F, method_used = wave_force_spm(H_i, T, d, method)
M, _ = wave_moment_spm(H_i, T, d, method)
crest, trough = clapotis_elevation(H_i, T, d)
structure_height = crest + 0.5 # Add freeboard buffer (e.g., 0.5 m)
print(f"🔍 Selected Method: {method_used}")
print(f"🌊 Wave Height (H_i): {H_i:.2f} m")
print(f"⏱️ Wave Period (T): {T:.2f} s")
print(f"🌊 Water Depth (d): {d:.2f} m\n")
print(f"📐 Total Wave Force: {F:,.2f} N/m")
print(f"📐 Overturning Moment: {M:,.2f} Nm/m\n")
print(f"🌊 Clapotis Crest Elevation: {crest:.2f} m")
print(f"🌊 Clapotis Trough Elevation: {trough:.2f} m")
print(f"🏗️ Suggested Minimum Structure Height: {structure_height:.2f} m")
# 🎚️ Interactive widgets
H_slider = widgets.FloatSlider(value=2.5, min=0.5, max=6.0, step=0.1, description='Wave Height (H)')
T_slider = widgets.FloatSlider(value=8.0, min=4.0, max=12.0, step=0.5, description='Wave Period (T)')
d_slider = widgets.FloatSlider(value=6.0, min=1.0, max=15.0, step=0.5, description='Water Depth (d)')
method_dropdown = widgets.Dropdown(options=['auto', 'Sainflou', 'Mich-Rundgren'], value='auto', description='Method')
interactive_ui = widgets.interactive(update_wave_calculator,
H_i=H_slider,
T=T_slider,
d=d_slider,
method=method_dropdown)
display(interactive_ui)
3. Simulation#
🌊 Wave Force & Moment Calculator with Height-Based Reduction#
This interactive Python tool estimates wave-induced force and moment on a vertical coastal wall using SPM empirical methods (Sainflou or Mich-Rundgren). It applies height-based reduction factors for crest elevation exceedance.
Key Features:#
Computes wave number, clapotis crest elevation, and orbital rise.
Estimates force and moment via SPM curves using:
Applies reduction factors when structure height < crest:
Interactive sliders for wave height, period, depth, structure height, and method selector.
Output:#
Auto-selected or user-defined method
Raw and corrected wave force (N/m) and overturning moment (Nm/m)
Reduction factor diagnostics and crest comparison
Use this tool to evaluate structural loading sensitivity to crest elevation exceedance in real-time.
import numpy as np
import ipywidgets as widgets
from IPython.display import display, clear_output
# 🌊 Constants
g = 9.81
rho = 1025
reflection_coeff = 1.0
# 🌀 Wave number calculator
def wave_number(T, d, tol=1e-6, max_iter=100):
omega = 2 * np.pi / T
k = omega**2 / g
for _ in range(max_iter):
k_new = omega**2 / (g * np.tanh(k * d))
if abs(k_new - k) < tol:
break
k = k_new
return k
# 🌊 Clapotis crest & orbital center
def clapotis_elevation(H_i, T, d):
k = wave_number(T, d)
L = 2 * np.pi / k
h0 = (H_i / 2) * (1 / np.tanh(2 * np.pi * d / L))
crest = d + h0 + ((1 + reflection_coeff) * H_i / 2)
trough = d + h0 - ((1 + reflection_coeff) * H_i / 2)
return crest, trough, h0
# 🧮 Wave Force & Moment (SPM-based)
def wave_force_spm(H_i, T, d, method):
Hi_gT2 = H_i / (g * T**2)
Hi_d = H_i / d
method = method if method != 'auto' else 'Sainflou' if H_i < 2.5 else 'Mich-Rundgren'
C_F = (0.5 + 1.2 * Hi_gT2 + 0.8 * Hi_d) if method == 'Sainflou' else (0.7 + 1.5 * Hi_gT2 + 1.0 * Hi_d)
return C_F * rho * g * H_i**2, method
def wave_moment_spm(H_i, T, d, method):
Hi_gT2 = H_i / (g * T**2)
Hi_d = H_i / d
method = method if method != 'auto' else 'Sainflou' if H_i < 2.5 else 'Mich-Rundgren'
C_M = (0.3 + 1.0 * Hi_gT2 + 0.6 * Hi_d) if method == 'Sainflou' else (0.5 + 1.3 * Hi_gT2 + 0.9 * Hi_d)
return C_M * rho * g * H_i**2 * d
# 🔧 Handler
def update_wave_calculator(H_i, T, d, method, structure_ht):
clear_output(wait=True)
crest, trough, h0 = clapotis_elevation(H_i, T, d)
hc = crest
hs = structure_ht
rf = rm = 1.0
if hs < hc:
alpha = hs / hc
rf = alpha * (2 - alpha)
rm = alpha**2 * (3 - 2 * alpha)
F, method_used = wave_force_spm(H_i, T, d, method)
M = wave_moment_spm(H_i, T, d, method)
F_corrected = F * rf
M_corrected = M * rm
print(f"🔍 Method Used: {method_used}")
print(f"📐 Structure Height: {hs:.2f} m | Clapotis Crest: {hc:.2f} m")
print(f"📉 Reduction Factors (empirical): rf = {rf:.3f}, rm = {rm:.3f}")
print(f"🌊 Total Force: {F:,.2f} N/m → Corrected: {F_corrected:,.2f} N/m")
print(f"🔁 Total Moment: {M:,.2f} Nm/m → Corrected: {M_corrected:,.2f} Nm/m")
# 🎚️ UI
interactive_ui = widgets.interactive(
update_wave_calculator,
H_i=widgets.FloatSlider(value=2.5, min=0.5, max=6.0, step=0.1, description='Wave Height'),
T=widgets.FloatSlider(value=8.0, min=4.0, max=12.0, step=0.5, description='Wave Period'),
d=widgets.FloatSlider(value=6.0, min=1.0, max=15.0, step=0.5, description='Water Depth'),
method=widgets.Dropdown(options=['auto', 'Sainflou', 'Mich-Rundgren'], value='auto', description='Method'),
structure_ht=widgets.FloatSlider(value=7.0, min=1.0, max=15.0, step=0.5, description='Structure Height')
)
display(interactive_ui)
4. Simulation#
🧮 Interactive Wave Force & Moment Estimator with Rubble Mound Correction#
This module estimates wave-induced horizontal force and overturning moment on a vertical wall atop a rubble mound foundation. It applies SPM-based empirical equations (Sainflou or Mich-Rundgren) with height-dependent correction factors based on rubble mound elevation versus clapotis crest:
Force Correction Factor: \(( rf = \frac{h_r}{h_c}(2 - \frac{h_r}{h_c}) \))
Moment Correction Factor: \(( rm = \left(\frac{h_r}{h_c}\right)^2(3 - 2\frac{h_r}{h_c})\))
import numpy as np
import ipywidgets as widgets
from IPython.display import display, clear_output
# 🌊 Physical constants
g = 9.81
rho = 1025
reflection_coeff = 1.0
def wave_number(T, d, tol=1e-6, max_iter=100):
omega = 2 * np.pi / T
k = omega**2 / g
for _ in range(max_iter):
k_new = omega**2 / (g * np.tanh(k * d))
if abs(k_new - k) < tol:
break
k = k_new
return k
def clapotis_elevation(H_i, T, d):
k = wave_number(T, d)
L = 2 * np.pi / k
h0 = (H_i / 2) * (1 / np.tanh(2 * np.pi * d / L))
crest = d + h0 + ((1 + reflection_coeff) * H_i / 2)
trough = d + h0 - ((1 + reflection_coeff) * H_i / 2)
return crest, trough, h0
def wave_force_spm(H_i, T, d, method):
Hi_gT2 = H_i / (g * T**2)
Hi_d = H_i / d
method = method if method != 'auto' else 'Sainflou' if H_i < 2.5 else 'Mich-Rundgren'
C_F = (0.5 + 1.2 * Hi_gT2 + 0.8 * Hi_d) if method == 'Sainflou' else (0.7 + 1.5 * Hi_gT2 + 1.0 * Hi_d)
return C_F * rho * g * H_i**2, method
def wave_moment_spm(H_i, T, d, method):
Hi_gT2 = H_i / (g * T**2)
Hi_d = H_i / d
method = method if method != 'auto' else 'Sainflou' if H_i < 2.5 else 'Mich-Rundgren'
C_M = (0.3 + 1.0 * Hi_gT2 + 0.6 * Hi_d) if method == 'Sainflou' else (0.5 + 1.3 * Hi_gT2 + 0.9 * Hi_d)
return C_M * rho * g * H_i**2 * d
# 🔁 Interactive update
def update_wave_rubble(H_i, T, d, method, mound_height):
clear_output(wait=True)
crest, trough, h0 = clapotis_elevation(H_i, T, d)
hc = crest
hr = mound_height
# Correction factors based on mound height
rf_rubble = rm_rubble = 0.0
if hr < hc:
alpha = hr / hc
rf_rubble = alpha * (2 - alpha)
rm_rubble = alpha**2 * (3 - 2 * alpha)
F, method_used = wave_force_spm(H_i, T, d, method)
M = wave_moment_spm(H_i, T, d, method)
F_corrected = (1 - rf_rubble) * F
M_corrected = (1 - rm_rubble) * M
# 🖨️ Output
print(f"🔍 Method: {method_used}")
print(f"🌊 H_i = {H_i:.2f} m | T = {T:.2f} s | d = {d:.2f} m")
print(f"📏 Clapotis Crest = {hc:.2f} m | Rubble Mound Height = {hr:.2f} m")
print(f"🔧 Reduction Factors: rf = {rf_rubble:.3f} | rm = {rm_rubble:.3f}")
print(f"📐 Original Force: {F:,.2f} N/m → Corrected: {F_corrected:,.2f} N/m")
print(f"📐 Original Moment: {M:,.2f} Nm/m → Corrected: {M_corrected:,.2f} Nm/m")
# 🎚️ Controls
interactive_ui = widgets.interactive(
update_wave_rubble,
H_i=widgets.FloatSlider(value=2.5, min=0.5, max=6.0, step=0.1, description='Wave Height'),
T=widgets.FloatSlider(value=8.0, min=4.0, max=12.0, step=0.5, description='Wave Period'),
d=widgets.FloatSlider(value=6.0, min=1.0, max=15.0, step=0.5, description='Water Depth'),
method=widgets.Dropdown(options=['auto', 'Sainflou', 'Mich-Rundgren'], value='auto', description='Method'),
mound_height=widgets.FloatSlider(value=2.5, min=0.0, max=15.0, step=0.5, description='Rubble Mound Height')
)
display(interactive_ui)
5. Self-Assessment#
Reflective & Conceptual Questions#
Understanding the Method#
What assumptions does Sainflou’s method make about wave behavior and structure geometry?
How might these assumptions limit its applicability in real-world coastal environments?Why is the wave pressure highest near the still water level and decreases with depth?
Explain this trend using the physics of wave motion and pressure distribution.How does the reflection coefficient ( c ) influence the pressure amplitude at the wall?
What physical conditions correspond to ( c = 0 ), ( c = 1 ), and values in between?
Engineering Implications#
Why is it important to apply correction factors for structure slope, wave angle, and overtopping?
What risks might arise if these factors are ignored in design calculations?How does overtopping reduce the effective wave force on a structure?
Is overtopping always beneficial from a structural loading perspective? Why or why not?What are the potential consequences of underestimating the overturning moment in coastal structure design?
How might this affect long-term stability and safety?
Design Sensitivity#
How does increasing the structure slope affect the wave pressure distribution and total moment?
Would a more inclined structure always result in lower forces?How does wave approach angle influence the loading on the structure?
Why is the cosine of the angle used as a correction factor?If the wave height exceeds the structure height, how should the design approach change?
Should the structure be redesigned to prevent overtopping, or can overtopping be safely accommodated?
Application & Extension#
How could this model be extended to account for wave breaking or nonlinear wave effects?
What additional parameters or methods would be needed?What are the limitations of using linear wave theory (Airy theory) in coastal engineering design?
When might you need to switch to more advanced models like Boussinesq or CFD?How would you validate the results of this model against physical experiments or field data?
What measurements would be most critical to collect?