RUSLE NoDb Mod
Gridded RUSLE (Revised Universal Soil Loss Equation) implementation for WEPPcloud runs, producing spatially explicit long-term average hillslope sheet-and-rill detachment potential rasters from the classic
A = R * K * LS * C * Pequation.
See also: specification.md for the full design rationale, factor equations, locked method contracts, and scientific references.
Overview
This mod replaces legacy heuristic gridded erosion visualizations with a product that is more explicit, more citable, and more academically defensible. It is treated as a visualization and prioritization layer, not as a regulatory estimate or a substitute for calibrated hillslope modeling.
The initial target configuration is disturbed9002_wbt. The mod requires the
WBT (WhiteboxTools) delineation backend; TOPAZ runs are not supported. Uses
US-only datasets (POLARIS for K; RAP for observed_rap C mode only).
Key characteristics:
- Spatially gridded outputs aligned to the run DEM
- Run-constant scalar
Rfactor sourced by explicitr_mode:cligen_static,momm2025_county_region, orcanonical_rusle2 - POLARIS-derived soil erodibility (K) with nomograph and EPIC estimators
- Two C-factor modes: observed RAP fractional cover and scenario-based disturbed/SBS lookup
- Masking scope varies by factor — see Spatial Masking
What this mod is not
- Not event-based detachment modeling
- Not sediment delivery to channels or outlets
- Not net erosion-deposition modeling
- Not channel or gully erosion
- Not a full clone of RUSLE2
See specification.md § Non-Goals for the full boundary statement.
Workflow
A RUSLE build orchestrates five factor computations and assembles the final
A raster. The Rusle controller (rusle.py) coordinates the entire
pipeline:
- R — Parse the run WEPP climate file, compute a scalar mean annual R
via
cli_calculate_static_r(cligen_static) or select a scalar planning climatology R from the vendored Momm 2025 county dataset or canonical official RUSLE2 polygon dataset; broadcast asrusle/r.tif - LS — Invoke the WBT
RusleLsFactortool on the conditioned DEM (prefersdem/wbt/relief.tif, falls back towatershed.relief), producingls.tif,l.tif,s.tif,sca.tif, andeffective_slope_length.tif - K — Load POLARIS near-surface soil layers, compute depth-weighted
averages, and derive K rasters via one or both estimators
(
k_polaris_nomograph.tif,k_polaris_epic.tif) - C — Compute cover-management factor from either observed RAP bare
ground (
observed_rap) or disturbed-family/SBS lookup (scenario_sbs) - P — Write a constant support-practice raster (default
P = 1.0) - A — Multiply
R * K * LS * C * Pcell-by-cell into the final mode-specific output
All artifacts are written under <wd>/rusle/ with machine-readable
provenance in rusle/manifest.json and a human-readable rusle/README.md
per build.
Components
Factor Modules
| Module | Factor | Description |
|---|---|---|
| ls_integration.py | LS | WBT RusleLsFactor runner; Desmet-Govers L, McCool/RUSLE S |
| k_integration.py | K | POLARIS nomograph and EPIC estimators with optional benchmark harness |
| k_nomograph.py | K | Nomograph-style K from sand/silt/clay/OM/Ksat |
| k_epic.py | K | Williams (1995) EPIC K from texture and organic carbon |
| k_compare.py | K | Benchmark comparison against reference K sources |
| k_reference.py | K | Reference point sampling for K validation |
| k_manifest.py | K | Manifest writing for K artifacts |
| c_integration.py | C | observed_rap and scenario_sbs C-factor runners |
| c_formula.py | C | Shared math: C = exp(-b * fg) |
| c_lookup.py | C | Static lookup table for scenario_sbs mode |
| c_manifest.py | C | Manifest writing for C artifacts |
Controller
rusle.py — The Rusle NoDb controller facade. Orchestrates
end-to-end builds, manages configuration state, and writes final A rasters
and provenance artifacts.
Data
| File | Purpose |
|---|---|
| data/rusle_c_lookup.csv | Static C-factor lookup for scenario_sbs mode, keyed by disturbed family and SBS class |
Reference Documents
docs/ — Local cache of primary open PDFs used by the specification. See docs/README.md for the full inventory.
Key Concepts
C-Factor Modes
observed_rap (default) — Uses observed RAP (Rangeland Analysis Platform)
fractional cover for a selected year. Bare ground drives net ground cover
(fg = clamp(100 - bare_ground_pct, 0, 100)), and the C factor is computed
as C = exp(-0.04 * fg). Best fit for current condition, recent post-fire,
and monitoring workflows.
scenario_sbs — Uses explicit lookup values keyed by canonical disturbed
family (forest, shrub, tall_grass) and SBS (Soil Burn Severity) class
(unburned, low, moderate, high). Restricted to runs with the Disturbed module
active. Best fit for counterfactual pre-fire/post-fire comparisons and
planning mode.
See specification.md § C for the full formula derivation, static matrix values, and non-burnable class policy.
K-Factor Modes
polaris_nomograph (default) — Nomograph-like RUSLE-facing emulation
using POLARIS sand, silt, clay, OM, and Ksat. Very fine sand is estimated via
the RUSLE2 User Reference Guide fallback equation. Closest to canonical
NRCS K semantics.
polaris_epic — Williams (1995) EPIC alternative using only texture and
organic carbon. Lower input burden but less directly comparable to NRCS K.
Best fit as a sensitivity or reproducibility path.
See specification.md § K for locked assumptions, rock-fragment handling, and comparison guidance.
POLARIS Soil Layers
The mod automatically acquires POLARIS near-surface soil property rasters
(sand, silt, clay, OM, bulk density, Ksat) at depths 0-5 cm and 5-15 cm,
with thickness-weighted averaging to a single near-surface value. The
internal Polaris NoDb controller handles retrieval, alignment, and
caching.
Spatial Masking
Masking behavior varies by factor and C mode in the current implementation:
- LS — The
channel_mask(netful) is passed as a stop mask to WBTRusleLsFactor, terminating slope-length growth at channel cells. NLCD and user stop masks are not currently wired into the LS call. - C (
observed_rap) — No NLCD-family masking is applied; validity is determined by RAP-band finite-value masks after DEM alignment. - C (
scenario_sbs) — NLCD-family masking is applied via the disturbed class mapping: water, developed, and wetland families produceC = nodata. - A — Cells where any input factor is
NaN/nodata produceA = NaN.
The specification defines a broader masking contract (NLCD water 11,
developed 21-24, wetlands 90/95, channel mask, optional blocking mask,
optional user masks) that is not yet fully wired into all factor paths. See
specification.md § Spatial Masking Rules
for the full design rationale, including the wetland masking decision.
Configuration
The Rusle controller reads its configuration from the run .cfg file under
the [rusle] section:
| Parameter | Default | Description |
|---|---|---|
r_mode |
cligen_static |
R-factor source: cligen_static, momm2025_county_region, or canonical_rusle2 |
c_mode |
observed_rap |
C-factor source: observed_rap or scenario_sbs |
rap_year |
latest available | RAP observation year for observed_rap mode |
k_modes |
polaris_nomograph |
Comma-separated K estimators to compute |
default_k_mode |
first in k_modes |
Which K raster feeds the final A product |
max_slope_length_m |
304.8 |
LS effective slope-length cap in meters (1000 ft handbook basis); override only for explicit sensitivity analysis |
p_value |
1.0 |
Constant support-practice factor |
See specification.md § Config Direction for the full config surface including advanced LS controls.
Build Artifacts
A standard build writes mode-specific artifacts under <wd>/rusle/:
Shared outputs:
r.tif, ls.tif, l.tif, s.tif, sca.tif, effective_slope_length.tif,
p.tif, manifest.json, README.md
Mode-specific outputs:
c_observed_rap.tif or c_scenario_sbs.tif,
a_<c_mode>_<default_k_mode>.tif,
k_polaris_nomograph.tif and/or k_polaris_epic.tif
Mode-support artifacts:
c_fg.tif (observed_rap), disturbed_class.tif (scenario_sbs),
c_lookup_used.csv (scenario_sbs), optional sbs_4class.tif
Factor rasters are single-band GeoTIFF on the DEM-aligned grid. Controller-
generated factor products use float32 with nodata -9999.0. Classification
artifacts (disturbed_class.tif, sbs_4class.tif) use uint8 with nodata
0 or 255 respectively.
Integration Points
- Depends on:
Ron,Watershed,Climate,Landuse,Disturbed,Polaris - External tools: WBT
RusleLsFactor(Rust, in/workdir/weppcloud-wbt),wepppyo3.climate.compute_static_r_from_cli(Rust PyO3) - Data sources: POLARIS soil grids, RAP fractional cover, NLCD landcover
- Used by: gl-dashboard raster overlays, preflight system, query-engine catalog
- RQ tasks: Build is enqueued as an RQ job rather than running inline
Persistence
- Filename:
rusle.nodb - Redis cache: DB 13, 72-hour TTL
- Locking: Required for all mutations (standard NoDb pattern)
- Provenance:
rusle/manifest.jsonis the canonical machine-readable record
Further Reading
- specification.md — Full design specification, method contracts, and scientific references
- docs/ — Reference PDF bundle
- ../../README.md — NoDb framework documentation
- ../disturbed/README.md — Disturbed module (provides SBS and management context)
- ../polaris/ — POLARIS NoDb substrate