From 5951ebb91602c28ecd1b155186c3ad12ce71e321 Mon Sep 17 00:00:00 2001
From: Delaigue Olivier <olivier.delaigue@irstea.priv>
Date: Mon, 1 Apr 2019 16:38:29 +0200
Subject: [PATCH] v1.2.13.0 NEW: add ISHyst argument in CreateIniStates

---
 DESCRIPTION            |  2 +-
 NEWS.rmd               |  4 ++--
 R/CreateIniStates.R    | 46 ++++++++++++++++++++++++++++++++++--------
 man/CreateIniStates.Rd |  4 +++-
 4 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index 556e94cf..a4d98026 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,7 +1,7 @@
 Package: airGR
 Type: Package
 Title: Suite of GR Hydrological Models for Precipitation-Runoff Modelling
-Version: 1.2.12.34
+Version: 1.2.13.0
 Date: 2019-04-01
 Authors@R: c(
   person("Laurent", "Coron", role = c("aut", "trl"), comment = c(ORCID = "0000-0002-1503-6204")),
diff --git a/NEWS.rmd b/NEWS.rmd
index 11251829..2a9a10a6 100644
--- a/NEWS.rmd
+++ b/NEWS.rmd
@@ -13,7 +13,7 @@ output:
 
 
 
-### 1.2.12.34 Release Notes (2019-04-01) 
+### 1.2.13.0 Release Notes (2019-04-01) 
 
 
 
@@ -41,7 +41,7 @@ output:
 
 - <code>CreateInputsCrit()</code> now returns a <code>idLayer</code> element to indicate which layer to use for SCA or SWE aggregation.
 
-- <code>CreateRunOptions()</code> now presents a <code>IsHyst</code> argument to give the possibility to use the hysteresis with CemaNeige. 
+- <code>CreateRunOptions()</code>, <code>CreateIniStates()</code> and <code>CreateCalibOptions()</code> now present a <code>IsHyst</code> argument to give the possibility to use the hysteresis with CemaNeige. 
 
 - <code>CreateRunOptions()</code> now presents a <code>warnings</code> argument to replace the verbose action (the <code>verbose</code> argument is kept to print messages).
 
diff --git a/R/CreateIniStates.R b/R/CreateIniStates.R
index 989b3426..17795fe9 100644
--- a/R/CreateIniStates.R
+++ b/R/CreateIniStates.R
@@ -1,4 +1,4 @@
-CreateIniStates <- function(FUN_MOD, InputsModel,
+CreateIniStates <- function(FUN_MOD, InputsModel, IsHyst = FALSE,
                             ProdStore = 350, RoutStore = 90, ExpStore = NULL,
                             UH1 = NULL, UH2 = NULL,
                             GCemaNeigeLayers = NULL, eTGCemaNeigeLayers = NULL,
@@ -44,7 +44,10 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
     BOOL <- TRUE
   }
   if (!BOOL) {
-    stop("Incorrect 'FUN_MOD' for use in 'CreateIniStates'")
+    stop("incorrect 'FUN_MOD' for use in 'CreateIniStates'")
+  }
+  if (!"CemaNeige" %in% ObjectClass & IsHyst) {
+    stop("'IsHyst' cannot be TRUE if CemaNeige is not used in 'FUN_MOD'")
   }
   
   ## check InputsModel
@@ -130,17 +133,32 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
     }
     UH2 <- rep(Inf, UH2n)
   }
-  if("CemaNeige" %in% ObjectClass &
+  if("CemaNeige" %in% ObjectClass & !IsHyst &
      (is.null(GCemaNeigeLayers) | is.null(eTGCemaNeigeLayers))) {
-    stop(sprintf("'%s' need values for 'GCemaNeigeLayers' and 'GCemaNeigeLayers'", nameFUN_MOD))
+      stop(sprintf("'%s' need values for 'GCemaNeigeLayers' and 'GCemaNeigeLayers'", nameFUN_MOD))
+  }
+  if("CemaNeige" %in% ObjectClass & IsHyst &
+     (is.null(GCemaNeigeLayers) | is.null(eTGCemaNeigeLayers) |
+      is.null(GthrCemaNeigeLayers) | is.null(GlocmaxCemaNeigeLayers))) {
+    stop(sprintf("'%s' need values for 'GCemaNeigeLayers', 'GCemaNeigeLayers', 'GthrCemaNeigeLayers' and 'GlocmaxCemaNeigeLayers'", nameFUN_MOD))
+  }
+  if("CemaNeige" %in% ObjectClass & !IsHyst &
+     (!is.null(GthrCemaNeigeLayers) | !is.null(GlocmaxCemaNeigeLayers))) {
+    if (verbose) {
+      warning(sprintf("'%s' does not require 'GthrCemaNeigeLayers' and 'GlocmaxCemaNeigeLayers'. Values set to NA", nameFUN_MOD))
+    }
+    GthrCemaNeigeLayers    <- Inf
+    GlocmaxCemaNeigeLayers <- Inf 
   }
   if(!"CemaNeige" %in% ObjectClass &
-     (!is.null(GCemaNeigeLayers) | !is.null(eTGCemaNeigeLayers))) {
+     (!is.null(GCemaNeigeLayers) | !is.null(eTGCemaNeigeLayers) | !is.null(GthrCemaNeigeLayers) | !is.null(GlocmaxCemaNeigeLayers))) {
     if (verbose) {
-      warning(sprintf("'%s' does not require 'GCemaNeigeLayers' and 'GCemaNeigeLayers'. Values set to NA", nameFUN_MOD))
+      warning(sprintf("'%s' does not require 'GCemaNeigeLayers' 'GCemaNeigeLayers', 'GthrCemaNeigeLayers' and 'GlocmaxCemaNeigeLayers'. Values set to NA", nameFUN_MOD))
     }
-    GCemaNeigeLayers   <- Inf
-    eTGCemaNeigeLayers <- Inf
+    GCemaNeigeLayers       <- Inf
+    eTGCemaNeigeLayers     <- Inf
+    GthrCemaNeigeLayers    <- Inf
+    GlocmaxCemaNeigeLayers <- Inf    
   }
   
   
@@ -222,6 +240,14 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
   if (!is.numeric(eTGCemaNeigeLayers) || length(eTGCemaNeigeLayers) != NLayers) {
     stop(sprintf("'eTGCemaNeigeLayers' must be numeric of length %i", NLayers))
   }
+  if (IsHyst) {
+    if (!is.numeric(GthrCemaNeigeLayers) || length(GthrCemaNeigeLayers) != NLayers) {
+      stop(sprintf("'eTGCemaNeigeLayers' must be numeric of length %i", NLayers))
+    }
+    if (!is.numeric(GlocmaxCemaNeigeLayers) || length(GlocmaxCemaNeigeLayers) != NLayers) {
+      stop(sprintf("'eTGCemaNeigeLayers' must be numeric of length %i", NLayers))
+    }
+  }
   
 
   ## format output
@@ -234,6 +260,10 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
   IniStatesNA <- relist(IniStatesNA, skeleton = IniStates)
   
   class(IniStatesNA) <- c("IniStates", ObjectClass)
+  if(IsHyst) {
+    class(IniStatesNA) <- c(class(IniStatesNA), "hysteresis")
+  }
+  
   return(IniStatesNA)
   
   
diff --git a/man/CreateIniStates.Rd b/man/CreateIniStates.Rd
index f6ab0da1..430c642a 100644
--- a/man/CreateIniStates.Rd
+++ b/man/CreateIniStates.Rd
@@ -9,7 +9,7 @@
 
 
 \usage{
-CreateIniStates(FUN_MOD, InputsModel,
+CreateIniStates(FUN_MOD, InputsModel, IsHyst = FALSE,
   ProdStore = 350, RoutStore = 90, ExpStore = NULL,
   UH1 = NULL, UH2 = NULL,
   GCemaNeigeLayers = NULL, eTGCemaNeigeLayers = NULL,
@@ -23,6 +23,8 @@ CreateIniStates(FUN_MOD, InputsModel,
 
 \item{InputsModel}{[object of class \code{InputsModel}] see \code{\link{CreateInputsModel}} for details}
 
+\item{IsHyst}{[boolean] boolean indicating if the hysteresis version of CemaNeige is used. See details}
+
 \item{ProdStore}{[numeric] production store level [mm]}
 
 \item{RoutStore}{[numeric] routing store level [mm]}
-- 
GitLab