Title: | Lumped/Semi-Distributed Hydrological Model for Education Purposes |
---|---|
Description: | The model, developed at the Vienna University of Technology, is a lumped conceptual rainfall-runoff model, following the structure of the HBV model. The model can also be run in a semi-distributed fashion and with dual representation of soil layer. The model runs on a daily or shorter time step and consists of a snow routine, a soil moisture routine and a flow routing routine. See Parajka, J., R. Merz, G. Bloeschl (2007) <DOI:10.1002/hyp.6253> Uncertainty and multiple objective calibration in regional water balance modelling: case study in 320 Austrian catchments, Hydrological Processes, 21, 435-446. |
Authors: | Alberto Viglione [aut, cre], Juraj Parajka [aut] |
Maintainer: | Alberto Viglione <[email protected]> |
License: | GPL (>= 2) |
Version: | 1.1-1 |
Built: | 2024-11-19 06:42:58 UTC |
Source: | CRAN |
Data for examples in the package
data(example_TUWmodel)
data(example_TUWmodel)
The data are time series for the river Vils at Vils (Laende):
Q_Vils
vector of observed daily discharges [mm/day];
P_Vils
matrix of observed daily precipitation [mm/day] for 6 zones;
T_Vils
matrix of observed daily temperatures [degC] for 6 zones;
PET_Vils
matrix of potential evapotranspiration [mm/day] for 6 zones;
SWE_Vils
matrix of observed snow water equivalent [mm] for 6 zones;
areas_Vils
areas of the 6 zones.
data(example_TUWmodel) ls() t <- as.Date(rownames(P_Vils)) plot(t, apply(P_Vils, 1, weighted.mean, w=areas_Vils), type="S", xlab="", ylab="Precipitation [mm/day]") plot(t, apply(PET_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Potential evapotranspiration [mm/day]") plot(t, T_Vils[,1], type="l", xlab="", ylab="Temperature [degC]") lines(t, T_Vils[,6], col=3) plot(t, SWE_Vils[,6], col=3, type="l", xlab="", ylab="Snow water equivalent [mm]") lines(t, SWE_Vils[,1], col=1) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Runoff [mm/day]")
data(example_TUWmodel) ls() t <- as.Date(rownames(P_Vils)) plot(t, apply(P_Vils, 1, weighted.mean, w=areas_Vils), type="S", xlab="", ylab="Precipitation [mm/day]") plot(t, apply(PET_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Potential evapotranspiration [mm/day]") plot(t, T_Vils[,1], type="l", xlab="", ylab="Temperature [degC]") lines(t, T_Vils[,6], col=3) plot(t, SWE_Vils[,6], col=3, type="l", xlab="", ylab="Snow water equivalent [mm]") lines(t, SWE_Vils[,1], col=1) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Runoff [mm/day]")
TUWmodel
is a lumped conceptual rainfall-runoff model, following the structure of the HBV model.
The model runs on a daily or shorter timestep and consists of a snow routine, a soil moisture routine and a flow routing routine.
See Parajka, J., R. Merz, G. Bloeschl (2007) Uncertainty and multiple objective calibration in regional water balance modelling: case study in 320 Austrian catchments, Hydrological Processes, 21, 435-446.
TUWmodel (prec, airt, ep, area=1, param=c(1.2,1.2,2,-2,0,0.9,100,3.3,0.5,9,105,50,2,10,26.5), incon=c(50,0,2.5,2.5), itsteps=NULL)
TUWmodel (prec, airt, ep, area=1, param=c(1.2,1.2,2,-2,0,0.9,100,3.3,0.5,9,105,50,2,10,26.5), incon=c(50,0,2.5,2.5), itsteps=NULL)
prec |
vector/matrix of precipitation input [mm/timestep] ( |
airt |
vector/matrix of air temperatures [degC] |
ep |
vector/matrix of potential evapotranspiration [mm/timestep] |
area |
if more zones, vector of the percentage of area for each zone (or proportional to it, i.e., if the sum is different from 1, it will be rescaled to be 1) |
param |
vector/matrix of parameters (
|
incon |
vector/matrix of initial conditions for the model ( |
itsteps |
length of the output (if NULL all the time series are used) |
More details about the model structure are given in the Appendix of
Parajka, J., R. Merz, G. Bloeschl (2007) Uncertainty and multiple objective calibration in regional water balance modelling: case study in 320 Austrian catchments, Hydrological Processes, 21, 435-446, doi:10.1002/hyp.6253.
An example of using TUWmodel
, including R scripts for automatic calibration, can be found in the Supplement of
Ceola, S., et al. (2015) Virtual laboratories: new opportunities for collaborative water science, Hydrology and Earth System Sciences, 19(4), 2101-2117, doi:10.5194/hess-19-2101-2015.
TUWmodel
gives a vector of simulated runoff as q
[mm/timestep], and the following vector/matrices:
qzones
simulated runoff for each zone [mm/timestep];
q0
surface runoff [mm/timestep];
q1
subsurface runoff [mm/timestep];
q2
baseflow [mm/timestep];
rain
liquid precipitation [mm/timestep];
snow
solid precipitation [mm/timestep];
melt
snowmelt [mm/timestep];
moist
soil moisture [mm];
swe
snow water equivalent [mm];
eta
actual evapo-transpiration [mm/timestep];
suz
upper storage zone [mm];
slz
lower storage zone [mm];
## Load the data data(example_TUWmodel) ## Simulate runoff and plot observed vs simulated series ## Lumped case (weighted means of the inputs) simLump <- TUWmodel(prec=apply(P_Vils, 1, weighted.mean, w=areas_Vils), airt=apply(T_Vils, 1, weighted.mean, w=areas_Vils), ep=apply(PET_Vils, 1, weighted.mean, w=areas_Vils), area=sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simLump$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), simLump$swe, col=2) ## Distribute input case (6 zones) simDist <- TUWmodel(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), apply(simDist$swe, 1, weighted.mean, w=areas_Vils), col=2) ## Distributed input and parameters case parametri <- matrix(rep(c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25), 6), ncol=6) parametri[2,] <- c(1.4, 1.7, 1.9, 2.2, 2.4, 3.0) simDist2 <- TUWmodel(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=parametri) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist2$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n")
## Load the data data(example_TUWmodel) ## Simulate runoff and plot observed vs simulated series ## Lumped case (weighted means of the inputs) simLump <- TUWmodel(prec=apply(P_Vils, 1, weighted.mean, w=areas_Vils), airt=apply(T_Vils, 1, weighted.mean, w=areas_Vils), ep=apply(PET_Vils, 1, weighted.mean, w=areas_Vils), area=sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simLump$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), simLump$swe, col=2) ## Distribute input case (6 zones) simDist <- TUWmodel(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), apply(simDist$swe, 1, weighted.mean, w=areas_Vils), col=2) ## Distributed input and parameters case parametri <- matrix(rep(c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25), 6), ncol=6) parametri[2,] <- c(1.4, 1.7, 1.9, 2.2, 2.4, 3.0) simDist2 <- TUWmodel(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=parametri) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist2$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n")
TUWmodel_dual
is a lumped conceptual rainfall-runoff model with dual representation of soil layer developed at the TUW,
following the structure of the HBV model. The dual soil layer consists of a skin soil layer which represents the layer observed
by satellite soil moisture sensors and a root zone soil storage which is identical with the original TUWmodel concept.
The model runs on a daily or shorter timestep and has similar structure as the original TUWmodel function.
More information about the dual layer concept and its implementation can be found in Parajka, J., V. Naeimi, G. Bloeschl
and J. Komma (2009) Matching ERS scatterometer based soil moisture patterns with simulations of a conceptual dual layer
hydrologic model over Austria, Hydrol. Earth Syst. Sci., 13, 259-271.
TUWmodel_dual (prec, airt, ep, area=1, param=c(1.2,1.2,2,-2,0,0.9,100,3.3,0.5,9,105,50,2,10,26.5,1,0.8,10), incon=c(50,0,2.5,2.5,0), itsteps=NULL)
TUWmodel_dual (prec, airt, ep, area=1, param=c(1.2,1.2,2,-2,0,0.9,100,3.3,0.5,9,105,50,2,10,26.5,1,0.8,10), incon=c(50,0,2.5,2.5,0), itsteps=NULL)
prec |
vector/matrix of precipitation input [mm/timestep] ( |
airt |
vector/matrix of air temperatures [degC] |
ep |
vector/matrix of potential evapotranspiration [mm/timestep] |
area |
if more zones, vector of the percentage of area for each zone (or proportional to it, i.e., if the sum is different from 1, it will be rescaled to be 1) |
param |
vector/matrix of parameters (
|
incon |
vector/matrix of initial conditions for the model ( |
itsteps |
length of the output (if NULL all the time series are used) |
More details about the model structure are given in
Parajka, J., V. Naeimi, G. Bloeschl and J. Komma (2009) Matching ERS scatterometer based soil moisture patterns with simulations of a conceptual dual layer hydrologic model over Austria, Hydrol. Earth Syst. Sci., 13, 259-271.
TUWmodel_dual
gives a vector of simulated runoff as q
[mm/timestep], and the following vector/matrices:
qzones
simulated runoff for each zone [mm/timestep];
q0
surface runoff [mm/timestep];
q1
subsurface runoff [mm/timestep];
q2
baseflow [mm/timestep];
rain
liquid precipitation [mm/timestep];
snow
solid precipitation [mm/timestep];
melt
snowmelt [mm/timestep];
moist
soil moisture [mm];
swe
snow water equivalent [mm];
eta
actual evapo-transpiration [mm/timestep];
suz
upper storage zone [mm];
slz
lower storage zone [mm];
ssl
top soil skin layer storage [mm];
## Load the data data(example_TUWmodel) ## Simulate runoff and plot observed vs simulated series ## Lumped case (weighted means of the inputs) simLump <- TUWmodel_dual(prec=apply(P_Vils, 1, weighted.mean, w=areas_Vils), airt=apply(T_Vils, 1, weighted.mean, w=areas_Vils), ep=apply(PET_Vils, 1, weighted.mean, w=areas_Vils), area=sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25,1,0.8,10)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simLump$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), simLump$swe, col=2) ## Distribute input case (6 zones) simDist <- TUWmodel_dual(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25,1,0.8,10)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), apply(simDist$swe, 1, weighted.mean, w=areas_Vils), col=2) ## Distributed input and parameters case parametri <- matrix(rep(c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25,1,0.8,10), 6), ncol=6) parametri[2,] <- c(1.4, 1.7, 1.9, 2.2, 2.4, 3.0) simDist2 <- TUWmodel_dual(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=parametri) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist2$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n")
## Load the data data(example_TUWmodel) ## Simulate runoff and plot observed vs simulated series ## Lumped case (weighted means of the inputs) simLump <- TUWmodel_dual(prec=apply(P_Vils, 1, weighted.mean, w=areas_Vils), airt=apply(T_Vils, 1, weighted.mean, w=areas_Vils), ep=apply(PET_Vils, 1, weighted.mean, w=areas_Vils), area=sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25,1,0.8,10)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simLump$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), simLump$swe, col=2) ## Distribute input case (6 zones) simDist <- TUWmodel_dual(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25,1,0.8,10)) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n") plot(as.Date(rownames(SWE_Vils)), apply(SWE_Vils, 1, weighted.mean, w=areas_Vils), type="l", xlab="", ylab="Snow Water Equivalent [mm]") lines(as.Date(rownames(T_Vils)), apply(simDist$swe, 1, weighted.mean, w=areas_Vils), col=2) ## Distributed input and parameters case parametri <- matrix(rep(c(1.02,1.70,2,0,-0.336, 0.934,121,2.52, 0.473,9.06,142, 50.1,2.38,10,25,1,0.8,10), 6), ncol=6) parametri[2,] <- c(1.4, 1.7, 1.9, 2.2, 2.4, 3.0) simDist2 <- TUWmodel_dual(prec=P_Vils, airt=T_Vils, ep=PET_Vils, area=areas_Vils/sum(areas_Vils), param=parametri) plot(as.Date(names(Q_Vils)), Q_Vils, type="l", xlab="", ylab="Discharges [mm/day]") lines(as.Date(rownames(T_Vils)), simDist2$q, col=2) legend("topleft", legend=c("Observations","Simulations"), col=c(1,2), lty=1, bty="n")