Sediment Module Reference¶
pywmp.sediment implements rainfall-driven erosion, overland transport, bedload
transport, and cohesive sediment dynamics coupled to the 2D shallow-water solver.
All classes operate on the same structured grid as ROMSimulation.
SedimentParameters¶
class SedimentParameters(K, C, D50_mm, P=1.0, shape='square')
Stores the soil and sediment properties shared across transport sub-models.
| Parameter | Type | Units | Description |
|---|---|---|---|
K |
float or ndarray | US customary | Soil erodibility factor (Wischmeier & Smith, 1978; Renard et al., 1997) |
C |
float or ndarray | dimensionless | Cover-management factor (Renard et al., 1997) |
D50_mm |
float | mm | Median grain diameter; governs Shields parameter and settling velocity |
P |
float or ndarray | dimensionless | Support-practice factor; default 1.0 (no conservation practice) |
shape |
str | — | Grid cell shape: 'square' or 'hex' |
Settling velocity is computed internally via the Ferguson-Church (2004) universal equation, which performs well across the silt-to-gravel range (0.001–100 mm) without requiring a separate regime selection.
RUSLEErosion¶
class RUSLEErosion(params, R, LS, grid)
Computes gross erosion from the Revised Universal Soil Loss Equation (RUSLE; Renard et al., 1997):
A = R × K × LS × C × P
where R is the rainfall erosivity factor (MJ mm ha⁻¹ hr⁻¹ yr⁻¹). Event-scale R
values can be derived from NOAA Atlas 14 IDF data (Perica et al., 2013) using the
EI₃₀ approximation. K is set via SedimentParameters. The LS factor combines the
slope-length factor L and slope steepness factor S.
LS factor computation¶
Two LS methods are available:
- Moore-Burch (
ls_method='moore_burch', default) — unit stream power approach using local slope and upstream contributing area (Moore & Burch, 1986):LS = (A_s / 22.13)^0.4 × (sin θ / 0.0896)^1.3 - Desmet-Govers (
ls_method='desmet_govers') — GIS-compatible formulation that accounts for flow divergence and convergence (Desmet & Govers, 1996).
For site-scale applications (watershed area < 20 km²), Moore-Burch is recommended; Desmet-Govers is preferred for complex topography with converging hillslopes.
Methods¶
RUSLEErosion.compute() -> ndarray # gross erosion rate (ton/ha/hr)
RUSLEErosion.annual() -> ndarray # annualised (ton/ha/yr) from event total
SuspendedSedimentTransport¶
class SuspendedSedimentTransport(params, grid, erosion=None, bedload=None)
Advects depth-averaged suspended sediment concentration (SSC) using a first-order upwind scheme driven by the 2D ROM velocity field (Fischer et al., 1979).
Governing equation¶
∂(hC)/∂t + ∂(uhC)/∂x + ∂(vhC)/∂y = E − D
where E = RUSLE erosion source (kg m⁻² s⁻¹), D = settling sink = w_s × C (h > 0).
Settling velocity w_s is computed from D50 via Ferguson and Church (2004).
Methods¶
SuspendedSedimentTransport.step(h, u, v, dt) -> ndarray # concentration field
SuspendedSedimentTransport.total_load_kg() -> float
SuspendedSedimentTransport.deposition_map() -> ndarray
BedloadTransport¶
class BedloadTransport(params, Sx, Sy, dx, theta_cr=0.0495, use_wong_parker=True)
Computes volumetric bedload flux per unit width using the Wong-Parker (2006) correction of the Meyer-Peter and Müller (1948) formula:
q_b* = 3.97 (τ* − τ*_cr)^1.5 [Wong-Parker, 2006]
The original Meyer-Peter and Müller (1948) formula used τ_cr = 0.047 and a coefficient of 8.0; Wong and Parker (2006) re-analysed MPM's original dataset and corrected the coefficient to 3.97 and τ_cr = 0.0495.
The dimensionless Shields stress τ* is computed from the local boundary shear stress and the grain properties (Shields, 1936):
τ* = τ_b / [(ρ_s − ρ) g D50]
| Parameter | Description |
|---|---|
params |
SedimentParameters instance |
Sx, Sy |
Bed slope arrays (dimensionless) |
dx |
Grid resolution (m) |
theta_cr |
Critical Shields parameter; default 0.0495 (Wong-Parker) |
use_wong_parker |
If False, use original MPM (1948) with coeff=8.0, theta_cr=0.047 |
Methods¶
BedloadTransport.flux(h, u, v) -> tuple[ndarray, ndarray] # (qbx, qby) m²/s
BedloadTransport.magnitude() -> ndarray
KronePartheniades¶
class KronePartheniades(tau_cd, tau_ce, M, w_s=None)
Implements the Krone (1962) deposition and Partheniades (1965) erosion framework for cohesive (fine-grained) sediment. The bed shear stress is compared to critical thresholds to determine net flux:
Deposition (Krone, 1962):
D = w_s × C × (1 − τ_b / τ_cd) when τ_b < τ_cd
Erosion (Partheniades, 1965):
E = M × (τ_b / τ_ce − 1) when τ_b > τ_ce
where M is the erosion rate constant (kg m⁻² s⁻¹).
| Parameter | Description |
|---|---|
tau_cd |
Critical deposition shear stress (Pa) |
tau_ce |
Critical erosion shear stress (Pa) |
M |
Partheniades erosion constant (kg m⁻² s⁻¹) |
w_s |
Settling velocity (m/s); if None, computed from D50 via Ferguson-Church (2004) |
Typical parameters for cohesive sediment types¶
The following values are representative starting points (Krishnappan & Droppo, 2011):
| Sediment type | τ_ce (Pa) | M (kg/m²/s/Pa) | ws (m/s) |
|---|---|---|---|
| Loose fine silt | 0.02–0.05 | 1e-4 | 2–5e-4 |
| Consolidated clay | 0.10–0.50 | 5e-5 | 0.5–2e-4 |
| Flocculated | 0.05–0.15 | 1e-4 | 1e-3 |
Methods¶
KronePartheniades.net_flux(h, u, v, C) -> ndarray # deposition(+) or erosion(-) kg/m²/s
KronePartheniades.step(h, u, v, C, dt) -> ndarray # updated concentration
MorphodynamicsModel¶
class MorphodynamicsModel(grid, bedload_transport, dt_morph=1.0)
Updates the DEM bed elevation from bedload flux divergence:
∂z/∂t = −(1 / (1 − λ)) × (∂q_bx/∂x + ∂q_by/∂y)
where λ is the bed porosity (default 0.4) and q_bx, q_by are the horizontal
bedload flux components from BedloadTransport.flux(). This formulation follows
the Exner equation as applied by Toro (2001).
| Parameter | Description |
|---|---|
dt_morph |
Morphological acceleration factor (1 = real time; 10 = 10× bed evolution) |
Methods¶
MorphodynamicsModel.update(qbx, qby) -> ndarray # delta-z (m) per time step
MorphodynamicsModel.cumulative_z() -> ndarray # total bed change (m)
SedimentResults¶
Returned by coupled ROMSimulation(..., sediment=...) runs.
@dataclass
class SedimentResults:
ssc_final: ndarray # final suspended concentration (kg/m³)
bedload_total: ndarray # cumulative bedload flux magnitude (m²)
deposition: ndarray # total deposition depth (mm)
erosion: ndarray # total erosion depth (mm)
bed_elevation: ndarray # final DEM after morphodynamics (m)
total_load_kg: float # total suspended load exported (kg)
Usage example¶
import numpy as np
from pywmp.sediment import (
SedimentParameters, BedloadTransport,
KronePartheniades, SuspendedSedimentTransport, SedimentResults,
)
from pywmp.rom import ROMGrid, ROMSimulation, ManningField, UniformPrecipitation
grid = ROMGrid.from_tif("data/dem_10m.tif")
params = SedimentParameters(K=0.28, C=0.12, D50_mm=0.08, P=0.8)
bedload = BedloadTransport(
params, Sx=grid.slope_x, Sy=grid.slope_y, dx=grid.dx,
theta_cr=0.0495, use_wong_parker=True, # Wong-Parker (2006)
)
cohesive = KronePartheniades(
tau_cd=0.07, tau_ce=0.15, M=2e-4, # Krone (1962); Partheniades (1965)
)
sim = ROMSimulation(
grid=grid,
precipitation=UniformPrecipitation(...),
manning=ManningField(np.full(grid.shape, 0.06)),
sediment={"params": params, "bedload": bedload, "cohesive": cohesive},
)
results, sed_results = sim.run()
print(f"Total load exported: {sed_results.total_load_kg:.1f} kg")
References¶
Desmet, P. J. J., & Govers, G. (1996). A GIS procedure for automatically calculating the USLE LS factor on topographically complex landscape units. Journal of Soil and Water Conservation, 51(5), 427–433. JSWC ↗
Ferguson, R. I., & Church, M. (2004). A simple universal equation for grain settling velocity. Journal of Sedimentary Research, 74(6), 933–937. DOI ↗
Fischer, H. B., List, E. J., Koh, R. C. Y., Imberger, J., & Brooks, N. H. (1979). Mixing in inland and coastal waters. Academic Press. Publisher ↗
Krishnappan, B. G., & Droppo, I. G. (2011). Some aspects of physical and chemical characteristics of fine sediments in the Athabasca River watershed. Journal of Soils and Sediments, 11(7), 1293–1307. DOI ↗
Krone, R. B. (1962). Flume studies of the transport of sediment in estuarial shoaling processes: Final report. University of California, Berkeley. DTIC ↗
Meyer-Peter, E., & Müller, R. (1948). Formulas for bed-load transport. In Proceedings of the 2nd Meeting of the International Association for Hydraulic Structures Research (pp. 39–64). IAHR. TU Delft ↗
Moore, I. D., & Burch, G. J. (1986). Physical basis of the length-slope factor in the Universal Soil Loss Equation. Soil Science Society of America Journal, 50(5), 1294–1298. DOI ↗
Partheniades, E. (1965). Erosion and deposition of cohesive soils. Journal of the Hydraulics Division, 91(1), 105–139. DOI ↗
Perica, S., Pavlovic, S., St. Laurent, M., Trypaluk, C., Unruh, D., Martin, D., & Wilhite, O. (2013). NOAA Atlas 14: Precipitation-frequency atlas of the United States, Volume 9: Southeastern States, Version 3 (NOAA Atlas 14, Vol. 9). NOAA. DOI ↗
Renard, K. G., Foster, G. R., Weesies, G. A., McCool, D. K., & Yoder, D. C. (1997). Predicting soil erosion by water: A guide to conservation planning with the Revised Universal Soil Loss Equation (RUSLE) (Agriculture Handbook No. 703). U.S. Department of Agriculture. ARS ↗
Toro, E. F. (2001). Shock-capturing methods for free-surface shallow flows. Wiley. Publisher ↗
Wischmeier, W. H., & Smith, D. D. (1978). Predicting rainfall erosion losses: A guide to conservation planning (Agriculture Handbook No. 537). U.S. Department of Agriculture. ARS ↗
Wong, M., & Parker, G. (2006). Reanalysis and correction of bed-load relation of Meyer-Peter and Müller using their own database. Journal of Hydraulic Engineering, 132(11), 1159–1168. DOI ↗