From 875347a653422d755b9e7e4ece10dc1fb8ee19ea Mon Sep 17 00:00:00 2001
From: David Dorchies <david.dorchies@irstea.fr>
Date: Thu, 18 Apr 2019 11:47:05 +0200
Subject: [PATCH] =?UTF-8?q?#33=20PAB=201=C3=A8re=20version=20qui=20compile?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/pab/pab.spec.ts         | 49 ++++++++++++++++++++++++
 src/pab/pab.ts               | 62 +++++++++++++++++++++++++++++++
 src/pab/pab_cloisons.ts      | 72 ++++++++++++++++++++++++++++++++++++
 src/pab/pab_params.ts        | 33 +++++++++++++++++
 src/param/params-equation.ts |  7 ++--
 src/structure/cloisons.ts    |  3 ++
 6 files changed, 223 insertions(+), 3 deletions(-)
 create mode 100644 spec/pab/pab.spec.ts
 create mode 100644 src/pab/pab.ts
 create mode 100644 src/pab/pab_cloisons.ts
 create mode 100644 src/pab/pab_params.ts

diff --git a/spec/pab/pab.spec.ts b/spec/pab/pab.spec.ts
new file mode 100644
index 00000000..f98a08cc
--- /dev/null
+++ b/spec/pab/pab.spec.ts
@@ -0,0 +1,49 @@
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier test_func.ts
+ */
+// import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
+
+import { Pab, PabParams } from "../../src/pab/pab";
+import { PabCloisons } from "../../src/pab/pab_cloisons";
+import { Cloisons, CloisonsParams } from "../../src/structure/cloisons";
+
+/**
+ * Exemple formation Cassiopée 2018-09
+ */
+
+// Modèle de cloison
+const modelCloisons = new Cloisons(
+    new CloisonsParams(
+        0.773,      // Débit total (m3/s)
+        78.27,    // Cote de l'eau amont (m)
+        3.1,     // Longueur des bassins (m)
+        2.5,      // Largeur des bassins (m)
+        1.5,      // Profondeur moyenne (m)
+        0.23     // Hauteur de chute (m)
+    )
+);
+
+const pab: Pab = new Pab(
+    new PabParams(
+        0,
+        78.27,
+        74.86
+    )
+);
+
+const pabCloison = new PabCloisons(modelCloisons);
+
+for (let i = 0; i < 15; i++) {
+    pab.addChild(pabCloison);
+}
+
+describe("Class Pab: ", () => {
+    describe("Calc(Z1) Exemple Formation 2018-09 p.14", () => {
+        it("vCalc(Z1) should return 78.27", () => {
+            expect(pab.Calc("Z1").vCalc).toBeCloseTo(78.27, 2);
+        });
+    });
+});
diff --git a/src/pab/pab.ts b/src/pab/pab.ts
new file mode 100644
index 00000000..3b58e19e
--- /dev/null
+++ b/src/pab/pab.ts
@@ -0,0 +1,62 @@
+import { Nub } from "../nub";
+import { ParamCalculability } from "../param/param-definition";
+import { Result } from "../util/result";
+import { PabCloisons } from "./pab_cloisons";
+import { PabParams } from "./pab_params";
+
+export { PabParams };
+
+export class Pab extends Nub {
+
+    /**
+     * paramètres castés au bon type
+     */
+    get prms(): PabParams {
+        return this._prms as PabParams;
+    }
+
+    /** Tableau des cloisons en série */
+    protected _pabCloisons: PabCloisons[] = [];
+
+    /**
+     * Calcul analytique
+     * @param sVarCalc Variable à calculer (Z1 uniquement)
+     */
+    public Equation(sVarCalc: string): Result {
+        const r: Result = new Result(0, this);
+        let Z: number = this.prms.Z2.v;
+        for (const cloison of this._pabCloisons) {
+            cloison.prms.Z2.v = Z;
+            cloison.Calc("Z1");
+            Z = cloison.prms.Z1.v;
+        }
+        this.prms.Z1.v = Z;
+        return r;
+    }
+
+    /**
+     * Ajout d'une cloison en série
+     * @param structure La structure à rajouter
+     * @param after position après laquelle insérer la cloison, à la fin sinon
+     */
+    public addChild(pabCloisons: PabCloisons, after?: number) {
+        if (after !== undefined) {
+            this._pabCloisons.splice(after + 1, 0, pabCloisons);
+        } else {
+            this._pabCloisons.push(pabCloisons);
+        }
+        // add reference to parent collection (this)
+        pabCloisons.parent = this;
+        // propagate precision
+        pabCloisons.prms.Pr.setValue(this.prms.Pr.v); // does not write to .v to bypass calculability control
+    }
+
+    /**
+     * paramétrage de la calculabilité des paramètres
+     */
+    protected setParametersCalculability() {
+        this.prms.Z1.calculability = ParamCalculability.EQUATION;
+        this.prms.Z2.calculability = ParamCalculability.DICHO;
+        this.prms.Q.calculability = ParamCalculability.DICHO;
+    }
+}
\ No newline at end of file
diff --git a/src/pab/pab_cloisons.ts b/src/pab/pab_cloisons.ts
new file mode 100644
index 00000000..631fdd64
--- /dev/null
+++ b/src/pab/pab_cloisons.ts
@@ -0,0 +1,72 @@
+import { ParamCalculability, ParamDefinition, ParamFamily} from "../param/param-definition";
+import { ParamDomainValue } from "../param/param-domain";
+import { ParamsEquation } from "../param/params-equation";
+import { Cloisons, CloisonsParams } from "../structure/cloisons";
+import { Pab } from "./pab";
+
+class PabCloisonsParams extends CloisonsParams {
+
+   /** Débit entrant à l'amont de la passe (m3/s) */
+   public QA: ParamDefinition;
+
+    /**
+     * Paramètres communs à toutes les équations de structure
+     * @param rQ Débit total (m3/s)
+     * @param rZ1 Cote de l'eau amont (m)
+     * @param rLB Longueur des bassins (m)
+     * @param rBB Largeur des bassins (m)
+     * @param rPB Profondeur moyenne (m)
+     * @param rDH Hauteur de chute (m)
+     */
+    constructor(modelCloisonsParams: CloisonsParams, rQA: number = 0) {
+        super(
+            modelCloisonsParams.Q.v,
+            modelCloisonsParams.Z1.v,
+            modelCloisonsParams.LB.v,
+            modelCloisonsParams.BB.v,
+            modelCloisonsParams.PB.v,
+            modelCloisonsParams.DH.v
+        );
+        this.Q = modelCloisonsParams.Q;
+        this.Z1 = modelCloisonsParams.Z1;
+        this.LB = modelCloisonsParams.LB;
+        this.BB = modelCloisonsParams.BB;
+        this.PB = modelCloisonsParams.PB;
+        this.DH = modelCloisonsParams.DH;
+        // Force la MAJ de la map avec les propriétés pointant vers celles de CloisonsParam
+        this.addParamDefinitions(modelCloisonsParams);
+        // On garde Pr en propre sur cet objet (Pointage impossible car en lecture seule)
+        this.addParamDefinition(this.Pr, true);
+
+        this.QA = new ParamDefinition(this, "QA", ParamDomainValue.ANY, rQA, ParamFamily.FLOWS);
+        this.addParamDefinition(this.QA);
+    }
+
+}
+
+// tslint:disable-next-line:max-classes-per-file
+export class PabCloisons extends Cloisons {
+
+    public parent: Pab;
+
+    constructor(modelCloisons: Cloisons, rQA: number = 0, dbg: boolean = false) {
+        super(new PabCloisonsParams(modelCloisons.prms, rQA), dbg);
+        this._structures = modelCloisons.structures;
+    }
+
+    /**
+     * paramètres castés au bon type
+     */
+    get prms(): PabCloisonsParams {
+        return this._prms as PabCloisonsParams;
+    }
+
+    /**
+     * paramétrage de la calculabilité des paramètres
+     */
+    protected setParametersCalculability() {
+        super.setParametersCalculability();
+        this.prms.QA.calculability = ParamCalculability.FREE;
+    }
+
+}
diff --git a/src/pab/pab_params.ts b/src/pab/pab_params.ts
new file mode 100644
index 00000000..00949271
--- /dev/null
+++ b/src/pab/pab_params.ts
@@ -0,0 +1,33 @@
+import { ParamDefinition, ParamFamily } from "../param/param-definition";
+import { ParamDomainValue } from "../param/param-domain";
+import { ParamsEquation } from "../param/params-equation";
+
+/**
+ * Parameters of a fish ladder
+ */
+export class PabParams extends ParamsEquation {
+
+    /** Débit entrant à l'amont de la passe (m3/s) */
+    public Q: ParamDefinition;
+
+    /** Cote de l'eau amont (m) */
+    public Z1: ParamDefinition;
+
+    /** Cote de l'eau aval (m) */
+    public Z2: ParamDefinition;
+
+    /**
+     * Paramètres communs à toutes les équations de structure
+     * @param rZ1 Cote de l'eau amont (m)
+     * @param rZ2 Cote de l'eau aval (m)
+     */
+    constructor(rQ: number, rZ1: number, rZ2: number) {
+        super();
+        this.Q = new ParamDefinition(this, "Q", ParamDomainValue.ANY, rZ1, ParamFamily.FLOWS);
+        this.addParamDefinition(this.Q);
+        this.Z1 = new ParamDefinition(this, "Z1", ParamDomainValue.ANY, rZ1, ParamFamily.ELEVATIONS);
+        this.addParamDefinition(this.Z1);
+        this.Z2 = new ParamDefinition(this, "Z2", ParamDomainValue.ANY, rZ2, ParamFamily.ELEVATIONS);
+        this.addParamDefinition(this.Z2);
+    }
+}
diff --git a/src/param/params-equation.ts b/src/param/params-equation.ts
index 5e13164f..5bc60a08 100644
--- a/src/param/params-equation.ts
+++ b/src/param/params-equation.ts
@@ -168,15 +168,16 @@ export abstract class ParamsEquation implements Iterable<ParamDefinition> {
         return new ParamDefinitionIterator(this);
     }
 
-    protected addParamDefinition(p: ParamDefinition) {
-        if (!this.hasParameter(p.symbol)) {
+    protected addParamDefinition(p: ParamDefinition, force: boolean = false) {
+        if (force || !this.hasParameter(p.symbol)) {
             this._paramMap[p.symbol] = p;
         }
     }
 
     protected addParamDefinitions(ps: ParamsEquation) {
         for (const p of ps) {
-            this.addParamDefinition(p);
+            // Force update of the map index
+            this.addParamDefinition(p, true);
         }
     }
 }
diff --git a/src/structure/cloisons.ts b/src/structure/cloisons.ts
index bfc110a8..19eb0a07 100644
--- a/src/structure/cloisons.ts
+++ b/src/structure/cloisons.ts
@@ -85,6 +85,9 @@ export class Cloisons extends ParallelStructure {
         );
         r.extraResults.PV = puissanceNub.Calc("PV", 0).vCalc;
 
+        // Ajout de la cote de radier
+        r.extraResults.ZB = prms.Z1 - prms.DH - prms.PB;
+
         return r;
     }
 
-- 
GitLab