Hydrologic Model
The hydrologic component of HydroPol2D governs the partitioning of atmospheric input into interception, throughfall, infiltration, evapotranspiration, snow accumulation and melt, vadose-zone storage, groundwater recharge, and groundwater feedback to the land surface.
At the cell scale, the hydrologic model determines how much water:
- is temporarily stored by the canopy,
- reaches the ground surface,
- infiltrates into the soil,
- remains stored in the vadose zone,
- recharges groundwater,
- returns to the surface through exfiltration,
- or is removed by evaporation and transpiration.
These processes are evaluated sequentially within each time step and provide the hydrologic forcing for the hydrodynamic model.
1. Conceptual Hydrologic Balanceβ
At the conceptual level, the hydrologic balance of a grid cell may be written as
where:
- is surface water depth
- is effective rainfall reaching the ground
- is snowmelt contribution
- is groundwater exfiltration to the surface
- is infiltration rate
- is evaporation rate from surface storage
- is transpiration rate
- and are additional imposed source and sink terms
Not all terms are active simultaneously. Their activation depends on the selected forcing configuration and model flags. Nevertheless, this balance provides the conceptual framework used to organize all vertical fluxes acting on a grid cell.
2. Canopy Interception, Throughfall, and Stemflowβ
HydroPol2D represents canopy interception using a storage-based interception model in which the precipitation that reaches the canopy is partitioned into:
- canopy storage,
- throughfall,
- canopy evaporation,
- and stemflow.
The interception routine receives:
- gross precipitation when snow modeling is off, and only the rainfall of Section 5.1 when it is on,
- potential evaporation ,
- leaf area index ,
- previous canopy storage ,
- canopy storage coefficient ,
and returns updated canopy storage , throughfall , evaporation from intercepted water , and stemflow .
With snow modeling on, the snow module splits the precipitation before the canopy. The snowfall goes to the snowpack, the melt goes straight to the surface, and takes the place of in the equations of this section.
This interception step controls how much of the atmospheric water input is temporarily retained by vegetation and how much is transferred to the ground surface during the current time step.
2.1 Maximum canopy storageβ
The maximum interception storage is computed as
where:
- is maximum canopy water storage
- is canopy storage coefficient
- is leaf area index
This relation implies that vegetation with larger leaf area can store more intercepted water.
2.2 Stemflowβ
The code includes a stemflow routine based on a delay function. The intermediate expressions are
and
where:
- is stemflow delay
- is the maximum delay parameter
- is the stemflow decay coefficient
- is the stemflow fraction
- is stemflow
In the current HydroPol2D implementation, stemflow is deactivated by explicitly imposing
Therefore, stemflow does not currently contribute to the surface-water balance, although the structure of the routine is retained in the code.
2.3 Evaporation from interception storageβ
The fraction of canopy storage exposed to evaporation is defined as
and the canopy evaporation is then computed as
subject to the constraint
where:
- is the fraction of canopy storage filled at the beginning of the time step
- is evaporation from interception storage
- is potential evaporation over the time step
This formulation assumes that canopy evaporation is proportional to the fraction of storage occupied at the beginning of the time step, while also enforcing that evaporation cannot exceed the water actually available in precipitation plus stored interception water.
2.4 Interception storage updateβ
The canopy storage increment is computed as
and the provisional storage becomes
Throughfall is then computed as the excess above the canopy storage capacity:
Finally, the canopy storage is truncated at its maximum admissible value:
where:
- is the canopy storage increment over the time step
- is provisional canopy storage before truncation
- is throughfall
- is final canopy storage
This sequence reflects the physical assumption that precipitation first fills canopy storage. Once the canopy reaches its storage capacity, the excess water is released as throughfall.
2.5 Effective rainfall passed to the surfaceβ
The rainfall available to the land surface is defined as
where:
- is effective rainfall reaching the ground
- is direct throughfall
- is stemflow
Under the current implementation, since stemflow is deactivated, effective rainfall is equal to throughfall. In practical terms, represents the amount of liquid water transferred from the atmosphereβcanopy system to the land surface during the time step, prior to hydrodynamic routing.
If the interception routine is disabled, then no canopy storage is resolved and precipitation reaches the surface directly, so that
2.6 Rainfall applicationβ
For validated applications, precipitation entering the interception module is applied over the active model cell as:
where is the aggregated rainfall depth over the model time step. With snow modeling on, is only the rain part of , the of Section 5.1.
3. Potential Evapotranspiration and Evaporationβ
HydroPol2D computes spatially distributed reference evapotranspiration using a PenmanβMonteith formulation. Meteorological station data are first interpolated over the grid using inverse distance weighting, and the interpolated fields are then used to compute both reference evapotranspiration and an evaporation-like term .
The quantity is used as the standard reference evapotranspiration, while is used in the interception routine to estimate evaporation from intercepted canopy water.
3.1 Spatial interpolation of meteorological forcingβ
At each time step, the following fields are interpolated from available stations:
- maximum air temperature
- minimum air temperature
- mean air temperature
- wind speed at
- relative humidity
- soil heat flux
For a generic variable , the interpolated field at location is written conceptually as
with
where:
- is the value observed at station
- is the distance from station to location
- is the inverse-distance weighting power parameter
Only stations with complete data at the current time step are retained in the interpolation. This procedure yields spatially distributed forcing fields that are then used in the evapotranspiration calculations.
3.2 PenmanβMonteith equationβ
The reference evapotranspiration is computed as
and the evaporation-like term is
where:
- is reference evapotranspiration
- is potential evaporation without aerodynamic surface resistance in the denominator
- is the slope of the saturation vapor pressure curve
- is net radiation
- is soil heat flux
- is the psychrometric constant
- is wind speed at
- is saturation vapor pressure
- is actual vapor pressure
- is mean air temperature
These are the algebraic forms implemented in the current code. The difference between and lies in the denominator, which makes an evaporation-like term more directly suited to canopy interception losses.
3.3 Supporting radiation and atmospheric termsβ
HydroPol2D computes the auxiliary PenmanβMonteith terms using astronomical and thermodynamic relationships.
Solar declination is computed as
Relative EarthβSun distance is
Extraterrestrial radiation is then computed as
Incoming solar radiation is estimated as
Clear-sky radiation is
Net shortwave radiation is
Net longwave radiation is
Net radiation is then
The slope of the saturation vapor pressure curve is computed as
Atmospheric pressure is estimated as
and the psychrometric constant is
where:
- is day of year
- is solar declination
- is relative EarthβSun distance
- is extraterrestrial radiation
- is sunrise hour angle
- is latitude
- is incoming solar radiation
- is the empirical radiation coefficient in the Hargreaves-type incoming radiation estimate
- is clear-sky solar radiation
- is the terrain elevation
- is net shortwave radiation
- is land-surface albedo
- is net longwave radiation
- is the StefanβBoltzmann constant
- is atmospheric pressure
These expressions are explicitly implemented in the evapotranspiration routine and evaluated in matrix form over the computational domain.
3.4 Direct evaporation and transpiration forcingβ
HydroPol2D can also use externally supplied raster fields of evaporation and transpiration. In that configuration, the model bypasses the internal PenmanβMonteith calculation and applies prescribed and fields directly in the hydrologic mass balance.
3.5 Feddes root-water-uptake stressβ
Feddes stress is optional. It reduces soil transpiration when the root zone is too wet or too dry (Feddes, Kowalik and Zaradny, 1978, Simulation of Field Water Use and Crop Yield, Pudoc, Wageningen).
| Model | Switch | Default |
|---|---|---|
| HydroPol2D-Python | vertical.feddes.enabled: true | off |
| HydroPol2D (MATLAB) | flag_feddes = 1 | 0 |
It works in both subsurface schemes (default and layered), on the structured grid and on the Voronoi mesh.
The reduction factor is a piecewise-linear function of the matric head (m, negative):
| Head | Meaning | Default (m) |
|---|---|---|
| Wetter than this: no uptake (no air for the roots) | β0.1 | |
| Start of unstressed uptake | β0.25 | |
| End of unstressed uptake | β4.0 | |
| Wilting point: no uptake | β80 |
The heads must satisfy . The head of each layer comes from its van Genuchten curve and its current water content.
Demand-dependent (optional). As in SWAP, can depend on the potential transpiration rate . applies at mm/day, at mm/day, and is interpolated linearly between them. Both default to , so the option is off unless they are set.
Uptake. Root density is uniform over the root depth . Each rooted layer is asked for its share of the demand, reduced by its own :
where is the rooted thickness of layer . Each take is limited by the water available in that layer. There is no compensation: demand that one layer cannot meet is not moved to another layer.
| Setting | HydroPol2D-Python | HydroPol2D (MATLAB) |
|---|---|---|
| Heads | vertical.feddes.h1_m, h2_m, h3_m, h4_m | feddes_h1_m, feddes_h2_m, feddes_h3_m, feddes_h4_m |
| Demand-dependent | vertical.feddes.h3_low_m, h3_high_m | feddes_h3_low_m, feddes_h3_high_m |
4. Infiltrationβ
The infiltration module computes the transfer of water from the surface to the vadose zone using a Darcy-based formulation coupled with van GenuchtenβMualem constitutive relationships. The formulation is designed to approximate Richards-type unsaturated flow behavior while maintaining compatibility with the storage-based structure of HydroPol2D.
At each time step, infiltration is controlled by three simultaneous constraints:
- the availability of water at the surface,
- the hydraulic capacity of the soil,
- the remaining storage capacity of the vadose zone.
The final infiltration rate is determined as the minimum among these competing limits.
Current layered vadose structureβ
The current implementation represents the soil and shallow groundwater column with four conceptual zones:
- a near-surface layer, with a default target thickness of (HydroPol2D-Python takes it from the soil-table length of Section 4.5, and the MATLAB code fixes it at );
- a root-zone layer, whose depth is assigned from land use / land cover;
- a transmission-zone layer, which occupies any remaining vadose thickness below the root zone;
- a groundwater zone, whose top is the current water-table depth.
The layer geometry is recomputed from soil depth, land-surface elevation, and groundwater head. The fallback rules are intentionally conservative:
- if the LULC root depth is shallower than the near-surface target, the explicit root-zone layer collapses and roots are represented within the near-surface layer;
- if bedrock is shallower than the requested root depth, root depth is truncated to available soil depth;
- if the water table is shallower than the requested root depth, vadose root storage is truncated at the water table;
- if the water table reaches the surface, all vadose layers have zero thickness and groundwater feedback occurs through saturation/exfiltration logic.
The same base soil hydraulic parameters are assigned to the near-surface, root-zone, and transmission-zone layers, while saturated hydraulic conductivity can be adjusted by layer multipliers:
Ks_multiplier_near_surface,Ks_multiplier_root_zone,Ks_multiplier_transmission.
This keeps the parameterization practical: the soil table defines the base physical soil behavior, LULC defines root-zone depth, and multipliers allow vertical contrasts when data or calibration support them.
4.1 Water-table-controlled unsaturated storageβ
The vertical structure of the soil column is dynamically linked to the groundwater table. The saturated thickness above the base of the soil profile is computed as
and the depth to the water table below the land surface is
where:
- is groundwater head
- is land surface elevation
- is soil depth
- is water-table depth below the surface
Under the current implementation, vadose storage is tracked as active water above residual content. The conceptual maximum storage available in the unsaturated zone is therefore
and the remaining storage capacity is
where:
- is maximum vadose storage
- is current vadose storage
- is residual water content
- is saturated water content
This formulation ensures that the available storage dynamically responds to groundwater fluctuations. As the water table rises, decreases and the vadose storage capacity shrinks accordingly. In the default layered implementation, this same logic is applied through the summed capacities of the near-surface, root-zone, and transmission-zone stores after truncation by the current water-table position.
4.2 Representative water content and effective saturationβ
The representative volumetric water content in the vadose zone is approximated as
subject to
The effective saturation is then defined as
where:
- is volumetric water content
- is residual water content
- is effective saturation
This effective saturation is used to evaluate both matric suction and hydraulic conductivity. In the default layered implementation, the same constitutive form is evaluated separately for each vadose layer; the single-state expression above is the conceptual equivalent for the legacy fallback formulation.
4.3 Matric pressure headβ
The matric pressure head is computed using the van Genuchten retention curve:
with
where:
- is matric pressure head
- is inverse air-entry parameter
- is van Genuchten shape parameter
At near-saturated conditions, the model imposes
to prevent numerical instability.
4.4 Unsaturated hydraulic conductivityβ
The unsaturated hydraulic conductivity is computed as
with
where:
- is unsaturated hydraulic conductivity
- is saturated hydraulic conductivity
- is pore-connectivity parameter
If is not provided, a default value of is used.
4.5 Darcy-based infiltration capacityβ
The infiltration capacity represents the maximum flux that can be transmitted into the soil given the current hydraulic state. In the current code, this is not based on a single value alone. Instead, HydroPol2D uses:
- a representative bucket suction based on the current storage of the near-surface layer, so that and below are those of that layer (only the legacy single-store fallback uses the whole vadose storage of Section 4.2),
- a within-step near-surface wetting predictor,
- and a weighted near-surface conductivity that blends saturated entry conductivity with the conductivity of the wetted top layer.
The temporary wetting predictor is
where:
- is the within-step candidate wetting depth
- is the remaining storage deficit of the near-surface layer
- is the predicted water content at the bottom of the near-surface layer
The effective entry conductivity is then evaluated as
where is the near-surface conductivity weight. The infiltration capacity is then computed as
where:
- is infiltration capacity
- is surface ponding head, equal to of Section 4.6
- is near-surface resistance length (default )
- is maximum driving head difference (typically )
This formulation accounts for both gravity-driven and capillary-driven infiltration while also approximating rapid wetting at the surface boundary. The wetting predictor does not add water to the soil state by itself; only the accepted infiltration flux updates vadose storage.
4.6 Supply-limited and storage-limited infiltrationβ
The water available for infiltration is determined from the effective surface water depth. It is the ponded depth at the start of the step plus the water that reaches the ground during the step,
where is this step's rain on the ground from Section 2.5 (the throughfall when interception is on, the rain itself when it is off) and is this step's snowmelt, zero when snow modeling is off.
The corresponding supply-limited infiltration rate is
where:
- is effective ponded water depth
- is time step in hours
The storage-limited infiltration rate is
The actual infiltration rate is then
Additional constraints are applied:
- over impervious cells
- when
Thus, infiltration is simultaneously supply-limited, capacity-limited, and storage-limited. In layered mode, acceptance is additionally constrained by the explicit near-surface storage deficit before water can continue to drain downward through the deeper vadose layers.
Figure 1. The three limits on infiltration, each shown in a case where it is the smallest (schematic, not to scale). The water that does not infiltrate stays on the surface and is routed to the neighbour cells.
4.7 Vadose storage updateβ
The infiltrated depth over the time step is
and the vadose storage is updated as
subject to
In the default layered implementation, the accepted infiltration first fills the near-surface store and the total vadose storage is then synchronized across:
- near-surface storage,
- root-zone storage,
- transmission-zone storage.
The scalar expression above is therefore the conceptual summary of a layered update rather than the only internal representation.
5. Snow Accumulation, Melt, and Sublimationβ
When snow modeling is active, HydroPol2D tracks snow water equivalent (SWE), snow density, and physical snow depth in every active grid cell. Snow parameters are read from the LULC parameter table and mapped to the grid from LULC_Index. The internal meteorological forcing pathway provides mean air temperature, minimum air temperature, and wind speed. Snow simulations therefore require flag_ETP = 1, flag_input_ETP_map = 0, and a meteorological workbook that covers the simulation period.
Figure 2. Rain or snow, storage, melt and sublimation in one cell. Only the rain enters the canopy store, the melt goes straight to the surface water, and the bottom panel uses synthetic forcing, not model output.
5.1 Rain-snow partitioningβ
Each LULC class supplies an all-snow threshold and an all-rain threshold , both in . The snow fraction is
The thresholds must satisfy . Equal thresholds give a step partition at that temperature. The resulting snowfall and rainfall are
where is the temperature-dependent snow fraction.
The partition comes before the canopy. Only the rainfall enters the interception model of Section 2, in place of ; the snowfall goes to the snowpack, and the melt reaches the surface without passing through the canopy.
5.2 Snow water equivalentβ
The SWE balance is
where all terms are in millimeters of water equivalent and is sublimation.
5.3 Snowmelt and timestep scalingβ
Snowmelt is the sum of degree-day and positive net-radiation terms. For a routing step of seconds and days,
Here, is the LULC-specific degree-day factor , is the internally calculated net-radiation flux , and is the latent heat of fusion. A flux of gives of water equivalent. Melt cannot exceed available SWE.
5.4 Snow density and depthβ
Fresh snow uses the LULC-specific initial density . Existing and new snow are mixed by SWE before compaction. Density then evolves as
with . Snow depth is
The factor 1000 converts water-equivalent depth to physical snow depth when SWE is in millimeters and density is in .
5.5 Sublimationβ
Here, is the LULC-specific sublimation coefficient, is wind speed , and and are saturation and ambient specific humidity. The current implementation estimates from the available temperature fields. Sublimation is nonnegative and cannot exceed post-melt SWE.
5.6 Initial snow states and class-code fallbackβ
Initial_SWE_path and Initial_Snow_Depth_path are optional rasters. With neither raster, the model initializes zero SWE and zero snow depth, and retains the LULC-specific fresh-snow density. With one raster, the other state is derived from that density. With both rasters, the model derives density from SWE and depth and rejects positive pairs outside the configured density range. Raster nodata means that no initial snow was specified for that cell.
If the LULC raster contains a valid code that is absent from the LULC, soil, or snow table, HydroPol2D assigns the area-weighted mean of properties from mapped cells. The model writes Input_Class_Code_Audit.csv, which lists raster codes, mapped table indices, fallback area, and the properties applied. Duplicate or non-numeric table indices, or a table with no mapped classes, remain input errors.
5.7 Surface-water update under snow conditionsβ
where is the rain that reaches the ground (Section 2.5) when is the input. With interception on, it is the throughfall that the canopy releases from . With interception off, .
If snow modeling is off,
where and are current and previous surface-water depth.
6. Vadose Storage, Recharge, and Groundwater Feedbackβ
6.1 Default layered vadose structureβ
The current default formulation is a layered vadose system, not a single recharge bucket. Water is tracked in:
- a near-surface layer,
- a root-zone layer,
- a transmission layer,
- and a groundwater-coupling interface below the transmission layer.
For a generic vadose layer with active storage (water above , as a depth over the whole cell) and thickness , the water sits in the pervious fraction of the cell:
The layer starts at and holds at most . Over a time step it drains to the layer below, subject to the available storage capacity in the receiving layer. (Before 2026-10-26 the initial storage and the drainage left out , so partly impervious cells started too wet and drained too slowly.)
6.2 Downward drainage and rechargeβ
In the default pathway:
- near-surface drainage moves first to the root zone when root storage exists,
- root-zone drainage moves to the transmission zone when transmission storage exists,
- transmission-zone drainage becomes recharge to groundwater.
Conceptually, the groundwater recharge over a time step can be summarized as
with optional direct drainage from higher layers only where the lower vadose layers are absent. This layered cascade is the canonical HydroPol2D recharge story. The older single-bucket Darcy closure remains available only as a fallback formulation and should not be treated as the default theory path.
6.3 Optional capillary rise and asynchronous groundwater couplingβ
When flag_capillary_rise = 1, shallow groundwater can return water upward into available vadose storage. The implemented capillary-rise logic increases with:
- shallower water-table depth,
- larger storage deficit in the receiving layer,
- and larger layer conductivity.
The net vadose-groundwater exchange of each surface-water step is therefore
where:
- is total downward recharge from layered drainage
- is upward capillary-rise exchange
This net exchange changes the water-table heads in every surface-water step. The groundwater scheduler is always asynchronous, and only the lateral groundwater flow, when it is on, waits for it. HydroPol2D-Python and the MATLAB code no longer read the flag_groundwater_async setting.
6.4 Saturation excess and groundwater exfiltrationβ
After the groundwater update, HydroPol2D recomputes the vadose capacity using the updated water-table position. Any water that no longer fits in the unsaturated zone is returned to the surface as saturation excess:
Groundwater head that rises above the local surface also generates exfiltration:
where is specific yield. The full canonical groundwater formulation, including the asynchronous scheduler and Boussinesq lateral flow solver, is documented on the Groundwater Model page.
6.5 Layered subsurface optionβ
The structure above is the default. The optional layered subsurface keeps the three soil stores but places them over regolith slots that reach the depth to bedrock. In that scheme a rising water table fills the empty pore space of the soil and regolith instead of pushing soil water to the surface.
7. Summaryβ
The hydrologic model in HydroPol2D integrates:
- canopy interception,
- PenmanβMonteith evapotranspiration,
- Darcy-based infiltration with weighted near-surface conductivity,
- snow accumulation and melt,
- layered vadose storage and groundwater coupling,
- optional Feddes root-water-uptake stress,
into a unified, mass-consistent framework that resolves vertical water fluxes at the grid-cell scale and provides the hydrologic forcing for the hydrodynamic model.