An error occurred while loading the file. Please try again.
-
Heraut Louis authored2c863e80
/**
* 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);
});
});
});