GR4JSG¶
At a glance…¶
This node uses the GR4JSG rainfall-runoff model to represent inflows from a catchment where snow matters. GR4JSG is GR4J with a snow store in front of it and, optionally, a glacier. The model takes precipitation, potential evapotranspiration, and daily maximum and minimum temperature, and determines inflows. It has the four GR4J parameters and five snow parameters. A glacier adds five more.
[node.my_snowy_node]
type = gr4jsg
loc = 20, 30
area = 165
rain = data.rain_csv.by_name.value
evap = data.mpot_csv.by_name.value
tmax = data.temp_csv.by_name.tmax
tmin = data.temp_csv.by_name.tmin
params = 1500, 4, 65, 0.38
snow_params = 0.5, 0, 3.38, 1.3, 3
ds_1 = my_other_node
Node properties¶
| Property | Description |
|---|---|
| [node.?] (compulsory) | Start of node declaration. This says we are creating a node, and also defines the name of the node. Example: [node.my_snowy_node] |
| type (compulsory) | The node type, which is “gr4jsg” in this case. type = gr4jsg |
| loc (compulsory) | The location of the node in cartesian coordinates. Example: loc = 20, 30 |
| area (compulsory) | The catchment area [km2]. Example area = 165 |
| rain (compulsory) | Precipitation data [mm]. The model decides each day whether it falls as rain or snow. Example: rain = data.rain_csv.by_name.value |
| evap (compulsory) | Potential evapotranspiration data [mm]. Example: evap = data.mpot_csv.by_name.value |
| tmax (compulsory) | Daily maximum temperature of the catchment [°C]. Example: tmax = data.temp_csv.by_name.tmax |
| tmin (compulsory) | Daily minimum temperature of the catchment [°C]. Example: tmin = data.temp_csv.by_name.tmin |
| params (compulsory) | The four GR4J model parameters: x1, x2, x3, x4. They mean what they mean on a GR4J node. Example: params = 1500, 4, 65, 0.38 |
| snow_params (compulsory) | The five snow parameters, in this order: tfrac, taccum, m_rainfall, base_rainfall, m_nonrainfall. Example: snow_params = 0.5, 0, 3.38, 1.3, 3 |
| ice_params (optional) | Gives the catchment a glacier. The five glacier parameters, in this order: initial_ice, ddfi, tmelt, return_flow, accumulation. Example: ice_params = 100000, 6, 0, 0.5, 0 |
| ds_1 (optional) | Name of the downstream node. This property defines a downstream link. GR4JSG nodes may only have 1 downstream link. Example: ds_1 = my_other_node |
The model parameters — and the rainfall-weighting terms, when rain is a linear combination of stations — can be calibrated with the built-in optimiser: see Optimisable parameters.
Results associated with this node¶
| Result | Description |
|---|---|
| dsflow | Downstream flow [ML] |
| usflow | Upstream flow [ML] |
| ds_1 | Downstream flow on link ds_1 [ML] |
| ds_1_order | Order on link ds_1 [ML] |
| runoff_volume | Catchment runoff volume from the GR4JSG model [ML] |
| runoff_depth | Catchment runoff depth from the GR4JSG model [mm] |
| rain | Input precipitation [mm] |
| evap | Input evapotranspiration [mm] |
| production_store | GR4J production store at the end of the day [mm] |
| routing_store | GR4J routing store at the end of the day [mm] |
| snowfall | Precipitation that fell as snow [mm] |
| snow_melt | Snow melted [mm] |
| snow_store | Snow store at the end of the day [mm] |
| ice_melt | Ice melted from the ice store, before routing [mm]. Zero for a node without a glacier. |
| ice_store | Ice store at the end of the day [mm]. Zero for a node without a glacier. |
| area | Catchment area [km2] — the declared area value, static for the whole run. See Static Node Properties. |
How the node works¶
The GR4JSG node adds inflows from a GR4JSG model to the system. The downstream flow is
dsflow = usflow + runoff_volume
where runoff_volume = runoff_depth × area.
The model is the formulation developed by the NSW Department of Planning, Industry and Environment (the Source plugin GRSG_DPIE). It puts a snow store, and optionally an ice store, in front of an unmodified GR4J model:
- precipitation falls as snow on a cold day and is held in the snow store;
- snow melt joins the rain entering GR4J;
- ice melt, where there is a glacier, bypasses GR4J and goes to runoff through its own unit hydrograph.
A catchment that is never cold enough for snow gives exactly the results of a GR4J node with the same params.
Snow parameters¶
| Parameter | Description | Units | Valid range | Default |
|---|---|---|---|---|
| tfrac | Weight on tmax in the representative temperature. 0 uses tmin, 1 uses tmax, 0.5 uses their mean |
– | 0 – 1 | 0.5 |
| taccum | Precipitation falls as snow when the representative temperature is below this | °C | any | 0 |
| m_rainfall | Melt rate on a day with rain | mm/°C/day | ≥ 0 | 3.38 |
| base_rainfall | Base melt on a day with rain | mm/day | ≥ 0 | 1.3 |
| m_nonrainfall | Melt rate on a day without rain | mm/°C/day | ≥ 0 | 3 |
Glacier parameters¶
| Parameter | Description | Units | Valid range | Default |
|---|---|---|---|---|
| initial_ice | Ice store at the start of the run | mm | ≥ 0 | – |
| ddfi | Ice degree-day factor | mm/°C/day | ≥ 0 | 6 |
| tmelt | Ice melts when the representative temperature is above this | °C | any | 0 |
| return_flow | Time base of the ice-melt unit hydrograph. At 0.5 or less, ice melt reaches the stream the day it melts | days | > 0 | 0.5 |
| accumulation | Constant gain to the ice store, every day | mm/day | ≥ 0 | 0 |
The node checks the parameters once, before every run. A set outside the valid ranges above stops the run with a message naming the node and the offending value. Parameters are never clamped: what you write is what runs.
Timestep¶
P is precipitation, and tmax and tmin are the day's temperatures. The representative temperature is
Rain or snow. The whole day's precipitation is one or the other.
if T < taccum: snowfall = P, rain = 0, snow_store = snow_store + P
otherwise: snowfall = 0, rain = P
Snow melt. While there is snow, it melts at a potential rate that depends on whether it rained. A day with rain uses the equation of USACE (1960); a day without uses that of Quick and Pipes (1976).
with rain: potential = max(T, 0) · (m_rainfall + 0.0126 · rain) + base_rainfall
without rain: beta = min(max(tmin, 0) / 4.4, 1.5)
potential = m_nonrainfall · (max(T, 0) + beta · ((tmax − tmin) / 8 + tmin))
snow_melt = min(potential, snow_store)
snow_store = snow_store − snow_melt
Rain and snow melt together are the input to GR4J, with potential evapotranspiration evap:
Glacier. A node with ice_params also has an ice store, which starts at initial_ice. Ice melts for the part of the day not spent melting snow:
snow_fraction = snow_melt / potential (0 when potential is 0)
if ice_store > 0 and T > tmelt:
ice_melt = min((1 − snow_fraction) · ddfi · (T − tmelt), ice_store)
ice_store = ice_store − ice_melt
Ice melt is routed through a unit hydrograph of the same shape as GR4J's second one, with return_flow in place of x4, and added to the runoff:
At the start of each day accumulation is added to the ice store while there is ice, and to the snow store once the ice is gone.
All stores except the ice store start empty, so allow a warm-up period.
What a glacier is in this model¶
Nothing in the model makes ice. Snow never turns into ice, so a glacier exists only where initial_ice puts one, and accumulation is the only thing that feeds it. Three things follow.
- The glacier can melt out. At the default
ddfia glacier loses 6 mm for every degree-day abovetmelt, which is metres a year in a mild climate. When the ice store reaches zero it stays at zero, and from then on the node behaves as a node without a glacier. Recordice_storeand check that this is what you intend. initial_icematters mainly by being large enough. While there is ice, the melt rate does not depend on how much.accumulationis water from outside the catchment. It stands for snow arriving from slopes above, by avalanche or wind. It is not taken fromrain, so it adds to the catchment's water balance.
Elevation and lapse rates¶
tmax, tmin, rain and evap describe the catchment, not the climate station. Where the catchment is higher than the station, write the adjustment in the expression:
[const]
const.t_lapse = -0.0065 # °C per m
const.dz = 800 # m, catchment above the station
[node.my_snowy_node]
type = gr4jsg
tmax = data.temp_csv.by_name.tmax + const.t_lapse * const.dz
tmin = data.temp_csv.by_name.tmin + const.t_lapse * const.dz
evap = max(0, data.mpot_csv.by_name.value - 0.0005 * const.dz)
A lapse rate written as a constant can be calibrated as const.t_lapse. Modellers who know the Source plugin will find that its elevation, lapse-rate and rainfall-scaling parameters are not node parameters here; this is where they go.
Timestep length¶
This is a daily model. The melt rates are per day and the melt equations carry daily constants, so the node is intended for models running on a daily timestep. It does not adjust the constants for another timestep.
References¶
Perrin, C., C. Michel, et al. (2003). "Improvement of a parsimonious model for streamflow simulation." Journal of Hydrology 279(1-4): 275-289
Quick, M.C. and A. Pipes (1976). "A combined snowmelt and rainfall runoff model." Canadian Journal of Civil Engineering 3(3): 449-460
U.S. Army Corps of Engineers (1960). Runoff from Snowmelt. Engineering Manual 1110-2-1406, Washington, D.C.