diff --git a/spec/structure/structure_triangular_trunc_weir_free.spec.ts b/spec/structure/structure_triangular_trunc_weir.spec.ts similarity index 89% rename from spec/structure/structure_triangular_trunc_weir_free.spec.ts rename to spec/structure/structure_triangular_trunc_weir.spec.ts index c80ce74ca7f00d843aa9332c0d75625df774936c..c96923e70f1152bf5152738091b3471c794a687e 100644 --- a/spec/structure/structure_triangular_trunc_weir_free.spec.ts +++ b/spec/structure/structure_triangular_trunc_weir.spec.ts @@ -7,12 +7,12 @@ // import { describe, expect, it, xdescribe } from "../mock_jasmine"; import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure"; -import { StructureTriangularTruncWeirFree } from "../../src/structure/structure_triangular_trunc_weir_free"; -import { TriangularTruncStructureParams } from "../../src/structure/structure_triangular_trunc_weir_free_params"; +import { StructureTriangularTruncWeirFree } from "../../src/structure/structure_triangular_trunc_weir"; +import { TriangularTruncStructureParams } from "../../src/structure/structure_triangular_trunc_weir_params"; import { itCalcQ } from "./functions"; const structPrm: TriangularTruncStructureParams = - new TriangularTruncStructureParams(0, 100.1, 100, 0.9, 101, 1.36); + new TriangularTruncStructureParams(0, 100.1, 100, 100, 0.9, 101, 1.36); const structTest: StructureTriangularTruncWeirFree = new StructureTriangularTruncWeirFree(structPrm, false); describe("Class StructureTriangularTruncWeirFree: ", () => { diff --git a/spec/structure/structure_triangular_weir_free.spec.ts b/spec/structure/structure_triangular_weir.spec.ts similarity index 81% rename from spec/structure/structure_triangular_weir_free.spec.ts rename to spec/structure/structure_triangular_weir.spec.ts index 3ee65c5848d52d849767445f1c619cb2ff5f6b91..9991abb2cc1e82d72396cd7ad16f677917d540fd 100644 --- a/spec/structure/structure_triangular_weir_free.spec.ts +++ b/spec/structure/structure_triangular_weir.spec.ts @@ -7,12 +7,12 @@ // import { describe, expect, it, xdescribe } from "../mock_jasmine"; import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure"; -import { StructureTriangularWeirFree } from "../../src/structure/structure_triangular_weir_free"; -import { TriangularStructureParams } from "../../src/structure/structure_triangular_weir_free_params"; +import { StructureTriangularWeir } from "../../src/structure/structure_triangular_weir"; +import { TriangularStructureParams } from "../../src/structure/structure_triangular_weir_params"; import { itCalcQ } from "./functions"; -const structPrm: TriangularStructureParams = new TriangularStructureParams(0, 100.1, 100.1, 45, 1.36); -const structTest: StructureTriangularWeirFree = new StructureTriangularWeirFree(structPrm, false); +const structPrm: TriangularStructureParams = new TriangularStructureParams(0, 100.1, 100.1, 100.1, 45, 1.36); +const structTest: StructureTriangularWeir = new StructureTriangularWeir(structPrm, false); describe("Class StructureTriangularWeirFree: ", () => { describe("Calcul Q a surface libre avec h1 croissant: ", () => { diff --git a/spec/structure/structure_weir_submerged_larinier.spec.ts b/spec/structure/structure_weir_submerged_larinier.spec.ts index 1952ed2f26f196c7e1f6e80312025e39965534f9..217491c52244d3bd3a85f5d1695fc17f4f6930c0 100644 --- a/spec/structure/structure_weir_submerged_larinier.spec.ts +++ b/spec/structure/structure_weir_submerged_larinier.spec.ts @@ -10,12 +10,13 @@ import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/stru // tslint:disable-next-line:max-line-length import { RectangularStructureParams, StructureWeirSubmergedLarinier } from "../../src/structure/structure_weir_submerged_larinier"; import { itCalcQ } from "../structure/functions"; +import { precDigits } from "../test_config"; const prms: RectangularStructureParams = new RectangularStructureParams(0, 101, 102, 101.5, 0.2, 0.65); const test: StructureWeirSubmergedLarinier = new StructureWeirSubmergedLarinier(prms, false); -describe("Class CloisonsOrifice: ", () => { - describe("Calc(Q): ", () => { +describe("Class StructureWeirSubmergedLarinier: ", () => { + xdescribe("Calc(Q): ", () => { const Z1: number[] = [102]; const Q: number[] = [0.407]; const mode: StructureFlowMode = StructureFlowMode.WEIR; @@ -24,4 +25,13 @@ describe("Class CloisonsOrifice: ", () => { itCalcQ(test, Z1[i], Infinity, Q[i], mode, regime); } }); + describe("Calc(Z1): ", () => { + it("Z1(Q=0.780) should be 75.301", () => { + const testZ1 = new StructureWeirSubmergedLarinier( + new RectangularStructureParams(0.780, 73.665, 75.301, 75.077, 0.35, 0.65), + false); + testZ1.prms.Z1.v = 100; // Test with initial condition far from solution + expect(testZ1.Calc("Z1").vCalc).toBeCloseTo(75.301, precDigits); + }); + }); }); diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts index 1379b405f308414b607978ff940bef0966d7775d..48d711d014617ed8b064bf1484dc420248308c64 100644 --- a/src/structure/factory_structure.ts +++ b/src/structure/factory_structure.ts @@ -14,8 +14,8 @@ import { StructureOrificeSubmerged, StructureOrificeSubmergedParams } from "./st import { StructureRectangularOrificeFree } from "./structure_rectangular_orifice_free"; import { StructureRectangularOrificeSubmerged } from "./structure_rectangular_orifice_submerged"; // tslint:disable-next-line:max-line-length -import { StructureTriangularTruncWeirFree, TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free"; -import { StructureTriangularWeirFree, TriangularStructureParams } from "./structure_triangular_weir_free"; +import { StructureTriangularTruncWeirFree, TriangularTruncStructureParams } from "./structure_triangular_trunc_weir"; +import { StructureTriangularWeir, TriangularStructureParams } from "./structure_triangular_weir"; import { StructureWeirFree } from "./structure_weir_free"; import { StructureWeirSubmergedLarinier } from "./structure_weir_submerged_larinier"; @@ -93,16 +93,18 @@ export function CreateStructure(loiDebit: LoiDebit, parentNub?: ParallelStructur 0, // Q 100, // ZDV 102, // Z1 + 100, // Z2 45, // Alpha2 oCd.SeuilT // Cd pour un seuil triangulaire // W = Infinity par défaut pour un seuil ); - return new StructureTriangularWeirFree(structTriangPrms, dbg); + return new StructureTriangularWeir(structTriangPrms, dbg); case LoiDebit.TriangularTruncWeirFree: const structTriTruncPrms: TriangularTruncStructureParams = new TriangularTruncStructureParams( 0, // Q 100.1, // ZDV 102, // Z1 + 100.1, // Z2 0.9, // BT 101, // ZT oCd.SeuilT // Cd pour un seuil triangulaire diff --git a/src/structure/structure.ts b/src/structure/structure.ts index c92d5e381cebcb8b3c820252c6b7cf00b027ea04..0d44f85b78c5971fd2856f550cc523eff6a063f1 100644 --- a/src/structure/structure.ts +++ b/src/structure/structure.ts @@ -232,6 +232,9 @@ export abstract class Structure extends Nub { if ((sVarCalc === "Q" && (this.prms.h1.v < this.prms.h2.v)) || (sVarCalc !== "Q" && this.prms.Q.v < 0)) { [this.prms.h1.v, this.prms.h2.v] = [this.prms.h2.v, this.prms.h1.v]; // Swap ES6 fashion const res: Result = super.Calc(sVarCalc, rInit); + if (sVarCalc === "Q") { + res.vCalc = -res.vCalc; + } [this.prms.h1.v, this.prms.h2.v] = [this.prms.h2.v, this.prms.h1.v]; // Swap ES6 fashion return res; } diff --git a/src/structure/structure_props.ts b/src/structure/structure_props.ts index 5c366ecf2b05673a42c82d9b3bd1e617ea609502..04cd480a1c55a08c95b696394cfef434fe1af771 100644 --- a/src/structure/structure_props.ts +++ b/src/structure/structure_props.ts @@ -33,7 +33,7 @@ export enum LoiDebit { TriangularWeirFree, // Loi de débit seuil triangulaire tronqué TriangularTruncWeirFree, - // Loi de débit seuil noyé (Larinier 1992) + // Loi de débit fente noyée (Larinier 1992) WeirSubmergedLarinier, // Loi de débit orifice noyé OrificeSubmerged @@ -45,7 +45,7 @@ export const loiAdmissiblesOuvrages: { [key: string]: LoiDebit[] } = { ], SeuilRectangulaire: [ LoiDebit.WeirCem88d, LoiDebit.WeirCem88v, LoiDebit.Cunge80, LoiDebit.WeirFree, - LoiDebit.KIVI + LoiDebit.KIVI, LoiDebit.WeirSubmergedLarinier ], SeuilTriangulaire: [ LoiDebit.TriangularWeirFree diff --git a/src/structure/structure_triangular_trunc_weir_free.ts b/src/structure/structure_triangular_trunc_weir.ts similarity index 71% rename from src/structure/structure_triangular_trunc_weir_free.ts rename to src/structure/structure_triangular_trunc_weir.ts index dbecb29e18fef3f2f4fa7885036e52455752c60e..4a709256902b2df80ba87018251b3fdf8b0ece24 100644 --- a/src/structure/structure_triangular_trunc_weir_free.ts +++ b/src/structure/structure_triangular_trunc_weir.ts @@ -2,7 +2,8 @@ import { ParamCalculability } from "../param/param-definition"; import { Result } from "../util/result"; import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure"; import { LoiDebit } from "./structure_props"; -import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free_params"; +import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_params"; +import { Villemonte } from "./villemonte"; export { TriangularTruncStructureParams }; @@ -31,14 +32,18 @@ export class StructureTriangularTruncWeirFree extends Structure { Structure.CheckEquation(sVarCalc); const data = this.getResultData(); - let v: number = this.prms.Cd.v * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v); + let Q: number = this.prms.Cd.v * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v); if (this.prms.Z1.v <= this.prms.ZT.v) { - v = v * Math.pow(this.prms.h1.v, 2.5); + Q = Q * Math.pow(this.prms.h1.v, 2.5); } else { - v = v * (Math.pow(this.prms.h1.v, 2.5) - Math.pow(this.prms.Z1.v - this.prms.ZT.v, 2.5)); + Q = Q * (Math.pow(this.prms.h1.v, 2.5) - Math.pow(this.prms.Z1.v - this.prms.ZT.v, 2.5)); } - return new Result(v, this, data); + if (data.ENUM_StructureFlowRegime !== StructureFlowRegime.FREE) { + Q = Villemonte(this.prms.h1.v, this.prms.h2.v, 2.5) * Q; + } + + return new Result(Q, this, data); } /** @@ -56,7 +61,16 @@ export class StructureTriangularTruncWeirFree extends Structure { } protected getFlowRegime() { - return StructureFlowRegime.FREE; + if (this.prms.Z2.v <= this.prms.ZDV.v) { + return StructureFlowRegime.FREE; + } else { + // La réduction de débit s'applique dès que Z2 > ZDV (Villemonte, 1946) + if (this.prms.h2.v < 4 / 5 * this.prms.h1.v) { + // Yc = 4 / 5 * H1 (Jameson, 1925) + return StructureFlowRegime.PARTIAL; + } + return StructureFlowRegime.SUBMERGED; + } } protected getFlowMode() { diff --git a/src/structure/structure_triangular_trunc_weir_free_params.ts b/src/structure/structure_triangular_trunc_weir_params.ts similarity index 91% rename from src/structure/structure_triangular_trunc_weir_free_params.ts rename to src/structure/structure_triangular_trunc_weir_params.ts index 694f2b9db203e606ce38e9fa2bb292c6bda7f091..fa3b77004f6ec08d5c59e73e2dc225703c8dfd98 100644 --- a/src/structure/structure_triangular_trunc_weir_free_params.ts +++ b/src/structure/structure_triangular_trunc_weir_params.ts @@ -21,16 +21,17 @@ 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, + rQ: number, rZDV: number, rZ1: number, rZ2: number, rBT: number, rZT: number, rCd: number, rW: number = Infinity ) { - super(rQ, rZDV, rZ1, - Infinity, rW); + super(rQ, rZDV, rZ1, rZ2, rW); this.BT = new ParamDefinition(this, "BT", ParamDomainValue.POS, rBT); this.addParamDefinition(this.BT); this.ZT = new ParamDefinition(this, "ZT", ParamDomainValue.POS, rZT, ParamFamily.ELEVATIONS); diff --git a/src/structure/structure_triangular_weir_free.ts b/src/structure/structure_triangular_weir.ts similarity index 67% rename from src/structure/structure_triangular_weir_free.ts rename to src/structure/structure_triangular_weir.ts index 0890add9d0f4924b77359c241ee1bdd8e90410db..ee505df9c103fe166a3f0cb955642393db99468b 100644 --- a/src/structure/structure_triangular_weir_free.ts +++ b/src/structure/structure_triangular_weir.ts @@ -2,14 +2,15 @@ import { ParamCalculability } from "../param/param-definition"; import { Result } from "../util/result"; import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure"; import { LoiDebit } from "./structure_props"; -import { TriangularStructureParams } from "./structure_triangular_weir_free_params"; +import { TriangularStructureParams } from "./structure_triangular_weir_params"; +import { Villemonte } from "./villemonte"; export { TriangularStructureParams }; /** - * Equation classique seuil triangulaire dénoyé + * Equation classique seuil triangulaire + Ennoiement Villemonte */ -export class StructureTriangularWeirFree extends Structure { +export class StructureTriangularWeir extends Structure { constructor(prms: TriangularStructureParams, dbg: boolean = false) { super(prms, dbg); @@ -31,10 +32,14 @@ export class StructureTriangularWeirFree extends Structure { Structure.CheckEquation(sVarCalc); const data = this.getResultData(); - const v = this.prms.Cd.v * this.getTanFromDegrees(this.prms.alpha2.v) + let Q = this.prms.Cd.v * this.getTanFromDegrees(this.prms.alpha2.v) * Math.pow(this.prms.h1.v, 2.5); - return new Result(v, this, data); + if (data.ENUM_StructureFlowRegime !== StructureFlowRegime.FREE) { + Q = Villemonte(this.prms.h1.v, this.prms.h2.v, 2.5) * Q; + } + + return new Result(Q, this, data); } /** @@ -45,7 +50,16 @@ export class StructureTriangularWeirFree extends Structure { } protected getFlowRegime() { - return StructureFlowRegime.FREE; + if (this.prms.Z2.v <= this.prms.ZDV.v) { + return StructureFlowRegime.FREE; + } else { + // La réduction de débit s'applique dès que Z2 > ZDV (Villemonte, 1946) + if (this.prms.h2.v < 4 / 5 * this.prms.h1.v) { + // Yc = 4 / 5 * H1 (Jameson, 1925) + return StructureFlowRegime.PARTIAL; + } + return StructureFlowRegime.SUBMERGED; + } } protected getFlowMode() { diff --git a/src/structure/structure_triangular_weir_free_params.ts b/src/structure/structure_triangular_weir_params.ts similarity index 90% rename from src/structure/structure_triangular_weir_free_params.ts rename to src/structure/structure_triangular_weir_params.ts index 89745252bc6052ecae255546f5b00a2f6767f178..b815bca4fdd131c8bb452493ae50a54044f5569a 100644 --- a/src/structure/structure_triangular_weir_free_params.ts +++ b/src/structure/structure_triangular_weir_params.ts @@ -18,15 +18,16 @@ 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, + rQ: number, rZDV: number, rZ1: number, rZ2: number, rAlpha2: number, rCd: number, rW: number = Infinity ) { - super(rQ, rZDV, rZ1, - Infinity, rW); + super(rQ, rZDV, rZ1, rZ2, rW); this.alpha2 = new ParamDefinition(this, "alpha2", ParamDomainValue.POS, rAlpha2); this.addParamDefinition(this.alpha2); this.Cd = new ParamDefinition(this, "Cd", ParamDomainValue.POS, rCd);