Processes
Rain/snow partitioning
Precipitation is partitioned into rain and snow before entering any store.
Three partitioning methods are available, selected via the snow_rain_process option.
If snow_rain_process is not set, the default is 'snow_rain:linear', except
when snow_melt_process='melt:cemaneige', which automatically selects
'snow_rain:cemaneige'.
Linear transition (snow_rain:linear)
The default partitioning applies a linear transition between pure snow and pure rain over a user-defined temperature range:
Below
prec_t_start(optional, °C, default: 0, [-2, 2]): all precipitation falls as snow.Above
prec_t_end(optional, °C, default: 2, [0, 4]): all precipitation falls as rain.Between the two thresholds: the snow fraction decreases linearly.
This partitioning is used by default in GSM-Socont, in HBV-96 (where it
corresponds to the transition interval TT ± TTI/2), and in GR4J when
snow_melt_process is not 'melt:cemaneige'.
Single-threshold (snow_rain:threshold)
A step-function partitioning with no transition zone. All precipitation is snow at or below the threshold, and rain above it.
prec_t(optional, °C, default: 0, [-5, 5]): temperature threshold. Full name:snow_rain_transition:threshold.
CemaNeige rain/snow partitioning (snow_rain:cemaneige)
The CemaNeige partitioning (Valéry et al. [2014]) has no calibrated parameters. It is
selected automatically when snow_melt_process='melt:cemaneige' in GR4J. The
equation used depends on elevation.
At elevations ≥ 1500 m, the solid fraction is computed from the daily mean temperature \(T_\mathrm{mean}\) with fixed bounds of −1 °C and 3 °C:
No additional forcing variables are needed beyond daily mean temperature.
At elevations < 1500 m, the solid fraction is approximated as the fraction of the day during which temperature is below 0 °C, assuming a linear diurnal cycle between the daily minimum (\(T_\mathrm{min}\)) and maximum (\(T_\mathrm{max}\)):
The temperature_min and temperature_max forcing variables are required for
hydro units below 1500 m.
Melt models
Four snow and glacier melt models are available in Hydrobricks. They differ in data requirements and spatial complexity, ranging from a simple temperature index to a radiation-enhanced approach. Choose based on the available input data and the catchment characteristics.
Available melt models:
degree_day: classical degree-day model
degree_day_aspect: aspect-based degree-day model
temperature_index: Hock’s radiation-enhanced temperature-index model
cemaneige: CemaNeige snowmelt model with thermal-state correction
Specify the melt model when instantiating the hydrological model:
socont = Socont(
soil_storage_nb=2,
surface_runoff="linear_storage",
snow_melt_process="melt:degree_day"
)
Valid values for snow_melt_process: "melt:degree_day",
"melt:degree_day_aspect", "melt:temperature_index",
"melt:cemaneige".
Degree-day model (degree_day)
Degree-day or temperature-index approaches are widely used in snow- and glacier-dominated catchments because they require only air temperature data, which is often the most readily available meteorological variable. The general form (Rango and Martinec [1995]) is:
where:
\(M_{\mathrm{DD}}(t)\) is the melt rate at time step \(t\) [mm d⁻¹],
\(a_j\) is the degree-day factor for snow or ice [mm d⁻¹ °C⁻¹],
\(T_a\) is the air temperature [°C],
\(T_T\) is the melt temperature threshold [°C].
This is the simplest option: melt is proportional to the temperature excess above the threshold, with a single degree-day factor per surface type (snow or ice). Requires only temperature and elevation band data. Use this model when computational simplicity or data availability is a priority.
Aspect-based degree-day model (degree_day_aspect)
Extends the standard degree-day model by assigning different degree-day factors to north-, south-, and east/west-facing slopes. Sun-exposed south-facing slopes receive more radiation and melt faster for the same air temperature; this model captures that effect without explicitly computing radiation. It requires the catchment to be discretized by elevation and aspect. Use this model when aspect strongly differentiates melt rates across the catchment.
Radiation-enhanced temperature-index model (temperature_index)
Based on Hock [1999], this model replaces the fixed degree-day factor with one that scales with potential clear-sky solar radiation:
where:
\(m\) is a base melt factor common to both ice and snow [mm d⁻¹ °C⁻¹],
\(r_j\) is a radiation factor for snow or ice [mm d⁻¹ °C⁻¹ m² W⁻¹],
\(I_{\mathrm{pot}}\) is the potential clear-sky direct solar radiation [W m⁻²].
Radiation is computed as:
where \(I_0\) is the solar constant (1368 W m⁻²), \((R_m/R)^2\) is the orbital eccentricity correction, \(\Psi_a\) is the mean clear-sky transmissivity, \(P/P_0\) is the ratio of local to sea-level atmospheric pressure, \(Z\) is the zenith angle, and \(\theta\) is the angle between the surface normal and the solar beam. Radiation is computed at 15-minute intervals and aggregated to daily values to capture diurnal and shading effects.
This model requires the catchment to be discretized by elevation and radiation. It is the most physically realistic of the three temperature-based variants and is recommended when snow and glacier melt dominate runoff. The main trade-off is that computing the radiation field adds some preprocessing time. See Argentin et al. [2025] for a comparative evaluation of all three models.
CemaNeige snowmelt model (cemaneige)
The CemaNeige model (Valéry et al. [2014]) addresses a known weakness of plain degree-day models: they tend to overestimate melt immediately after cold spells because they respond instantly to temperature without any memory of prior cold. CemaNeige adds a thermal state variable \(e_{TG}\) that tracks how cold the snowpack is. Melt can only occur when the snowpack has fully warmed (i.e., \(e_{TG} = 0\)):
An additional scaling factor accounts for partial snow cover: when the snow water equivalent (SWE) is well below the mean annual accumulation \(C_n\), only a fraction of the area is snow-covered and effective melt is reduced:
where \(C_n = 0.9 \times \overline{P_{\mathrm{snow}}}\) and \(\overline{P_{\mathrm{snow}}}\) is the mean annual solid precipitation. The factor 0.1 ensures a minimum melt rate even at very low SWE.
Parameters:
Kf: degree-day melt factor [mm d⁻¹ °C⁻¹]CTG: cold content weighting factor [−], range [0, 1]. Values close to 1 give the snowpack a long thermal memory; values near 0 make it respond almost instantly to temperature.Tmelt: melt temperature threshold [°C]Cn(mean_annual_snow): mean annual solid precipitation [mm]
CemaNeige is the recommended snow model for the GR4J model:
gr4j = models.GR4J(snow_melt_process='melt:cemaneige')
Snowpack liquid water retention
By default, melt water leaves the snowpack directly. The HBV snow routine
(Bergström [1976], Lindström et al. [1997]) instead retains liquid water
in the snowpack, releases only the excess over a holding capacity, and lets the
retained water refreeze during cold spells. This behaviour is enabled by the
snow_water_retention_process and snow_refreezing_process options (it is
the default in HBV-96); the melt process output is then kept in
the snowpack liquid water storage instead of leaving the snowpack.
In addition, the rain_to_snowpack option routes the rain onto the snowpack
liquid water storage instead of the land cover, as in the original HBV snow
routine. Rain falling on an existing snowpack is then retained (up to the
holding capacity) and exposed to refreezing; when there is no snow, the holding
capacity is zero and the rain passes through to the land cover within the same
time step. This option requires a snow water retention process.
Snow water holding capacity (outflow:snow_holding)
Releases the liquid water exceeding the snowpack holding capacity, defined as a fraction CWH of the snow water equivalent:
where \(W\) is the liquid water content of the snowpack [mm] and \(SWE\) is the snow water equivalent [mm]. The excess is released within the time step to the parent land cover. When the snowpack is melted away (\(SWE = 0\)), all the liquid water is released.
Parameters:
cwh(aliaswhc) (optional, dimensionless, default: 0.1, [0, 0.2])Liquid water holding capacity, as a fraction of the SWE.
Full name:
snowpack:water_holding_capacity.
Degree-day refreezing (refreeze:degree_day)
Refreezes the liquid water retained in the snowpack (transfer from the water storage back to the snow storage) when the temperature drops below the melt threshold:
where \(CFR\) is the refreezing coefficient [−], and \(a_{\mathrm{snow}}\)
(degree-day factor) and \(T_T\) (melt temperature threshold) are read from
the melt process of the same snowpack, so melt and refreezing stay consistent.
It therefore requires snow_melt_process='melt:degree_day'.
Parameters:
cfr(optional, dimensionless, default: 0.05, [0, 0.1])Refreezing coefficient.
Full name:
snowpack:refreezing_factor.
Interception
GR4J interception (interception:gr4j)
Implements the GR4J zero-capacity interception store (Perrin et al. [2003]), which neutralises precipitation against PET before either reaches a store. With total precipitation \(P\) (rain plus snowmelt) and potential evapotranspiration \(E_P\):
if \(P > E_P\), the amount \(E_P\) is sent to the atmosphere, the net precipitation \(P_n = P - E_P\) is passed on, and the net evaporative demand is \(E_n = 0\);
if \(P \le E_P\), the amount \(P\) is sent to the atmosphere and the net evaporative demand \(E_n = E_P - P\) is published for the downstream production-store ET.
The remaining net precipitation \(P_n\) is then routed to the production
store by an outflow:rest (throughfall) process.
Requires the pet forcing; no calibrated parameters.
Evapotranspiration
Several ET formulations are available. They all convert the potential
evapotranspiration (pet forcing) into actual ET by reducing it as a function
of the storage filling ratio \(S(t)/S_{\max}\); they differ only in the shape
of that reduction. The generic et:linear, et:power_law and
et:exponential reductions can be attached to any storage brick that has a
maximum capacity.
Socont ET (et:socont)
Used in GSM-Socont. Actual ET is proportional to PET, scaled by the filling ratio of the reservoir with a square-root exponent (Schaefli et al. [2005]):
where:
\(E_P(t)\) is the potential evapotranspiration [mm d⁻¹],
\(S(t)\) is the current water content of the reservoir [mm],
\(S_{\max}\) is the maximum storage capacity [mm].
ET decreases as the reservoir empties; it equals PET when the reservoir is full.
No calibrated parameters. Requires the pet forcing.
GR4J ET (et:gr4j)
Used internally by GR4J. Withdraws actual evapotranspiration from the production store to the atmosphere, using the net evaporative demand \(E_n\) published by the interception step (Perrin et al. [2003]):
where \(X_1\) is the production store capacity and \(S\) is the store content after this step’s infiltration. No calibrated parameters beyond \(X_1\).
HBV ET (et:hbv)
Used in HBV-96. Actual ET is withdrawn from the soil moisture storage at the (corrected) potential rate when the soil moisture exceeds a threshold, and decreases linearly below it (Lindström et al. [1997]):
where:
\(E_P(t)\) is the potential evapotranspiration [mm d⁻¹],
\(\mathrm{cevpf}\) is the evapotranspiration correction factor [−],
\(SM(t)\) is the current soil moisture [mm],
\(FC\) is the soil moisture storage capacity [mm],
\(LP\) is the fraction of \(FC\) above which ET reaches the potential rate [−].
Requires the pet forcing.
Parameters:
lp(dimensionless, default: 0.9, [0.3, 1])ET reduction threshold, as a fraction of \(FC\).
Full name:
soil_moisture:lp.
cevpf(optional, dimensionless, default: 1, [0.5, 2])Evapotranspiration correction factor, scaling the potential evaporation. Set it per cover (e.g. higher for forests) to vary the evaporation by land cover.
Full name:
soil_moisture:et_correction_factor.
Linear ET (et:linear)
Generic parameter-free reduction. Actual ET increases linearly with the filling ratio and reaches PET when the reservoir is full:
where:
\(E_P(t)\) is the potential evapotranspiration [mm d⁻¹],
\(S(t)\) is the current water content of the reservoir [mm],
\(S_{\max}\) is the maximum storage capacity [mm].
No calibrated parameters. Requires the pet forcing.
Power-law ET (et:power_law)
Generalization of the Socont ET with a calibratable exponent. Actual ET scales
with the filling ratio raised to the exponent power:
where \(\beta\) is the exponent. It recovers the linear reduction at
\(\beta = 1\), the Socont ET at \(\beta = 0.5\), and gives convex
(\(\beta > 1\)) or concave (\(\beta < 1\)) reductions otherwise.
Requires the pet forcing.
Parameters:
exponent(dimensionless, default: 0.5, [0.2, 3])Exponent applied to the filling ratio. Alias:
et_beta.
Exponential ET (et:exponential)
Concave, asymptotic reduction. Actual ET rises steeply when the store is wet and saturates toward PET as it fills:
where \(\alpha\) controls the curvature: a larger \(\alpha\) makes ET
approach PET faster as the reservoir fills. Requires the pet forcing.
Parameters:
alpha(dimensionless, default: 2, [0.5, 10])Curvature of the reduction curve. Alias:
et_alpha.
Infiltration
Socont infiltration (infiltration:socont)
Used in GSM-Socont for the open (soil) land cover. Water infiltrates into the slow reservoir at a rate that decreases quadratically as the reservoir fills (Schaefli et al. [2005]):
where \(S(t)\) is the current water content and \(S_{\max}\) is the maximum capacity. When the reservoir is empty, all incoming water infiltrates; when full, infiltration is zero and the remainder becomes surface runoff. No calibrated parameters.
GR4J infiltration (infiltration:gr4j)
Computes the portion \(P_s\) of net precipitation \(P_n\) that enters the GR4J production store (Perrin et al. [2003]). In the GR4J model this infiltration term is not applied on its own but as part of the combined production:gr4j step:
where \(X_1\) is the production store capacity and \(S\) is its current water content. The rate increases with \(P_n\) and decreases as the store fills, going to zero when \(S = X_1\). No calibrated parameters.
HBV infiltration / beta function (infiltration:hbv)
Used in HBV-96 on each soil-bearing land cover (e.g. open, forest). The incoming water \(P\) (rain and snowpack outflow) is split between the soil moisture storage and the response routine using the HBV beta function (Lindström et al. [1997]). The infiltrating part is
and the complement, the recharge \(P \cdot (SM/FC)^{\beta}\), is routed to the upper zone by an outflow:rest process. When the soil is dry, all the water infiltrates; when it is at capacity, all the water becomes recharge.
Parameters:
beta(dimensionless, default: 2, [1, 6])Shape coefficient of the beta function.
Full name:
open:beta(<cover>:betain general).
Percolation
Constant percolation (percolation:constant)
Drains water from one reservoir to another at a fixed rate, independent of storage:
where \(r\) is the percolation rate [mm d⁻¹]. Used in
GSM-Socont when soil_storage_nb=2 to connect the first
slow reservoir to the baseflow reservoir, and in HBV-96 (PERC)
to connect the upper zone to the lower zone.
Parameters:
percol(alias forpercolation_rate): constant drainage rate [mm d⁻¹], range [0, 10]. Full name:slow_reservoir:percolation_rate/upper_zone:percolation_rate(aliasperc).
GR4J percolation (percolation:gr4j)
Drains water from the GR4J production store (Perrin et al. [2003]):
where \(S\) is the current production-store water content and \(X_1\) is its capacity. Percolation increases non-linearly with the filling ratio and goes to zero when the store is empty. In the GR4J model it is applied as part of the combined production:gr4j step. No calibrated parameters.
Capillary flux
HBV capillary transport (capillary:hbv)
Used in HBV-96. Returns water from the upper zone to the soil moisture storage, at a rate that increases with the soil moisture deficit (Lindström et al. [1997]):
where \(CFLUX\) is the maximum capillary flux [mm d⁻¹], \(SM\) is the soil moisture [mm] and \(FC\) its capacity [mm]. The flux vanishes when the soil is at capacity. It is disabled by default (\(CFLUX = 0\)).
Parameters:
cflux(optional, mm/d, default: 0, [0, 3])Maximum capillary flux.
Full name:
upper_zone:max_capillary_flux.
Production
GR4J production (production:gr4j)
Used internally by GR4J. Applies the complete production-store update in a single discrete step and routes its output to the unit-hydrograph input (Perrin et al. [2003]). For a start-of-step store level \(S\) and net precipitation \(P_n\):
Infiltration \(P_s\) fills the store (see infiltration:gr4j), raising the level to \(S + P_s\).
Evapotranspiration \(E_s\) is withdrawn separately by the et:gr4j process and sent to the atmosphere.
Percolation \(\mathrm{Perc}\) drains the store (see percolation:gr4j).
The water routed to the unit-hydrograph input is
i.e. the net precipitation that did not infiltrate plus the percolation leaving the store. Because GR4J is solved as a discrete model, the production store is computed directly (no ODE solver), so the per-step update is exact and solver-independent. No calibrated parameters beyond \(X_1\).
Surface runoff / Quick flow
Two formulations control how water leaves the surface runoff storage
in GSM-Socont. The choice is made via the surface_runoff
option at model instantiation.
Socont runoff (runoff:socont)
The default (surface_runoff="socont_runoff"). Models overland flow on an
inclined plane with a linearly varying water depth, following Manning’s equation
(Schaefli et al. [2005]):
where:
\(\beta\) is a runoff coefficient [m4/3 s-1] that absorbs Manning’s roughness and the plane width,
\(J\) is the mean terrain slope [°]; internally converted to m m-1 via \(\tan J\),
\(h\) is the water depth at the downslope end of the plane [m].
Parameters:
beta: runoff coefficient [m4/3 s-1], range [100, 30 000]. Full name:surface_runoff:runoff_coefficient.J: mean terrain slope [°], range [0, 90]. Derived from terrain data; not a calibration parameter. Full name:surface_runoff:slope.
It is the original Socont parameterisation.
Linear storage runoff (outflow:linear)
Alternative (surface_runoff="linear_storage"). Replaces the Manning-based
formulation with a simple linear reservoir:
Parameters:
k_quick: response factor [d-1], range [0.05, 1]. Full name:surface_runoff:response_factor.
Use this formulation when a simpler quick-flow representation is preferred.
Transfer
GR4J routing (routing:gr4j)
Used internally by GR4J. Transforms the production-store output \(P_R\) into discharge through two unit hydrographs, a non-linear routing store, and a groundwater-exchange term (Perrin et al. [2003]).
The inflow is split 90 % / 10 % between two unit hydrographs:
UH1 (S-curve \(S\!H_1\), time base \(X_4\)) feeds the routing store and carries \(0.9\,P_R\);
UH2 (S-curve \(S\!H_2\), time base \(2X_4\)) feeds the direct branch and carries \(0.1\,P_R\).
The S-curves are
with \(S\!H = 0\) below the range and \(S\!H = 1\) above it; the unit-hydrograph ordinates are the successive differences of the S-curve.
The groundwater exchange depends on the routing-store filling ratio:
where \(R\) is the routing-store content. A positive \(X_2\) imports water into the catchment; a negative one exports it (a loss). The routing store is updated with the UH1 output and \(F\), then releases
The direct branch yields \(Q_D = \max(0,\; \text{UH2 output} + F)\), and the total discharge is \(Q = Q_R + Q_D\).
Parameters:
X2(exchange_factor): groundwater exchange coefficient [mm d⁻¹], default 0. Full name:uh_input:exchange_factor.X3(routing_capacity): routing-store capacity [mm], default 90. Full name:uh_input:routing_capacity.X4(uh_base_time): unit-hydrograph time base [d], default 1.7, must be > 0.5. Full name:uh_input:uh_base_time.
GR6J routing (routing:gr6j)
Used internally by GR6J. Extends GR4J routing (Pushpalatha et al. [2011]) with two changes that improve low-flow simulation:
a threshold-based groundwater exchange (the GR5J form):
\[F = X_2 \left(\frac{R}{X_3} - X_5\right)\]where \(R\) is the routing-store content and \(X_5\) is a dimensionless threshold setting the filling ratio at which the exchange changes sign;
an additional exponential routing store (coefficient \(X_6\)) in parallel to the power routing store.
The UH1 output \(Q_9\) is split 60 % to the power store and 40 % to the exponential store; the exchange \(F\) is added to both stores and to the direct branch. The power routing store and the direct branch behave as in GR4J routing, releasing \(Q_R\) and \(Q_D\). The exponential store updates as
and releases (Michel et al. [2003]; airGR formulation), with \(a = R_{\mathrm{exp}}/X_6\) clamped to \([-33, 33]\):
The exponential store may take negative values, which lets it reproduce long, smooth recessions. The total discharge is \(Q = \max(0,\; Q_R + Q_{\mathrm{exp}} + Q_D)\).
Parameters: X2, X3 and X4 as for routing:gr4j (with the threshold exchange replacing the power-law one),
plus
X5(exchange_threshold): groundwater exchange threshold [−], default 0. Full name:uh_input:exchange_threshold.X6(exp_store_coeff): exponential store coefficient [mm], default 4, must be > 0. Full name:uh_input:exp_store_coeff.
HBV routing / MAXBAS (routing:hbv)
Used in HBV-96. Smooths the total runoff (upper and lower zone outflows) with the MAXBAS transformation function, a triangular unit hydrograph of base length \(MAXBAS\) [d] (Lindström et al. [1997]). The weight assigned to day \(j\) after the inflow is the difference of the cumulative triangular distribution
evaluated at the time-step boundaries: \(u_j = C(j) - C(j-1)\). Each inflow is thus spread over \(\lceil MAXBAS \rceil\) days with a symmetric, triangular weighting. With \(MAXBAS = 1\) the inflow passes through within the time step.
Parameters:
maxbas(d, default: 1, [1, 10])Base length of the triangular unit hydrograph.
Full name:
routing:maxbas.
Reservoir outflow
The following outflow mechanisms are used by storage bricks across all models.
- Linear outflow (
outflow:linear) The most common outflow type. Outflow is proportional to the current storage:
\[Q(t) = k \cdot S(t)\]Parameter:
response_factor[d-1]. Used for the slow reservoirs, glacier area storages, the linear quick-flow option, and the HBV-96 lower zone (k_lz).- Non-linear outflow (
runoff:hbv) The HBV-96 upper zone outflow (Lindström et al. [1997]). Outflow increases non-linearly with the current storage:
\[Q_0(t) = k_{uz} \cdot UZ(t)^{\,1+\alpha}\]where \(UZ\) is the upper zone content [mm]. With \(\alpha = 0\) it reduces to a linear reservoir. Parameters:
k_uz(response_factor) [mm-α d-1], range [0.0001, 1], andalpha(aliasalfa) [−], default 1, range [0, 3]. Full names:upper_zone:response_factor,upper_zone:alpha.- Overflow (
outflow:overflow) Releases water instantaneously when storage exceeds its maximum capacity. No parameters. Used to prevent the slow reservoir from overfilling.
- Direct outflow (
outflow:direct) Routes the entire storage content to the target in a single time step. No parameters. Used internally in GSM-Socont to pass glacier meltwater directly to the basin-level lumped storages. Because it withdraws the full content, it cannot run in parallel with any other process drawing from the same storage; configuration validation rejects such a combination (use
outflow:restinstead when several outflows must share a store).- Rest outflow (
outflow:rest) Routes whatever water remains in the store after all the other (sibling) processes have taken their share. It works on both directly-computed and solver-handled bricks: on a direct brick the siblings have already withdrawn their share, so the remaining content is exactly “the rest”; on a solver brick the siblings’ current outflow rates are subtracted so the demands sum to the available content. It must therefore be declared after the other withdrawing processes. No parameters. Used for surface runoff in the Socont open (soil) land cover (water not infiltrated becomes runoff), in GR4J for throughfall (the net precipitation \(P_n\) passed on to the production store), and in HBV-96 for the recharge (the complement of the beta-function infiltration, routed to the upper zone).