From 7fdd08de6431aa3dd0691b1aa7f9537b3788f648 Mon Sep 17 00:00:00 2001
From: Dorchies David <david.dorchies@inrae.fr>
Date: Mon, 12 Jul 2021 15:46:12 +0200
Subject: [PATCH] fix(RunModel_Lag): issues with warm-up, initial and end
 states

- Add explicit management of "QsimDown" and "Qsim_m3" items to OutputsModel
- Remove OutputsModel$StateEnd from regression tests because of changing in class sorting of IniStates object

Refs #132
---
 .regressionignore                  |  2 ++
 R/CreateRunOptions.R               |  3 +++
 R/RunModel_Lag.R                   | 13 ++++++++++---
 tests/testthat/test-RunModel_Lag.R |  8 ++++++++
 4 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/.regressionignore b/.regressionignore
index 43285f50..44aced51 100644
--- a/.regressionignore
+++ b/.regressionignore
@@ -13,8 +13,10 @@ Param_Sets_GR4J RunOptions_Cal
 Param_Sets_GR4J RunOptions_Val
 * OutputsModel$Param
 * OutputsModel$WarmUpQsim
+* OutputsModel$StateEnd
 Param_Sets_GR4J OutputsModel_Val
 RunModel_Lag InputsModel
+RunModel_Lag OutputsModel
 RunModel_Lag OutputsModelDown
 SeriesAggreg SimulatedMonthlyRegime
 * InputsCrit$FUN_CRIT
diff --git a/R/CreateRunOptions.R b/R/CreateRunOptions.R
index 8fd3022a..8f5235bb 100644
--- a/R/CreateRunOptions.R
+++ b/R/CreateRunOptions.R
@@ -303,6 +303,9 @@ CreateRunOptions <- function(FUN_MOD, InputsModel,
 
   ##Outputs_all
   Outputs_all <- c("DatesR", unlist(FortranOutputs), "WarmUpQsim", "StateEnd", "Param")
+  if (FeatFUN_MOD$IsSD) {
+    Outputs_all <- c(Outputs_all, "QsimDown", "Qsim_m3")
+  }
 
   ##check_Outputs_Sim
   if (!is.vector(Outputs_Sim)) {
diff --git a/R/RunModel_Lag.R b/R/RunModel_Lag.R
index dea36093..e6b8fe56 100644
--- a/R/RunModel_Lag.R
+++ b/R/RunModel_Lag.R
@@ -116,14 +116,21 @@ RunModel_Lag <- function(InputsModel, RunOptions, Param, QcontribDown) {
 
   ## OutputsModel
 
-  OutputsModel$Qsim_m3 <- Qsim_m3[IndPeriod2]
+  if ("Qsim_m3" %in% RunOptions$Outputs_Sim) {
+    OutputsModel$Qsim_m3 <- Qsim_m3[IndPeriod2]
+  }
 
   if ("Qsim" %in% RunOptions$Outputs_Sim) {
     # Convert back Qsim to mm
-    OutputsModel$Qsim <- OutputsModel$Qsim_m3 / sum(InputsModel$BasinAreas, na.rm = TRUE) / 1e3
+    OutputsModel$Qsim <- Qsim_m3[IndPeriod2] / sum(InputsModel$BasinAreas, na.rm = TRUE) / 1e3
     # message("Qsim: ", paste(OutputsModel$Qsim, collapse = ", "))
   }
 
+  if ("QsimDown" %in% RunOptions$Outputs_Sim) {
+    # Convert back Qsim to mm
+    OutputsModel$QsimDown <- QsimDown[IndPeriod2]
+  }
+
   # Warning for negative flows or NAs only in extended outputs
   if (length(RunOptions$Outputs_Sim) > 2) {
     if (any(OutputsModel$Qsim[!is.na(OutputsModel$Qsim)] < 0)) {
@@ -149,7 +156,7 @@ RunModel_Lag <- function(InputsModel, RunOptions, Param, QcontribDown) {
     # message("StateEnd: ", paste(OutputsModel$StateEnd$SD, collapse = ", "))
   }
   if ("WarmUpQsim" %in% RunOptions$Outputs_Sim) {
-    OutputsModel$WarmUpQsim <- Qsim_m3[seq_len(length(RunOptions$IndPeriod_WarmUp))]
+    OutputsModel$WarmUpQsim <- Qsim_m3[seq_len(length(RunOptions$IndPeriod_WarmUp))] / sum(InputsModel$BasinAreas, na.rm = TRUE) / 1e3
   }
 
   if ("Param" %in% RunOptions$Outputs_Sim) {
diff --git a/tests/testthat/test-RunModel_Lag.R b/tests/testthat/test-RunModel_Lag.R
index 374a797e..23889967 100644
--- a/tests/testthat/test-RunModel_Lag.R
+++ b/tests/testthat/test-RunModel_Lag.R
@@ -81,6 +81,14 @@ test_that("'QcontribDown$Qim' should have the same lenght as 'RunOptions$IndPeri
   )
 })
 
+test_that("OutputsModel must have a item 'QsimDown' equal to GR4J Qsim contribution", {
+  expect_equal(OutputsGR4JOnly$Qsim,
+               RunModel_Lag(InputsModel = InputsModel,
+                            RunOptions = RunOptions,
+                            Param = 1,
+                            QcontribDown = OutputsGR4JOnly)$QsimDown)
+})
+
 test_that("RunModel(FUN=RunModel_Lag) should give same result as RunModel_Lag", {
   QcontribDown <- OutputsGR4JOnly
   Output_RunModel_Lag <- RunModel_Lag(InputsModel = InputsModel,
-- 
GitLab