Modelo lluvia escorrentía semidistribuido, que representa una versión simplificada de la variabilidad espacial de la respuesta hidrológica, en donde la topográfica se considera espacialmente. Este modelo usa un número reducido de parámetros, pero mantiene su interpretación física. Tiene una estructura simplificada, que reduce los requisitos de datos. Así, este modelo integra la capacidad de simular la distribución espacial de sus resultados en cualquier paso de tiempo, con una buena eficiencia computacional (Jeziorska & Niedzielski, 2018).
Los factores predominantes que influyen en la generación de caudales en el modelo son la topografía de la cuenca y las características del suelo (Franchini et al. 1996). La topografía se expresa cuantitativamente mediante el índice topográfico (también conocido como índice de humedad topográfica, TWI). Su valor se calcula a partir de la topografía; donde αi es el área que contribuye a la pendiente ascendente de la enésima cuenca y tan βi es la pendiente de la superficie del suelo de esta cuenca (Jeziorska & Niedzielski, 2018).
El área contribuyente aguas arriba (Figura 1) representa el área que potencialmente puede producir escorrentía hacia la salida de la cuenca. En la representación ráster del terreno, debe ser reemplazada por el área de drenaje pendiente arriba por unidad de longitud de contorno, que es equivalente al tamaño de celda de la cuadrícula DEM. Las áreas asociadas con valores altos de TWI tienden a saturarse primero y, por lo tanto, constituirán áreas contribuyentes potenciales del subsuelo o la superficie (Jeziorska & Niedzielski, 2018).
TWI se refiere al concepto de área de fuente variable de generación de escorrentía y se basa en las siguientes tres suposiciones simplificadas con respecto al sistema hidrológico:
la dinámica de la zona saturada se puede aproximar mediante sucesivas representaciones de estado estacionario.
el gradiente hidráulico de la zona saturada se puede aproximar por la pendiente topográfica de la superficie local (tan βi), y, por lo tanto, el nivel freático y el flujo saturado son paralelos a la pendiente de la superficie local.
la distribución de la transmisividad pendiente abajo con la profundidad es una función exponencial del déficit de almacenamiento o la profundidad del nivel freático.
Figura 1: Concepto básico del esquema TOPMODEL (Jeziorska & Niedzielski, 2018).
Antes de iniciar, se realiza la limpieza del espacio de trabajo.
rm(list=ls(all=TRUE))
Se direcciona a la carpeta de trabajo, en donde se encuentra la información a usar y en donde se guardará la información generada.
setwd("D:/Maestria Hidrosistemas/3 Semestre/Modelacion de Procesos Hidrologicos/Parcial")
Para poder realizar este modelo se deben descargar e instalar las siguientes librerías:
Estas deben ser instaladas usando el comando en la consola de install.packages(“Nombre de la librería”) Y deben ser llamadas en el código:
library("topmodel")
library("Hmisc")
Topmodel requiere dos tipos de información topográfica, la distribución del índice topográfico (topidx), y el tiempo de concentración (delay). Al ser un modelo semidistribuido, no usa estos mapas directamente, si no usa los histogramas.
Para realizar el cálculo del índice topográfico, debe ingresarse el DEM de forma matricial, y se debe tener en cuenta la resolución del DEM, en este caso es 25.data(huagrahuma.dem)
DEM <- sinkfill(huagrahuma.dem, degree=0.1, res = 25)
## number of iterations = 79
## number of sinks left = 0
topindex <- topidx(DEM, resolution=25)
topindex = as.data.frame(topindex)
Para este ejemplo el tiempo de concentración, fue generado con la función flowlength.
n <- 7 # un numero alto de clases daría un histograma suavizado.
delay <- flowlength(huagrahuma.dem)*25
delay <- make.classes(delay, n)
delay <- delay[n:1,]
delay[,2] <- c(0, cumsum(delay[1:(n-1),2]))
Parametro | Definición | Unidades |
---|---|---|
qs0 | Flujo subsuperficial inicial por unidad de área | (m) |
lnTe | Log del promedio de área del T0 | (m2/h) |
m | Controla la tasa de disminución de la transmisividad | |
en el perfil del suelo | ||
Sr0 | Déficit de almacenamiento inicial en la zona radicular | (m) |
Sr max | Déficit de almacenamiento máximo en zona radicular | (m) |
td | Tiempo de retardo de la zona no saturada por unidad de | (h/m) |
déficit de almacenamiento | ||
vr | Caudal del canal dentro de la cuenca | (m/h) |
k0 | Conductividad hidráulica superficial | (m/h) |
CD | Acondicionamiento Capilar | |
dt | Delta de tiempo | (h) |
data(huagrahuma)
attach(huagrahuma)
str(huagrahuma)
## List of 6
## $ ETp : num [1:10000] 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.4e-06 4.4e-06 ...
## $ Qobs : num [1:10000] 3.34e-05 NA 3.45e-05 NA 3.34e-05 ...
## $ delay :'data.frame': 4 obs. of 2 variables:
## ..$ delay1: num [1:4] 0 1000 3000 5000
## ..$ delay2: num [1:4] 0 0.1 0.5 1
## $ parameters: Named num [1:11] 3.17e-05 -5.99e-01 2.13e-02 2.63e-03 8.68e-01 ...
## ..- attr(*, "names")= chr [1:11] "qs0" "lnTe" "m" "Sr0" ...
## $ rain : num [1:10000] 0 0 0 0 0 0 0 0 0 0 ...
## $ topidx :'data.frame': 16 obs. of 2 variables:
## ..$ breaks: num [1:16] 16.2 15.3 14.3 13.4 12.4 ...
## ..$ area : num [1:16] 0.000619 0.000464 0.001857 0.004488 0.003869 ...
head(topidx)
## breaks area
## 1 16.21528 0.0006190034
## 2 15.27187 0.0004642526
## 3 14.32846 0.0018570102
## 4 13.38504 0.0044877747
## 5 12.44163 0.0038687713
## 6 11.49822 0.0095945528
head(parameters)
## qs0 lnTe m Sr0 Srmax
## 3.167914e-05 -5.990615e-01 2.129723e-02 2.626373e-03 8.683245e-01
## td
## 2.850000e+00
head(rain)
## [1] 0 0 0 0 0 0
head(ETp)
## [1] 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.5e-06 4.5e-06
plot(rain, type="h")
Qsim <- topmodel(parameters, topidx, delay, rain, ETp)
plot(Qsim, type="l", col="red")
points(Qobs)
Se evalúa el modelo con una métrica de desempeño (Nash - Sutcliffe).
NSeff(Qobs, Qsim)
## [1] 0.6046691
parameters["m"] <- runif(1, min = 0, max = 0.1)
parameters["m"]
## m
## 0.08497109
Qsim <- topmodel(parameters, topidx, delay, rain, ETp)
NSeff(Qobs, Qsim)
## [1] 0.1620278
plot(Qsim, type="l", col="red")
points(Qobs)
Ahora los valores de todos los parámetros se van variar 100 veces, de manera aleatoria.
n <- 100
qs0 <- runif(n, min = 0.0001, max = 0.00025)
lnTe <- runif(n, min = -2, max = 3)
m <- runif(n, min = 0, max = 0.1)
Sr0 <- runif(n, min = 0, max = 0.2)
Srmax <- runif(n, min = 0, max = 0.1)
td <- runif(n, min = 0, max = 3)
vch <- runif(n, min = 100, max = 2500)
vr <- runif(n, min = 100, max = 2500)
k0 <- runif(n, min = 0, max = 10)
CD <- runif(n, min = 0, max = 5)
dt <- 0.25
parameters <- cbind(qs0,lnTe,m,Sr0,Srmax,td,vch,vr,k0,CD,dt)
NS <- topmodel(parameters, topidx, delay, rain, ETp, Qobs = Qobs)
max(NS)
## [1] 0.8493528
plot(lnTe, NS, ylim = c(0,1))
Ahora se elegirá el umbral de comportamiento y se eliminará el set de parámetros “malo.”
parameters <- parameters[NS > 0.3,]
NS <- NS[NS > 0.3]
Qsim <- topmodel(parameters,topidx,delay,rain,ETp)
hist(Qsim[1,], xlab= "Qsim")
weights <- NS - 0.3
weights <- weights / sum(weights)
limits <- apply(Qsim, 1, "wtd.quantile", weights = weights,
probs = c(0.05,0.95), normwt=T)
plot(limits[2,], type="l", ylab='Limits')
points(limits[1,], type="l")
points(Qobs, col="red")
outside <- (Qobs > limits[2,]) | (Qobs < limits[1,])
summary(outside)
## Mode FALSE TRUE NA's
## logical 5007 1765 3228
mean(limits[2,] - limits[1,]) / mean(Qobs, na.rm=T)
## [1] 0.7413749