Inputs and outputs
Use this guide to configure a column or a slope-unit domain and read the results. Public times are in hours; geometry and material properties use SI units unless a constructor specifies otherwise. See the tutorials for complete examples and the API reference for function signatures.
Single-column parameter conventions
| Input | Meaning | Unit |
|---|---|---|
slope_angle_deg |
Ground-surface slope | degrees |
maximum_depth |
Maximum vertical column depth | m |
initial_water_table_depth |
Initial water-table depth; defaults to the column base | m |
saturated_hydraulic_conductivity |
Saturated conductivity, \(K_{\mathrm{s}}\) | m/s |
alpha |
Intrinsic Gardner parameter | 1/m |
theta_s, theta_r |
Saturated and residual water contents | m³/m³ |
long_term_infiltration |
Background flux defining the steady initial profile | m/s |
cohesion, friction_angle_deg |
Effective cohesion and friction angle | Pa, degrees |
unit_weight_soil, unit_weight_water |
Soil and water unit weights | N/m³ |
equation_set |
"srivastava_yeh" (default) or "baum_etal" |
— |
Configure hydraulic parameters with HydraulicProperties, strength with StrengthProperties, and basal drainage with a boundary object. srivastava_yeh uses the intrinsic Gardner laws; baum_etal uses the TRIGRS-style conversions. Their differences are described in the equation comparison.
Column depth and observation plane
maximum_depth sets the reported profile extent. With a finite basal boundary, an initial water table below this depth is adjusted to the base; an infinite boundary retains the requested depth. Results record both requested and effective initial depths.
The optional depth_to_failure_plane argument selects the pressure and factor-of-safety time-series plane within the column. It defaults to the base and does not change the full profiles or hydraulic calculation.
result = us.run_single_column(
hydro=hydro, strength=strength, boundary=boundary, rainfall=rainfall,
output_times=output_times_h,
depth_to_failure_plane=0.8, # vertical depth in metres
)
The analytical unsaturated domain extends to the effective initial water table. Water-table rise and pressure below it follow the storage and reconstruction assumptions.
Public time convention
Use hours for output_times, rainfall breakpoints, direct analytical evaluations, and storage_time_step. Returned times also use hours; the solver converts to SI seconds internally.
Rainfall constructors accept alternative units explicitly, for example duration_units="days". Stored histories still use hours. output_times must start at zero and increase strictly; its last value sets the event simulation horizon.
Rainfall forcing
RainfallSeries describes piecewise-constant gross rainfall. Convenience constructors default to mm/h and hours:
rainfall = us.RainfallSeries.from_intervals(
intensities=[0.0, 9.0, 3.0], # mm/h
durations=[3.0, 2.0, 1.0], # hours
)
Include zero-intensity intervals for dry gaps. Each column admits \(I(t)=\min[P(t),K_{\mathrm{s}}]\); rainfall above its local conductivity is discarded without surface storage or routing.
Intervals use [start, end): the next rate applies at an interior breakpoint, and rainfall is zero at the final breakpoint. Plot instantaneous rates with step(..., where="post").
Antecedent rainfall
Pass an AntecedentRainfall object to simulate rainfall before the triggering event. Omit it for an event without antecedent forcing.
antecedent = us.AntecedentRainfall.uniform(
total_rainfall_mm=500,
duration=90, duration_units="days", # stored history uses hours
drainage_efficiency=1.0,
)
result = us.run_single_column(
hydro=hydro, strength=strength, boundary=boundary, rainfall=rainfall,
output_times=output_times_h, antecedent=antecedent,
storage_time_step=1.0, # hours
)
For a measured history, use AntecedentRainfall(series, drainage_efficiency=...) with a RainfallSeries beginning at zero. The same object is accepted by spatial solvers. Each antecedent interval receives the local conductivity cap.
drainage_efficiency=None uses the event boundary's setting throughout. An explicit value in [0, 1] applies during the antecedent only. Efficiency multiplies drainage capacity, \(q_{\mathrm{c}}=\eta K_{\mathrm{s}}\sin^2\delta\); a value of 1 does not impose a fixed water table.
Moisture and retained storage continue into the event. Returned times are event-relative, while water-table rise and cumulative storage reference the start of the complete history and can be positive at event zero. See the antecedent tutorial and physical assumptions.
Antecedent diagnostic fields
Metadata includes rainfall amounts, transfer, drainage, storage, and profile-water changes. All volume fields below are in millimetres of water; antecedent flux_m_s fields are period means.
| Metadata field | Meaning |
|---|---|
antecedent_effective_infiltration_mm |
Rainfall admitted after the local cap |
antecedent_basal_transfer_mm |
Integrated flux arriving at the base |
antecedent_basal_storage_mm |
Retained basal water |
antecedent_drainage_mm |
Drainage allocated by the storage balance |
antecedent_capacity_drainage_mm |
Integral of basal flux limited by drainage capacity |
antecedent_background_correction_mm |
Allocated minus capacity-limited drainage |
antecedent_profile_water_change_mm |
Reconstructed profile-water change |
antecedent_unsaturated_response_water_change_mm |
Profile-water change before reconstruction |
antecedent_water_balance_residual_mm |
Effective input minus allocated drainage and reconstructed profile-water change |
antecedent_storage_above_pore_capacity_mm |
Retained storage exceeding fillable pore volume |
Profile changes reference the start of the complete history. Basal storage is already represented in the reconstructed profile; do not add them as independent stores. See water-balance checks.
Slope-unit domain and materials
run_slope_units represents each slope unit (SU) as an independent column. Supply a table or GeoDataFrame with these required fields:
| Column | Meaning | Unit |
|---|---|---|
su_id |
Unique slope-unit identifier | — |
material_id |
Key in the material mapping | — |
slope_angle_deg |
Local slope | degrees |
maximum_depth_m |
Maximum vertical column depth | m |
initial_water_table_depth_m |
Requested initial water-table depth | m |
Optional failure_depth_m selects the observation plane; omission selects the base. Geometry comes from each SU. Material objects supply shared hydraulic and strength properties:
materials = {
"soil_a": {
"hydro": us.HydraulicProperties(
saturated_hydraulic_conductivity=1e-5,
alpha=3.0, theta_s=0.41, theta_r=0.06,
long_term_infiltration=1.5e-7,
),
"strength": us.StrengthProperties(
cohesion=3000.0, friction_angle_deg=33.6, unit_weight_soil=18000.0,
),
"boundary": us.FinitePerchedBoundary(drainage_efficiency=0.1),
},
}
Each material requires hydro and strength; boundary and rainfall are optional defaults. Each SU receives its own resolved configuration. Material DataFrames or CSV files are also supported; see material-table fields.
Spatially varying property overrides
Non-null SU properties override the mapped material; missing values inherit it.
| SU column | Property |
|---|---|
saturated_hydraulic_conductivity_m_s |
Saturated conductivity |
alpha_m_inv |
Gardner parameter |
theta_s, theta_r |
Water-content limits |
long_term_infiltration_m_s |
Background flux |
cohesion_pa, friction_angle_deg |
Strength |
unit_weight_soil_n_m3, unit_weight_water_n_m3 |
Unit weights |
boundary, drainage_efficiency |
Basal drainage |
Constructor names such as alpha and cohesion are also accepted in SI units. Use one name per property; conflicting aliases are rejected. Run-level n_roots, n_depths, and equation_set apply to every unit when supplied; otherwise material settings apply.
Spatial rainfall histories
SU columns int_0, dur_0, int_1, dur_1, … define consecutive rainfall intervals in mm/h and hours. Indices start at zero without gaps; each intensity needs a positive duration. Use zero intensity for dry intervals. Alternative units are set with rainfall_intensity_units and rainfall_duration_units.
Rainfall precedence is SU intervals → material rainfall → shared run rainfall. Rows with no interval values inherit rainfall; partial histories are rejected. Output times are shared across units, and each history supplies zero rainfall after it ends.
units["int_0"], units["dur_0"] = 0.0, 3.0
units["int_1"], units["dur_1"] = 9.0, 2.0
result = us.run_slope_units(
units, materials, output_times=output_times_h, n_jobs=2,
)
Column names from GIS files
Use column_mapping to map expected names to input-file names. List only fields needing a mapping:
column_mapping = {
"su_id": "OBJECTID",
"material_id": "MATERIAL",
"slope_angle_deg": "SLOPE",
"maximum_depth_m": "DEPTH",
"initial_water_table_depth_m": "WT_DEPTH",
}
result = us.run_slope_units(
slope_units, materials, rainfall=rainfall,
output_times=output_times_h, column_mapping=column_mapping,
)
run_slope_units_from_gpkg accepts the same mapping, including optional properties and rainfall fields. Mapping changes names only; values must use the documented units. SlopeUnitSchema offers an alternative for geometry and boundary fields; supply either schema or column_mapping.
Input attributes, geometry, and CRS are retained in spatial results and exports. SlopeUnitsResult.summary() reports minimum FS over the full column and at the selected plane. Use result_for(su_id) for a column result and to_geopackage() for a spatial export.
Column outputs
| Accessor | Content |
|---|---|
time_dataframe() |
Time series at the selected plane, fluxes, storage, and water-table rise |
profile_dataframe() |
Depth profiles for each output time |
arrays() |
NumPy arrays |
metadata |
Configuration, effective initial water table, and diagnostics |
rainfall_flux is gross rainfall, infiltration_flux is the admitted rate, and rainfall_excess_flux is the rejected difference. basal_flux is analytical transfer at the effective initial water table; excess_flux is undrained basal transfer. See result fields.
The selected-plane FS differs from the minimum over the whole column. \(\mathrm{FS}\le1\) marks the model's deterministic failure threshold, rather than a failure probability.
Numerical controls
| Control | Default | Role |
|---|---|---|
n_roots |
250 | Analytical series terms; srivastava_yeh resolves extra terms at short times when needed |
n_depths |
250 | Depth intervals for profiles and storage calculations |
small_time_threshold |
1e-4 | Dimensionless cutoff for the baum_etal early-time approximation |
output_times |
Required | Saved time samples and initial storage integration grid |
storage_time_step |
None; 1 h with antecedent forcing | Maximum internal storage integration interval, in hours |
max_factor_of_safety |
10 | Upper FS output cap |
n_jobs |
-1 | Spatial worker count; 1 runs serially |
Output sampling and storage integration
output_times controls saved results. storage_time_step refines internal storage integration independently: hourly outputs with storage_time_step=5 / 60 use intervals of at most five minutes while saving hourly profiles. Rainfall breakpoints and drainage transitions are included automatically.
Without an explicit storage_time_step, event-only simulations use output times and rainfall breakpoints; simulations with antecedent forcing use a maximum interval of 1 h. Finer integration can change storage, water-table rise, and FS. Finer output sampling is needed to resolve the first sampled failure time.
Compare root counts, depth resolutions, and storage intervals until the quantities of interest stabilize. Numerical refinement does not remove the model's water-table reconstruction assumptions. Details of the series and early-time response are in analytical infiltration.