From 19d089805b723cddb26e00c597d86d8b7f35a8bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr>
Date: Fri, 10 Feb 2023 12:42:26 +0100
Subject: [PATCH] fix: set Z1 to ZDV when Q=0 for non submerged structure

refs #219
---
 .../structure_jalhyd219_debit_nul.spec.ts     | 40 +++++++++++++++++++
 src/structure/structure.ts                    |  7 +++-
 2 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 spec/structure/structure_jalhyd219_debit_nul.spec.ts

diff --git a/spec/structure/structure_jalhyd219_debit_nul.spec.ts b/spec/structure/structure_jalhyd219_debit_nul.spec.ts
new file mode 100644
index 00000000..15d0a2f7
--- /dev/null
+++ b/spec/structure/structure_jalhyd219_debit_nul.spec.ts
@@ -0,0 +1,40 @@
+import { RectangularStructureParams, StructureWeirFree } from "../../src/internal_modules";
+
+describe("jalhyd#219 cote amont d'un ouvrage dénoyé à débit nul :", () => {
+    function createStruct(z1: number, zr: number): StructureWeirFree {
+        const s: StructureWeirFree = new StructureWeirFree(
+            new RectangularStructureParams(0, // Q
+                zr, // ZDV
+                z1, // Z1
+                92, // Z2
+                1, // L
+                0.6, // Cd
+                0.8 // W
+            ),
+            false
+        );
+        s.calculatedParam = s.prms.Z1;
+        return s;
+    }
+
+    it("cote amont initiale < Zr", () => {
+        const z1: number = 90;
+        const zr: number = 100;
+        const s: StructureWeirFree = createStruct(z1, zr);
+        expect(s.CalcSerie().vCalc).toBeCloseTo(zr, 3);
+    });
+
+    it("cote amont initiale = Zr", () => {
+        const z1: number = 100;
+        const zr: number = 100;
+        const s: StructureWeirFree = createStruct(z1, zr);
+        expect(s.CalcSerie().vCalc).toBeCloseTo(zr, 3);
+    });
+
+    it("cote amont initiale > Zr", () => {
+        const z1: number = 110;
+        const zr: number = 100;
+        const s: StructureWeirFree = createStruct(z1, zr);
+        expect(s.CalcSerie().vCalc).toBeCloseTo(zr, 3);
+    });
+});
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index 0363d513..09e64c33 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -194,10 +194,13 @@ export abstract class Structure extends ChildNub {
             // Débit nul <=> tirant d'eau amont = tirant d'eau aval ou tout autre paramètre nul
             switch (sVarCalc) {
                 case "Z1":
-                    this.currentResultElement = new Result(this.prms.Z2.v, this, flagsNull);
+                    // max(Z2,ZDV) dans le cas dénoyé et noyé
+                    // on met Z1 à ZDV pour faciliter les calculs sur les prébarrages
+                    this.currentResultElement = new Result(Math.max(this.prms.Z2.v, this.prms.ZDV.v), this, flagsNull);
                     return this._result;
                 case "Z2":
-                    this.currentResultElement = new Result(this.prms.Z1.v, this, flagsNull);
+                    // max(Z1,ZDV) dans le cas dénoyé et noyé
+                    this.currentResultElement = new Result(Math.max(this.prms.Z1.v, this.prms.ZDV.v), this, flagsNull);
                     return this._result;
                 default:
                     // Est-ce toujours vrai ? Nécessitera peut-être d'étendre la méthode
-- 
GitLab