From bf090c778a7105001d03d82cb54e82fc2b1efef1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr>
Date: Fri, 14 Apr 2023 17:11:55 +0200
Subject: [PATCH] refactor: check submergence error only in
 Structure.Calc/CalcSerie

refs #302
---
 src/structure/parallel_structure.ts           | 21 +------------------
 src/structure/structure.ts                    | 21 ++++++++++++-------
 src/structure/structure_weir_submerged.ts     |  4 ++--
 .../structure_weir_submerged_larinier.ts      |  4 ++--
 src/util/result.ts                            |  9 --------
 src/util/resultelement.ts                     | 11 +++++++++-
 6 files changed, 29 insertions(+), 41 deletions(-)

diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index addfaac7..ce283b19 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -86,21 +86,7 @@ export class ParallelStructure extends Nub {
             this._result.globalLog.insert(new Message(MessageCode.ERROR_STRUCTURE_AU_MOINS_UNE));
             return this._result;
         }
-        const res = super.CalcSerie(rInit);
-
-        // si des erreurs/warnings sont survenus dans les structures, on les propage
-
-        for (const st of this.structures) {
-            this.result.globalLog.addLog(st.result.log);
-        }
-
-        // si une erreur d'ennoiement est survenue dans les structures, on annule les résultats
-
-        if (res.hasMessage(MessageCode.ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN, true)) {
-            res.removeValues();
-        }
-
-        return res;
+        return super.CalcSerie(rInit);
     }
 
     /**
@@ -177,11 +163,6 @@ export class ParallelStructure extends Nub {
                 this.result.globalLog.addLog(r.globalLog);
         }
 
-        // check structures submergence for some discharge laws
-        for (const st of this.structures) {
-            st.checkSubmergence();
-        }
-
         return this.result;
     }
 
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index e90938f0..4b9dff89 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -103,7 +103,17 @@ export abstract class Structure extends ChildNub {
     /**
      * fonction appelée dans Calc() pour vérifier l'ennoiement (cf. classes dérivées)
      */
-    public checkSubmergence() {
+    public checkSubmergence(res: Result) {
+    }
+
+
+    // si une erreur d'ennoiement est survenue, on annule les résultats
+    public static filterResultsOnSubmergenceError(res: Result): boolean {
+        if (res.resultElement.hasMessage(MessageCode.ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN)) {
+            res.resultElement.removeValues();
+            return true;
+        }
+        return false;
     }
 
     /** Constante utile : Racine de 2g */
@@ -295,12 +305,9 @@ export abstract class Structure extends ChildNub {
         }
 
         // Calcul normal hors débit nul
-        return super.Calc(sVarCalc, rInit);
-    }
-
-    public CalcSerie(rInit?: number, resetDepending: boolean = true): Result {
-        const res = super.CalcSerie(rInit, resetDepending);
-        this.checkSubmergence();
+        const res = super.Calc(sVarCalc, rInit);
+        this.checkSubmergence(res);
+        Structure.filterResultsOnSubmergenceError(res);
         return res;
     }
 
diff --git a/src/structure/structure_weir_submerged.ts b/src/structure/structure_weir_submerged.ts
index e5ef98b9..f4628730 100644
--- a/src/structure/structure_weir_submerged.ts
+++ b/src/structure/structure_weir_submerged.ts
@@ -22,8 +22,8 @@ export class StructureWeirSubmerged extends RectangularStructure {
     /**
      * vérification que l'ennoiement est supérieur à une valeur donnée
      */
-    public checkSubmergence() {
-        this.checkSubmergenceMin(0.6);
+    public checkSubmergence(res: Result) {
+        this.checkSubmergenceMin(res, 0.6);
     }
 
     public Calc(sVarCalc: string, rInit?: number): Result {
diff --git a/src/structure/structure_weir_submerged_larinier.ts b/src/structure/structure_weir_submerged_larinier.ts
index ca3843d0..9e7890f1 100644
--- a/src/structure/structure_weir_submerged_larinier.ts
+++ b/src/structure/structure_weir_submerged_larinier.ts
@@ -28,8 +28,8 @@ export class StructureWeirSubmergedLarinier extends RectangularStructure {
     /**
      * vérification que l'ennoiement est supérieur à une valeur donnée
      */
-    public checkSubmergence() {
-        this.checkSubmergenceMin(0.5);
+    public checkSubmergence(res: Result) {
+        this.checkSubmergenceMin(res, 0.5);
     }
 
     public Calc(sVarCalc: string, rInit?: number): Result {
diff --git a/src/util/result.ts b/src/util/result.ts
index 2a8746ff..8b3c60b2 100644
--- a/src/util/result.ts
+++ b/src/util/result.ts
@@ -357,13 +357,4 @@ export class Result extends JalhydObject {
             re.removeExtraResults();
         }
     }
-
-    /**
-     * Removes all values in result elements
-     */
-    public removeValues() {
-        for (const re of this._resultElements) {
-            re.removeValues();
-        }
-    }
 }
diff --git a/src/util/resultelement.ts b/src/util/resultelement.ts
index f9f054cd..72b4c02d 100644
--- a/src/util/resultelement.ts
+++ b/src/util/resultelement.ts
@@ -1,4 +1,4 @@
-import { cLog } from "../internal_modules";
+import { MessageCode, cLog } from "../internal_modules";
 import { Message, MessageSeverity } from "../internal_modules";
 import { Result } from "../internal_modules";
 
@@ -241,6 +241,15 @@ export class ResultElement {
         return false;
     }
 
+    public hasMessage(code: MessageCode): boolean {
+        for (const m of this.log.messages) {
+            if (m.code === code) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * compute error, warning, info count on all log messages
      */
-- 
GitLab