pab.spec.ts 10.54 KiB
/**
 * 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 { ParamValueMode, Session } from "../../src/index";
import { CloisonAval } from "../../src/pab/cloison_aval";
import { Cloisons, CloisonsParams } from "../../src/pab/cloisons";
import { Pab, PabParams } from "../../src/pab/pab";
import { ParallelStructureParams } from "../../src/structure/parallel_structure";
import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
import { StructureVanLevParams, StructureVanLevVillemonte } from "../../src/structure/structure_vanlev";
import { StructureWeirSubmergedLarinier } from "../../src/structure/structure_weir_submerged_larinier";
import { StructureWeirVillemonte } from "../../src/structure/structure_weir_villemonte";
import { MessageCode } from "../../src/util/message";
const dbg: boolean = false;
/**
 * Exemple formation Cassiopée 2018-09
function createModelCloisonTest(): Cloisons {
    // Modèle de cloison
    const modelCloisons = new Cloisons(
        new CloisonsParams(
            0,      // 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 rectStructPrms = new RectangularStructureParams(
        0,  // Q
        76.67,        // ZDV
        78.27,        // Z1 entered here for good assignation of h1
        0,      // Z2
        0.35,          // L
        0.65        // Cd pour un seuil rectangulaire
        // W = Infinity par défaut pour un seuil
    // Ajout d'ouvrage dans la cloison
    modelCloisons.addChild(new StructureWeirSubmergedLarinier(rectStructPrms));
    return modelCloisons;
function createPabTest(): Pab {
    // Création de la cloison aval
    const downWall = new CloisonAval(new ParallelStructureParams(0, 0, 0));
    const kiviPrms = new RectangularStructureParams (
        0,  // Q
        73.95,        // ZDV
        0,        // Z1
        0,      // Z2
        0.6,          // L
        0.4        // Cd pour un seuil rectangulaire
    downWall.addChild(new StructureWeirVillemonte(kiviPrms));
    // Création de la passe
    const p: Pab = new Pab(
        new PabParams(
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
0.773, 78.27, 74.86 ), downWall, dbg ); // Ajout des cloisons p.addCloisonsFromModel(createModelCloisonTest(), 15); p.downWall = downWall; return p; } function TestGeometry(b: Cloisons, ZRMB: number, ZRAM: number, ZDV: number) { it(`ZRMB should be equal to ${ZRMB}`, () => { expect(b.prms.ZRMB.currentValue).toBeCloseTo(ZRMB, 3); }); it(`ZRAM should be equal to ${ZRAM}`, () => { expect(b.prms.ZRAM.currentValue).toBeCloseTo(ZRAM, 3); }); it(`ZDV should be equal to ${ZDV}`, () => { expect(b.structures[0].prms.ZDV.currentValue).toBeCloseTo(ZDV, 3); }); } function checkPabResults(p: Pab, vCalc: number) { p.CalcSerie(); // Résultat du calcul principal (Z1 ou Q) expect(p.result.vCalc).toBeCloseTo(vCalc, 2); // Résultat Ligne d'eau (Cote de l'eau, P/V, Tmoy, DH dans les 14 bassins) const tRef = [ [78.270, 150.032, 1.500, 0.230], [78.040, 149.932, 1.501, 0.230], [77.811, 149.932, 1.501, 0.230], [77.581, 149.932, 1.501, 0.230], [77.351, 149.181, 1.502, 0.229], [77.122, 149.081, 1.503, 0.229], [76.893, 148.982, 1.504, 0.229], [76.664, 148.883, 1.505, 0.229], [76.435, 148.036, 1.507, 0.228], [76.207, 147.840, 1.509, 0.228], [75.979, 146.900, 1.512, 0.227], [75.752, 145.867, 1.516, 0.226], [75.526, 144.744, 1.521, 0.225], [75.301, 143.534, 1.527, 0.224] ]; // Cote de l'eau dernier bassin à l'amont de la cloison aval expect(p.downWall.result.vCalc).toBeCloseTo(75.077, 2); expect(p.downWall.result.extraResults.DH).toBeCloseTo(0.217, 2); expect(p.downWall.result.extraResults.ZRAM).toBeCloseTo(73.435, 2); expect(p.downWall.result.extraResults.Q).toBeCloseTo(0.773, 2); expect(p.downWall.result.extraResults.x).toBeCloseTo(3.1 * 14, 2); for (let i = 0; i < 14; i++) { // Cote de l'eau à l'amont de la cloison amont du bassin expect(p.children[i].result.vCalc).toBeCloseTo(tRef[i][0], 2); // Puissance volumique dissipée expect(p.children[i].result.extraResults.PV).toBeCloseTo(tRef[i][1], 0); // Tirant d'eau moyen expect(p.children[i].result.extraResults.YMOY).toBeCloseTo(tRef[i][2], 2); // Chute expect(p.children[i].result.extraResults.DH).toBeCloseTo(tRef[i][3], 2); // Débits expect(p.children[i].result.extraResults.Q).toBeCloseTo(0.773, 2); expect(p.children[i].result.extraResults.QA).toBeCloseTo(0, 2); // Cote radier amont expect(p.children[i].result.extraResults.ZRAM).toBeCloseTo(73.665 + (13 - i) * 0.23, 2); // Cote radier mi-bassin expect(p.children[i].result.extraResults.ZRMB).toBeCloseTo(73.550 + (13 - i) * 0.23, 2); expect(p.children[i].result.extraResults.x).toBeCloseTo(3.1 * i, 2);
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
} } // Tests let pab: Pab = createPabTest(); describe("Class Pab: ", () => { beforeEach( () => { pab = createPabTest(); }); describe("Exemple Formation 2018-09 p.14", () => { let ZRMB = 76.54; let ZDV = 76.67; let i: number = 0; for (const b of pab.children) { describe(`Geometry Basin #${i}`, () => { TestGeometry( b, ZRMB, ZRMB + 0.23 / 2, ZDV); }); i++; ZRMB -= 0.23; ZDV -= 0.23; } it("CalcSerie(Z1) should return 78.27", () => { pab.calculatedParam = pab.prms.Z1; checkPabResults(pab, 78.27); }); it("CalcSerie(Q) should return 0.773", () => { pab.calculatedParam = pab.prms.Q; checkPabResults(pab, 0.773); }); }); describe("Vanne levante sur Cloison aval", () => { beforeEach( () => { pab = createPabTest(); pab.downWall = new CloisonAval(new ParallelStructureParams(0, 0, 0)); pab.downWall.addChild( new StructureVanLevVillemonte( new StructureVanLevParams(0.773, 73, 75.090, 74.86, 0.6, 0.4, 0.217, 73.5, 74) ) ); }); it("CalcSerie(Z1) should return 78.27", () => { pab.calculatedParam = pab.prms.Z1; checkPabResults(pab, 78.27); }); it("CalcSerie(Q) should return 0.773", () => { pab.calculatedParam = pab.prms.Q; checkPabResults(pab, 0.773); }); it("CalcSerie(Z1) should return an error", () => { pab.downWall.addChild( new StructureVanLevVillemonte( new StructureVanLevParams(0.773, 73, 75.090, 74.86, 0.6, 0.4, 0.217, 73.5, 74) ) ); pab.calculatedParam = pab.prms.Z1; expect(pab.CalcSerie().globalLog.messages[0].code) .toBe(MessageCode.ERROR_CLOISON_AVAL_UN_OUVRAGE_REGULE); }); }); describe("when Z1 is too low compared to ZDV", () => { it("logs should appear if dichotomy does not converge", () => { pab.calculatedParam = pab.prms.Q; pab.prms.Z1.singleValue = 76.60; pab.CalcSerie(); expect(pab.result.hasLog).toBe(true);
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
expect(pab.result.resultElement.log.messages[0].code) .toBe(MessageCode.ERROR_PAB_Z1_LOWER_THAN_UPSTREAM_WALL); // @TODO or other error message ? }); }); describe("variating Z1", () => { it("logs should appear when Z1 < Z2", () => { pab.calculatedParam = pab.prms.Q; pab.prms.Z1.setValues(73, 85, 6); pab.CalcSerie(); expect(pab.result.nbResultElements).toBe(3); expect(pab.result.hasLog).toBe(true); expect(pab.result.resultElements[0].log.messages[0].code).toBe(MessageCode.ERROR_PAB_Z1_LOWER_THAN_Z2); }); it("erroneous first cases should not prevent subsequent cases from succeeding", () => { pab.calculatedParam = pab.prms.Q; pab.prms.Z1.setValues(73, 85, 6); pab.CalcSerie(); // for ex. Cloisons n°1 expect(pab.children[0].result.nbResultElements).toBe(3); expect(Object.keys(pab.children[0].result.resultElements[1].extraResults).length).toBe(12); }); }); describe("calculated parameter should always be Q or Z1 - ", () => { it("try setting Q and Z1 to SINGLE", () => { pab.calculatedParam = pab.prms.Q; pab.prms.Z1.valueMode = ParamValueMode.SINGLE; expect(pab.calculatedParam.symbol).toBe("Q"); pab.prms.Q.valueMode = ParamValueMode.SINGLE; expect(pab.calculatedParam.symbol).toBe("Z1"); }); it("try setting Q and Z1 to MINMAX", () => { pab.calculatedParam = pab.prms.Q; pab.prms.Z1.valueMode = ParamValueMode.MINMAX; expect(pab.calculatedParam.symbol).toBe("Q"); pab.prms.Q.valueMode = ParamValueMode.MINMAX; expect(pab.calculatedParam.symbol).toBe("Z1"); }); it("try setting Q and Z1 to LISTE", () => { pab.calculatedParam = pab.prms.Q; pab.prms.Z1.valueMode = ParamValueMode.LISTE; expect(pab.calculatedParam.symbol).toBe("Q"); pab.prms.Q.valueMode = ParamValueMode.LISTE; expect(pab.calculatedParam.symbol).toBe("Z1"); }); it("try setting Q and Z1 to LINK", () => { // clone PAB const pab2 = createPabTest(); Session.getInstance().clear(); Session.getInstance().registerNub(pab); Session.getInstance().registerNub(pab2); // link pab.prms.Z1.defineReference(pab2, "Z1"); expect(pab.calculatedParam.symbol).toBe("Q"); expect(pab.prms.Z1.valueMode).toBe(ParamValueMode.LINK); pab.prms.Q.defineReference(pab2, "Q"); expect(pab.calculatedParam.symbol).toBe("Z1"); expect(pab.prms.Q.valueMode).toBe(ParamValueMode.LINK); }); }); });