Commit ae30902a authored by Dorchies David's avatar Dorchies David
Browse files

Merge branch '33-ajout-du-calcul-d-une-passe-a-bassin' of...

Merge branch '33-ajout-du-calcul-d-une-passe-a-bassin' of gitlab-ssh.irstea.fr:david.dorchies/jalhyd into 33-ajout-du-calcul-d-une-passe-a-bassin
Showing with 75 additions and 30 deletions
+75 -30
......@@ -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: ", () => {
......
......@@ -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: ", () => {
......
......@@ -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);
});
});
});
......@@ -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
......
......@@ -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;
}
......
......@@ -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
......
......@@ -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() {
......
......@@ -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);
......
......@@ -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() {
......
......@@ -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);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment