From a825512f738de745e80fb7ccf53d35f66e9c876d Mon Sep 17 00:00:00 2001
From: David Dorchies <david.dorchies@irstea.fr>
Date: Wed, 20 Jun 2018 14:48:45 +0200
Subject: [PATCH] Closes #29

---
 spec/structure/dever.spec.ts                  | 44 ++++++++++
 src/structure/dever.ts                        | 88 +++++++++++++++++++
 src/structure/dever_params.ts                 | 29 ++++++
 src/structure/factory_structure.ts            |  9 +-
 src/structure/structure_props.ts              |  7 +-
 ...cture_triangular_trunc_weir_free_params.ts |  5 +-
 .../structure_triangular_weir_free_params.ts  |  5 +-
 7 files changed, 176 insertions(+), 11 deletions(-)
 create mode 100644 spec/structure/dever.spec.ts
 create mode 100644 src/structure/dever.ts
 create mode 100644 src/structure/dever_params.ts

diff --git a/spec/structure/dever.spec.ts b/spec/structure/dever.spec.ts
new file mode 100644
index 00000000..dc43499a
--- /dev/null
+++ b/spec/structure/dever.spec.ts
@@ -0,0 +1,44 @@
+/**
+ * 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 { Dever, DeverParams } from "../../src/structure/dever";
+import { CreateStructure } from "../../src/structure/factory_structure";
+import { LoiDebit, StructureType } from "../../src/structure/structure_props";
+import { Result } from "../../src/util/result";
+
+const dever: Dever = new Dever(
+    new DeverParams(
+        0,     // rQ DÊbit total (m3/s)
+        102,   // rZ1 Cote de l'eau amont (m)
+        2,     // rBR Largeur du cours d'eau amont (m)
+        100    // rZR Cote du lit du cours d'eau amont (m)
+    ),
+    false // debug
+);
+
+dever.addStructure(CreateStructure(StructureType.SeuilTriangulaireTrunc, LoiDebit.TriangularTruncWeirFree, false));
+
+describe("Class Dever: ", () => {
+    describe("Calc(Q) Seuil Triangulaire Trunc", () => {
+        it("vCalc should return 5.407", () => {
+            expect(dever.Calc("Q").vCalc).toBeCloseTo(5.407, 3);
+        });
+        it("extraResults.V should return 1.352", () => {
+            expect(dever.Calc("Q").extraResults.V).toBeCloseTo(1.352, 3);
+        });
+        it("extraResults.Ec should return 0.093", () => {
+            expect(dever.Calc("Q").extraResults.Ec).toBeCloseTo(0.093, 3);
+        });
+        it("extraResults.Cv should return 1.116", () => {
+            expect(dever.Calc("Q").extraResults.Cv).toBeCloseTo(1.116, 3);
+        });
+        it("extraResults.CvQT should return 6.036", () => {
+            expect(dever.Calc("Q").extraResults.CvQT).toBeCloseTo(6.036, 3);
+        });
+    });
+});
diff --git a/src/structure/dever.ts b/src/structure/dever.ts
new file mode 100644
index 00000000..2f935588
--- /dev/null
+++ b/src/structure/dever.ts
@@ -0,0 +1,88 @@
+import { Nub } from "../nub";
+import { ParamCalculability, ParamDefinition } from "../param/param-definition";
+import { Result } from "../util/result";
+import { DeverParams } from "./dever_params";
+import { ParallelStructure } from "./parallel_structure";
+
+export { DeverParams };
+
+export class Dever extends ParallelStructure {
+    constructor(prms: DeverParams, dbg: boolean = false) {
+        super(prms, dbg);
+    }
+
+    /**
+     * paramètres castÊs au bon type
+     */
+    get prms(): DeverParams {
+        return this._prms as DeverParams;
+    }
+
+    /**
+     * Calcul pour tous les paramètres
+     * @param sVarCalc Paramètre à calculer
+     * @returns RÊsultat avec rÊsultats complÊmentaires et message
+     */
+    public Equation(sVarCalc: string): Result {
+        const r: Result = super.Equation(sVarCalc);
+        let QT: number;
+        if (sVarCalc === "Q") {
+            QT = r.vCalc;
+        } else {
+            QT = this.prms.Q.v;
+        }
+        // Vitesse dans le cours d'eau amont
+        r.extraResults.V = QT / (this.prms.BR.v * Math.max(0, this.prms.Z1.v - this.prms.ZR.v));
+        // Energie cinÊtique dans le cours d'eau amont
+        r.extraResults.Ec = r.extraResults.V * r.extraResults.V / (2 * 9.81);
+        // Calcul du rapport des aires sur les seuils et de l'aire du cours d'eau amont
+        const rA: number = this.calcA() / (this.prms.BR.v * Math.max(0, this.prms.Z1.v - this.prms.ZR.v));
+        // Calcul de Cv
+        r.extraResults.Cv = this.calcCv(rA);
+        // Calcul de CV.QT
+        r.extraResults.CvQT = r.extraResults.Cv * QT;
+        return r;
+    }
+
+    /**
+     * paramÊtrage de la calculabilitÊ des paramètres
+     */
+    protected setParametersCalculability() {
+        super.setParametersCalculability();
+        this.prms.BR.calculability = ParamCalculability.FREE;
+        this.prms.ZR.calculability = ParamCalculability.FREE;
+        // On supprime Z2 de l'interface car rÊgime dÊnoyÊ uniquement
+        this.prms.Z2.calculability = ParamCalculability.NONE;
+    }
+
+    /**
+     * Calcul de la somme des aires des ouvrages.
+     * @note N.B. : doit ÃĒtre appelÊ après calcul si le calcul porte sur Z1 ou
+     */
+    private calcA(): number {
+        let A: number = 0;
+        for (const st of this.structures) {
+            A += st.calcA();
+        }
+        return A;
+    }
+
+    /**
+     * Calcul du facteur de la correction du coefficient de dÊbit dÃģ à la vitesse d'approche
+     * @param rA Rapport entre l'aire d'Êcoulement des seuils et l'aire de la section amont
+     */
+    private calcCv(rA: number): number {
+        const aA: number[] = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8];
+        const aCv: number[] = [1, 1.005, 1.015, 1.022, 1.035, 1.065, 1.09, 1.14, 1.21];
+        // tslint:disable-next-line:prefer-for-of
+        for (let i = 1; i < aA.length; i++) {
+            if (rA < aA[i]) {
+                const k: number = (rA - aA[i - 1]) / (aA[i] - aA[i - 1]);
+                return aCv[i - 1] * (1 - k) + k * aCv[i];
+            }
+        }
+        // Rapport des aires supÊrieur à 0.8 => Cv = 1.21
+        return aCv[aCv.length - 1];
+    }
+
+}
diff --git a/src/structure/dever_params.ts b/src/structure/dever_params.ts
new file mode 100644
index 00000000..02bad78a
--- /dev/null
+++ b/src/structure/dever_params.ts
@@ -0,0 +1,29 @@
+import { ParamDefinition } from "../param/param-definition";
+import { ParamDomainValue } from "../param/param-domain";
+import { ParallelStructureParams } from "./parallel_structure_params";
+
+/**
+ * Common parameters of hydraulic structure equations
+ */
+export class DeverParams extends ParallelStructureParams {
+    /** Largeur du cours d'eau amont (m) */
+    public BR: ParamDefinition;
+
+    /** Cote du lit du cours d'eau amont (m) */
+    public ZR: 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 rBR Largeur du cours d'eau amont (m)
+     * @param rZR Cote du lit du cours d'eau amont (m)
+     */
+    constructor(rQ: number, rZ1: number, rBR: number, rZR: number) {
+        super(rQ, rZ1, - Infinity);
+        this.BR = new ParamDefinition("BR", ParamDomainValue.ANY, rBR);
+        this.addParamDefinition(this.BR);
+        this.ZR = new ParamDefinition("ZR", ParamDomainValue.ANY, rZR);
+        this.addParamDefinition(this.ZR);
+    }
+}
diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts
index 302113c6..91200313 100644
--- a/src/structure/factory_structure.ts
+++ b/src/structure/factory_structure.ts
@@ -26,6 +26,7 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
         // W = Infinity par dÊfaut pour un seuil
     );
 
+    // Control of validity of structure type and definition of parameters
     switch (structureType) {
         case StructureType.VanneRectangulaire:
             rectStructPrms.W.v = 0.5;
@@ -33,17 +34,21 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
             break;
         case StructureType.SeuilRectangulaire:
         case StructureType.SeuilTriangulaire:
+        case StructureType.SeuilTriangulaireTrunc:
             break;
 
         default:
             throw new Error(`type de structure ${StructureType[structureType]} non pris en charge`);
     }
+
+    // Control validity of the couple Structure Type / Discharge equation
     if (!(StructureProperties.isCompatibleValues(structureType, loiDebit))) {
         throw new Error(
             `La loi de dÊbit ${LoiDebit[loiDebit]} n'est pas admissible pour le type ${StructureType[structureType]}`
         );
     }
 
+    // Instanciation of the equation
     switch (loiDebit) {
         case LoiDebit.Cem88d:
             rectStructPrms.Cd.v = oCd.SeuilR; // Cd Cem88d qu'on soit en seuil ou vanne
@@ -82,7 +87,6 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
                 0,          // Q
                 100,        // ZDV
                 102,        // Z1
-                101.5,      // Z2
                 45,         // Alpha2
                 oCd.SeuilT  // Cd pour un seuil triangulaire
                 // W = Infinity par dÊfaut pour un seuil
@@ -91,9 +95,8 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
             case LoiDebit.TriangularTruncWeirFree:
             const structTriTruncPrms: TriangularTruncStructureParams = new TriangularTruncStructureParams(
                 0,          // Q
-                100,        // ZDV
+                100.1,        // ZDV
                 102,        // Z1
-                101.5,      // Z2
                 0.9,        // BT
                 101,        // ZT
                 oCd.SeuilT  // Cd pour un seuil triangulaire
diff --git a/src/structure/structure_props.ts b/src/structure/structure_props.ts
index e8bc5aa5..d7835ef4 100644
--- a/src/structure/structure_props.ts
+++ b/src/structure/structure_props.ts
@@ -1,5 +1,5 @@
 export enum StructureType {
-    SeuilRectangulaire, VanneRectangulaire, SeuilTriangulaire
+    SeuilRectangulaire, VanneRectangulaire, SeuilTriangulaire, SeuilTriangulaireTrunc
     // VanneCirculaire,
     // VanneTrapezoidale, SeuilTrapezoidal
 }
@@ -31,7 +31,10 @@ export const loiAdmissibles: { [key: string]: LoiDebit[] } = {
         LoiDebit.KIVI
     ],
     SeuilTriangulaire: [
-        LoiDebit.TriangularWeirFree, LoiDebit.TriangularTruncWeirFree
+        LoiDebit.TriangularWeirFree
+    ],
+    SeuilTriangulaireTrunc: [
+        LoiDebit.TriangularTruncWeirFree
     ],
     VanneRectangulaire: [
         LoiDebit.Cem88d, LoiDebit.Cem88v, LoiDebit.Cunge80, LoiDebit.OrificeFree,
diff --git a/src/structure/structure_triangular_trunc_weir_free_params.ts b/src/structure/structure_triangular_trunc_weir_free_params.ts
index 81fc59fc..7b3687b9 100644
--- a/src/structure/structure_triangular_trunc_weir_free_params.ts
+++ b/src/structure/structure_triangular_trunc_weir_free_params.ts
@@ -21,17 +21,16 @@ export class TriangularTruncStructureParams extends StructureParams {
      * @param rQ    DÊbit (m3/s)
      * @param rZDV  Cote de la crÃĒte du dÊversoir ou du radier de la vanne (m)
      * @param rZ1   Cote de l'eau amont (m)
-     * @param rZ2   Cote de l'eau aval (m)
      * @param rBT   Demi-ouverture du triangle (m)
      * @param rZT   Cote haute du triangle (m)
      * @param rCd   Coefficient de dÊbit (-)
      * @param rW    Ouverture de la vanne (m) (Valeur par dÊfaut +infinity pour les dÊversoirs)
      */
     constructor(
-        rQ: number, rZDV: number, rZ1: number, rZ2: number,
+        rQ: number, rZDV: number, rZ1: number,
         rBT: number, rZT: number, rCd: number, rW: number = Infinity
     ) {
-        super(rQ, rZDV, rZ1, rZ2, rW);
+        super(rQ, rZDV, rZ1, - Infinity, rW);
         this.BT = new ParamDefinition("BT", ParamDomainValue.POS, rBT);
         this.addParamDefinition(this.BT);
         this.ZT = new ParamDefinition("ZT", ParamDomainValue.POS, rZT);
diff --git a/src/structure/structure_triangular_weir_free_params.ts b/src/structure/structure_triangular_weir_free_params.ts
index 306b94ac..7cfe3544 100644
--- a/src/structure/structure_triangular_weir_free_params.ts
+++ b/src/structure/structure_triangular_weir_free_params.ts
@@ -18,16 +18,15 @@ export class TriangularStructureParams extends StructureParams {
      * @param rQ    DÊbit (m3/s)
      * @param rZDV  Cote de la crÃĒte du dÊversoir ou du radier de la vanne (m)
      * @param rZ1   Cote de l'eau amont (m)
-     * @param rZ2   Cote de l'eau aval (m)
      * @param rAlpha2    Demi-angle au sommet du triangle (degrÊs)
      * @param rCd   Coefficient de dÊbit (-)
      * @param rW    Ouverture de la vanne (m) (Valeur par dÊfaut +infinity pour les dÊversoirs)
      */
     constructor(
-        rQ: number, rZDV: number, rZ1: number, rZ2: number,
+        rQ: number, rZDV: number, rZ1: number,
         rAlpha2: number, rCd: number, rW: number = Infinity
     ) {
-        super(rQ, rZDV, rZ1, rZ2, rW);
+        super(rQ, rZDV, rZ1, - Infinity, rW);
         this.alpha2 = new ParamDefinition("alpha2", ParamDomainValue.POS, rAlpha2);
         this.addParamDefinition(this.alpha2);
         this.Cd = new ParamDefinition("Cd", ParamDomainValue.POS, rCd);
-- 
GitLab