Nothing
## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## -----------------------------------------------------------------------------
library(HBV.IANIGLA)
data("lumped_hbv")
head(lumped_hbv)
summary(lumped_hbv)
## -----------------------------------------------------------------------------
# we first consider the SnowGlacier module to take into account
# precipitation partioning and the snow accumulation/melting.
snow_module <-
SnowGlacier_HBV(model = 1,
inputData = as.matrix( lumped_hbv[ , c('T(ºC)', 'P(mm/d)')] ),
initCond = c(20, 2),
param = c(1.20, 1.00, 0.00, 2.5) )
# is always advisable to take a look at the output (unless until you get familiarised
# with the model)
head(snow_module)
# now see the function documentation...you should be able to relate the model option
# with the matrix output!
## -----------------------------------------------------------------------------
soil_module <-
Soil_HBV(model = 1,
inputData = cbind(snow_module[ , "Total"], lumped_hbv$`PET(mm/d)`),
initCond = c(100, 1),
param = c(200, 0.8, 1.15) )
head(soil_module)
## -----------------------------------------------------------------------------
routing_module <-
Routing_HBV(model = 1,
lake = F,
inputData = as.matrix(soil_module[ , "Rech"]),
initCond = c(0, 0, 0),
param = c(0.9, 0.01, 0.001, 0.5, 0.01) )
head(routing_module)
## ----fig.width = 7------------------------------------------------------------
tf_module <-
round(
UH(model = 1,
Qg = routing_module[ , "Qg"],
param = c(1.5) ),
2)
# let's plot the "true" and simulated hydrographs
plot( x = lumped_hbv[ , "Date"],
y = tf_module,
type = "l", col = "dodgerblue",
xlab = "Date", ylab = "q(mm/d)")
lines(x = lumped_hbv[ , "Date"],
y = lumped_hbv[ , "qout(mm/d)"],
col = "red")
# you can get a goodness of fit measurement by,
cor(x = lumped_hbv[ , "qout(mm/d)"], y = tf_module)
# hint: to use hydrological goodness of fit functions (e.g.: NSE - Nash-Sutcliffe
# Efficiency) you can install the hydroGOF package.
## ----definition, echo = TRUE--------------------------------------------------
## brief arguments desription
# basin: data frame with the same structure of the data("lumped_hbv") (colnames included).
# param_snow: numeric vector with snow module parameters.
# param_soil: numeric vector with soil moisture parameters.
# param_routing: numeric vector with the routing parameters.
# param_tf: numeric vector with the transfer function parameter.
# init_snow: numeric value with initial snow water equivalent. Default value being 20 mm.
# init_soil: numeric value with initial soil moisture content. Default value being 100 mm.
# init_routing: numeric vector with bucket water initial values. Default values are 0 mm.
## output
# simulated streamflow series.
hbv_lumped <- function(basin,
param_snow,
param_soil,
param_routing,
param_tf,
init_snow = 20,
init_soil = 100,
init_routing = c(0, 0, 0)
){
snow_module <-
SnowGlacier_HBV(model = 1,
inputData = as.matrix( basin[ , c('T(ºC)', 'P(mm/d)')] ),
initCond = c(init_snow, 2),
param = param_snow )
soil_module <-
Soil_HBV(model = 1,
inputData = cbind(snow_module[ , "Total"], basin$`PET(mm/d)`),
initCond = c(init_soil, 1),
param = param_soil )
routing_module <-
Routing_HBV(model = 1,
lake = F,
inputData = as.matrix(soil_module[ , "Rech"]),
initCond = init_routing,
param = param_routing )
tf_module <-
UH(model = 1,
Qg = routing_module[ , "Qg"],
param = param_tf )
out <- round(tf_module, 2)
return(out)
}
## ----fig.width = 7------------------------------------------------------------
# one of the ideas behind a function is to succinctly express
# operations that will look complicated or too large. In our
# case, by modifying (in the same line of arguments) just some
# parameters we obtain the basin discharge
streamflow <-
hbv_lumped(basin = lumped_hbv,
param_snow = c(1.20, 1.00, 0.00, 2.5),
param_soil = c(200, 0.8, 1.15),
param_routing = c(0.2, 0.01, 0.005, 0.75, 0.15),
param_tf = c(1.5))
plot( x = lumped_hbv[ , "Date"],
y = streamflow,
type = "l", col = "dodgerblue",
xlab = "Date", ylab = "q(mm/d)")
lines(x = lumped_hbv[ , "Date"],
y = lumped_hbv[ , "qout(mm/d)"],
col = "red")
cor(x = streamflow, y = lumped_hbv[ , "qout(mm/d)"] )
## -----------------------------------------------------------------------------
# first we are going to generate a vector with the possible values
# of our parameter. Let's say that we want to evaluate the effect of
# changing the K0 value.
target_param <- seq(from = 0.1, to = 0.9, by = 0.01)
# now we get the number fo required iterations and we create an empty
# vector to store the evaluation function results
n_it <- length(target_param)
response <- c()
# finally run our function n_it times and we plot the results
for(i in 1:n_it){
streamflow <-
hbv_lumped(basin = lumped_hbv,
param_snow = c(1.20, 1.00, 0.00, 2.5),
param_soil = c(200, 0.8, 1.15),
param_routing = c(target_param[i], 0.05, 0.002, 0.9, 0.1),
param_tf = c(1.5))
response[i] <- cor(x = streamflow, y = lumped_hbv[ , "qout(mm/d)"] )
}
plot(x = target_param, y = response, type = "p",
ylim = c(0, 1), pch = 20, cex = 0.5)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.