From 68e57ae106fbbf8b93f10644d3427810d6f4d6aa Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Thu, 8 Mar 2018 12:34:16 +0100
Subject: [PATCH] =?UTF-8?q?acSection=20:=20m=C3=A9thode=20Calc()=20renomm?=
 =?UTF-8?q?=C3=A9e=20en=20calcFromY(),=20cr=C3=A9ation=20d'une=20m=C3=A9th?=
 =?UTF-8?q?ode=20Calc()=20avec=20la=20m=C3=AAme=20signature=20pour=20faire?=
 =?UTF-8?q?=20un=20Reset()=20syst=C3=A9matique=20au=201er=20appel=20closes?=
 =?UTF-8?q?=20#42?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/regime_uniforme.ts            |   1 -
 src/section/section_circulaire.ts |  27 +++-----
 src/section/section_puissance.ts  |  22 +++----
 src/section/section_rectang.ts    |   4 +-
 src/section/section_type.ts       | 100 ++++++++++++------------------
 5 files changed, 58 insertions(+), 96 deletions(-)

diff --git a/src/regime_uniforme.ts b/src/regime_uniforme.ts
index d1bd51e9..9e67d5e8 100644
--- a/src/regime_uniforme.ts
+++ b/src/regime_uniforme.ts
@@ -25,7 +25,6 @@ export class RegimeUniforme extends Nub {
    * @return Débit en régime uniforme
    */
     Calc_Qn(): Result {
-        this.Sn.Reset(true);
         if (this.Sn.prms.If.v <= 0)
             return new Result(0);
 
diff --git a/src/section/section_circulaire.ts b/src/section/section_circulaire.ts
index 874e4271..f3666a18 100644
--- a/src/section/section_circulaire.ts
+++ b/src/section/section_circulaire.ts
@@ -130,11 +130,10 @@ export class cSnCirc extends acSection {
 
                 this.debug("circ.Calc_B() : PAS débordement");
                 if (this.prms.D.isDefined && this.prms.Y.isDefined) {
-                        const rAlpha: Result = this.Calc("Alpha");
+                        const rAlpha: Result = this.calcFromY("Alpha");
                         if (!rAlpha.ok)
                                 return rAlpha;
 
-                        // let res = this.prms.D.v * Math.sin(this.Calc("Alpha"));
                         let res = this.prms.D.v * Math.sin(rAlpha.vCalc);
                         this.debug("circ.Calc_B() : res=" + res);
                         return new Result(res);
@@ -167,11 +166,10 @@ export class cSnCirc extends acSection {
                         return new Result(v);
                 }
 
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
-                // return this.prms.D.v * this.Calc("Alpha");
                 const v = this.prms.D.v * rAlpha.vCalc;
                 return new Result(v);
         }
@@ -195,7 +193,7 @@ export class cSnCirc extends acSection {
                         return new Result(v);
                 }
 
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
@@ -214,11 +212,10 @@ export class cSnCirc extends acSection {
                 if (!this.bSnFermee && this.isDebordement())
                         return super.Calc_dP_Debordement();
 
-                const rDAlpha: Result = this.Calc("dAlpha");
+                const rDAlpha: Result = this.calcFromY("dAlpha");
                 if (!rDAlpha.ok)
                         return rDAlpha;
 
-                // return this.prms.D.v * this.Calc("dAlpha");
                 const v = this.prms.D.v * rDAlpha.vCalc;
                 return new Result(v);
         }
@@ -231,15 +228,14 @@ export class cSnCirc extends acSection {
                 if (this.isDebordement())
                         return super.Calc_dB_Debordement();
 
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
-                const rDAlpha: Result = this.Calc("dAlpha");
+                const rDAlpha: Result = this.calcFromY("dAlpha");
                 if (!rDAlpha.ok)
                         return rDAlpha;
 
-                // return this.prms.D.v * this.Calc("dAlpha") * Math.cos(this.Calc("Alpha"));
                 const v = this.prms.D.v * rDAlpha.vCalc * Math.cos(rAlpha.vCalc);
                 return new Result(v);
         }
@@ -250,9 +246,7 @@ export class cSnCirc extends acSection {
          * @return S x Yg
          */
         protected Calc_SYg(): Result {
-                // let alpha = this.Calc("Alpha");
-
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
@@ -269,14 +263,11 @@ export class cSnCirc extends acSection {
          * @return S x Yg
          */
         protected Calc_dSYg(): Result {
-                // let alpha = this.Calc("Alpha");
-                // let dAlpha = this.Calc("dAlpha");
-
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
-                const rDAlpha: Result = this.Calc("dAlpha");
+                const rDAlpha: Result = this.calcFromY("dAlpha");
                 if (!rDAlpha.ok)
                         return rDAlpha;
 
diff --git a/src/section/section_puissance.ts b/src/section/section_puissance.ts
index 4c894eaf..c762de16 100644
--- a/src/section/section_puissance.ts
+++ b/src/section/section_puissance.ts
@@ -59,11 +59,10 @@ export class cSnPuiss extends acSection {
                 if (this.prms.Y.v >= this.prms.YB.v)
                         return new Result(this.prms.LargeurBerge.v);
 
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
-                // return this.Calc("Alpha") * Math.pow(this.prms.Y.v, this.prms.k.v);
                 const v = rAlpha.vCalc * Math.pow(this.prms.Y.v, this.prms.k.v);
                 return new Result(v);
         }
@@ -73,12 +72,11 @@ export class cSnPuiss extends acSection {
          * @return B
          */
         protected Calc_P(): Result {
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
                 var n = 100; /// Le nombre de partie pour le calcul de l'intégrale
-                // var Lambda2 = Math.pow(this.Calc("Alpha"), 2);
                 var Lambda2 = Math.pow(rAlpha.vCalc, 2);
                 var P = 0; /// Le périmètre à calculer
                 var Previous = 0;
@@ -96,7 +94,7 @@ export class cSnPuiss extends acSection {
          * @return S
          */
         protected Calc_S(): Result {
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
@@ -110,12 +108,11 @@ export class cSnPuiss extends acSection {
          * @return dP
          */
         protected Calc_dP(): Result {
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
                 let k = this.prms.k.v;
-                // return 2 * Math.sqrt(1 + Math.pow(k * this.Calc("Alpha") / 2, 2) * Math.pow(this.prms.Y.v, 2 * (k - 1)));
                 const v = 2 * Math.sqrt(1 + Math.pow(k * rAlpha.vCalc / 2, 2) * Math.pow(this.prms.Y.v, 2 * (k - 1)));
                 return new Result(v);
         }
@@ -125,12 +122,11 @@ export class cSnPuiss extends acSection {
          * @return dB
          */
         protected Calc_dB(): Result {
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
                 let k = this.prms.k.v;
-                // return this.Calc("Alpha") * k * Math.pow(this.prms.Y.v, k - 1);
                 const v = rAlpha.vCalc * k * Math.pow(this.prms.Y.v, k - 1);
                 return new Result(v);
         }
@@ -141,12 +137,11 @@ export class cSnPuiss extends acSection {
          * @return S x Yg
          */
         protected Calc_SYg(): Result {
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
                 let k = this.prms.k.v;
-                // return this.Calc("Alpha") * Math.pow(this.prms.Y.v, k + 2) / ((k + 1) * (k + 2));
                 const v = rAlpha.vCalc * Math.pow(this.prms.Y.v, k + 2) / ((k + 1) * (k + 2));
                 return new Result(v);
         }
@@ -157,17 +152,16 @@ export class cSnPuiss extends acSection {
          * @return S x Yg
          */
         protected Calc_dSYg(): Result {
-                const rAlpha: Result = this.Calc("Alpha");
+                const rAlpha: Result = this.calcFromY("Alpha");
                 if (!rAlpha.ok)
                         return rAlpha;
 
-                const rDAlpha: Result = this.Calc("dAlpha");
+                const rDAlpha: Result = this.calcFromY("dAlpha");
                 if (!rDAlpha.ok)
                         return rDAlpha;
 
                 let k = this.prms.k.v;
                 let Y = this.prms.Y.v;
-                // let SYg = this.Calc("dAlpha") * Math.pow(Y, k + 2) + this.Calc("Alpha") * Math.pow(Y, k + 1) * (k + 2);
                 let SYg = rDAlpha.vCalc * Math.pow(Y, k + 2) + rAlpha.vCalc * Math.pow(Y, k + 1) * (k + 2);
                 const v = SYg / ((k + 1) * (k + 2));
                 return new Result(v);
diff --git a/src/section/section_rectang.ts b/src/section/section_rectang.ts
index c29befdd..fab309e9 100644
--- a/src/section/section_rectang.ts
+++ b/src/section/section_rectang.ts
@@ -57,9 +57,7 @@ export class cSnRectang extends acSection {
          * @return tirant d'eau conjugué
          */
         protected CalcYco(): Result {
-                // return this.prms.Y.v * (Math.sqrt(1 + 8 * Math.pow(this.Calc("Fr"), 2)) - 1) / 2;
-
-                const rFR: Result = this.Calc("Fr");
+                const rFR: Result = this.calcFromY("Fr");
                 if (!rFR.ok)
                         return rFR;
 
diff --git a/src/section/section_type.ts b/src/section/section_type.ts
index dcb11e66..8bf9b170 100644
--- a/src/section/section_type.ts
+++ b/src/section/section_type.ts
@@ -155,7 +155,7 @@ export abstract class acSection extends ComputeNode {
          */
         private _newtonDbg: boolean;
 
-        private _indentCalc: number = -1;
+        private _indentCalc: number;
 
         /**
          * Construction de la classe.
@@ -244,13 +244,23 @@ export abstract class acSection extends ComputeNode {
 
         /**
          * Calcul des données à la section
+         * effectue un reset du cache des résultats
          * @param sDonnee Clé de la donnée à calculer (voir this->arCalc)
          * @param rY valeur de Y à utiliser
          * @return la donnée calculée
          */
         public Calc(sDonnee: string, rY: number = undefined): Result {
+                this._indentCalc = -1;
+                this.Reset(true);
+                return this.calcFromY(sDonnee, rY);
+        }
+
+        /**
+         * calcul des données à la section dépendant de Y
+         */
+        protected calcFromY(sDonnee: string, rY: number = undefined): Result {
                 this._indentCalc++;
-                this.debug("in Calc(" + sDonnee + ", rY=" + rY + ") old " + sDonnee + "=" + this.arCalc[sDonnee]);
+                this.debug("in calcFromY(" + sDonnee + ", rY=" + rY + ") old " + sDonnee + "=" + this.arCalc[sDonnee]);
                 this.debug("this.Y=" + this.prms.Y.toString());
 
                 if (rY != undefined && (!this.prms.Y.isDefined || rY != this.prms.Y.v)) {
@@ -262,8 +272,7 @@ export abstract class acSection extends ComputeNode {
                         // La donnée a besoin d'être calculée
                         switch (sDonnee) {
                                 case 'I-J': // Variation linéaire de l'énergie spécifique (I-J) en m/m
-                                        // this.arCalc[sDonnee] = this.prms.If.v - this.Calc("J");
-                                        var rJ: Result = this.Calc("J");
+                                        var rJ: Result = this.calcFromY("J");
                                         if (rJ.ok) {
                                                 this.arCalc[sDonnee] = this.prms.If.v - rJ.vCalc;
                                                 var res = new Result(this.arCalc[sDonnee]);
@@ -286,10 +295,10 @@ export abstract class acSection extends ComputeNode {
                                                 this.arCalc[sDonnee] = res.vCalc;
                                         break;
                         }
-                        this.debug("Calc(" + sDonnee + ") resultat -> " + this.arCalc[sDonnee]);
+                        this.debug("calcFromY(" + sDonnee + ") resultat -> " + this.arCalc[sDonnee]);
                 }
                 else {
-                        this.debug("Calc(" + sDonnee + ") cache= " + this.arCalc[sDonnee]);
+                        this.debug("calcFromY(" + sDonnee + ") cache= " + this.arCalc[sDonnee]);
                         res = new Result(this.arCalc[sDonnee]);
                 }
                 this._indentCalc--;
@@ -367,7 +376,7 @@ export abstract class acSection extends ComputeNode {
 
 
         protected Calc_dS(): Result {
-                return this.Calc("B"); // largeur au miroir
+                return this.calcFromY("B"); // largeur au miroir
         }
 
         /**
@@ -425,23 +434,18 @@ export abstract class acSection extends ComputeNode {
          * @return Le rayon hydraulique
          */
         private Calc_R(): Result {
-                // let P = this.Calc("P");
-                let rP: Result = this.Calc("P");
+                let rP: Result = this.calcFromY("P");
                 if (!rP.ok)
                         return rP;
 
-                // if (P != 0)
                 if (rP.vCalc == 0)
                         return new Result(new Message(MessageCode.ERROR_SECTION_PERIMETRE_NUL));
-                // return this.Calc("S") / P;
 
-                let rS = this.Calc("S");
+                let rS = this.calcFromY("S");
                 if (!rS.ok)
                         return rS;
 
                 return new Result(rS.vCalc / rP.vCalc);
-
-                // return Infinity;
         }
 
         /**
@@ -449,8 +453,7 @@ export abstract class acSection extends ComputeNode {
          * @return dR
          */
         private Calc_dR(): Result {
-                // let P = this.Calc("P");
-                const rP: Result = this.Calc("P");
+                const rP: Result = this.calcFromY("P");
 
                 if (!rP.ok)
                         return rP;
@@ -459,16 +462,15 @@ export abstract class acSection extends ComputeNode {
                 if (rP.vCalc == 0)
                         return new Result(new Message(MessageCode.ERROR_SECTION_PERIMETRE_NUL));
 
-                //return ((this.Calc("B") * P - this.Calc("S") * this.Calc("dP")) / Math.pow(P, 2));
-                const rB: Result = this.Calc("B");
+                const rB: Result = this.calcFromY("B");
                 if (!rB.ok)
                         return rB;
 
-                const rS: Result = this.Calc("S");
+                const rS: Result = this.calcFromY("S");
                 if (!rS.ok)
                         return rS;
 
-                const rDP: Result = this.Calc("dP");
+                const rDP: Result = this.calcFromY("dP");
                 if (!rDP.ok)
                         return rDP;
 
@@ -513,23 +515,19 @@ export abstract class acSection extends ComputeNode {
          * @return La perte de charge
          */
         private Calc_J(): Result {
-                // let R = this.Calc("R");
-                let rR: Result = this.Calc("R");
+                let rR: Result = this.calcFromY("R");
                 if (!rR.ok)
                         return rR;
 
-                // if (R != 0)
                 if (rR.vCalc == 0)
                         return new Result(new Message(MessageCode.ERROR_SECTION_RAYON_NUL));
 
-                // return Math.pow(this.Calc("V") / this.prms.Ks.v, 2) / Math.pow(R, 4 / 3);
-                const rV: Result = this.Calc("V");
+                const rV: Result = this.calcFromY("V");
                 if (!rV.ok)
                         return rV;
 
                 const v = Math.pow(rV.vCalc / this.prms.Ks.v, 2) / Math.pow(rR.vCalc, 4 / 3);
                 return new Result(v);
-                //                return Infinity;
         }
 
         /**
@@ -537,39 +535,33 @@ export abstract class acSection extends ComputeNode {
          * @return Le nombre de Froude
          */
         private Calc_Fr(): Result {
-                // let S = this.Calc("S");
-                const rS: Result = this.Calc("S");
+                const rS: Result = this.calcFromY("S");
 
                 if (!rS.ok)
                         return rS;
 
-                // if (S != 0)
                 if (rS.vCalc == 0)
                         return new Result(new Message(MessageCode.ERROR_SECTION_SURFACE_NULLE));
 
-                const rB: Result = this.Calc("B");
+                const rB: Result = this.calcFromY("B");
                 if (!rB.ok)
                         return rB;
 
-                // return this.prms.Q.v / S * Math.sqrt(this.Calc("B") / S / cParamsCanal.G);
                 const v = this.prms.Q.v / rS.vCalc * Math.sqrt(rB.vCalc / rS.vCalc / cParamsCanal.G);
                 return new Result(v);
-
-                // return Infinity;
         }
 
         /**
          * Calcul de dy/dx
          */
         private Calc_dYdX(Y: number): Result {
-                // L'appel à Calc("J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
+                // L'appel à calcFromY("J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
 
-                // return - (this.prms.If.v - this.Calc("J", Y) / (1 - Math.pow(this.Calc("Fr", Y), 2)));
-                const rJ: Result = this.Calc("J", Y);
+                const rJ: Result = this.calcFromY("J", Y);
                 if (!rJ.ok)
                         return rJ;
 
-                const rFR: Result = this.Calc("Fr", Y);
+                const rFR: Result = this.calcFromY("Fr", Y);
                 if (!rFR.ok)
                         return rFR;
 
@@ -582,20 +574,15 @@ export abstract class acSection extends ComputeNode {
          * @return Vitesse moyenne
          */
         private Calc_V(): Result {
-                // let S = this.Calc("S");
-                let rS: Result = this.Calc("S");
+                let rS: Result = this.calcFromY("S");
                 if (!rS.ok)
                         return rS;
 
-                // if (S != 0)
                 if (rS.vCalc == 0)
                         return new Result(new Message(MessageCode.ERROR_SECTION_SURFACE_NULLE));
 
-                // return this.prms.Q.v / S;
                 const v = this.prms.Q.v / rS.vCalc;
                 return new Result(v);
-
-                // return Infinity;
         }
 
         /**
@@ -603,9 +590,7 @@ export abstract class acSection extends ComputeNode {
          * @return Charge spécifique
          */
         private Calc_Hs(): Result {
-                // return this.prms.Y.v + Math.pow(this.Calc("V"), 2) / (2 * cParamsCanal.G);
-
-                let rV: Result = this.Calc("V");
+                let rV: Result = this.calcFromY("V");
                 if (!rV.ok)
                         return rV;
 
@@ -623,12 +608,11 @@ export abstract class acSection extends ComputeNode {
                 this.Swap(true); // On mémorise les données hydrauliques en cours
 
                 // On calcule la charge avec la hauteur critique
-                // var Hsc = this.Calc("Hs", this.CalcGeo("Yc"));
                 const rYC: Result = this.CalcGeo("Yc");
                 if (!rYC.ok)
                         res = rYC;
                 else
-                        res = this.Calc("Hs", rYC.vCalc);
+                        res = this.calcFromY("Hs", rYC.vCalc);
 
                 // On restitue les données initiales
                 this.Swap(false);
@@ -699,10 +683,9 @@ export abstract class acSection extends ComputeNode {
 
                 const oHautCorrespondante = new cHautCorrespondante(this, this._newtonMaxIter, this._newtonDbg);
 
-                const rYC: Result = this.Calc("Yc");
+                const rYC: Result = this.calcFromY("Yc");
                 if (!rYC.ok)
                         return rYC;
-                // let res = oHautCorrespondante.Newton(this.Calc("Yc") * 2);
                 let rYF = oHautCorrespondante.Newton(rYC.vCalc * 2);
 
                 // if (res == undefined || !oHautCorrespondante.hasConverged()) {
@@ -752,19 +735,18 @@ export abstract class acSection extends ComputeNode {
 
                 const oHautConj = new cHautConjuguee(this, this._newtonMaxIter, this._newtonDbg);
 
-                const rFR: Result = this.Calc("Fr");
+                const rFR: Result = this.calcFromY("Fr");
                 if (!rFR.ok)
                         res = rFR;
                 else {
                         // Choisir une valeur initiale du bon côté de la courbe
-                        // if (this.Calc("Fr") < 1) {
                         if (rFR.vCalc < 1) {
                                 // Ecoulement fluvial, on cherche la conjuguée à partir du tirant d'eau torrentiel
-                                var Y0: Result = this.Calc("Yt");
+                                var Y0: Result = this.calcFromY("Yt");
                         }
                         else {
                                 // Ecoulement torrentiel, on cherche la conjuguée à partir du tirant d'eau fluvial
-                                Y0 = this.Calc("Yf");
+                                Y0 = this.calcFromY("Yf");
                         }
                         if (!Y0.ok)
                                 res = Y0;
@@ -792,15 +774,14 @@ export abstract class acSection extends ComputeNode {
          * @return contrainte de cisaillement
          */
         private Calc_Tau0(): Result {
-                const rR: Result = this.Calc("R");
+                const rR: Result = this.calcFromY("R");
                 if (!rR.ok)
                         return rR;
 
-                const rJ: Result = this.Calc("J");
+                const rJ: Result = this.calcFromY("J");
                 if (!rJ.ok)
                         return rJ;
 
-                // return 1000 * cParamsCanal.G * this.Calc("R") * this.Calc("J");
                 return new Result(1000 * cParamsCanal.G * rR.vCalc * rJ.vCalc);
         }
 
@@ -841,15 +822,14 @@ export abstract class acSection extends ComputeNode {
          * @return Impulsion hydraulique
          */
         private Calc_Imp(): Result {
-                const rV: Result = this.Calc("V");
+                const rV: Result = this.calcFromY("V");
                 if (!rV.ok)
                         return rV;
 
-                const rSYG: Result = this.Calc("SYg");
+                const rSYG: Result = this.calcFromY("SYg");
                 if (!rSYG.ok)
                         return rSYG;
 
-                // return 1000 * (this.prms.Q.v * this.Calc("V") + cParamsCanal.G * this.Calc("SYg"));
                 const v = 1000 * (this.prms.Q.v * rV.vCalc + cParamsCanal.G * rSYG.vCalc);
                 return new Result(v);
         }
-- 
GitLab