Skip to content
Snippets Groups Projects
Commit 3538e2d0 authored by David Dorchies's avatar David Dorchies
Browse files

#29 Debuggage equation seuil triangulaire tronqué + calcul de l'aire

parent 9392813e
No related branches found
Tags v.1.2.1
No related merge requests found
Showing
with 132 additions and 69 deletions
......@@ -83,7 +83,6 @@ const ps2: ParallelStructure = new ParallelStructure(
false // debug
);
// tslint:disable-next-line:prefer-for-of
describe("Class ParallelStructure: ", () => {
// Ajout d'une structure de chaque type dans ParallelStructure
const iLoiDebits: number[] = [];
......
......@@ -42,6 +42,13 @@ class StructureTest extends Structure {
return new Result(this.prms.Z1.v - this.prms.Z2.v, data);
}
/**
* Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
*/
public calcA(): number {
return Math.min(Math.max(this.prms.h1.v, this.prms.h2.v), this.prms.W.v);
}
}
/* Test structure with :
......
......@@ -8,7 +8,7 @@
import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
import { StructureTriangularTruncWeirFree } from "../../src/structure/structure_triangular_trunc_weir_free";
import { TriangularTruncStructureParams } from "../../src/structure/triangular_trunc_structure_params";
import { TriangularTruncStructureParams } from "../../src/structure/structure_triangular_trunc_weir_free_params";
import { itCalcQ } from "./functions";
const structPrm: TriangularTruncStructureParams =
......
......@@ -8,7 +8,7 @@
import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
import { StructureTriangularWeirFree } from "../../src/structure/structure_triangular_weir_free";
import { TriangularStructureParams } from "../../src/structure/triangular_structure_params";
import { TriangularStructureParams } from "../../src/structure/structure_triangular_weir_free_params";
import { itCalcQ } from "./functions";
const structPrm: TriangularStructureParams = new TriangularStructureParams(0, 100.1, 100.1, 100, 45, 1.36);
......
......@@ -8,24 +8,28 @@ import { StructureKiviParams } from "./structure_kivi_params";
import { StructureOrificeFree } from "./structure_orifice_free";
import { StructureOrificeSubmerged } from "./structure_orifice_submerged";
import { LoiDebit, StructureProperties, StructureType } from "./structure_props";
// 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 { StructureWeirFree } from "./structure_weir_free";
export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit, dbg: boolean = false): Structure {
const oCd: {[s: string]: number} = {SeuilR: 0.4, VanneR: 0.6, SeuilT: 1.36};
const rectStructPrms: RectangularStructureParams = new RectangularStructureParams(
0, // Q
100, // ZDV
102, // Z1
101.5, // Z2
2, // L
0.4 // Cd pour un seuil rectangulaire
oCd.SeuilR // Cd pour un seuil rectangulaire
// W = Infinity par défaut pour un seuil
);
switch (structureType) {
case StructureType.VanneRectangulaire:
rectStructPrms.W.v = 0.5;
rectStructPrms.Cd.v = 0.6; // Cd pour une vanne rectangulaire
rectStructPrms.Cd.v = oCd.VanneR; // Cd pour une vanne rectangulaire
break;
case StructureType.SeuilRectangulaire:
case StructureType.SeuilTriangulaire:
......@@ -42,15 +46,15 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
switch (loiDebit) {
case LoiDebit.Cem88d:
rectStructPrms.Cd.v = 0.4; // Cd Cem88d qu'on soit en seuil ou vanne
rectStructPrms.Cd.v = oCd.SeuilR; // Cd Cem88d qu'on soit en seuil ou vanne
return new StructureCem88d(rectStructPrms, dbg);
case LoiDebit.Cem88v:
rectStructPrms.Cd.v = 0.6; // Cd Cem88d qu'on soit en seuil ou vanne
rectStructPrms.Cd.v = oCd.VanneR; // Cd Cem88d qu'on soit en seuil ou vanne
return new StructureCem88v(rectStructPrms, dbg);
case LoiDebit.Cunge80:
rectStructPrms.Cd.v = 0.6; // Cd Cunge80 qu'on soit en seuil ou vanne
rectStructPrms.Cd.v = oCd.VanneR; // Cd Cunge80 qu'on soit en seuil ou vanne
return new StructureCunge80(rectStructPrms, dbg);
case LoiDebit.OrificeFree:
......@@ -64,26 +68,38 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
case LoiDebit.KIVI:
const structKiviPrm: StructureKiviParams = new StructureKiviParams(
8.516, // Q
101, // ZDV
103, // Z1
102, // Z2
2, // L
0.4, // alpha
0.001, // béta
100); // ZRAM : cote Radier Amont
8.516, // Q
101, // ZDV
103, // Z1
102, // Z2
2, // L
oCd.SeuilR, // alpha
0.001, // béta
100); // ZRAM : cote Radier Amont
return new StructureKivi(structKiviPrm, dbg);
case LoiDebit.TriangularWeirFree:
const triangStructPrms: TriangularStructureParams = new TriangularStructureParams(
0, // Q
case LoiDebit.TriangularWeirFree:
const structTriangPrms: TriangularStructureParams = new TriangularStructureParams(
0, // Q
100, // ZDV
102, // Z1
101.5, // Z2
45, // Alpha2
oCd.SeuilT // Cd pour un seuil triangulaire
// W = Infinity par défaut pour un seuil
);
return new StructureTriangularWeirFree(structTriangPrms, dbg);
case LoiDebit.TriangularTruncWeirFree:
const structTriTruncPrms: TriangularTruncStructureParams = new TriangularTruncStructureParams(
0, // Q
100, // ZDV
102, // Z1
101.5, // Z2
45, // Alpha2
1.36 // Cd pour un seuil triangulaire
0.9, // BT
101, // ZT
oCd.SeuilT // Cd pour un seuil triangulaire
// W = Infinity par défaut pour un seuil
);
return new StructureTriangularWeirFree(triangStructPrms, dbg);
return new StructureTriangularTruncWeirFree(structTriTruncPrms, dbg);
default:
throw new Error(`type de LoiDebit ${LoiDebit[loiDebit]} non pris en charge`);
......
import { Nub } from "../nub";
import { ParamsEquation } from "../param/params-equation";
import { ParamDefinition } from "../param/param-definition";
import { ParamDomainValue } from "../param/param-domain";
import { ParamsEquation } from "../param/params-equation";
/**
* Common parameters of hydraulic structure equations
......
......@@ -20,6 +20,13 @@ export abstract class RectangularStructure extends Structure {
return this._prms as RectangularStructureParams;
}
/**
* Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
*/
public calcA(): number {
return Math.min(Math.max(this.prms.h1.v, this.prms.h2.v), this.prms.W.v) * this.prms.L.v;
}
/**
* paramétrage de la calculabilité des paramètres
*/
......
......@@ -67,6 +67,11 @@ export abstract class Structure extends Nub {
return this._prms as StructureParams;
}
/**
* Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
*/
public abstract calcA(): number;
/**
* Calcul d'une équation quelque soit l'inconnue à calculer.
* Gestion du débit nul et de l'inversion de débit
......
......@@ -52,6 +52,13 @@ export class StructureKivi extends Structure {
}
/**
* Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
*/
public calcA(): number {
return Math.min(Math.max(this.prms.h1.v, this.prms.h2.v), this.prms.W.v) * this.prms.L.v;
}
protected getFlowRegime(): StructureFlowRegime {
if (this.prms.h2.v > 0) {
return StructureFlowRegime.SUBMERGED;
......
......@@ -20,7 +20,9 @@ export enum LoiDebit {
// Loi Kindsvater-Carter et Villemonte
KIVI,
// Loi de débit seuil triangulaire dénoyé
TriangularWeirFree
TriangularWeirFree,
// Loi de débit seuil triangulaire tronqué
TriangularTruncWeirFree
}
export const loiAdmissibles: { [key: string]: LoiDebit[] } = {
......@@ -29,7 +31,7 @@ export const loiAdmissibles: { [key: string]: LoiDebit[] } = {
LoiDebit.KIVI
],
SeuilTriangulaire: [
LoiDebit.TriangularWeirFree
LoiDebit.TriangularWeirFree, LoiDebit.TriangularTruncWeirFree
],
VanneRectangulaire: [
LoiDebit.Cem88d, LoiDebit.Cem88v, LoiDebit.Cunge80, LoiDebit.OrificeFree,
......
import { ParamCalculability } from "../param/param-definition";
import { Result } from "../util/result";
import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
import { TriangularTruncStructureParams } from "./triangular_trunc_structure_params";
import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free_params";
export { TriangularTruncStructureParams };
......@@ -28,7 +29,7 @@ export class StructureTriangularTruncWeirFree extends Structure {
Structure.CheckEquation(sVarCalc);
const data = this.getResultData();
let v: number = this.prms.Cd.v * this.prms.B2.v / (this.prms.ZT.v - this.prms.ZDV.v);
let v: 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);
} else {
......@@ -38,6 +39,20 @@ export class StructureTriangularTruncWeirFree extends Structure {
return new Result(v, data);
}
/**
* Calcul de l'aire d'écoulement sur le seuil
*/
public calcA(): number {
if (this.prms.Z1.v <= this.prms.ZT.v) {
const h: number = Math.max(this.prms.h1.v, this.prms.h2.v);
return h * h * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v);
} else {
const Z: number = Math.max(this.prms.Z1.v, this.prms.Z2.v);
return this.prms.BT.v * (this.prms.ZT.v - this.prms.ZDV.v)
+ 2 * this.prms.BT.v * (Z - this.prms.ZT.v);
}
}
protected getFlowRegime() {
return StructureFlowRegime.FREE;
}
......@@ -46,4 +61,14 @@ export class StructureTriangularTruncWeirFree extends Structure {
return StructureFlowMode.WEIR;
}
/**
* paramétrage de la calculabilité des paramètres
*/
protected setParametersCalculability() {
super.setParametersCalculability();
this.prms.BT.calculability = ParamCalculability.DICHO;
this.prms.ZT.calculability = ParamCalculability.DICHO;
this.prms.Cd.calculability = ParamCalculability.DICHO;
}
}
......@@ -7,7 +7,7 @@ import { StructureParams } from "./structure_params";
*/
export class TriangularTruncStructureParams extends StructureParams {
/** Demi-ouverture du triangle (m) */
public B2: ParamDefinition;
public BT: ParamDefinition;
/** Cote haute du triangle (m) */
public ZT: ParamDefinition;
......@@ -22,18 +22,18 @@ export class TriangularTruncStructureParams extends StructureParams {
* @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 rB2 Demi-ouverture du triangle (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, rZ2: number,
rB2: number, rZT: number, rCd: number, rW: number = Infinity
rBT: number, rZT: number, rCd: number, rW: number = Infinity
) {
super(rQ, rZDV, rZ1, rZ2, rW);
this.B2 = new ParamDefinition("B2", ParamDomainValue.POS, rB2);
this.addParamDefinition(this.B2);
this.BT = new ParamDefinition("BT", ParamDomainValue.POS, rBT);
this.addParamDefinition(this.BT);
this.ZT = new ParamDefinition("ZT", ParamDomainValue.POS, rZT);
this.addParamDefinition(this.ZT);
this.Cd = new ParamDefinition("Cd", ParamDomainValue.POS, rCd);
......
import { ParamCalculability } from "../param/param-definition";
import { Result } from "../util/result";
import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
import { TriangularStructure } from "./triangular_structure";
import { TriangularStructureParams } from "./triangular_structure_params";
import { TriangularStructureParams } from "./structure_triangular_weir_free_params";
export { TriangularStructureParams };
/**
* Equation classique seuil triangulaire dénoyé
*/
export class StructureTriangularWeirFree extends TriangularStructure {
export class StructureTriangularWeirFree extends Structure {
constructor(prms: TriangularStructureParams, dbg: boolean = false) {
super(prms, dbg);
}
/**
* paramètres castés au bon type
*/
get prms(): TriangularStructureParams {
return this._prms as TriangularStructureParams;
}
/**
* Calcul analytique Q = f(Cd, L, h1, h2, W) seuil dénoyé
* @param sVarCalc Variable à calculer (doit être "Q")
......@@ -23,6 +35,13 @@ export class StructureTriangularWeirFree extends TriangularStructure {
return new Result(v, data);
}
/**
* Calcul de l'aire d'écoulement sur le seuil
*/
public calcA(): number {
return Math.pow(Math.max(this.prms.h1.v, this.prms.h2.v), 2) * this.getTanFromDegrees(this.prms.alpha2.v);
}
protected getFlowRegime() {
return StructureFlowRegime.FREE;
}
......@@ -37,5 +56,14 @@ export class StructureTriangularWeirFree extends TriangularStructure {
*/
protected getTanFromDegrees(degrees: number) {
return Math.tan(degrees * Math.PI / 180);
}
}
/**
* paramétrage de la calculabilité des paramètres
*/
protected setParametersCalculability() {
super.setParametersCalculability();
this.prms.alpha2.calculability = ParamCalculability.DICHO;
this.prms.Cd.calculability = ParamCalculability.DICHO;
}
}
import { ParamCalculability } from "../param/param-definition";
import { Structure } from "./structure";
import { TriangularStructureParams } from "./triangular_structure_params";
export { TriangularStructureParams };
/**
* Classe mère pour toutes les structures ayant une base rectangulaire (vannes, seuils)
*/
export abstract class TriangularStructure extends Structure {
constructor(prms: TriangularStructureParams, dbg: boolean = false) {
super(prms, dbg);
}
/**
* paramètres castés au bon type
*/
get prms(): TriangularStructureParams {
return this._prms as TriangularStructureParams;
}
/**
* paramétrage de la calculabilité des paramètres
*/
protected setParametersCalculability() {
super.setParametersCalculability();
this.prms.alpha2.calculability = ParamCalculability.DICHO;
this.prms.Cd.calculability = ParamCalculability.DICHO;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment