Commit 35825f1b authored by Dorchies David's avatar Dorchies David
Browse files

fix(Calibration): error in X4 transformation for calibration with ungauged nodes

Refs #42
2 merge requests!93Draft: Version 0.7.0,!40Resolve "Feature request: use of non gauged stations in the network"
Pipeline #38039 passed with stage
in 6 minutes and 9 seconds
Showing with 32 additions and 9 deletions
+32 -9
...@@ -45,7 +45,6 @@ Calibration.GRiwrmInputsModel <- function(InputsModel, ...@@ -45,7 +45,6 @@ Calibration.GRiwrmInputsModel <- function(InputsModel,
} }
hasUngauged <- IM$hasUngauged hasUngauged <- IM$hasUngauged
if (hasUngauged) { if (hasUngauged) {
Sdown <- IM$BasinAreas[length(IM$BasinAreas)]
l <- updateParameters4Ungauged(id, l <- updateParameters4Ungauged(id,
InputsModel, InputsModel,
RunOptions, RunOptions,
...@@ -70,18 +69,28 @@ Calibration.GRiwrmInputsModel <- function(InputsModel, ...@@ -70,18 +69,28 @@ Calibration.GRiwrmInputsModel <- function(InputsModel,
) )
if (hasUngauged) { if (hasUngauged) {
# Add OutputsCalib for ungauged nodes # Select nodes with model in the sub-network
g <- attr(InputsModel, "GRiwrm") g <- attr(IM, "GRiwrm")
ungaugedIds <- g$id[g$gauged == id & g$id != id & !is.na(g$model)] Ids <- g$id[g$gauged == id & !is.na(g$model)]
for (uId in ungaugedIds) { # Extract the X4 calibrated for the whole intermediate basin
PS <- attr(IM[[id]], "ParamSettings")
if(PS$hasX4) {
X4 <- OutputsCalib[[id]]$ParamFinalR[PS$iX4] # Global parameter
subBasinAreas <- calcSubBasinAreas(IM)
}
for (uId in Ids) {
# Add OutputsCalib for ungauged nodes
OutputsCalib[[uId]] <- OutputsCalib[[id]] OutputsCalib[[uId]] <- OutputsCalib[[id]]
# Copy parameters and transform X4 relatively to the sub-basin area
PS <- attr(IM[[uId]], "ParamSettings") PS <- attr(IM[[uId]], "ParamSettings")
OutputsCalib[[uId]]$ParamFinalR <- OutputsCalib[[uId]]$ParamFinalR[PS$Indexes] OutputsCalib[[uId]]$ParamFinalR <-
OutputsCalib[[uId]]$ParamFinalR[PS$Indexes]
if(PS$hasX4) { if(PS$hasX4) {
OutputsCalib[[uId]]$ParamFinalR[PS$iX4] <- OutputsCalib[[uId]]$ParamFinalR[PS$iX4] <-
OutputsCalib[[uId]]$ParamFinalR[PS$iX4] * (sum(IM[[uId]]$BasinAreas) / Sdown) ^ 0.3 X4 * (subBasinAreas[uId] / sum(subBasinAreas)) ^ 0.3
} }
} }
IM <- IM[[id]]
} }
if(useUpstreamQsim) { if(useUpstreamQsim) {
...@@ -203,6 +212,20 @@ updateParameters4Ungauged <- function(GaugedId, ...@@ -203,6 +212,20 @@ updateParameters4Ungauged <- function(GaugedId,
} }
#' Compute the area of downstream sub-basins
#'
#' @param IM *GRiwrmInputsModel* object (See [CreateInputsModel.GRiwrm])
#'
#' @return [numeric] named [vector] of the area of the downstream sub-basins
#' @noRd
calcSubBasinAreas <- function(IM) {
unlist(
sapply(IM, function(x) {
if(is.list(x)) as.numeric(x$BasinAreas[length(x$BasinAreas)])})
)
}
#' RunModel for a sub-network of ungauged nodes #' RunModel for a sub-network of ungauged nodes
#' #'
#' The function simulates a network with one set of parameters #' The function simulates a network with one set of parameters
...@@ -230,13 +253,13 @@ updateParameters4Ungauged <- function(GaugedId, ...@@ -230,13 +253,13 @@ updateParameters4Ungauged <- function(GaugedId,
#' @noRd #' @noRd
RunModel_Ungauged <- function(InputsModel, RunOptions, Param) { RunModel_Ungauged <- function(InputsModel, RunOptions, Param) {
InputsModel$FUN_MOD <- NULL InputsModel$FUN_MOD <- NULL
SBV <- sum(InputsModel[[length(InputsModel)]]$BasinAreas) SBVI <- sum(calcSubBasinAreas(InputsModel))
# Compute Param for each sub-basin # Compute Param for each sub-basin
P <- lapply(InputsModel, function(IM) { P <- lapply(InputsModel, function(IM) {
PS <- attr(IM, "ParamSettings") PS <- attr(IM, "ParamSettings")
p <- Param[PS$Indexes] p <- Param[PS$Indexes]
if(PS$hasX4) { if(PS$hasX4) {
p[PS$iX4] <- Param[PS$iX4] * (IM$BasinAreas[length(IM$BasinAreas)] / SBV) ^ 0.3 p[PS$iX4] <- Param[PS$iX4] * (IM$BasinAreas[length(IM$BasinAreas)] / SBVI) ^ 0.3
} }
return(p) return(p)
}) })
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment