From 8734217975bd68d35f794a6fa8ace8994cc3cf96 Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Tue, 7 Nov 2017 14:40:44 +0100
Subject: [PATCH] =?UTF-8?q?-=20remous=20:=20correction=20d'un=20bug=20dans?=
 =?UTF-8?q?=20le=20calcul=20du=20param=C3=A8tre=20suppl=C3=A9mentaire=20-?=
 =?UTF-8?q?=20ajout=20de=20tests=20unitaires=20sur=20le=20calcul=20du=20pa?=
 =?UTF-8?q?ram=C3=A8tre=20suppl=C3=A9mentaire?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/remous_trapez.spec.ts | 98 +++++++++++++++++++++++++++-----------
 src/remous.ts              | 19 +++++---
 2 files changed, 83 insertions(+), 34 deletions(-)

diff --git a/spec/remous_trapez.spec.ts b/spec/remous_trapez.spec.ts
index 9010db27..975dc726 100644
--- a/spec/remous_trapez.spec.ts
+++ b/spec/remous_trapez.spec.ts
@@ -3,31 +3,10 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
+import { compareObject, compareArray } from "./nubtest";
 
-function compObject(s: string, arr1: { [key: number]: number }, arr2: { [key: number]: number }) {
-    expect(Object.keys(arr1).length).toEqual(Object.keys(arr2).length, s + ": longueur incorrecte");
-
-    let arrVals: number[] = [];
-    for (let i in arr1) {
-        let v1: number = arr1[i];
-        let v2: number = arr2[i];
-        expect(equalEpsilon(v1, v2)).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + " " + v2);
-    }
-}
-
-function compArray(s: string, arr1: string[], arr2: number[]) {
-    expect(arr1.length).toEqual(arr2.length);
-
-    let arrVals: number[] = [];
-    for (let i = 0; i < arr1.length; i++) {
-        let v1: number = +arr1[i];
-        let v2: number = arr2[i];
-        expect(equalEpsilon(v1, v2)).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + " " + v2);
-    }
-}
-
-xdescribe('Class Remous / section trapèze :', () => {
-    describe('méthode trapèzes :', () => {
+describe('Class Remous / section trapèze :', () => {
+    xdescribe('méthode trapèzes :', () => {
         it('test 1', () => {
             let prms = new ParamsSectionTrapez(2.5, // largeur de fond
                 0.56, // fruit
@@ -54,13 +33,78 @@ xdescribe('Class Remous / section trapèze :', () => {
             let res = rem.calculRemous(undefined);
 
             let f = { 9: 0.278, 10: 0.4 };
-            compObject("Yfluvial", res["flu"], f);
+            compareObject("Yfluvial", res["flu"], f, precDist);
 
             let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.4 };
-            compObject("Ytorrentiel", res["tor"], t);
+            compareObject("Ytorrentiel", res["tor"], t, precDist);
 
             let x = [0.000, 1.000, 2.000, 3.000, 4.000, 5.000, 6.000, 7.000, 8.000, 9.000, 10.000];
-            compArray("abcisses", res["trX"], x);
+            compareArray("abcisses", res["trX"], x);
+        });
+    });
+
+    describe('paramètre à calculer :', () => {
+        it('Hs (test 1)', () => {
+            let prms = new ParamsSectionTrapez(
+                2.5, // largeur de fond
+                0.56, // fruit
+                1, // tirant d'eau
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                0.001, // précision
+                1 // YB=hauteur de berge
+            );
+
+            let sect = new cSnTrapez(undefined, prms);
+
+            let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
+                0.4, // Yaval    = tirant aval
+                100,  // Long= Longueur du bief
+                5,  // Dx=Pas d'espace
+                MethodeResolution.Trapezes
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(prem, log);
+
+            let res = rem.calculRemous("Hs");
+
+            // données de validation : version PHP (oct 2017)
+            let hs = { 0.000: 1.507, 5.000: 0.735, 10.000: 0.731, 15.000: 0.727, 20.000: 0.723, 25.000: 0.719, 30.000: 0.715, 35.000: 0.71, 40.000: 0.704, 45.000: 0.699, 50.000: 0.693, 55.000: 0.687, 60.000: 0.68, 65.000: 0.673, 70.000: 0.665, 75.000: 0.656, 80.000: 0.646, 85.000: 0.634, 90.000: 0.62, 95.000: 0.603, 100.000: 0.572 };
+            compareObject("Hs", res["tRes"], hs, 0.002);
+        });
+
+        it('Hs (test 2)', () => {
+            let prms = new ParamsSectionTrapez(
+                2.5, // largeur de fond
+                0.56, // fruit
+                1, // tirant d'eau
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                0.001, // précision
+                1 // YB=hauteur de berge
+            );
+
+            let sect = new cSnTrapez(undefined, prms);
+
+            let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
+                1, // Yaval    = tirant aval
+                8,  // Long= Longueur du bief
+                0.1,  // Dx=Pas d'espace
+                MethodeResolution.Trapezes
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(prem, log);
+
+            let res = rem.calculRemous("Hs");
+
+            // données de validation : version PHP (oct 2017)
+            // ici j'ai supprimé un point (x=2.5)
+            let hs = { 0.000: 1.507, 2.600: 0.753, 2.700: 0.757, 2.800: 0.762, 2.900: 0.767, 3.000: 0.771, 3.100: 0.776, 3.200: 0.781, 3.300: 0.786, 3.400: 0.79, 3.500: 0.795, 3.600: 0.8, 3.700: 0.805, 3.800: 0.81, 3.900: 0.814, 4.000: 0.819, 4.100: 0.824, 4.200: 0.829, 4.300: 0.834, 4.400: 0.839, 4.500: 0.844, 4.600: 0.849, 4.700: 0.854, 4.800: 0.859, 4.900: 0.864, 5.000: 0.869, 5.100: 0.874, 5.200: 0.879, 5.300: 0.884, 5.400: 0.889, 5.500: 0.894, 5.600: 0.899, 5.700: 0.904, 5.800: 0.909, 5.900: 0.914, 6.000: 0.919, 6.100: 0.924, 6.200: 0.929, 6.300: 0.934, 6.400: 0.939, 6.500: 0.944, 6.600: 0.95, 6.700: 0.955, 6.800: 0.96, 6.900: 0.965, 7.000: 0.97, 7.100: 0.975, 7.200: 0.98, 7.300: 0.986, 7.400: 0.991, 7.500: 0.996, 7.600: 1.001, 7.700: 1.006, 7.800: 1.012, 7.900: 1.017, 8.000: 1.022 };
+            compareObject("Hs", res["tRes"], hs, 0.009);
         });
     });
 });
diff --git a/src/remous.ts b/src/remous.ts
index e023d29d..4eff52f5 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -644,19 +644,24 @@ export class CourbeRemous extends Nub {
 		if (val_a_cal != undefined && nFlu != 0 && nTor != 0) {
 			for (let rX of trX) {
 				let rY = undefined;
+				let hasFlu: boolean = crbFlu[+rX] != undefined;
+				let hasTor: boolean = crbTor[+rX] != undefined;
 
-				if (crbFlu[+rX] != undefined && crbTor[+rX] == undefined) {
+				if (hasFlu && !hasTor)
 					rY = crbFlu[+rX];
-				}
-				if (crbTor[+rX] != undefined) {
-					if (crbFlu[+rX] == undefined || (crbFlu[+rX] != undefined && crbFlu[+rX] == crbTor[+rX])) {
+
+				if (hasTor)
+					if (!hasFlu || (hasFlu && crbFlu[+rX] == crbTor[+rX]))
 						rY = crbTor[+rX];
-					}
 
-					if (rY != undefined)
-						tRes[+rX] = this.Sn.Calc(val_a_cal, rY);
+				if (rY != undefined) {
+					tRes[+rX] = this.Sn.Calc(val_a_cal, rY);
+					this.debug('X=' + rX + ' Calc(' + val_a_cal + ', Y=' + rY + ')=' + tRes[+rX]);
 				}
 			}
+
+			this.debug("extra param " + val_a_cal);
+			this.logObject(tRes);
 		}
 
 		return { "flu": crbFlu, "tor": crbTor, "trX": trX, "tRes": tRes };
-- 
GitLab