diff --git a/.Rbuildignore b/.Rbuildignore index acd9e68a9a2e50eff8ef783a77b63bab66e63424..0213e2a03f260331139d4b10befe6139bd114f9b 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,3 +9,4 @@ ^\.vscode$ ^Rplots\.pdf$ ^ci$ +^data-raw$ diff --git a/.regressionignore b/.regressionignore index 5ceae7cdb93d9480568fbd4545a4d8c7968177a1..908652aefa643be08ff52268db94692e0f1dfac3 100644 --- a/.regressionignore +++ b/.regressionignore @@ -4,3 +4,32 @@ # ignored variable : [Topic]<SPACE>[Variable]. # Example for ignoring OutputsModel variable produced by example("RunModel_GR2M"): RunModel_GR2M OutputsModel +Calibration_Michel RunOptions +Calibration RunOptions +CreateCalibOptions RunOptions +CreateIniStates RunOptions +CreateInputsCrit RunOptions +CreateInputsModel RunOptions +CreateRunOptions RunOptions +ErrorCrit_KGE RunOptions +ErrorCrit_KGE2 RunOptions +ErrorCrit_NSE RunOptions +ErrorCrit_RMSE RunOptions +ErrorCrit RunOptions +Imax RunOptions +Param_Sets_GR4J RunOptions_Cal +Param_Sets_GR4J RunOptions_Val +RunModel_CemaNeige RunOptions +RunModel_CemaNeigeGR4J RunOptions +RunModel_CemaNeigeGR5J RunOptions +RunModel_CemaNeigeGR6J RunOptions +RunModel_GR1A RunOptions +RunModel_GR2M RunOptions +RunModel_GR4H RunOptions +RunModel_GR4J RunOptions +RunModel_GR5H RunOptions +RunModel_GR5J RunOptions +RunModel_GR6J RunOptions +RunModel_Lag RunOptions +RunModel RunOptions +SeriesAggreg RunOptions diff --git a/R/CreateRunOptions.R b/R/CreateRunOptions.R index 4edbdd7184f0b489ebde8c6628bae9eb5a6ab998..39caf90952178f8f97ce8d81edd907f40dca2d50 100644 --- a/R/CreateRunOptions.R +++ b/R/CreateRunOptions.R @@ -24,12 +24,17 @@ CreateRunOptions <- function(FUN_MOD, InputsModel, ObjectClass <- FeatFUN_MOD$Class TimeStepMean <- FeatFUN_MOD$TimeStepMean + ## Model output variable list + FortranOutputs <- .FortranOutputs(GR = FeatFUN_MOD$CodeModHydro, + isCN = "CemaNeige" %in% FeatFUN_MOD$Class) + ## manage class if (IsIntStore) { ObjectClass <- c(ObjectClass, "interception") } if (IsHyst) { ObjectClass <- c(ObjectClass, "hysteresis") + FeatFUN_MOD$NbParam <- FeatFUN_MOD$NbParam + 2 } if (!"CemaNeige" %in% ObjectClass & "hysteresis" %in% ObjectClass) { @@ -473,7 +478,9 @@ CreateRunOptions <- function(FUN_MOD, InputsModel, IniStates = IniStates, IniResLevels = IniResLevels, Outputs_Cal = Outputs_Cal, - Outputs_Sim = Outputs_Sim) + Outputs_Sim = Outputs_Sim, + FortranOutputs = FortranOutputs, + FeatFUN_MOD = FeatFUN_MOD) if ("CemaNeige" %in% ObjectClass) { RunOptions <- c(RunOptions, list(MeanAnSolidPrecip = MeanAnSolidPrecip)) diff --git a/R/RunModel_CemaNeigeGR4H.R b/R/RunModel_CemaNeigeGR4H.R index bda65ddbbbfffc5dde71ac8a17953c4494241657..51318c1faa81aea3bfad90c75b2eb1771b65a6b3 100644 --- a/R/RunModel_CemaNeigeGR4H.R +++ b/R/RunModel_CemaNeigeGR4H.R @@ -3,40 +3,12 @@ RunModel_CemaNeigeGR4H <- function(InputsModel, RunOptions, Param) { ## Initialization of variables IsHyst <- inherits(RunOptions, "hysteresis") - NParam <- ifelse(test = IsHyst, yes = 8L, no = 6L) - NParamCN <- NParam - 4L + NParamCN <- RunOptions$FeatFUN_MOD$NbParam - 4L NStates <- 4L - FortranOutputs <- .FortranOutputs(GR = "GR4H", isCN = TRUE) - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "hourly")) { - stop("'InputsModel' must be of class 'hourly'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(InputsModel, "CemaNeige")) { - stop("'InputsModel' must be of class 'CemaNeige'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!inherits(RunOptions, "CemaNeige")) { - stop("'RunOptions' must be of class 'CemaNeige'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) @@ -76,9 +48,9 @@ RunModel_CemaNeigeGR4H <- function(InputsModel, RunOptions, Param) { ## CemaNeige________________________________________________________________________________ if (inherits(RunOptions, "CemaNeige")) { if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsCemaNeige <- as.integer(1:length(FortranOutputs$CN)) + IndOutputsCemaNeige <- as.integer(1:length(RunOptions$FortranOutputs$CN)) } else { - IndOutputsCemaNeige <- which(FortranOutputs$CN %in% RunOptions$Outputs_Sim) + IndOutputsCemaNeige <- which(RunOptions$FortranOutputs$CN %in% RunOptions$Outputs_Sim) } CemaNeigeLayers <- list() CemaNeigeStateEnd <- NULL @@ -116,7 +88,7 @@ RunModel_CemaNeigeGR4H <- function(InputsModel, RunOptions, Param) { ## Data storage CemaNeigeLayers[[iLayer]] <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(CemaNeigeLayers[[iLayer]]) <- FortranOutputs$CN[IndOutputsCemaNeige] + names(CemaNeigeLayers[[iLayer]]) <- RunOptions$FortranOutputs$CN[IndOutputsCemaNeige] IndPliqAndMelt <- which(names(CemaNeigeLayers[[iLayer]]) == "PliqAndMelt") if (iLayer == 1) { CatchMeltAndPliq <- RESULTS$Outputs[, IndPliqAndMelt] / NLayers @@ -142,9 +114,9 @@ RunModel_CemaNeigeGR4H <- function(InputsModel, RunOptions, Param) { ## GR model if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsMod <- as.integer(1:length(FortranOutputs$GR)) + IndOutputsMod <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputsMod <- which(FortranOutputs$GR %in% RunOptions$Outputs_Sim) + IndOutputsMod <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } ## Use of IniResLevels @@ -186,45 +158,14 @@ RunModel_CemaNeigeGR4H <- function(InputsModel, RunOptions, Param) { } if (inherits(RunOptions, "CemaNeige") & "Precip" %in% RunOptions$Outputs_Sim) { - RESULTS$Outputs[, which(FortranOutputs$GR[IndOutputsMod] == "Precip")] <- InputsModel$Precip[IndPeriod1] - } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if (ExportDatesR & ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "hourly", "GR", "CemaNeige") - if (IsHyst) { - class(OutputsModel) <- c(class(OutputsModel), "hysteresis") + RESULTS$Outputs[, which(RunOptions$FortranOutputs$GR[IndOutputsMod] == "Precip")] <- + InputsModel$Precip[IndPeriod1] } - return(OutputsModel) + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries, + CemaNeigeLayers) } diff --git a/R/RunModel_CemaNeigeGR4J.R b/R/RunModel_CemaNeigeGR4J.R index 6ff79a433e234a1aa50aa0cb692e8e9c845e729d..74d93b176f2e058e9e0bd04a414800178089a057 100644 --- a/R/RunModel_CemaNeigeGR4J.R +++ b/R/RunModel_CemaNeigeGR4J.R @@ -1,44 +1,16 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { - - + + ## Initialization of variables IsHyst <- inherits(RunOptions, "hysteresis") - NParam <- ifelse(test = IsHyst, yes = 8L, no = 6L) - NParamCN <- NParam - 4L + NParamCN <- RunOptions$FeatFUN_MOD$NbParam - 4L NStates <- 4L - FortranOutputs <- .FortranOutputs(GR = "GR4J", isCN = TRUE) - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "daily")) { - stop("'InputsModel' must be of class 'daily'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(InputsModel, "CemaNeige")) { - stop("'InputsModel' must be of class 'CemaNeige'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!inherits(RunOptions, "CemaNeige")) { - stop("'RunOptions' must be of class 'CemaNeige'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + + + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) - + Param_X1X3_threshold <- 1e-2 Param_X4_threshold <- 0.5 @@ -53,8 +25,8 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { if (Param[4L] < Param_X4_threshold) { warning(sprintf("Param[4] (X4: unit hydrograph time constant [d]) < %.2f\n X4 set to %.2f", Param_X4_threshold, Param_X4_threshold)) Param[4L] <- Param_X4_threshold - } - + } + ## Input data preparation if (identical(RunOptions$IndPeriod_WarmUp, 0L)) { RunOptions$IndPeriod_WarmUp <- NULL @@ -71,20 +43,20 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { ## Output data preparation ExportDatesR <- "DatesR" %in% RunOptions$Outputs_Sim ExportStateEnd <- "StateEnd" %in% RunOptions$Outputs_Sim - - + + ## CemaNeige________________________________________________________________________________ if (inherits(RunOptions, "CemaNeige")) { if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsCemaNeige <- as.integer(1:length(FortranOutputs$CN)) + IndOutputsCemaNeige <- as.integer(1:length(RunOptions$FortranOutputs$CN)) } else { - IndOutputsCemaNeige <- which(FortranOutputs$CN %in% RunOptions$Outputs_Sim) + IndOutputsCemaNeige <- which(RunOptions$FortranOutputs$CN %in% RunOptions$Outputs_Sim) } CemaNeigeLayers <- list() CemaNeigeStateEnd <- NULL NameCemaNeigeLayers <- "CemaNeigeLayers" - - + + ## Call CemaNeige Fortran_________________________ for(iLayer in 1:NLayers) { if (!IsHyst) { @@ -92,7 +64,7 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { } else { StateStartCemaNeige <- RunOptions$IniStates[(7 + 20 + 40) + c(iLayer, iLayer+NLayers, iLayer+2*NLayers, iLayer+3*NLayers)] } - RESULTS <- .Fortran("frun_cemaneige", PACKAGE = "airGR", + RESULTS <- .Fortran("frun_cemaneige", PACKAGE = "airGR", ## inputs LInputs = LInputSeries, ### length of input and output series InputsPrecip = InputsModel$LayerPrecip[[iLayer]][IndPeriod1], ### input series of total precipitation [mm/d] @@ -106,16 +78,16 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { IsHyst = as.integer(IsHyst), ### use of hysteresis NOutputs = as.integer(length(IndOutputsCemaNeige)), ### number of output series IndOutputs = IndOutputsCemaNeige, ### indices of output series - ## outputs + ## outputs Outputs = matrix(as.double(-99e9), nrow = LInputSeries, ncol = length(IndOutputsCemaNeige)), ### output series [mm, mm/d or degC] StateEnd = rep(as.double(-99e9), as.integer(NStates)) ### state variables at the end of the model run ) RESULTS$Outputs[RESULTS$Outputs <= -99e8] <- NA RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA - + ## Data storage CemaNeigeLayers[[iLayer]] <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(CemaNeigeLayers[[iLayer]]) <- FortranOutputs$CN[IndOutputsCemaNeige] + names(CemaNeigeLayers[[iLayer]]) <- RunOptions$FortranOutputs$CN[IndOutputsCemaNeige] IndPliqAndMelt <- which(names(CemaNeigeLayers[[iLayer]]) == "PliqAndMelt") if (iLayer == 1) { CatchMeltAndPliq <- RESULTS$Outputs[, IndPliqAndMelt] / NLayers @@ -136,24 +108,24 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { NameCemaNeigeLayers <- NULL CatchMeltAndPliq <- InputsModel$Precip[IndPeriod1] } - - - + + + ## GR model______________________________________________________________________________________ if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsMod <- as.integer(1:length(FortranOutputs$GR)) + IndOutputsMod <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputsMod <- which(FortranOutputs$GR %in% RunOptions$Outputs_Sim) + IndOutputsMod <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } - + ## Use of IniResLevels if (!is.null(RunOptions$IniResLevels)) { RunOptions$IniStates[1] <- RunOptions$IniResLevels[1] * ParamMod[1] ### production store level (mm) RunOptions$IniStates[2] <- RunOptions$IniResLevels[2] * ParamMod[3] ### routing store level (mm) } - + ## Call GR model Fortan - RESULTS <- .Fortran("frun_gr4j", PACKAGE = "airGR", + RESULTS <- .Fortran("frun_gr4j", PACKAGE = "airGR", ## inputs LInputs = LInputSeries, ### length of input and output series InputsPrecip = CatchMeltAndPliq, ### input series of total precipitation [mm/d] @@ -164,7 +136,7 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { StateStart = RunOptions$IniStates[1:NStatesMod], ### state variables used when the model run starts NOutputs = as.integer(length(IndOutputsMod)), ### number of output series IndOutputs = IndOutputsMod, ### indices of output series - ## outputs + ## outputs Outputs = matrix(as.double(-99e9), nrow = LInputSeries, ncol = length(IndOutputsMod)), ### output series [mm or mm/d] StateEnd = rep(as.double(-99e9), NStatesMod) ### state variables at the end of the model run ) @@ -173,57 +145,26 @@ RunModel_CemaNeigeGR4J <- function(InputsModel, RunOptions, Param) { if (ExportStateEnd) { RESULTS$StateEnd[-3L] <- ifelse(RESULTS$StateEnd[-3L] < 0, 0, RESULTS$StateEnd[-3L]) ### remove negative values except for the ExpStore location idNStates <- seq_len(NStates*NLayers) %% NStates - RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_CemaNeigeGR4J, InputsModel = InputsModel, IsHyst = IsHyst, - ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = NULL, + RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_CemaNeigeGR4J, InputsModel = InputsModel, IsHyst = IsHyst, + ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = NULL, UH1 = RESULTS$StateEnd[(1:20) + 7], - UH2 = RESULTS$StateEnd[(1:40) + (7+20)], - GCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 1]], - eTGCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 2]], - GthrCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 3]], - GlocmaxCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 0]], + UH2 = RESULTS$StateEnd[(1:40) + (7+20)], + GCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 1]], + eTGCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 2]], + GthrCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 3]], + GlocmaxCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 0]], verbose = FALSE) } - + if (inherits(RunOptions, "CemaNeige") & "Precip" %in% RunOptions$Outputs_Sim) { - RESULTS$Outputs[, which(FortranOutputs$GR[IndOutputsMod] == "Precip")] <- InputsModel$Precip[IndPeriod1] - } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) + RESULTS$Outputs[, which(RunOptions$FortranOutputs$GR[IndOutputsMod] == "Precip")] <- + InputsModel$Precip[IndPeriod1] } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if (ExportDatesR & ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "daily", "GR", "CemaNeige") - if (IsHyst) { - class(OutputsModel) <- c(class(OutputsModel), "hysteresis") - } - return(OutputsModel) - + + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries, + CemaNeigeLayers) } diff --git a/R/RunModel_CemaNeigeGR5H.R b/R/RunModel_CemaNeigeGR5H.R index 0a4995fb2b570e96e2ee593bc566c9812f737363..a78946b618549ee741ee2c06daf58000ea147505 100644 --- a/R/RunModel_CemaNeigeGR5H.R +++ b/R/RunModel_CemaNeigeGR5H.R @@ -1,51 +1,22 @@ RunModel_CemaNeigeGR5H <- function(InputsModel, RunOptions, Param) { - - + + ## Initialization of variables IsHyst <- inherits(RunOptions, "hysteresis") - NParam <- ifelse(test = IsHyst, yes = 9L, no = 7L) - NParamCN <- NParam - 5L + NParamCN <- RunOptions$FeatFUN_MOD$NbParam - 5L NStates <- 4L - FortranOutputs <- .FortranOutputs(GR = "GR5H", isCN = TRUE) IsIntStore <- inherits(RunOptions, "interception") if (IsIntStore) { Imax <- RunOptions$Imax } else { Imax <- -99 } - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "hourly")) { - stop("'InputsModel' must be of class 'hourly'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(InputsModel, "CemaNeige")) { - stop("'InputsModel' must be of class 'CemaNeige'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!inherits(RunOptions, "CemaNeige")) { - stop("'RunOptions' must be of class 'CemaNeige'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) - - + + Param_X1X3_threshold <- 1e-2 Param_X4_threshold <- 0.5 if (Param[1L] < Param_X1X3_threshold) { @@ -59,8 +30,8 @@ RunModel_CemaNeigeGR5H <- function(InputsModel, RunOptions, Param) { if (Param[4L] < Param_X4_threshold) { warning(sprintf("Param[4] (X4: unit hydrograph time constant [h]) < %.2f\n X4 set to %.2f", Param_X4_threshold, Param_X4_threshold)) Param[4L] <- Param_X4_threshold - } - + } + ## Input data preparation if (identical(RunOptions$IndPeriod_WarmUp, 0L)) { RunOptions$IndPeriod_WarmUp <- NULL @@ -73,24 +44,24 @@ RunModel_CemaNeigeGR5H <- function(InputsModel, RunOptions, Param) { ParamMod <- Param[1:NParamMod] NLayers <- length(InputsModel$LayerPrecip) NStatesMod <- as.integer(length(RunOptions$IniStates) - NStates * NLayers) - + ## Output data preparation ExportDatesR <- "DatesR" %in% RunOptions$Outputs_Sim ExportStateEnd <- "StateEnd" %in% RunOptions$Outputs_Sim - - + + ## CemaNeige________________________________________________________________________________ if (inherits(RunOptions, "CemaNeige")) { if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsCemaNeige <- as.integer(1:length(FortranOutputs$CN)) + IndOutputsCemaNeige <- as.integer(1:length(RunOptions$FortranOutputs$CN)) } else { - IndOutputsCemaNeige <- which(FortranOutputs$CN %in% RunOptions$Outputs_Sim) + IndOutputsCemaNeige <- which(RunOptions$FortranOutputs$CN %in% RunOptions$Outputs_Sim) } CemaNeigeLayers <- list() CemaNeigeStateEnd <- NULL NameCemaNeigeLayers <- "CemaNeigeLayers" - - + + ## Call CemaNeige Fortran_________________________ for (iLayer in 1:NLayers) { @@ -113,16 +84,16 @@ RunModel_CemaNeigeGR5H <- function(InputsModel, RunOptions, Param) { IsHyst = as.integer(IsHyst), ### use of hysteresis NOutputs = as.integer(length(IndOutputsCemaNeige)), ### number of output series IndOutputs = IndOutputsCemaNeige, ### indices of output series - ## outputs + ## outputs Outputs = matrix(as.double(-99e9), nrow = LInputSeries, ncol = length(IndOutputsCemaNeige)), ### output series [mm, mm/h or degC] StateEnd = rep(as.double(-99e9), as.integer(NStates)) ### state variables at the end of the model run ) RESULTS$Outputs[RESULTS$Outputs <= -99e8] <- NA RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA - + ## Data storage CemaNeigeLayers[[iLayer]] <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(CemaNeigeLayers[[iLayer]]) <- FortranOutputs$CN[IndOutputsCemaNeige] + names(CemaNeigeLayers[[iLayer]]) <- RunOptions$FortranOutputs$CN[IndOutputsCemaNeige] IndPliqAndMelt <- which(names(CemaNeigeLayers[[iLayer]]) == "PliqAndMelt") if (iLayer == 1) { CatchMeltAndPliq <- RESULTS$Outputs[, IndPliqAndMelt] / NLayers @@ -148,9 +119,9 @@ RunModel_CemaNeigeGR5H <- function(InputsModel, RunOptions, Param) { ## GR model if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsMod <- as.integer(1:length(FortranOutputs$GR)) + IndOutputsMod <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputsMod <- which(FortranOutputs$GR %in% RunOptions$Outputs_Sim) + IndOutputsMod <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } ## Use of IniResLevels @@ -191,54 +162,20 @@ RunModel_CemaNeigeGR5H <- function(InputsModel, RunOptions, Param) { UH2 = RESULTS$StateEnd[(1:(40*24)) + (7+20*24)], GCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 1]], eTGCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 2]], - GthrCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 3]], + GthrCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 3]], GlocmaxCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 0]], verbose = FALSE) } - + if (inherits(RunOptions, "CemaNeige") & "Precip" %in% RunOptions$Outputs_Sim) { - RESULTS$Outputs[, which(FortranOutputs$GR[IndOutputsMod] == "Precip")] <- InputsModel$Precip[IndPeriod1] + RESULTS$Outputs[, which(RunOptions$FortranOutputs$GR[IndOutputsMod] == "Precip")] <- + InputsModel$Precip[IndPeriod1] } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if (ExportDatesR & ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "hourly", "GR", "CemaNeige") - if (IsHyst) { - class(OutputsModel) <- c(class(OutputsModel), "hysteresis") - } - if (IsIntStore) { - class(OutputsModel) <- c(class(OutputsModel), "interception") - } - return(OutputsModel) - + + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries, + CemaNeigeLayers) } diff --git a/R/RunModel_CemaNeigeGR5J.R b/R/RunModel_CemaNeigeGR5J.R index a8dabc3c97764c99f6e9c69f14dc951ba828e3fe..4c1d509c810e0708546790dc436dd869f0790b71 100644 --- a/R/RunModel_CemaNeigeGR5J.R +++ b/R/RunModel_CemaNeigeGR5J.R @@ -1,45 +1,17 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { - - + + ## Initialization of variables IsHyst <- inherits(RunOptions, "hysteresis") - NParam <- ifelse(test = IsHyst, yes = 9L, no = 7L) - NParamCN <- NParam - 5L + NParamCN <- RunOptions$FeatFUN_MOD$NbParam - 5L NStates <- 4L - FortranOutputs <- .FortranOutputs(GR = "GR5J", isCN = TRUE) - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "daily")) { - stop("'InputsModel' must be of class 'daily'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(InputsModel, "CemaNeige")) { - stop("'InputsModel' must be of class 'CemaNeige'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!inherits(RunOptions, "CemaNeige")) { - stop("'RunOptions' must be of class 'CemaNeige'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + + + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) - - + + Param_X1X3_threshold <- 1e-2 Param_X4_threshold <- 0.5 if (Param[1L] < Param_X1X3_threshold) { @@ -53,8 +25,8 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { if (Param[4L] < Param_X4_threshold) { warning(sprintf("Param[4] (X4: unit hydrograph time constant [d]) < %.2f\n X4 set to %.2f", Param_X4_threshold, Param_X4_threshold)) Param[4L] <- Param_X4_threshold - } - + } + ## Input data preparation if (identical(RunOptions$IndPeriod_WarmUp, 0L)) { RunOptions$IndPeriod_WarmUp <- NULL @@ -69,20 +41,20 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { NStatesMod <- as.integer(length(RunOptions$IniStates) - NStates * NLayers) ExportDatesR <- "DatesR" %in% RunOptions$Outputs_Sim ExportStateEnd <- "StateEnd" %in% RunOptions$Outputs_Sim - - + + ## CemaNeige________________________________________________________________________________ if (inherits(RunOptions, "CemaNeige")) { if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsCemaNeige <- as.integer(1:length(FortranOutputs$CN)) + IndOutputsCemaNeige <- as.integer(1:length(RunOptions$FortranOutputs$CN)) } else { - IndOutputsCemaNeige <- which(FortranOutputs$CN %in% RunOptions$Outputs_Sim) + IndOutputsCemaNeige <- which(RunOptions$FortranOutputs$CN %in% RunOptions$Outputs_Sim) } CemaNeigeLayers <- list() CemaNeigeStateEnd <- NULL NameCemaNeigeLayers <- "CemaNeigeLayers" - - + + ## Call CemaNeige Fortran_________________________ for(iLayer in 1:NLayers) { if (!IsHyst) { @@ -104,20 +76,20 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { IsHyst = as.integer(IsHyst), ### use of hysteresis NOutputs = as.integer(length(IndOutputsCemaNeige)), ### number of output series IndOutputs = IndOutputsCemaNeige, ### indices of output series - ## outputs + ## outputs Outputs = matrix(as.double(-99e9), nrow = LInputSeries, ncol = length(IndOutputsCemaNeige)), ### output series [mm, mm/d or degC] StateEnd = rep(as.double(-99e9), as.integer(NStates)) ### state variables at the end of the model run ) RESULTS$Outputs[RESULTS$Outputs <= -99e8] <- NA RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA - + ## Data storage CemaNeigeLayers[[iLayer]] <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(CemaNeigeLayers[[iLayer]]) <- FortranOutputs$CN[IndOutputsCemaNeige] + names(CemaNeigeLayers[[iLayer]]) <- RunOptions$FortranOutputs$CN[IndOutputsCemaNeige] IndPliqAndMelt <- which(names(CemaNeigeLayers[[iLayer]]) == "PliqAndMelt") if (iLayer == 1) { CatchMeltAndPliq <- RESULTS$Outputs[, IndPliqAndMelt] / NLayers - } + } if (iLayer > 1) { CatchMeltAndPliq <- CatchMeltAndPliq + RESULTS$Outputs[, IndPliqAndMelt] / NLayers } @@ -133,23 +105,23 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { CemaNeigeStateEnd <- NULL NameCemaNeigeLayers <- NULL CatchMeltAndPliq <- InputsModel$Precip[IndPeriod1] - } - - - + } + + + ## GR model______________________________________________________________________________________ if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsMod <- as.integer(1:length(FortranOutputs$GR)) + IndOutputsMod <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputsMod <- which(FortranOutputs$GR %in% RunOptions$Outputs_Sim) + IndOutputsMod <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } - + ## Use of IniResLevels if (!is.null(RunOptions$IniResLevels)) { RunOptions$IniStates[1] <- RunOptions$IniResLevels[1] * ParamMod[1] ### production store level (mm) RunOptions$IniStates[2] <- RunOptions$IniResLevels[2] * ParamMod[3] ### routing store level (mm) } - + ## Call GR model Fortan RESULTS <- .Fortran("frun_gr5j", PACKAGE = "airGR", ## inputs @@ -162,7 +134,7 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { StateStart = RunOptions$IniStates[1:NStatesMod], ### state variables used when the model run starts NOutputs = as.integer(length(IndOutputsMod)), ### number of output series IndOutputs = IndOutputsMod, ### indices of output series - ## outputs + ## outputs Outputs = matrix(as.double(-99e9), nrow = LInputSeries, ncol = length(IndOutputsMod)), ### output series [mm or mm/d] StateEnd = rep(as.double(-99e9), NStatesMod) ### state variables at the end of the model run ) @@ -177,51 +149,20 @@ RunModel_CemaNeigeGR5J <- function(InputsModel, RunOptions, Param) { UH2 = RESULTS$StateEnd[(1:40) + (7+20)], GCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 1]], eTGCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 2]], - GthrCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 3]], + GthrCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 3]], GlocmaxCemaNeigeLayers = CemaNeigeStateEnd[seq_len(NStates*NLayers)[idNStates == 0]], verbose = FALSE) } - + if (inherits(RunOptions, "CemaNeige") & "Precip" %in% RunOptions$Outputs_Sim) { - RESULTS$Outputs[, which(FortranOutputs$GR[IndOutputsMod] == "Precip")] <- InputsModel$Precip[IndPeriod1] - } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if (ExportDatesR & ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "daily", "GR", "CemaNeige") - if (IsHyst) { - class(OutputsModel) <- c(class(OutputsModel), "hysteresis") - } - return(OutputsModel) - + RESULTS$Outputs[, which(RunOptions$FortranOutputs$GR[IndOutputsMod] == "Precip")] <- + InputsModel$Precip[IndPeriod1] + } + + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries, + CemaNeigeLayers) } diff --git a/R/RunModel_CemaNeigeGR6J.R b/R/RunModel_CemaNeigeGR6J.R index 48859cb09a837e014909452794db9a5bbad05721..3388fe2b2e400172ee76412a7c536ce0244207ed 100644 --- a/R/RunModel_CemaNeigeGR6J.R +++ b/R/RunModel_CemaNeigeGR6J.R @@ -3,40 +3,12 @@ RunModel_CemaNeigeGR6J <- function(InputsModel, RunOptions, Param) { ## Initialization of variables IsHyst <- inherits(RunOptions, "hysteresis") - NParam <- ifelse(test = IsHyst, yes = 10L, no = 8L) - NParamCN <- NParam - 6L + NParamCN <- RunOptions$FeatFUN_MOD$NbParam - 6L NStates <- 4L - FortranOutputs <- .FortranOutputs(GR = "GR6J", isCN = TRUE) - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "daily")) { - stop("'InputsModel' must be of class 'daily'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(InputsModel, "CemaNeige")) { - stop("'InputsModel' must be of class 'CemaNeige'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!inherits(RunOptions, "CemaNeige")) { - stop("'RunOptions' must be of class 'CemaNeige'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) @@ -78,9 +50,9 @@ RunModel_CemaNeigeGR6J <- function(InputsModel, RunOptions, Param) { ## CemaNeige________________________________________________________________________________ if (inherits(RunOptions, "CemaNeige")) { if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsCemaNeige <- as.integer(1:length(FortranOutputs$CN)) + IndOutputsCemaNeige <- as.integer(1:length(RunOptions$FortranOutputs$CN)) } else { - IndOutputsCemaNeige <- which(FortranOutputs$CN %in% RunOptions$Outputs_Sim) + IndOutputsCemaNeige <- which(RunOptions$FortranOutputs$CN %in% RunOptions$Outputs_Sim) } CemaNeigeLayers <- list() CemaNeigeStateEnd <- NULL @@ -117,7 +89,7 @@ RunModel_CemaNeigeGR6J <- function(InputsModel, RunOptions, Param) { ## Data storage CemaNeigeLayers[[iLayer]] <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(CemaNeigeLayers[[iLayer]]) <- FortranOutputs$CN[IndOutputsCemaNeige] + names(CemaNeigeLayers[[iLayer]]) <- RunOptions$FortranOutputs$CN[IndOutputsCemaNeige] IndPliqAndMelt <- which(names(CemaNeigeLayers[[iLayer]]) == "PliqAndMelt") if (iLayer == 1) { CatchMeltAndPliq <- RESULTS$Outputs[, IndPliqAndMelt] / NLayers @@ -143,9 +115,9 @@ RunModel_CemaNeigeGR6J <- function(InputsModel, RunOptions, Param) { ## GR model______________________________________________________________________________________ if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputsMod <- as.integer(1:length(FortranOutputs$GR)) + IndOutputsMod <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputsMod <- which(FortranOutputs$GR %in% RunOptions$Outputs_Sim) + IndOutputsMod <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } ## Use of IniResLevels @@ -188,46 +160,15 @@ RunModel_CemaNeigeGR6J <- function(InputsModel, RunOptions, Param) { } if (inherits(RunOptions, "CemaNeige") & "Precip" %in% RunOptions$Outputs_Sim) { - RESULTS$Outputs[, which(FortranOutputs$GR[IndOutputsMod] == "Precip")] <- InputsModel$Precip[IndPeriod1] - } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if (ExportDatesR & ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(CemaNeigeLayers), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs$GR[IndOutputsMod], NameCemaNeigeLayers, "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "daily", "GR", "CemaNeige") - if (IsHyst) { - class(OutputsModel) <- c(class(OutputsModel), "hysteresis") + RESULTS$Outputs[, which(RunOptions$FortranOutputs$GR[IndOutputsMod] == "Precip")] <- + InputsModel$Precip[IndPeriod1] } - return(OutputsModel) + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries, + CemaNeigeLayers) } diff --git a/R/RunModel_GR1A.R b/R/RunModel_GR1A.R index 620965f0c58c6a3ce8edcf9bd2801d3fc04433e9..87ff6aceb6d53f9b745f2542c2ed85b29f223b2f 100644 --- a/R/RunModel_GR1A.R +++ b/R/RunModel_GR1A.R @@ -1,33 +1,7 @@ RunModel_GR1A <- function(InputsModel, RunOptions, Param) { + .ArgumentsCheckGR(InputsModel, RunOptions, Param) - ## Initialization of variables - NParam <- 1 - FortranOutputs <- .FortranOutputs(GR = "GR1A")$GR - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "yearly")) { - stop("'InputsModel' must be of class 'yearly'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } Param <- as.double(Param) @@ -38,9 +12,9 @@ RunModel_GR1A <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } @@ -69,34 +43,9 @@ RunModel_GR1A <- function(InputsModel, RunOptions, Param) { RESULTS$Outputs[RESULTS$Outputs <= -99e8] <- NA RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - class(OutputsModel) <- c("OutputsModel", "yearly", "GR") - return(OutputsModel) - + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/RunModel_GR2M.R b/R/RunModel_GR2M.R index e0261695d36e4b4c22b61f83c0e456df47f0a865..dd2f696d5cc30f0dd5e98f8f7a4198f4964aca6c 100644 --- a/R/RunModel_GR2M.R +++ b/R/RunModel_GR2M.R @@ -1,33 +1,7 @@ RunModel_GR2M <- function(InputsModel, RunOptions, Param) { + .ArgumentsCheckGR(InputsModel, RunOptions, Param) - ## Initialization of variables - NParam <- 2 - FortranOutputs <- .FortranOutputs(GR = "GR2M")$GR - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "monthly")) { - stop("'InputsModel' must be of class 'monthly'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } Param <- as.double(Param) Param_X1X2_threshold <- 1e-2 @@ -47,9 +21,9 @@ RunModel_GR2M <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } ## Output data preparation @@ -91,34 +65,9 @@ RunModel_GR2M <- function(InputsModel, RunOptions, Param) { } ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "monthly", "GR") - return(OutputsModel) - + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/RunModel_GR4H.R b/R/RunModel_GR4H.R index 69beb4b05f3616dd0f8fb556130edb69d54ebb85..f70f3a1d0f165c51ef451e44d56ca50f83a685b6 100644 --- a/R/RunModel_GR4H.R +++ b/R/RunModel_GR4H.R @@ -1,33 +1,7 @@ RunModel_GR4H <- function(InputsModel, RunOptions, Param) { + .ArgumentsCheckGR(InputsModel, RunOptions, Param) - ## Initialization of variables - NParam <- 4 - FortranOutputs <- .FortranOutputs(GR = "GR4H")$GR - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "hourly")) { - stop("'InputsModel' must be of class 'hourly'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } Param <- as.double(Param) Param_X1X3_threshold <- 1e-2 @@ -52,9 +26,9 @@ RunModel_GR4H <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } ## Output data preparation @@ -96,35 +70,9 @@ RunModel_GR4H <- function(InputsModel, RunOptions, Param) { verbose = FALSE) } - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "hourly", "GR") - return(OutputsModel) - + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/RunModel_GR4J.R b/R/RunModel_GR4J.R index 0af262be0d397dcdd5a81533ac8e38bdf4746c22..fab8517e6383fbcfcf0244bd285d547ead1c3ea2 100644 --- a/R/RunModel_GR4J.R +++ b/R/RunModel_GR4J.R @@ -1,33 +1,7 @@ RunModel_GR4J <- function(InputsModel, RunOptions, Param) { + .ArgumentsCheckGR(InputsModel, RunOptions, Param) - ## Initialization of variables - NParam <- 4 - FortranOutputs <- .FortranOutputs(GR = "GR4J")$GR - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "daily")) { - stop("'InputsModel' must be of class 'daily'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } Param <- as.double(Param) Param_X1X3_threshold <- 1e-2 @@ -52,16 +26,11 @@ RunModel_GR4J <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } - ## Output data preparation - IndPeriod2 <- (length(RunOptions$IndPeriod_WarmUp)+1):LInputSeries - ExportDatesR <- "DatesR" %in% RunOptions$Outputs_Sim - ExportStateEnd <- "StateEnd" %in% RunOptions$Outputs_Sim - ## Use of IniResLevels if (!is.null(RunOptions$IniResLevels)) { RunOptions$IniStates[1] <- RunOptions$IniResLevels[1] * Param[1] ### production store level (mm) @@ -86,7 +55,7 @@ RunModel_GR4J <- function(InputsModel, RunOptions, Param) { ) RESULTS$Outputs[RESULTS$Outputs <= -99e8] <- NA RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA - if (ExportStateEnd) { + if ("StateEnd" %in% RunOptions$Outputs_Sim) { RESULTS$StateEnd[-3L] <- ifelse(RESULTS$StateEnd[-3L] < 0, 0, RESULTS$StateEnd[-3L]) ### remove negative values except for the ExpStore location RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_GR4J, InputsModel = InputsModel, ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = NULL, @@ -96,35 +65,9 @@ RunModel_GR4J <- function(InputsModel, RunOptions, Param) { verbose = FALSE) } - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "daily", "GR") - return(OutputsModel) - + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/RunModel_GR5H.R b/R/RunModel_GR5H.R index 58ea098a765a1ee7195ad32b8fc7587172d22d8a..1d0139741fbcd7cda8bd567ee388ba7ef9805580 100644 --- a/R/RunModel_GR5H.R +++ b/R/RunModel_GR5H.R @@ -2,8 +2,6 @@ RunModel_GR5H <- function(InputsModel, RunOptions, Param) { ## Initialization of variables - NParam <- 5 - FortranOutputs <- .FortranOutputs(GR = "GR5H")$GR IsIntStore <- inherits(RunOptions, "interception") if (IsIntStore) { Imax <- RunOptions$Imax @@ -11,29 +9,8 @@ RunModel_GR5H <- function(InputsModel, RunOptions, Param) { Imax <- -99 } + .ArgumentsCheckGR(InputsModel, RunOptions, Param) - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "hourly")) { - stop("'InputsModel' must be of class 'hourly'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } Param <- as.double(Param) Param_X1X3_threshold <- 1e-2 @@ -58,9 +35,9 @@ RunModel_GR5H <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } ## Output data preparation @@ -107,38 +84,9 @@ RunModel_GR5H <- function(InputsModel, RunOptions, Param) { verbose = FALSE) } - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "hourly", "GR") - if (IsIntStore) { - class(OutputsModel) <- c(class(OutputsModel), "interception") - } - return(OutputsModel) - + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/RunModel_GR5J.R b/R/RunModel_GR5J.R index fa5f83ac424e1df581cedcf2e02dcdb5145470df..73e17c6cb32116164131153a9e6decf7f49ce39b 100644 --- a/R/RunModel_GR5J.R +++ b/R/RunModel_GR5J.R @@ -1,35 +1,9 @@ RunModel_GR5J <- function(InputsModel, RunOptions, Param) { - - - ## Initialization of variables - NParam <- 5 - FortranOutputs <- .FortranOutputs(GR = "GR5J")$GR - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "daily")) { - stop("'InputsModel' must be of class 'daily'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) - + Param_X1X3_threshold <- 1e-2 Param_X4_threshold <- 0.5 if (Param[1L] < Param_X1X3_threshold) { @@ -43,8 +17,8 @@ RunModel_GR5J <- function(InputsModel, RunOptions, Param) { if (Param[4L] < Param_X4_threshold) { warning(sprintf("Param[4] (X4: unit hydrograph time constant [d]) < %.2f\n X4 set to %.2f", Param_X4_threshold, Param_X4_threshold)) Param[4L] <- Param_X4_threshold - } - + } + ## Input data preparation if (identical(RunOptions$IndPeriod_WarmUp, 0L)) { RunOptions$IndPeriod_WarmUp <- NULL @@ -52,24 +26,24 @@ RunModel_GR5J <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } - + ## Output data preparation IndPeriod2 <- (length(RunOptions$IndPeriod_WarmUp)+1):LInputSeries ExportDatesR <- "DatesR" %in% RunOptions$Outputs_Sim ExportStateEnd <- "StateEnd" %in% RunOptions$Outputs_Sim - + ## Use of IniResLevels if (!is.null(RunOptions$IniResLevels)) { RunOptions$IniStates[1] <- RunOptions$IniResLevels[1] * Param[1] ### production store level (mm) RunOptions$IniStates[2] <- RunOptions$IniResLevels[2] * Param[3] ### routing store level (mm) } - + ## Call GR model Fortan - RESULTS <- .Fortran("frun_gr5j", PACKAGE = "airGR", + RESULTS <- .Fortran("frun_gr5j", PACKAGE = "airGR", ## inputs LInputs = LInputSeries, ### length of input and output series InputsPrecip = InputsModel$Precip[IndPeriod1], ### input series of total precipitation [mm/d] @@ -88,43 +62,17 @@ RunModel_GR5J <- function(InputsModel, RunOptions, Param) { RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA if (ExportStateEnd) { RESULTS$StateEnd[-3L] <- ifelse(RESULTS$StateEnd[-3L] < 0, 0, RESULTS$StateEnd[-3L]) ### remove negative values except for the ExpStore location - RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_GR5J, InputsModel = InputsModel, - ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = NULL, + RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_GR5J, InputsModel = InputsModel, + ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = NULL, UH1 = NULL, - UH2 = RESULTS$StateEnd[(1:40) + (7+20)], - GCemaNeigeLayers = NULL, eTGCemaNeigeLayers = NULL, + UH2 = RESULTS$StateEnd[(1:40) + (7+20)], + GCemaNeigeLayers = NULL, eTGCemaNeigeLayers = NULL, verbose = FALSE) } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "daily", "GR") - return(OutputsModel) - + + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/RunModel_GR6J.R b/R/RunModel_GR6J.R index 572511f71610a75c262d34317ecfe6de8c4f7295..659a0b5cbece1c88aa883fc3a5d4247fccd0f98e 100644 --- a/R/RunModel_GR6J.R +++ b/R/RunModel_GR6J.R @@ -1,35 +1,9 @@ RunModel_GR6J <- function(InputsModel, RunOptions, Param) { - - - ## Initialization of variables - NParam <- 6 - FortranOutputs <- .FortranOutputs(GR = "GR6J")$GR - - - ## Arguments check - if (!inherits(InputsModel, "InputsModel")) { - stop("'InputsModel' must be of class 'InputsModel'") - } - if (!inherits(InputsModel, "daily")) { - stop("'InputsModel' must be of class 'daily'") - } - if (!inherits(InputsModel, "GR")) { - stop("'InputsModel' must be of class 'GR'") - } - if (!inherits(RunOptions, "RunOptions")) { - stop("'RunOptions' must be of class 'RunOptions'") - } - if (!inherits(RunOptions, "GR")) { - stop("'RunOptions' must be of class 'GR'") - } - if (!is.vector(Param) | !is.numeric(Param)) { - stop("'Param' must be a numeric vector") - } - if (sum(!is.na(Param)) != NParam) { - stop(paste("'Param' must be a vector of length", NParam, "and contain no NA")) - } + + .ArgumentsCheckGR(InputsModel, RunOptions, Param) + Param <- as.double(Param) - + Param_X1X3X6_threshold <- 1e-2 Param_X4_threshold <- 0.5 if (Param[1L] < Param_X1X3X6_threshold) { @@ -47,8 +21,8 @@ RunModel_GR6J <- function(InputsModel, RunOptions, Param) { if (Param[6L] < Param_X1X3X6_threshold) { warning(sprintf("Param[6] (X6: coefficient for emptying exponential store [mm]) < %.2f\n X6 set to %.2f", Param_X1X3X6_threshold, Param_X1X3X6_threshold)) Param[6L] <- Param_X1X3X6_threshold - } - + } + ## Input data preparation if (identical(RunOptions$IndPeriod_WarmUp, 0L)) { RunOptions$IndPeriod_WarmUp <- NULL @@ -56,25 +30,25 @@ RunModel_GR6J <- function(InputsModel, RunOptions, Param) { IndPeriod1 <- c(RunOptions$IndPeriod_WarmUp, RunOptions$IndPeriod_Run) LInputSeries <- as.integer(length(IndPeriod1)) if ("all" %in% RunOptions$Outputs_Sim) { - IndOutputs <- as.integer(1:length(FortranOutputs)) + IndOutputs <- as.integer(1:length(RunOptions$FortranOutputs$GR)) } else { - IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + IndOutputs <- which(RunOptions$FortranOutputs$GR %in% RunOptions$Outputs_Sim) } - + ## Output data preparation IndPeriod2 <- (length(RunOptions$IndPeriod_WarmUp)+1):LInputSeries ExportDatesR <- "DatesR" %in% RunOptions$Outputs_Sim ExportStateEnd <- "StateEnd" %in% RunOptions$Outputs_Sim - + ## Use of IniResLevels if (!is.null(RunOptions$IniResLevels)) { RunOptions$IniStates[1] <- RunOptions$IniResLevels[1] * Param[1] ### production store level (mm) RunOptions$IniStates[2] <- RunOptions$IniResLevels[2] * Param[3] ### routing store level (mm) RunOptions$IniStates[3] <- RunOptions$IniResLevels[3] ### exponential store level (mm) } - + ## Call GR model Fortan - RESULTS <- .Fortran("frun_gr6j", PACKAGE = "airGR", + RESULTS <- .Fortran("frun_gr6j", PACKAGE = "airGR", ## inputs LInputs = LInputSeries, ### length of input and output series InputsPrecip = InputsModel$Precip[IndPeriod1], ### input series of total precipitation [mm/d] @@ -93,43 +67,17 @@ RunModel_GR6J <- function(InputsModel, RunOptions, Param) { RESULTS$StateEnd[RESULTS$StateEnd <= -99e8] <- NA if (ExportStateEnd) { RESULTS$StateEnd[-3L] <- ifelse(RESULTS$StateEnd[-3L] < 0, 0, RESULTS$StateEnd[-3L]) ### remove negative values except for the ExpStore location - RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_GR6J, InputsModel = InputsModel, - ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = RESULTS$StateEnd[3L], + RESULTS$StateEnd <- CreateIniStates(FUN_MOD = RunModel_GR6J, InputsModel = InputsModel, + ProdStore = RESULTS$StateEnd[1L], RoutStore = RESULTS$StateEnd[2L], ExpStore = RESULTS$StateEnd[3L], UH1 = RESULTS$StateEnd[(1:20) + 7], - UH2 = RESULTS$StateEnd[(1:40) + (7+20)], - GCemaNeigeLayers = NULL, eTGCemaNeigeLayers = NULL, + UH2 = RESULTS$StateEnd[(1:40) + (7+20)], + GCemaNeigeLayers = NULL, eTGCemaNeigeLayers = NULL, verbose = FALSE) } - - ## Output data preparation - ## OutputsModel only - if (!ExportDatesR & !ExportStateEnd) { - OutputsModel <- lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]) - names(OutputsModel) <- FortranOutputs[IndOutputs] - } - ## DatesR and OutputsModel only - if (ExportDatesR & !ExportStateEnd) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i])) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs]) - } - ## OutputsModel and StateEnd only - if (!ExportDatesR & ExportStateEnd) { - OutputsModel <- c(lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c(FortranOutputs[IndOutputs], "StateEnd") - } - ## DatesR and OutputsModel and StateEnd - if ((ExportDatesR & ExportStateEnd) | "all" %in% RunOptions$Outputs_Sim) { - OutputsModel <- c(list(InputsModel$DatesR[RunOptions$IndPeriod_Run]), - lapply(seq_len(RESULTS$NOutputs), function(i) RESULTS$Outputs[IndPeriod2, i]), - list(RESULTS$StateEnd)) - names(OutputsModel) <- c("DatesR", FortranOutputs[IndOutputs], "StateEnd") - } - - ## End - rm(RESULTS) - class(OutputsModel) <- c("OutputsModel", "daily", "GR") - return(OutputsModel) - + + ## OutputsModel generation + .GetOutputsModelGR(InputsModel, + RunOptions, + RESULTS, + LInputSeries) } diff --git a/R/Utils.R b/R/Utils.R index 6aa1f33f9e5dafbef3ca55578ce38f55c50765bb..27fad0b4c5715a4ce0a56d8f60a01f6354168039 100644 --- a/R/Utils.R +++ b/R/Utils.R @@ -71,6 +71,7 @@ stop("the time step of the model inputs must be ", res$TimeUnit) } } + res$CodeModHydro <- gsub("CemaNeige", "", res$CodeMod) return(res) } } diff --git a/R/UtilsRunModel.R b/R/UtilsRunModel.R new file mode 100644 index 0000000000000000000000000000000000000000..c5f861fb3789df1654d2b2fc9ce4da97efa0b064 --- /dev/null +++ b/R/UtilsRunModel.R @@ -0,0 +1,98 @@ +#' Create `OutputsModel` for GR non-Cemaneige models +#' +#' @param InputsModel output of [CreateInputsModel] +#' @param RunOptions output of [CreateRunOptions] +#' @param RESULTS outputs of [.Fortran] +#' @param LInputSeries number of time steps of warm-up + run periods +#' @param CemaNeigeLayers outputs of Cemaneige pre-process +#' +#' @return OutputsModel object +#' @noRd +#' +.GetOutputsModelGR <- function(InputsModel, + RunOptions, + RESULTS, + LInputSeries, + CemaNeigeLayers = NULL) { + + IndPeriod2 <- (length(RunOptions$IndPeriod_WarmUp)+1):LInputSeries + FortranOutputs <- RunOptions$FortranOutputs$GR + + if ("all" %in% RunOptions$Outputs_Sim) { + IndOutputs <- as.integer(1:length(FortranOutputs)) + } else { + IndOutputs <- which(FortranOutputs %in% RunOptions$Outputs_Sim) + } + + OutputsModel <- list() + + if("DatesR" %in% RunOptions$Outputs_Sim) { + OutputsModel$DatesR <- InputsModel$DatesR[RunOptions$IndPeriod_Run] + } + + seqOutputs <- seq_len(RESULTS$NOutputs) + names(seqOutputs) <- FortranOutputs[IndOutputs] + + OutputsModel <- c(OutputsModel, + lapply(seqOutputs, function(i) RESULTS$Outputs[IndPeriod2, i])) + + if(!is.null(CemaNeigeLayers)) { + OutputsModel$CemaNeigeLayers <- CemaNeigeLayers + } + + if("StateEnd" %in% RunOptions$Outputs_Sim) { + OutputsModel$StateEnd <- RESULTS$StateEnd + } + + class(OutputsModel) <- c("OutputsModel", class(RunOptions)[-1]) + + return(OutputsModel) +} + + +#' Check arguments of `RunModel_*GR*` functions +#' +#' @param InputsModel see [CreateInputsModel] +#' @param RunOptions see [CreateRunOptions] +#' @param Param [numeric] [vector] model calibration parameters +#' +#' @return [NULL] +#' @noRd +#' +.ArgumentsCheckGR <- function(InputsModel, RunOptions, Param) { + if (!inherits(InputsModel, "InputsModel")) { + stop("'InputsModel' must be of class 'InputsModel'") + } + if (!inherits(InputsModel, RunOptions$FeatFUN_MOD$TimeUnit)) { + stop("'InputsModel' must be of class '", RunOptions$FeatFUN_MOD$TimeUnit, "'") + } + if (!inherits(InputsModel, "GR")) { + stop("'InputsModel' must be of class 'GR'") + } + if (class(RunOptions)[1] != "RunOptions") { + if (!inherits(RunOptions, "RunOptions")) { + stop("'RunOptions' must be of class 'RunOptions'") + } else { + stop("'RunOptions' class of 'RunOptions' must be in first position") + } + } + if (!inherits(RunOptions, "GR")) { + stop("'RunOptions' must be of class 'GR'") + } + + if ("CemaNeige" %in% RunOptions$FeatFUN_MOD$Class) { + if (!inherits(InputsModel, "CemaNeige")) { + stop("'InputsModel' must be of class 'CemaNeige'") + } + if (!inherits(RunOptions, "CemaNeige")) { + stop("'RunOptions' must be of class 'CemaNeige'") + } + } + + if (!is.vector(Param) | !is.numeric(Param)) { + stop("'Param' must be a numeric vector") + } + if (sum(!is.na(Param)) != RunOptions$FeatFUN_MOD$NbParam) { + stop(paste("'Param' must be a vector of length", RunOptions$FeatFUN_MOD$NbParam, "and contain no NA")) + } +} diff --git a/data-raw/vignettes.R b/data-raw/vignettes.R new file mode 100644 index 0000000000000000000000000000000000000000..618fb37da8b32c31d036b6dd385f324cfb51766e --- /dev/null +++ b/data-raw/vignettes.R @@ -0,0 +1,25 @@ +## code to prepare datasets used in vignettes +library(airGR) + +source("tests/testthat/helper_vignettes.R") + +# V02.1_param_optim +RunVignetteChunks("V02.1_param_optim") +save(resGLOB, resPORT, + file = "inst/vignettesData/vignetteParamOptim.rda", + version = 2) +save(algo, Ind_Run, InputsCrit_inv, InputsModel, MOptimGR4J, optMO, RunOptions, + file = "inst/vignettesData/vignetteParamOptimCaramel.rda", + version = 2) + +# V02.2_param_mcmc +RunVignetteChunks("V02.2_param_mcmc") +save(gelRub, multDRAM, + file = "inst/vignettesData/vignetteParamMCMC.rda", + version = 2) + +# V04_cemaneige_hysteresis +RunVignetteChunks("V04_cemaneige_hysteresis") +save(OutputsCrit_Cal, OutputsCrit_Cal_NoHyst, OutputsCrit_Val, OutputsCrit_Val_NoHyst, + file = "inst/vignettesData/vignetteParamMCMC.rda", + version = 2) diff --git a/inst/vignettesData/vignetteParamOptimCaramel.rda b/inst/vignettesData/vignetteParamOptimCaramel.rda index 7d2e9fcc41220cab22fa5b1e57e7c666ef74803e..adf9461d0a5e0e4dd70f5b55034920aaa28e84c2 100644 Binary files a/inst/vignettesData/vignetteParamOptimCaramel.rda and b/inst/vignettesData/vignetteParamOptimCaramel.rda differ diff --git a/tests/testthat/helper_vignettes.R b/tests/testthat/helper_vignettes.R index 931f99a55ee90fa4417040a36b58f66220aaac71..687101be34de23f4cdb031114a82d4a0ff4bd71f 100644 --- a/tests/testthat/helper_vignettes.R +++ b/tests/testthat/helper_vignettes.R @@ -73,6 +73,9 @@ RunVignetteChunks <- function(vignette, if(file.exists(sprintf("../../vignettes/%s.Rmd", vignette))) { # testthat context in development environnement RunRmdChunks(sprintf("../../vignettes/%s.Rmd", vignette), tmpFolder, force.eval) + } else if(file.exists(sprintf("vignettes/%s.Rmd", vignette))) { + # context in direct run in development environnement + RunRmdChunks(sprintf("vignettes/%s.Rmd", vignette), tmpFolder, force.eval) } else { # R CMD check context in package environnement RunRmdChunks(system.file(sprintf("doc/%s.Rmd", vignette), package = "airGR"), tmpFolder, force.eval) diff --git a/vignettes/V02.1_param_optim.Rmd b/vignettes/V02.1_param_optim.Rmd index bcd3f3e8d21ef017391aaac5f94c8a61650678bc..7ded694184a5c890656f25e7c90b3ca044d9e145 100644 --- a/vignettes/V02.1_param_optim.Rmd +++ b/vignettes/V02.1_param_optim.Rmd @@ -269,7 +269,7 @@ ggplot() + theme_bw() ``` -The pameter sets can be viewed in the parameter space, illustrating different populations. +The parameter sets can be viewed in the parameter space, illustrating different populations. ```{r fig.height=6, fig.width=6, message=FALSE, warning=FALSE} param_optMO <- apply(optMO$parameters, MARGIN = 1, FUN = function(x) {