diff --git a/spec/structure/structure_triangular_weir.spec.ts b/spec/structure/structure_triangular_weir.spec.ts index 8a0896d93e4ea3f54685c5d8ced532100dab07e7..c222c7c9958edb04bc7da5348568c2404a9d192c 100644 --- a/spec/structure/structure_triangular_weir.spec.ts +++ b/spec/structure/structure_triangular_weir.spec.ts @@ -7,7 +7,7 @@ function createStruct() { return new StructureTriangularWeir(new TriangularStructureParams(0, 100.1, 100.1, 100.1, 45, 1.36), false); } -describe("Class StructureTriangularWeirFree: ", () => { +describe("Class StructureTriangularWeir: ", () => { describe("Calcul Q a surface libre avec h1 croissant: ", () => { const structTest = createStruct(); diff --git a/spec/structure/structure_triangular_weir_board.spec.ts b/spec/structure/structure_triangular_weir_board.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e49a35b204195cffe3198b7e0d95b1ce915ae9a0 --- /dev/null +++ b/spec/structure/structure_triangular_weir_board.spec.ts @@ -0,0 +1,20 @@ +import { StructureTriangularWeirBroad } from "../../src/structure/structure_triangular_weir_broad"; +import { CreateStructure } from "../../src/structure/factory_structure"; +import { LoiDebit } from "../../src/index"; + + + +describe("Class StructureTriangularWeirBroad: ", () => { + it("Q free flow should be similar to Q limit submergence", () => { + const st = CreateStructure(LoiDebit.TriangularWeirBroad); + st.prms.Z2.singleValue = st.prms.ZDV.singleValue - 1; + const rQFreeFlow = st.CalcSerie().vCalc; + st.prms.Z2.singleValue = st.prms.ZDV.singleValue + (st.prms.Z1.singleValue - st.prms.ZDV.singleValue) * 0.8001; + expect(st.CalcSerie().vCalc).toBeCloseTo(rQFreeFlow, 1E-3); + }) + it("Z2 similar to Z1 should lead to null discharge", () => { + const st = CreateStructure(LoiDebit.TriangularWeirBroad); + st.prms.Z2.singleValue = st.prms.Z1.singleValue - 0.001; + expect(st.CalcSerie().vCalc).toBeCloseTo(0, 1E-3); + }) +}); \ No newline at end of file diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts index 380383ace75305d6a0e7c54773fbd28263690ae8..b5dd0233f08bd21f04c8f97e7f5af6dfbae9fe9c 100755 --- a/src/structure/factory_structure.ts +++ b/src/structure/factory_structure.ts @@ -20,6 +20,7 @@ import { StructureRectangularOrificeSubmerged } from "./structure_rectangular_or import { StructureTriangularTruncWeirFree } from "./structure_triangular_trunc_weir"; import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_params"; import { StructureTriangularWeir } from "./structure_triangular_weir"; +import { StructureTriangularWeirBroad } from "./structure_triangular_weir_broad"; import { TriangularStructureParams } from "./structure_triangular_weir_params"; import { StructureVanLevLarinier } from "./structure_vanlev_larinier"; import { StructureVanLevParams } from "./structure_vanlev_params"; @@ -126,6 +127,7 @@ export function CreateStructure(loiDebit: LoiDebit, parentNub?: ParallelStructur break; case LoiDebit.TriangularWeirFree: + case LoiDebit.TriangularWeirBroad: const structTriangPrms: TriangularStructureParams = new TriangularStructureParams( 0, // Q 100, // ZDV @@ -135,7 +137,11 @@ export function CreateStructure(loiDebit: LoiDebit, parentNub?: ParallelStructur oCd.SeuilT // Cd pour un seuil triangulaire // W = Infinity par défaut pour un seuil ); - ret = new StructureTriangularWeir(structTriangPrms, dbg); + if(loiDebit === LoiDebit.TriangularWeirFree) { + ret = new StructureTriangularWeir(structTriangPrms, dbg); + } else { + ret = new StructureTriangularWeirBroad(structTriangPrms, dbg); + } break; case LoiDebit.TriangularTruncWeirFree: diff --git a/src/structure/structure_props.ts b/src/structure/structure_props.ts index 8af1602540ac9e227acf867311ba22350ae1d5c7..c0aa812217d50ab294de310740891e09ce5d7d49 100644 --- a/src/structure/structure_props.ts +++ b/src/structure/structure_props.ts @@ -49,6 +49,8 @@ export enum LoiDebit { VanLevVillemonte, // loi de débit Seuil Cunge 1980 WeirCunge80, + // Loi de débit seuil triangulaire épais (Bos, Discharge measurement structures, 1989, p.137-143) + TriangularWeirBroad, } export const loiAdmissiblesOuvrages: { [key: string]: LoiDebit[] } = { @@ -60,7 +62,7 @@ export const loiAdmissiblesOuvrages: { [key: string]: LoiDebit[] } = { LoiDebit.WeirVillemonte, LoiDebit.WeirFree, LoiDebit.KIVI, LoiDebit.WeirCunge80 ], SeuilTriangulaire: [ - LoiDebit.TriangularWeirFree + LoiDebit.TriangularWeirFree, LoiDebit.TriangularWeirBroad ], SeuilTriangulaireTrunc: [ LoiDebit.TriangularTruncWeirFree @@ -79,7 +81,7 @@ export const loiAdmissiblesCloisons: { [key: string]: LoiDebit[] } = { LoiDebit.WeirSubmergedLarinier, LoiDebit.WeirVillemonte ], SeuilTriangulaire: [ - LoiDebit.TriangularWeirFree + LoiDebit.TriangularWeirFree, LoiDebit.TriangularWeirBroad ], SeuilTriangulaireTrunc: [ LoiDebit.TriangularTruncWeirFree @@ -109,7 +111,7 @@ export const loiAdmissiblesCloisonAval: { [key: string]: LoiDebit[] } = { LoiDebit.VanLevVillemonte, LoiDebit.VanLevLarinier ], SeuilTriangulaire: [ - LoiDebit.TriangularWeirFree + LoiDebit.TriangularWeirFree, LoiDebit.TriangularWeirBroad ], SeuilTriangulaireTrunc: [ LoiDebit.TriangularTruncWeirFree diff --git a/src/structure/structure_triangular_weir_broad.ts b/src/structure/structure_triangular_weir_broad.ts new file mode 100644 index 0000000000000000000000000000000000000000..b060a02bb73f51d4d4d4a6be1fd3ba9b39efd33d --- /dev/null +++ b/src/structure/structure_triangular_weir_broad.ts @@ -0,0 +1,41 @@ +import { ParamCalculability } from "../param/param-definition"; +import { Result } from "../util/result"; +import { StructureFlowMode, StructureFlowRegime } from "./structure"; +import { LoiDebit } from "./structure_props"; +import { TriangularStructureParams } from "./structure_triangular_weir_params"; +import { Villemonte } from "./villemonte"; +import { StructureTriangularWeirFree } from "./structure_triangular_weir_free"; + +/** + * Equation classique seuil triangulaire + Ennoiement Villemonte + */ +export class StructureTriangularWeirBroad extends StructureTriangularWeirFree { + + constructor(prms: TriangularStructureParams, dbg: boolean = false) { + super(prms, dbg); + this._loiDebit = LoiDebit.TriangularWeirBroad; // First name of the law for backward compatibility + } + + /** + * Calcul analytique Q = f(Cd, L, h1, h2, W) + * @param sVarCalc Variable à calculer (doit être "Q") + */ + public CalcQ(): Result { + + const r = super.CalcQ(); + + if (r.values.ENUM_StructureFlowRegime !== StructureFlowRegime.FREE) { + r.vCalc = r.vCalc * Math.sin(3.962902 * Math.pow((1 - this.prms.h2.v / this.prms.h1.v), 0.574979)) + } + + return r; + } + + protected getFlowRegime() { + if (this.prms.h2.v < 4 / 5 * this.prms.h1.v) { + // Yc = 4 / 5 * H1 (Jameson, 1925) + return StructureFlowRegime.FREE; + } + return StructureFlowRegime.SUBMERGED; + } +}