From ec18eb2e6407460103b9814dc1500c7bf2c0441f Mon Sep 17 00:00:00 2001
From: David <david.dorchies@inrae.fr>
Date: Thu, 11 May 2023 14:23:04 +0200
Subject: [PATCH] fix(RunModel.Supervisor): offset in node properties

In case of a network with disordered Diversions

Fix #126
---
 R/CreateSupervisor.R |  6 +-----
 R/utils.Supervisor.R | 10 +++++-----
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/R/CreateSupervisor.R b/R/CreateSupervisor.R
index 8af0483..24c9f5b 100644
--- a/R/CreateSupervisor.R
+++ b/R/CreateSupervisor.R
@@ -34,11 +34,7 @@ CreateSupervisor <- function(InputsModel, TimeStep = 1L) {
   e$InputsModel <- InputsModel
   e$griwrm <- attr(InputsModel, "GRiwrm")
   # Commands U are only applied on DirectInjection and Diversion
-  e$nodeProperties <- lapply(e$griwrm$id[getDiversionRows(e$griwrm, TRUE)],
-                             getNodeProperties,
-                             griwrm = e$griwrm)
-  names(e$nodeProperties) <- unique(e$griwrm$id)
-  dfNP <- do.call(rbind, lapply(e$nodeProperties, dplyr::bind_cols))
+  e$nodeProperties <- getAllNodesProperties(e$griwrm)
   models4U <- c("Diversion", "RunModel_Reservoir")
   e$griwrm4U <-
     e$griwrm[is.na(e$griwrm$model) |
diff --git a/R/utils.Supervisor.R b/R/utils.Supervisor.R
index 946ef64..4b80681 100644
--- a/R/utils.Supervisor.R
+++ b/R/utils.Supervisor.R
@@ -11,8 +11,8 @@ getDataFromLocation <- function(loc, sv) {
   if (length(grep("\\[[0-9]+\\]$", loc)) > 0) {
     stop("Reaching output of other controller is not implemented yet")
   } else {
-    if (!sv$nodeProperties[[loc]]$DirectInjection) {
-      if (sv$nodeProperties[[loc]]$Upstream) {
+    if (!sv$nodeProperties[loc, "DirectInjection"]) {
+      if (sv$nodeProperties[loc, "Upstream"]) {
         sv$OutputsModel[[loc]]$Qsim_m3[sv$ts.previous]
       } else {
         sv$OutputsModel[[loc]]$Qsim_m3
@@ -39,17 +39,17 @@ setDataToLocation <- function(ctrlr, sv) {
 
     locU <- ctrlr$Unames[i]
 
-    if (sv$nodeProperties[[locU]]$DirectInjection) {
+    if (sv$nodeProperties[locU, "DirectInjection"]) {
       # Direct injection node => update Qusptream of downstream node
       node <- sv$griwrm4U$down[sv$griwrm4U$id == locU]
       # ! Qupstream contains warm up period and run period => the index is shifted
       if(!is.null(sv$InputsModel[[node]])) {
         sv$InputsModel[[node]]$Qupstream[sv$ts.index0 + sv$ts.index, locU] <- U
       }
-    } else if (sv$nodeProperties[[locU]]$Diversion){
+    } else if (sv$nodeProperties[locU, "Diversion"]){
       # Diversion node => update Qdiv with -U
       sv$InputsModel[[locU]]$Qdiv[sv$ts.index0 + sv$ts.index] <- -U
-    } else if (sv$nodeProperties[[locU]]$Reservoir) {
+    } else if (sv$nodeProperties[locU, "Reservoir"]) {
       sv$InputsModel[[locU]]$Qrelease[sv$ts.index0 + sv$ts.index] <- U
     } else {
       stop("Node ", locU, " must be a Direct Injection or a Diversion node")
-- 
GitLab