From 8d756aac4a17f898e8a07cec4b2593cdf8078cb4 Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Thu, 11 Jan 2018 08:59:27 +0100
Subject: [PATCH] =?UTF-8?q?Ajout=20des=20calculs=20pour=20le=20noeud=20"pa?=
 =?UTF-8?q?sse=20=C3=A0=20bassins=20:=20puissance=20dissip=C3=A9e"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/pab/pab_puissance.spec.ts |  7 ++-
 src/index.ts                   |  1 +
 src/pab/pab_puissance.ts       | 88 ++++++++++++++++++++++++++++++++++
 src/param.ts                   |  1 +
 src/parameters.ts              |  8 ++++
 5 files changed, 101 insertions(+), 4 deletions(-)
 create mode 100644 src/pab/pab_puissance.ts

diff --git a/spec/pab/pab_puissance.spec.ts b/spec/pab/pab_puissance.spec.ts
index 88516754..5da5561a 100644
--- a/spec/pab/pab_puissance.spec.ts
+++ b/spec/pab/pab_puissance.spec.ts
@@ -2,7 +2,7 @@
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
 import { Result } from "../../src/util/result";
-import { PabPuissance, PabPuissanceParams } from "pab_puissance";
+import { PabPuissance, PabPuissanceParams } from "../../src/pab/pab_puissance";
 import { check } from "../nubtest";
 
 function PabPuissanceTest(varTest: string) {
@@ -16,11 +16,11 @@ function PabPuissanceTest(varTest: string) {
             );
 
             let res: number = prms[varTest].v;
-            prms[varTest].v = undefined;
 
             const nub = new PabPuissance(prms);
+            prms[varTest].v = undefined;
 
-            check(nub.Calc(), res);
+            check(nub.Calc(varTest, 1e-9), res);
         });
     });
 }
@@ -34,5 +34,4 @@ describe("Class PabPuissance: ", () => {
     PabPuissanceTest("Q");
     PabPuissanceTest("V");
     PabPuissanceTest("Pv");
-
 });
diff --git a/src/index.ts b/src/index.ts
index 79ad03ea..a7f8a2e1 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -19,3 +19,4 @@ export * from './util/log';
 export * from './util/result';
 export * from './util/interval';
 export * from './pab/pab_dimension';
+export * from './pab/pab_puissance';
diff --git a/src/pab/pab_puissance.ts b/src/pab/pab_puissance.ts
new file mode 100644
index 00000000..4ee44dad
--- /dev/null
+++ b/src/pab/pab_puissance.ts
@@ -0,0 +1,88 @@
+import { Result } from "../util/result";
+import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability, ParamsEquation } from "../param";
+import { NumericalString } from "../index";
+import { Nub } from "../nub";
+
+export class PabPuissanceParams extends ParamsEquation {
+    [key: string]: any; // pour pouvoir faire this['methode]();
+
+    /** Chute entre bassins DH */
+    private _DH: ParamDefinition;
+
+    /** Débit Q */
+    private _Q: ParamDefinition;
+
+    /** Volume V */
+    private _V: ParamDefinition;
+
+    /** Puissance dissipée PV */
+    private _Pv: ParamDefinition;
+
+    constructor(rDH: number, rQ: number, rV: number, rPV: number = undefined) {
+        super();
+        this._DH = new ParamDefinition(ComputeNodeType.PabPuissance, 'DH', ParamDomainValue.POS, rDH);
+        this._Q = new ParamDefinition(ComputeNodeType.PabPuissance, 'Q', ParamDomainValue.POS, rQ);
+        this._V = new ParamDefinition(ComputeNodeType.PabPuissance, 'V', ParamDomainValue.POS, rV);
+        this._Pv = new ParamDefinition(ComputeNodeType.PabPuissance, 'Pv', ParamDomainValue.POS, rPV);
+
+        this.addParamDefinition(this._DH);
+        this.addParamDefinition(this._Q);
+        this.addParamDefinition(this._V);
+        this.addParamDefinition(this._Pv);
+    }
+
+    get DH() {
+        return this._DH;
+    }
+
+    get Q() {
+        return this._Q;
+    }
+
+    get V() {
+        return this._V;
+    }
+
+    get Pv() {
+        return this._Pv;
+    }
+}
+export class PabPuissance extends Nub {
+    constructor(prms: PabPuissanceParams, dbg: boolean = false) {
+        super(prms, dbg);
+    }
+
+    /**
+     * paramètres castés au bon type
+     */
+    get prms(): PabPuissanceParams {
+        return <PabPuissanceParams>this._prms;
+    }
+
+    /**
+     * paramétrage de la calculabilité des paramètres
+     */
+    protected setParametersCalculability() {
+        this.prms.DH.calculability = ParamCalculability.DICHO;
+        this.prms.Q.calculability = ParamCalculability.DICHO;
+        this.prms.V.calculability = ParamCalculability.DICHO;
+        this.prms.Pv.calculability = ParamCalculability.EQUATION;
+    }
+
+    Equation(sVarCalc: string): Result {
+        let v: number;
+
+        switch (sVarCalc) {
+            case "Pv":
+                const ro: number = 1000;     // masse volumique de l'eau en kg/m3
+                const g: number = 9.81;     // accélération de la gravité terrestre en m/s2.
+                v = ro * g * this.prms.Q.v * this.prms.DH.v / this.prms.V.v;
+                break;
+
+            default:
+                throw "PabPuissance.Equation() : invalid variable name " + sVarCalc;
+        }
+
+        return new Result(v);
+    }
+}
diff --git a/src/param.ts b/src/param.ts
index 534c2cf0..78e7cd77 100644
--- a/src/param.ts
+++ b/src/param.ts
@@ -422,6 +422,7 @@ export enum ComputeNodeType {
     CourbeRemous, // paramètres communs à toutes les courbes de remous
     CourbeRemousTrapeze, CourbeRemousRectangle, CourbeRemousCercle, CourbeRemousPuissance,
     PabDimensions, // passe à bassin rectangulaire
+    PabPuissance, // passe à bassin : énergie dissipée
     Test
 }
 
diff --git a/src/parameters.ts b/src/parameters.ts
index 3133f27b..d9db8212 100644
--- a/src/parameters.ts
+++ b/src/parameters.ts
@@ -9,6 +9,7 @@ import { ParamsSectionPuiss, cSnPuiss } from "./section/section_puissance";
 import { RegimeUniforme } from "./regime_uniforme";
 import { CourbeRemous, CourbeRemousParams } from "./remous";
 import { PabDimensionParams, PabDimension } from "./pab/pab_dimension";
+import { PabPuissanceParams, PabPuissance } from "./pab/pab_puissance";
 
 export class ComputeNodeParameters {
     private static _instance: ComputeNodeParameters;
@@ -166,6 +167,13 @@ export class ComputeNodeParameters {
                     return cn;
                 }
 
+            case ComputeNodeType.PabPuissance:
+                {
+                    let cn = new PabPuissanceParams(undefined, undefined, undefined);
+                    let n = new PabPuissance(cn); // pour initialiser la calculabilité des paramètres
+                    return cn;
+                }
+
             default:
                 throw "ComputeNodeParameters.getComputeNodeParameters() : noeud de calcul '" + ComputeNodeType[type] + "' non pris en charge";
         }
-- 
GitLab