From a65598f10817f3acf6f30cd9a36516b04874bf5c Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Wed, 7 Jun 2017 09:40:50 +0200
Subject: [PATCH] =?UTF-8?q?-=20classe=20acSection=20:=20=20=20.=20correcti?=
 =?UTF-8?q?on=20bug=20Calc=5FdR=20(parenth=C3=A8se=20manquante=20avant=20/?=
 =?UTF-8?q?)=20=20=20.=20suppression=20du=20param=C3=A8tre=20rY=20de=20Cal?=
 =?UTF-8?q?c=5FSYg()=20-=20d=C3=A9but=20des=20tests=20de=20la=20section=20?=
 =?UTF-8?q?param=C3=A9tr=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/section_param_rect_fluvial.spec.ts       | 116 ++++++++++++++++++
 spec/section_param_rect_torrentiel.spec.ts    | 116 ++++++++++++++++++
 ...s => section_param_trapez_fluvial.spec.ts} |   0
 spec/section_param_trapez_torrentiel.spec.ts  | 116 ++++++++++++++++++
 src/section/section_type.ts                   |  32 +++--
 5 files changed, 368 insertions(+), 12 deletions(-)
 create mode 100644 spec/section_param_rect_fluvial.spec.ts
 create mode 100644 spec/section_param_rect_torrentiel.spec.ts
 rename spec/{section_param_trapez.spec_fluvial.spec.ts => section_param_trapez_fluvial.spec.ts} (100%)
 create mode 100644 spec/section_param_trapez_torrentiel.spec.ts

diff --git a/spec/section_param_rect_fluvial.spec.ts b/spec/section_param_rect_fluvial.spec.ts
new file mode 100644
index 00000000..7a8dd602
--- /dev/null
+++ b/spec/section_param_rect_fluvial.spec.ts
@@ -0,0 +1,116 @@
+/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
+
+import { Result } from "../src/base";
+import { nub, precDigits, precDist } from "./nubtest";
+import { cSnRectang } from "../src/section/section_rectang";
+import { cParamsCanal } from "../src/section/section_type";
+
+let paramCnl: cParamsCanal;
+let sect: cSnRectang;
+
+describe('Section paramétrée rectangulaire : ', () => {
+    beforeEach(() => {
+        paramCnl = new cParamsCanal(40, //  Ks=Strickler
+            1.2,  //  Q=Débit
+            0.001, //  If=pente du fond
+            precDist, // précision
+            1 // YB= hauteur de berge
+            // YCL=Condition limite en cote à l'amont ou à l'aval
+        );
+
+        sect = new cSnRectang(undefined, paramCnl,
+            2.5 // largeur de fond
+        );
+        // tirant d'eau
+        sect.v.Y = 0.8;
+    });
+
+    describe('fluvial :', () => {
+        // charge spécifique
+        it('Hs should equal to 0.818', () => {
+            expect(sect.Calc_Hs()).toBeCloseTo(0.818, precDigits);
+        });
+
+        // charge critique
+        it('Hsc should equal to 0.43', () => {
+            expect(sect.Calc_Hsc()).toBeCloseTo(0.43, precDigits);
+        });
+
+        // largeur au miroir
+        it('B should equal to 2.5', () => {
+            expect(sect.Calc_B()).toBeCloseTo(2.5, precDigits);
+        });
+
+        // périmètre mouillé
+        it('P should equal to 4.1', () => {
+            expect(sect.Calc_P()).toBeCloseTo(4.1, precDigits);
+        });
+
+        // surface mouillée
+        it('S should equal to 2', () => {
+            expect(sect.Calc_S()).toBeCloseTo(2, precDigits);
+        });
+
+        // rayon hydraulique
+        it('R should equal to 0.488', () => {
+            expect(sect.Calc_R()).toBeCloseTo(0.488, precDigits);
+        });
+
+        // vitesse moyenne
+        it('V should equal to 0.6', () => {
+            expect(sect.Calc_V()).toBeCloseTo(0.6, precDigits);
+        });
+
+        // nombre de Froude
+        it('Fr should equal to 0.214', () => {
+            expect(sect.Calc_Fr()).toBeCloseTo(0.214, precDigits);
+        });
+
+        // tirant d'eau critique
+        it('Yc should equal to 0.286', () => {
+            expect(sect.Calc_Yc()).toBeCloseTo(0.286, precDigits);
+        });
+
+        // tirant d'eau normal
+        it('Yn should equal to 0.663', () => {
+            expect(sect.Calc_Yn()).toBeCloseTo(0.663, precDigits);
+        });
+
+        // tirant d'eau fluvial
+        it('Yf should equal to 0.8', () => {
+            expect(sect.Calc_Yf()).toBeCloseTo(0.8, precDigits);
+        });
+
+        // tirant d'eau torrentiel
+        it('Yt should equal to 0.131', () => {
+            expect(sect.Calc_Yt()).toBeCloseTo(0.131, precDigits);
+        });
+
+        // tirant d'eau conjugué
+        it('Yco should equal to 0.068', () => {
+            expect(sect.Calc_Yco()).toBeCloseTo(0.068, precDigits);
+        });
+
+        // perte de charge
+        it('J should equal to 0.00059', () => {
+            paramCnl.v.Prec = 0.00001;
+            expect(sect.Calc_J()).toBeCloseTo(0.00059, precDigits);
+        });
+
+        // Variation linéaire de l'énergie spécifique
+        it('I-J should equal to 0.00041', () => {
+            paramCnl.v.Prec = 0.00001;
+            expect(sect.Calc('I-J')).toBeCloseTo(0.00041, precDigits);
+        });
+
+        // impulsion hydraulique
+        it('Imp should equal to 8568', () => {
+            expect(sect.Calc_Imp()).toBeCloseTo(8568, precDigits);
+        });
+
+        // force tractrice (contrainte de cisaillement)
+        it('Tau0 should equal to 2.804', () => {
+            expect(sect.Calc_Tau0()).toBeCloseTo(2.804, precDigits);
+        });
+    });
+});
diff --git a/spec/section_param_rect_torrentiel.spec.ts b/spec/section_param_rect_torrentiel.spec.ts
new file mode 100644
index 00000000..d21cf8b1
--- /dev/null
+++ b/spec/section_param_rect_torrentiel.spec.ts
@@ -0,0 +1,116 @@
+/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
+
+import { Result } from "../src/base";
+import { nub, precDigits, precDist } from "./nubtest";
+import { cSnRectang } from "../src/section/section_rectang";
+import { cParamsCanal } from "../src/section/section_type";
+
+let paramCnl: cParamsCanal;
+let sect: cSnRectang;
+
+describe('Section paramétrée rectangulaire : ', () => {
+    beforeEach(() => {
+        paramCnl = new cParamsCanal(40, //  Ks=Strickler
+            10,  //  Q=Débit
+            0.001, //  If=pente du fond
+            precDist, // précision
+            1 // YB= hauteur de berge
+            // YCL=Condition limite en cote à l'amont ou à l'aval
+        );
+
+        sect = new cSnRectang(undefined, paramCnl,
+            2.5 // largeur de fond
+        );
+        // tirant d'eau
+        sect.v.Y = 0.8;
+    });
+
+    describe('torrentiel :', () => {
+        // charge spécifique
+        it('Hs should equal to 2.074', () => {
+            expect(sect.Calc_Hs()).toBeCloseTo(2.074, precDigits);
+        });
+
+        // charge critique
+        it('Hsc should equal to 1.766', () => {
+            expect(sect.Calc_Hsc()).toBeCloseTo(1.766, precDigits);
+        });
+
+        // largeur au miroir
+        it('B should equal to 2.5', () => {
+            expect(sect.Calc_B()).toBeCloseTo(2.5, precDigits);
+        });
+
+        // périmètre mouillé
+        it('P should equal to 4.1', () => {
+            expect(sect.Calc_P()).toBeCloseTo(4.1, precDigits);
+        });
+
+        // surface mouillée
+        it('S should equal to 2', () => {
+            expect(sect.Calc_S()).toBeCloseTo(2, precDigits);
+        });
+
+        // rayon hydraulique
+        it('R should equal to 0.488', () => {
+            expect(sect.Calc_R()).toBeCloseTo(0.488, precDigits);
+        });
+
+        // vitesse moyenne
+        it('V should equal to 5', () => {
+            expect(sect.Calc_V()).toBeCloseTo(5, precDigits);
+        });
+
+        // nombre de Froude
+        it('Fr should equal to 1.785', () => {
+            expect(sect.Calc_Fr()).toBeCloseTo(1.785, precDigits);
+        });
+
+        // tirant d'eau critique
+        it('Yc should equal to 1.177', () => {
+            expect(sect.Calc_Yc()).toBeCloseTo(1.177, precDigits);
+        });
+
+        // tirant d'eau normal
+        it('Yn should equal to 3.364', () => {
+            expect(sect.Calc_Yn()).toBeCloseTo(3.364, precDigits);
+        });
+
+        // tirant d'eau fluvial
+        it('Yf should equal to 1.831', () => {
+            expect(sect.Calc_Yf()).toBeCloseTo(1.831, precDigits);
+        });
+
+        // tirant d'eau torrentiel
+        it('Yt should equal to 0.8', () => {
+            expect(sect.Calc_Yt()).toBeCloseTo(0.8, precDigits);
+        });
+
+        // tirant d'eau conjugué
+        it('Yco should equal to 1.659', () => {
+            expect(sect.Calc_Yco()).toBeCloseTo(1.659, precDigits);
+        });
+
+        // perte de charge
+        it('J should equal to 0.041', () => {
+            //paramCnl.v.Prec = 0.00001;
+            expect(sect.Calc_J()).toBeCloseTo(0.041, precDigits);
+        });
+
+        // Variation linéaire de l'énergie spécifique
+        it('I-J should equal to -0.04', () => {
+            //paramCnl.v.Prec = 0.00001;
+            expect(sect.Calc('I-J')).toBeCloseTo(-0.04, precDigits);
+        });
+
+        // impulsion hydraulique
+        it('Imp should equal to 57848', () => {
+            expect(sect.Calc_Imp()).toBeCloseTo(57848, precDigits);
+        });
+
+        // force tractrice (contrainte de cisaillement)
+        it('Tau0 should equal to 194.718', () => {
+            expect(sect.Calc_Tau0()).toBeCloseTo(194.718, precDigits);
+        });
+    });
+});
diff --git a/spec/section_param_trapez.spec_fluvial.spec.ts b/spec/section_param_trapez_fluvial.spec.ts
similarity index 100%
rename from spec/section_param_trapez.spec_fluvial.spec.ts
rename to spec/section_param_trapez_fluvial.spec.ts
diff --git a/spec/section_param_trapez_torrentiel.spec.ts b/spec/section_param_trapez_torrentiel.spec.ts
new file mode 100644
index 00000000..45ca6638
--- /dev/null
+++ b/spec/section_param_trapez_torrentiel.spec.ts
@@ -0,0 +1,116 @@
+/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
+
+import { Result } from "../src/base";
+import { nub, precDigits, precDist } from "./nubtest";
+import { cSnTrapez } from "../src/section/section_trapez";
+import { cParamsCanal } from "../src/section/section_type";
+
+let paramCnl: cParamsCanal;
+let sect: cSnTrapez;
+
+describe('Section paramétrée trapèze :', () => {
+    beforeEach(() => {
+        paramCnl = new cParamsCanal(40, //  Ks=Strickler
+            10,  //  Q=Débit
+            0.001, //  If=pente du fond
+            precDist, // précision
+            1 // YB= hauteur de berge
+            // YCL=Condition limite en cote à l'amont ou à l'aval
+        );
+
+        sect = new cSnTrapez(undefined, paramCnl,
+            2.5, // largeur de fond
+            0.56 // fruit
+        );
+        // tirant d'eau
+        sect.v.Y = 0.8;
+    });
+
+    describe('torrentiel :', () => {
+        // charge spécifique
+        it('Hs should equal to 1.716', () => {
+            expect(sect.Calc_Hs()).toBeCloseTo(1.716, precDigits);
+        });
+
+        // charge critique
+        it('Hsc should equal to 1.534', () => {
+            expect(sect.Calc_Hsc()).toBeCloseTo(1.534, precDigits);
+        });
+
+        // largeur au miroir
+        it('B should equal to 3.396', () => {
+            expect(sect.Calc_B()).toBeCloseTo(3.396, precDigits);
+        });
+
+        // périmètre mouillé
+        it('P should equal to 4.334', () => {
+            expect(sect.Calc_P()).toBeCloseTo(4.334, precDigits);
+        });
+
+        // surface mouillée
+        it('S should equal to 2.358', () => {
+            expect(sect.Calc_S()).toBeCloseTo(2.358, precDigits);
+        });
+
+        // rayon hydraulique
+        it('R should equal to 0.544', () => {
+            expect(sect.Calc_R()).toBeCloseTo(0.544, precDigits);
+        });
+
+        // vitesse moyenne
+        it('V should equal to 4.24', () => {
+            expect(sect.Calc_V()).toBeCloseTo(4.24, precDigits);
+        });
+
+        // nombre de Froude
+        it('Fr should equal to 1.625', () => {
+            expect(sect.Calc_Fr()).toBeCloseTo(1.625, precDigits);
+        });
+
+        // tirant d'eau critique
+        it('Yc should equal to 1.074', () => {
+            expect(sect.Calc_Yc()).toBeCloseTo(1.074, precDigits);
+        });
+
+        // tirant d'eau normal
+        it('Yn should equal to 2.275', () => {
+            expect(sect.Calc_Yn()).toBeCloseTo(2.275, precDigits);
+        });
+
+        // tirant d'eau fluvial
+        it('Yf should equal to 1.502', () => {
+            expect(sect.Calc_Yf()).toBeCloseTo(1.502, precDigits);
+        });
+
+        // tirant d'eau torrentiel
+        it('Yt should equal to 0.8', () => {
+            expect(sect.Calc_Yt()).toBeCloseTo(0.8, precDigits);
+        });
+
+        // tirant d'eau conjugué
+        it('Yco should equal to 1.398', () => {
+            expect(sect.Calc_Yco()).toBeCloseTo(1.398, precDigits);
+        });
+
+        // perte de charge
+        it('J should equal to 0.025', () => {
+            //paramCnl.v.Prec = 0.00001;
+            expect(sect.Calc_J()).toBeCloseTo(0.025, precDigits);
+        });
+
+        // Variation linéaire de l'énergie spécifique
+        it('I-J should equal to -0.024', () => {
+            expect(sect.Calc('I-J')).toBeCloseTo(-0.024, precDigits);
+        });
+
+        // impulsion hydraulique
+        it('Imp should equal to 51187.203', () => {
+            expect(sect.Calc_Imp()).toBeCloseTo(51187.203, precDigits);
+        });
+
+        // force tractrice (contrainte de cisaillement)
+        it('Tau0 should equal to 135.020', () => {
+            expect(sect.Calc_Tau0()).toBeCloseTo(135.020, precDigits);
+        });
+    });
+});
diff --git a/src/section/section_type.ts b/src/section/section_type.ts
index c80356b0..1c073760 100644
--- a/src/section/section_type.ts
+++ b/src/section/section_type.ts
@@ -1,5 +1,5 @@
 import { IParamsEquation, Debug } from "../base"
-import { acNewton } from "./newton";
+//import { acNewton } from "./newton";
 import { cHautCritique, cHautNormale, cHautCorrespondante, cHautConjuguee } from "./hauteur";
 import { cLog } from "./log";
 
@@ -158,7 +158,7 @@ export abstract class acSection extends Debug {
                                         return this.Calc_Yn();
 
                                 default:
-                                        var methode = 'Calc_' + sDonnee;
+                                        let methode = 'Calc_' + sDonnee;
 
                                         /* !!!!!
                                            si on réunit les 2 lignes suivantes ( this.arCalc[sDonnee] = this[methode](); ),
@@ -205,12 +205,14 @@ export abstract class acSection extends Debug {
                                         }
                                         this.v.LargeurBerge = this.arCalcGeo[sDonnee];
                                         break;
+
                                 default:
                                         /*var methode = 'Calc_'+sDonnee + '()';
                                         this.CalcGeo[sDonnee] = eval(methode);*/
                                         var methode = 'Calc_' + sDonnee;
                                         this.arCalcGeo[sDonnee] = this[methode]();
-                                //   this.debug("methodecalcgeo " + this[methode]());
+                                        //   this.debug("methodecalcgeo " + this[methode]());
+                                        break;
                         }
                         //~ spip_log('CalcGeo('.sDCalcGeonnee.',rY='.this->oP->rYB.')='.this->arCalcGeo[sDonnee],'hydraulic.'._LOG_DEBUG);
                         this.Swap(false); // On restitue les données hydrauliques en cours
@@ -304,7 +306,7 @@ export abstract class acSection extends Debug {
          */
         Calc_dR() {
                 if (this.Calc('P') != 0) {
-                        return (this.Calc('B') * this.Calc('P') - this.Calc('S') * this.Calc('dP') / Math.pow(this.Calc('P'), 2));
+                        return ((this.Calc('B') * this.Calc('P') - this.Calc('S') * this.Calc('dP')) / Math.pow(this.Calc('P'), 2));
                 }
                 else {
                         return 0;
@@ -409,10 +411,10 @@ export abstract class acSection extends Debug {
                 if (this.XOR(Dx > 0, !(Y + Dx / 6 * (k1 + 2 * (k2 + k3) + k4) < this.HautCritique))) { return false; }
                 return Y + Dx / 6 * (k1 + 2 * (k2 + k3) + k4);
         }
-        /**
-         * Calcul du point suivant d'une courbe de remous
-         * @return Tirant d'eau
-         */
+        // /**
+        //  * Calcul du point suivant d'une courbe de remous
+        //  * @return Tirant d'eau
+        //  */
         // Calc_Y(rY) {
         // var funcCalcY = 'Calc_Y_' + this.oP.Resolution;
         // var methods = Object.getOwnPropertyNames(this).filter(function (p) {
@@ -559,8 +561,11 @@ export abstract class acSection extends Debug {
          * multiplié par la surface hydraulique
          * @return S x Yg
          */
-        Calc_SYg(rY) {
-                return Math.pow(rY, 2) * this.v.LargeurBerge / 2;
+        // Calc_SYg(rY) {
+        //         return Math.pow(rY, 2) * this.v.LargeurBerge / 2;
+        // }
+        Calc_SYg() {
+                return Math.pow(this.v.Y, 2) * this.v.LargeurBerge / 2;
         }
 
         /**
@@ -568,8 +573,11 @@ export abstract class acSection extends Debug {
          * multiplié par la surface hydraulique
          * @return S x Yg
          */
-        Calc_dSYg(rY) {
-                return rY * this.v.LargeurBerge;
+        // Calc_dSYg(rY) {
+        //         return rY * this.v.LargeurBerge;
+        // }
+        Calc_dSYg() {
+                return this.v.Y * this.v.LargeurBerge;
         }
 
         /**
-- 
GitLab