Skip to contents

Calculates the effective (relative) saturation S_e(h) at given matric potential values using the Van Genuchten (1980) model with the Mualem constraint (m = 1 − 1/n):

Usage

saturation_index(data, alpha, n, h)

Arguments

data

A data frame or tibble. Passed as the first argument so the function is compatible with |> and %>% pipes.

alpha

Van Genuchten shape parameter (1/cm or 1/m, matching units of h). Either a bare column name from data or a scalar numeric value. Must be strictly positive.

n

Van Genuchten shape parameter (dimensionless). Must be > 1 for the Mualem model. Either a bare column name or a scalar numeric value.

h

Matric potential / pressure head (cm or m, must match units of alpha). Either a bare column name or a scalar numeric value. Sign convention: absolute value is used internally.

Value

The input data as a tibble with an additional column .Se containing effective saturation (dimensionless, 0–1).

Details

$$S_e(h) = \frac{1}{(1 + (\alpha |h|)^n)^m}$$

S_e ranges from 0 (completely dry) to 1 (saturated). It is related to volumetric water content by:

$$\theta(h) = \theta_r + (\theta_s - \theta_r) \cdot S_e(h)$$

Use this function when you need the dimensionless saturation state rather than the absolute water content (e.g. as an intermediate for K(h) or when comparing soils with different θ_r/θ_s).

References

Van Genuchten, M. Th. (1980). A closed-form equation for predicting the hydraulic conductivity of unsaturated soils. Soil Science Society of America Journal, 44(5), 892–898. https://doi.org/10.2136/sssaj1980.03615995004400050002x

See also

swrc_van_genuchten() for absolute water content θ(h), hydraulic_conductivity() for K(h).

Examples

library(tibble)

soil <- tibble(h = c(0, 10, 100, 1000, 15000))

saturation_index(soil, alpha = 0.02, n = 1.5, h = h)
#> # A tibble: 5 × 2
#>       h    .Se
#>   <dbl>  <dbl>
#> 1     0 1     
#> 2    10 0.972 
#> 3   100 0.639 
#> 4  1000 0.223 
#> 5 15000 0.0577

# Confirm relationship to swrc_van_genuchten()
soil |>
  saturation_index(alpha = 0.02, n = 1.5, h = h) |>
  dplyr::mutate(.theta_check = 0.05 + (0.45 - 0.05) * .Se)
#> # A tibble: 5 × 3
#>       h    .Se .theta_check
#>   <dbl>  <dbl>        <dbl>
#> 1     0 1            0.45  
#> 2    10 0.972        0.439 
#> 3   100 0.639        0.306 
#> 4  1000 0.223        0.139 
#> 5 15000 0.0577       0.0731