From 7209968301ec793c5b46ec04dd973b71ea087c5d Mon Sep 17 00:00:00 2001
From: David <david.dorchies@inrae.fr>
Date: Tue, 31 Dec 2024 16:40:30 +0100
Subject: [PATCH] fix(serializeIniStates): format IniStates as in
 CreateRunOptions

Refs #179
---
 R/RunModel.GRiwrmOutputsModel.R |  2 +-
 R/RunModel.Supervisor.R         |  2 +-
 R/utils.RunModel.R              | 20 +++++++++++++++++++-
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/R/RunModel.GRiwrmOutputsModel.R b/R/RunModel.GRiwrmOutputsModel.R
index cf8d00d..878e614 100644
--- a/R/RunModel.GRiwrmOutputsModel.R
+++ b/R/RunModel.GRiwrmOutputsModel.R
@@ -73,7 +73,7 @@ RunModel.GRiwrmOutputsModel <- function(x,
   for (id in names(RunOptions)) {
     # Run model for the sub-basin and one time step
     RunOptions[[id]]$IniResLevels <- NULL
-    RunOptions[[id]]$IniStates <- serializeIniStates(x[[id]]$StateEnd)
+    RunOptions[[id]]$IniStates <- serializeIniStates(x[[id]]$StateEnd, InputsModel[[id]])
     RunOptions[[id]]$IndPeriod_WarmUp <- 0L
     RunOptions[[id]]$IndPeriod_Run <- IndPeriod_Run
   }
diff --git a/R/RunModel.Supervisor.R b/R/RunModel.Supervisor.R
index 57a59f2..2959122 100644
--- a/R/RunModel.Supervisor.R
+++ b/R/RunModel.Supervisor.R
@@ -120,7 +120,7 @@ RunModel.Supervisor <- function(x, RunOptions, Param, ...) {
     # Loop over sub-basin using SD model
     for (id in SD_Ids) {
       # Run model for the sub-basin and one time step
-      RunOptions[[id]]$IniStates <- serializeIniStates(x$OutputsModel[[id]]$StateEnd)
+      RunOptions[[id]]$IniStates <- serializeIniStates(x$OutputsModel[[id]]$StateEnd, x$InputsModel[[id]])
       RunOptions[[id]]$IndPeriod_Run <- iTS
       # Route upstream flows for SD nodes
       if (x$InputsModel[[id]]$isReservoir) {
diff --git a/R/utils.RunModel.R b/R/utils.RunModel.R
index dbf187b..a881b67 100644
--- a/R/utils.RunModel.R
+++ b/R/utils.RunModel.R
@@ -60,8 +60,26 @@ OutputsModelQsim <- function(InputsModel, OutputsModel, IndPeriod_Run) {
 #' @return A vector as in `RunOptions$IniStates`
 #' @noRd
 #'
-serializeIniStates <- function(IniStates) {
+serializeIniStates <- function(IniStates, InputsModel) {
+  ObjectClass <- class(InputsModel)
+  if (!"CemaNeige" %in% ObjectClass && any(is.na(IniStates$CemaNeigeLayers$G))) {
+    IniStates$CemaNeigeLayers$G <- NULL
+  }
+  if (!"CemaNeige" %in% ObjectClass && any(is.na(IniStates$CemaNeigeLayers$eTG))) {
+    IniStates$CemaNeigeLayers$eTG <- NULL
+  }
+  if (!"CemaNeige" %in% ObjectClass && any(is.na(IniStates$CemaNeigeLayers$Gthr))) {
+    IniStates$CemaNeigeLayers$Gthr <- NULL
+  }
+  if (!"CemaNeige" %in% ObjectClass && any(is.na(IniStates$CemaNeigeLayers$Glocmax))) {
+    IniStates$CemaNeigeLayers$Glocmax <- NULL
+  }
+  IniStates$Store$Rest <- rep(NA, 3)
   IniStates <- unlist(IniStates)
+  IniStates[is.na(IniStates) & !grepl("SD", names(IniStates))] <- 0
+  if ("monthly" %in% ObjectClass) {
+    IniStates <- IniStates[seq_len(NState)]
+  }
   return(IniStates)
 }
 
-- 
GitLab