diff --git a/spec/regime_uniforme_rect.spec.ts b/spec/regime_uniforme_rect.spec.ts index a6dd6ab07d4e7897e7f3fcf378e6dc6301319a04..43793fa4a636349be48bcc35e469e064936c67b2 100644 --- a/spec/regime_uniforme_rect.spec.ts +++ b/spec/regime_uniforme_rect.spec.ts @@ -11,58 +11,110 @@ describe('Class RegimeUniforme / section rectangulaire : ', () => { // }); describe('Calc(): ', () => { - it('Q should be 1.568', () => { - let sect: cSnRectang; - let prmsCanal: cParamsCanal; + it('LargeurFond should be 2.5', () => { + let paramCnl = new cParamsCanal(40, // Ks=Strickler + 1.568, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1 // YB=hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + + let sect = new cSnRectang(undefined, paramCnl, + 0, // largeur de fond + false); + // tirant d'eau + sect.v.Y = 0.8; + + let ru = new RegimeUniforme(sect); - // Ks=Strickler, Q=Débit, If=pente du font, précision, YB=hauteur de berge, YCL=Condition limite en cote à l'amont ou à l'aval - prmsCanal = new cParamsCanal(40, 0, 0.001, precDist, 1) + expect(ru.Calc("LargeurFond").vCalc).toBeCloseTo(2.5, precDigits); + }); - // largeur de fond - sect = new cSnRectang(false, prmsCanal, 2.5); + it('Q should be 1.568', () => { + let prmsCanal = new cParamsCanal(40, // Ks=Strickler + 0, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1 // YB=hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + + let sect = new cSnRectang(undefined, prmsCanal, + 2.5 // largeur de fond + ); // tirant d'eau sect.v.Y = 0.8; - var ru = new RegimeUniforme(sect); + let ru = new RegimeUniforme(sect); // nom variable à calculer, valeur de Q expect(ru.Calc("Q").vCalc).toBeCloseTo(1.568, precDigits); }); it('Q should be 0.731', () => { - let sect: cSnRectang; - let prmsCanal: cParamsCanal; - - // Ks=Strickler, Q=Débit, If=pente du font, précision, YB=hauteur de berge, YCL=Condition limite en cote à l'amont ou à l'aval - prmsCanal = new cParamsCanal(30, 0, 0.0001, precDist, 1.2) - - // largeur de fond - sect = new cSnRectang(false, prmsCanal, 3); + let prmsCanal = new cParamsCanal(30, // Ks=Strickler + 0, // Q=Débit + 0.0001, // If=pente du fond + precDist, // précision + 1.2 // YB=hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + let sect = new cSnRectang(undefined, prmsCanal, + 3 // largeur de fond + ); // tirant d'eau sect.v.Y = 1.1; - var ru = new RegimeUniforme(sect); + let ru = new RegimeUniforme(sect); // nom variable à calculer, valeur de Q expect(ru.Calc("Q").vCalc).toBeCloseTo(0.731, precDigits); }); it('Strickler should be 30.618', () => { - let sect: cSnRectang; - let prmsCanal: cParamsCanal; - - // Ks=Strickler, Q=Débit, If=pente du font, précision, YB=hauteur de berge, YCL=Condition limite en cote à l'amont ou à l'aval - prmsCanal = new cParamsCanal(40, 1.2, 0.001, precDist, 1) - - // largeur de fond - sect = new cSnRectang(false, prmsCanal, 2.5); + let prmsCanal = new cParamsCanal(40, // Ks=Strickler + 1.2, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1 // YB=hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + let sect = new cSnRectang(undefined, prmsCanal, + 2.5 // largeur de fond + ); // tirant d'eau sect.v.Y = 0.8; - var ru = new RegimeUniforme(sect); + let ru = new RegimeUniforme(sect); // nom variable à calculer, valeur de Ks expect(ru.Calc("Ks").vCalc).toBeCloseTo(30.618, precDigits); }); + + it('Y should be 0.663', () => { + let prmsCanal = new cParamsCanal(40, // Ks=Strickler + 1.2, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1 // YB=hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + let sect = new cSnRectang(undefined, prmsCanal, + 2.5 // largeur de fond + ); + // tirant d'eau + sect.v.Y = 0; + + let ru = new RegimeUniforme(sect); + + // nom variable à calculer, valeur de Ks + expect(ru.Calc("Y").vCalc).toBeCloseTo(0.663, precDigits); + }); }); }); diff --git a/spec/regime_uniforme_trapeze.spec.ts b/spec/regime_uniforme_trapeze.spec.ts index 51acbad5f8a50478f272848581e6120a3652b916..f4f94204103f67c5a33d396181840f4f04cb82d3 100644 --- a/spec/regime_uniforme_trapeze.spec.ts +++ b/spec/regime_uniforme_trapeze.spec.ts @@ -12,34 +12,43 @@ describe('Class RegimeUniforme / section trapèze: ', () => { describe('Calc(): ', () => { it('Q should be 1.988', () => { - let sect: cSnTrapez; - let paramCnl: cParamsCanal; - // Ks=Strickler, Q=Débit, If=pente du font, précision, YB=hauteur de berge, YCL=Condition limite en cote à l'amont ou à l'aval - paramCnl = new cParamsCanal(40, 0, 0.001, precDist, 1) - // largeur de fond, fruit - sect = new cSnTrapez(false, paramCnl, 2.5, 0.56); + let paramCnl = new cParamsCanal(40, // Ks=Strickler + 0, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1 // YB= hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + let sect = new cSnTrapez(undefined, paramCnl, + 2.5, // largeur de fond + 0.56 // fruit + ); // tirant d'eau sect.v.Y = 0.8; - var ru: RegimeUniforme; - ru = new RegimeUniforme(sect); + let ru = new RegimeUniforme(sect); expect(ru.Calc("Q").vCalc).toBeCloseTo(1.988, precDigits); }); - it('LargeurFond should be 1.516', () => { - let sect: cSnTrapez; - let paramCnl: cParamsCanal; - // Ks=Strickler, Q=Débit, If=pente du font, précision, YB=hauteur de berge, YCL=Condition limite en cote à l'amont ou à l'aval - paramCnl = new cParamsCanal(40, 1.2, 0.001, 0.001, 1) - // largeur de fond, fruit - sect = new cSnTrapez(false, paramCnl, 0, 0.56); + let paramCnl = new cParamsCanal(40, // Ks=Strickler + 1.2, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1 // YB= hauteur de berge + // YCL=Condition limite en cote à l'amont ou à l'aval + ); + + let sect = new cSnTrapez(undefined, paramCnl, + 0, // largeur de fond + 0.56 // fruit + ); // tirant d'eau sect.v.Y = 0.8; - var ru: RegimeUniforme; - ru = new RegimeUniforme(sect); + let ru = new RegimeUniforme(sect); expect(ru.Calc("LargeurFond").vCalc).toBeCloseTo(1.516, precDigits); }); diff --git a/src/base.ts b/src/base.ts index be69087500c424fbe703aaeb7cd5ff36c3d8b2ff..7a51fe820b6b4ed167ca75f35555baa88e9e3d58 100644 --- a/src/base.ts +++ b/src/base.ts @@ -46,15 +46,17 @@ export interface IParamsEquation { */ export abstract class Debug { /** - * @param DBG Flag de débuggage + * @param _DBG Flag de débuggage */ - constructor(private DBG: boolean) { } + constructor(private _DBG: boolean) { } /** * Affiche un message dans la console si le flag this.DBG est à true * @param s Message à afficher dans la console */ protected debug(s: any) { - if (this.DBG) console.log(s); + if (this._DBG) console.log(s); } + + get DBG() { return this._DBG; } } diff --git a/src/cond_distri.ts b/src/cond_distri.ts index cc365c4c2d426dd3bcfb44b68873a02071142529..e654973265a53819744dd3e72b54617d1ea973d3 100644 --- a/src/cond_distri.ts +++ b/src/cond_distri.ts @@ -67,7 +67,6 @@ export class ConduiteDistrib extends Nub { break; } - return new Result(v); } } \ No newline at end of file diff --git a/src/dichotomie.ts b/src/dichotomie.ts index 21a5b729bce461843bd3c597af78ed750860d6aa..35bfe296005287f54ace7ec3eeb33a7a677d113a 100644 --- a/src/dichotomie.ts +++ b/src/dichotomie.ts @@ -13,8 +13,8 @@ export class Dichotomie extends Debug { * @param nub Noeud de calcul contenant la méthode de calcul Equation * @param sVarCalc Nom de la variable à calculer */ - constructor(private nub: Nub, private sVarCalc: string) { - super(false); + constructor(private nub: Nub, private sVarCalc: string, dbg: boolean = false) { + super(dbg); } /** Valeur inconnue à rechercher */ @@ -31,7 +31,7 @@ export class Dichotomie extends Debug { * Méthode simulant l'opérateur booléen xor * @see http://www.howtocreate.co.uk/xor.html */ - XOR(a, b) { + XOR(a: boolean, b: boolean) { return (a || b) && !(a && b); } @@ -57,13 +57,13 @@ export class Dichotomie extends Debug { Dichotomie(rTarget: number, rTol: number, rInit: number): Result { let res: Result; - let XminInit = 1E-8; + let XminInit: number = 1E-8; this.vX = XminInit; let v1: number = this.Calcul().vCalc; let XmaxInit: number = Math.max(1, rInit) * 100; this.vX = XmaxInit; - let v2 = this.Calcul().vCalc; + let v2: number = this.Calcul().vCalc; let DX = (XmaxInit - XminInit) / this.IDEFINT; let nIterMax = Math.floor(Math.max(XmaxInit - rInit, rInit - XminInit) / DX + 1); diff --git a/src/nub.ts b/src/nub.ts index ff654c2caee6b226da6555ccb48f8cc4be7cf781..0b8be8df7236e8ae7810676c2979eb9d1783fff5 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -67,7 +67,7 @@ export abstract class Nub extends Debug { * @param rPrec précision de calcul */ Solve(sVarCalc: string, rInit: number, rPrec: number): Result { - let dicho: Dichotomie = new Dichotomie(this, sVarCalc); + let dicho: Dichotomie = new Dichotomie(this, sVarCalc, this.DBG); var target = this.v[this._varsEq[0]]; return dicho.Dichotomie(target, rPrec, rInit); } diff --git a/src/regime_uniforme.ts b/src/regime_uniforme.ts index ac6130dbcad186e456ba53333e3d7eb8340c839f..fa8cf789f9eaee554765a4fe8f5fb889752534f6 100644 --- a/src/regime_uniforme.ts +++ b/src/regime_uniforme.ts @@ -7,9 +7,8 @@ import { acSection, cParamsCanal } from "./section/section_type"; export class RegimeUniforme extends Nub { private Sn: acSection; ///< Objet section - constructor(s: acSection) { - // let paramsEq: { [key: string]: number } = {}; - super(s.v, false); + constructor(s: acSection, dbg: boolean = false) { + super(s.v, dbg); this.debug('constructeur RU'); @@ -23,10 +22,10 @@ export class RegimeUniforme extends Nub { * Calcul du débit en régime uniforme. * @return Débit en régime uniforme */ - Calc_Qn() { + Calc_Qn(): number { this.Sn.Reset(true); if (this.Sn.oP.v.If <= 0) { - var Qn = 0; // ? false bool + var Qn: number = 0; // ? false bool //this.oLog.Add('h_normale_pente_neg_nul',true); } else { Qn = this.Sn.oP.v.Ks * Math.pow(this.Sn.Calc('R', this.Sn.v.Y), 2 / 3) * this.Sn.Calc('S', this.Sn.v.Y) * Math.sqrt(this.Sn.oP.v.If); diff --git a/src/section/newton.ts b/src/section/newton.ts index d237ddab55dacb5c6c20a7c8ed3a0dd81a0fce20..f09889d0af00cba670251f22da9aebeeabae41d9 100644 --- a/src/section/newton.ts +++ b/src/section/newton.ts @@ -1,49 +1,54 @@ import { cParamsCanal } from "./section_type" +import { cLog } from "./log"; export abstract class acNewton { - protected rTol; - protected Dx; + protected rTol: number; + protected Dx: number; private iCpt = 0; private iCptMax = 50; private rRelax = 1; /// Coefficient de relaxation private rFnPrec = 0; /// Mémorisation du Fn précédent pour détecter le changement de signe private iOscil = 0; /// Nombre de changement de signe de Delta - private oLog; + private oLog: cLog; + /** * Constructeur de la classe - * @param $oSn Section sur laquelle on fait le calcul - * @param $oP Paramètres supplémentaires (Débit, précision...) + * @param oP Paramètres supplémentaires (Débit, précision...) */ constructor(oP: cParamsCanal) { this.rTol = oP.v.Prec; this.Dx = oP.v.Prec / 10; } + /** * Calcul de la fonction f(x) dont on cherche le zéro. - * @param $rX x + * @param rX x * @return Calcul de la fonction */ abstract CalcFn(rX); + /** * Calcul de la dérivée f'(x) (peut être redéfini pour calcul analytique) - * @param $rX x + * @param rX x * @return Calcul de la fonction */ - protected CalcDer($x) { - //~ spip_log('Newton:CalcDer $rX='.$x,'hydraulic.'._LOG_DEBUG); - return (this.CalcFn($x + this.Dx) - this.CalcFn($x - this.Dx)) / (2 * this.Dx); + protected CalcDer(x) { + //~ spip_log('Newton:CalcDer rX='.x,'hydraulic.'._LOG_DEBUG); + return (this.CalcFn(x + this.Dx) - this.CalcFn(x - this.Dx)) / (2 * this.Dx); } + /** * Test d'égalité à une tolérance près - * @param $rFn x + * @param rFn x * @return True si égal, False sinon */ - private FuzzyEqual($rFn) { - return (Math.abs($rFn) < this.rTol); + private FuzzyEqual(rFn) { + return (Math.abs(rFn) < this.rTol); } + /** * Fonction récursive de calcul de la suite du Newton - * @param $rX x + * @param rX x * @return Solution du zéro de la fonction */ XOR(a, b) { @@ -58,7 +63,7 @@ export abstract class acNewton { } else { var rDer = this.CalcDer(rX); - //~ echo(' - f\' = '.$rDer); + //~ echo(' - f\' = '.rDer); if (rDer != 0) { if (this.XOR(rFn < 0, this.rFnPrec < 0)) { this.iOscil++; @@ -95,6 +100,7 @@ export abstract class acNewton { } } } + /** * Pour savoir si le Newton a convergé * @return true si oui, false sinon diff --git a/src/section/section_circulaire.ts b/src/section/section_circulaire.ts index 56bb10999ae80b1c3acf8970f9bcf2f91c1467c1..8740c7bdc638a4d7158d4581ba0f3b25cdc4318f 100644 --- a/src/section/section_circulaire.ts +++ b/src/section/section_circulaire.ts @@ -1,4 +1,5 @@ -import { acSection } from "./section_type"; +import { acSection, cParamsCanal } from "./section_type"; +import { cLog } from "./log"; /** * Calculs de la section circulaire @@ -6,13 +7,13 @@ import { acSection } from "./section_type"; export class cSnCirc extends acSection { //public D; /// Diamètre du cercle - private Alpha; /// Angle de la surface libre par rapport au fond + private Alpha: number; /// Angle de la surface libre par rapport au fond protected nbDessinPoints = 50; - constructor(oLog, oP, D) { - super(oLog, oP); + constructor(oLog: cLog, oP: cParamsCanal, D: number, dbg: boolean = false) { + super(oLog, oP, dbg); this.v.D = D; - if (oP.YB > D) { oP.YB = D; } // On place la berge au sommet du cercle + if (oP.v.YB > D) { oP.v.YB = D; } // On place la berge au sommet du cercle } /** * Calcul de l'angle Alpha de la surface libre par rapport au fond. @@ -70,10 +71,10 @@ export class cSnCirc extends acSection { /** * Calcul du périmètre mouillé. - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return B */ - Calc_P($rY = 0) { + Calc_P(rY = 0) { if (this.v.Y > this.oP.v.YB && !this.bSnFermee) { // On n'ajoute pas le périmètre dans le cas d'une fente de Preissmann return this.CalcGeo('P') + super.Calc_P_Debordement(this.v.Y - this.oP.v.YB); @@ -85,10 +86,10 @@ export class cSnCirc extends acSection { /** * Calcul de la surface mouillée. - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return S */ - Calc_S($rY = 0) { + Calc_S(rY = 0) { if (this.v.Y > this.oP.v.YB) { return this.CalcGeo('S') + super.Calc_S_Debordement(this.v.Y - this.oP.v.YB); } @@ -125,10 +126,10 @@ export class cSnCirc extends acSection { /** * Calcul de la distance du centre de gravité de la section à la surface libre * multiplié par la surface hydraulique - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return S x Yg */ - Calc_SYg($rY = 0) { + Calc_SYg(rY = 0) { var SYg = Math.sin(this.Calc('Alpha')) - Math.pow(Math.sin(this.Calc('Alpha')), 3) / 3 - this.Calc('Alpha') * Math.cos(this.Calc('Alpha')); SYg = Math.pow(this.v.D, 3) / 8 * SYg; return SYg; @@ -136,10 +137,10 @@ export class cSnCirc extends acSection { /** * Calcul de la dérivée de la distance du centre de gravité de la section à la surface libre * multiplié par la surface hydraulique - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return S x Yg */ - Calc_dSYg($rY = 0) { + Calc_dSYg(rY = 0) { var cos = Math.cos(this.Calc('Alpha')); var sin = Math.sin(this.Calc('Alpha')); var SYg = this.Calc('dAlpha') * cos; diff --git a/src/section/section_puissance.ts b/src/section/section_puissance.ts index 1afb789b01788281ecd32a3fc421694dfc939bad..2c56ef62c33618127b76a1a14e6daa5659e26183 100644 --- a/src/section/section_puissance.ts +++ b/src/section/section_puissance.ts @@ -1,15 +1,16 @@ -import { acSection } from "./section_type"; +import { acSection, cParamsCanal } from "./section_type"; +import { cLog } from "./log"; /** * Calculs de la section parabolique ou "puissance" */ export class cSnPuiss extends acSection { //public k; /// Coefficient de forme compris entre 0 et 1 - //$LargeurBerge => La largeur des berges est déjà présente dans acSection + //LargeurBerge => La largeur des berges est déjà présente dans acSection protected nbDessinPoints = 50; - constructor(oLog, oP, rk, LargeurBerge) { - super(oLog, oP); + constructor(oLog: cLog, oP: cParamsCanal, rk: number, LargeurBerge: number, dbg: boolean = false) { + super(oLog, oP, dbg); this.v.k = rk; this.v.LargeurBerge = LargeurBerge; } @@ -34,10 +35,10 @@ export class cSnPuiss extends acSection { } /** * Calcul du périmètre mouillé. - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return B */ - Calc_P($rY = 0) { + Calc_P(rY = 0) { var n = 100; /// Le nombre de partie pour le calcul de l'intégrale var Lambda2 = Math.pow(this.Calc('Alpha'), 2); var P = 0; /// Le périmètre à calculer @@ -53,10 +54,10 @@ export class cSnPuiss extends acSection { /** * Calcul de la surface mouillée. - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return S */ - Calc_S($rY = 0) { + Calc_S(rY = 0) { return this.Calc('Alpha') * Math.pow(this.v.Y, this.v.k + 1) / (this.v.k + 1); } @@ -78,19 +79,19 @@ export class cSnPuiss extends acSection { /** * Calcul de la distance du centre de gravité de la section à la surface libre * multiplié par la surface hydraulique - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return S x Yg */ - Calc_SYg($rY = 0) { + Calc_SYg(rY = 0) { return this.Calc('Alpha') * Math.pow(this.v.Y, this.v.k + 2) / ((this.v.k + 1) * (this.v.k + 2)); } /** * Calcul de la dérivée distance du centre de gravité de la section à la surface libre * multiplié par la surface hydraulique - * @param $rY Uniquement présent car la méthode parent a cet argument + * @param rY Uniquement présent car la méthode parent a cet argument * @return S x Yg */ - Calc_dSYg($rY = 0) { + Calc_dSYg(rY = 0) { var SYg = this.Calc('dAlpha') * Math.pow(this.v.Y, this.v.k + 2) + this.Calc('Alpha') * Math.pow(this.v.Y, this.v.k + 1) * (this.v.k + 2); return SYg / ((this.v.k + 1) * (this.v.k + 2)); } diff --git a/src/section/section_rectang.ts b/src/section/section_rectang.ts index 1a7b0b739c280b59c8ef927a0ae9bba056e719a2..255046e0fd3e0403265b1e30847e1ee4986181e9 100644 --- a/src/section/section_rectang.ts +++ b/src/section/section_rectang.ts @@ -1,19 +1,21 @@ -import { acSection } from "./section_type"; +import { acSection, cParamsCanal } from "./section_type"; +import { cLog } from "./log"; /** * Calculs de la section rectangulaire */ export class cSnRectang extends acSection { - constructor(oLog, oP, LargeurFond) { - super(oLog, oP); + constructor(oLog: cLog, oP: cParamsCanal, LargeurFond: number, dbg: boolean = false) { + super(oLog, oP, dbg); this.v.LargeurBerge = LargeurFond; } + /** * Calcul du périmètre mouillé - * @param $rY Uniquement présent car la méthode parent à cet argument + * @param rY Uniquement présent car la méthode parent à cet argument * @return Périmètre mouillé (m) */ - Calc_P($rY = 0) { + Calc_P(rY = 0) { return this.v.LargeurBerge + super.Calc_P_Debordement(this.v.Y); } diff --git a/src/section/section_trapez.ts b/src/section/section_trapez.ts index e1a67989fa1a61d3824320b54f440fe178da6548..e51313485a5899ef0fd3a5a3df6427caa502da47 100644 --- a/src/section/section_trapez.ts +++ b/src/section/section_trapez.ts @@ -1,4 +1,5 @@ -import { acSection } from "./section_type"; +import { acSection, cParamsCanal } from "./section_type"; +import { cLog } from "./log"; /** * Calculs de la section trapézoïdale @@ -6,8 +7,8 @@ import { acSection } from "./section_type"; export class cSnTrapez extends acSection { // public LargeurFond; /// Largeur au fond // public Fruit; /// Fruit des berges - constructor(oLog, oP, LargeurFond, Fruit) { - super(oLog, oP); + constructor(oLog: cLog, oP: cParamsCanal, LargeurFond: number, Fruit: number, dbg: boolean = false) { + super(oLog, oP, dbg); this.v.LargeurFond = LargeurFond; this.v.Fruit = Fruit; } @@ -23,33 +24,33 @@ export class cSnTrapez extends acSection { /** * Calcul du périmètre mouillé - * @param $rY Uniquement présent car la méthode parent à cet argument + * @param rY Uniquement présent car la méthode parent à cet argument * @return Périmètre mouillé (m) */ - Calc_P($rY = 0) { + Calc_P(rY = 0) { if (this.v.Y > this.oP.v.YB) { var P = this.CalcGeo('P') + super.Calc_P_Debordement(this.v.Y - this.oP.v.YB); } else { P = this.v.LargeurFond + 2 * Math.sqrt(1 + Math.pow(this.v.Fruit, 2)) * this.v.Y; } - //~ spip_log('Trapez->CalcP(rY='.$this->rY.')='.$P,'hydraulic.'._LOG_DEBUG); + //~ spip_log('Trapez->CalcP(rY='.this->rY.')='.P,'hydraulic.'._LOG_DEBUG); return P; } /** * Calcul de la surface mouillée - * @param $rY Uniquement présent car la méthode parent à cet argument + * @param rY Uniquement présent car la méthode parent à cet argument * @return Surface mouillée (m2) */ - Calc_S($rY = 0) { + Calc_S(rY = 0) { if (this.v.Y > this.oP.v.YB) { var S = this.CalcGeo('S') + super.Calc_S_Debordement(this.v.Y - this.oP.v.YB); } else { S = this.v.Y * (this.v.LargeurFond + this.v.Fruit * this.v.Y); } - //~ spip_log('Trapez->CalcS(rY='.$this->rY.')='.$S,'hydraulic.'._LOG_DEBUG); + //~ spip_log('Trapez->CalcS(rY='.this->rY.')='.S,'hydraulic.'._LOG_DEBUG); return S; } @@ -94,19 +95,19 @@ export class cSnTrapez extends acSection { /** * Calcul de la distance du centre de gravité de la section à la surface libre * multiplié par la surface hydraulique - * @param $rY Uniquement présent car la méthode parent à cet argument + * @param rY Uniquement présent car la méthode parent à cet argument * @return S x Yg */ - Calc_SYg($rY = 0) { + Calc_SYg(rY = 0) { return (this.v.LargeurFond / 2 + this.v.Fruit * this.v.Y / 3) * Math.pow(this.v.Y, 2); } /** * Calcul de la dérivée de la distance du centre de gravité de la section à la surface libre * multiplié par la surface hydraulique - * @param $rY Uniquement présent car la méthode parent à cet argument + * @param rY Uniquement présent car la méthode parent à cet argument * @return S x Yg */ - Calc_dSYg($rY = 0) { + Calc_dSYg(rY = 0) { var SYg = this.v.Fruit / 3 * Math.pow(this.v.Y, 2); SYg += (this.v.LargeurFond / 2 + this.v.Fruit * this.v.Y / 3) * 2 * this.v.Y; return SYg; diff --git a/src/section/section_type.ts b/src/section/section_type.ts index 8a75981ae56904345e7c824a946eaeadb5ef91c1..94256007bf3a5dbf6f704853b7618fa18e29e950 100644 --- a/src/section/section_type.ts +++ b/src/section/section_type.ts @@ -1,14 +1,13 @@ -import { Debug } from "../base" +import { IParamsEquation, Debug } from "../base" import { acNewton } from "./newton"; import { cLog } from "./log"; -import { IParamsEquation } from "../base"; /** * Calcul de la hauteur critique */ export class cHautCritique extends acNewton { - private Sn; - private oP; + private Sn: acSection; + private oP: cParamsCanal; /** * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul @@ -27,7 +26,7 @@ export class cHautCritique extends acNewton { CalcFn(rX) { // Calcul de la fonction if (this.Sn.Calc('S', rX) != 0) { - var Fn = (Math.pow(this.oP.Q, 2) * this.Sn.Calc('B', rX) / Math.pow(this.Sn.Calc('S', rX), 3) / this.oP.G - 1); + var Fn = (Math.pow(this.oP.v.Q, 2) * this.Sn.Calc('B', rX) / Math.pow(this.Sn.Calc('S', rX), 3) / cParamsCanal.G - 1); } else { Fn = Infinity; @@ -42,7 +41,7 @@ export class cHautCritique extends acNewton { if (this.Sn.Calc('S') != 0) { // L'initialisation à partir de rX a été faite lors de l'appel à CalcFn var Der = (this.Sn.Calc('dB') * this.Sn.Calc('S') - 3 * this.Sn.Calc('B') * this.Sn.Calc('B')); - Der = Math.pow(this.oP.Q, 2) / this.oP.G * Der / Math.pow(this.Sn.Calc('S'), 4); + Der = Math.pow(this.oP.v.Q, 2) / cParamsCanal.G * Der / Math.pow(this.Sn.Calc('S'), 4); } else { Der = Infinity; @@ -55,11 +54,10 @@ export class cHautCritique extends acNewton { * Calcul de la hauteur normale */ export class cHautNormale extends acNewton { - private Sn; - private Q; - private Ks; - private If; - private G; + private Sn: acSection; + private Q: number; + private Ks: number; + private If: number; /** * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul @@ -71,7 +69,6 @@ export class cHautNormale extends acNewton { this.Q = oP.v.Q; this.Ks = oP.v.Ks; this.If = oP.v.If; - this.G = oP.v.G; } /** * Calcul de la fonction dont on cherche le zéro @@ -99,10 +96,10 @@ export class cHautNormale extends acNewton { * Calcul de la hauteur correspondante (charge égale) */ export class cHautCorrespondante extends acNewton { - private Y; // Tirant d'eau connu - private rS2; // 1/S^2 associé au tirant d'eau connu - private Sn; // Section contenant les données de la section avec la hauteur à calculer - private rQ2G; // Constante de gravité + private Y: number; // Tirant d'eau connu + private rS2: number; // 1/S^2 associé au tirant d'eau connu + private Sn: acSection; // Section contenant les données de la section avec la hauteur à calculer + private rQ2G: number; // Constante de gravité /** * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul @@ -113,7 +110,7 @@ export class cHautCorrespondante extends acNewton { this.Y = Sn.v.Y; this.rS2 = Math.pow(Sn.Calc('S'), -2); this.Sn = Sn; - this.rQ2G = Math.pow(oP.v.Q, 2) / (2 * oP.v.G); + this.rQ2G = Math.pow(oP.v.Q, 2) / (2 * cParamsCanal.G); } /** * Calcul de la fonction dont on cherche le zéro @@ -146,19 +143,17 @@ export class cHautCorrespondante extends acNewton { */ export class cHautConjuguee extends acNewton { /** Tirant d'eau connu */ - private Y; + private Y: number; /** 1/S^2 associé au tirant d'eau connu */ - private rS2; + private rS2: number; /** Section contenant les données de la section avec la hauteur à calculer */ - private Sn; - /** Constante de gravité */ - private G; + private Sn: acSection; /** Carré du débit */ - private rQ2; + private rQ2: number; /** Surface hydraulique associée au tirant d'eau connu */ - private rS; + private rS: number; /** SYg associée au tirant d'eau connu */ - private rSYg; + private rSYg: number; /** * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul @@ -169,7 +164,6 @@ export class cHautConjuguee extends acNewton { this.Y = oSn.v.Y; this.rQ2 = Math.pow(oP.v.Q, 2); this.Sn = oSn; - this.G = oP.v.G; this.rS = oSn.Calc('S'); this.rSYg = oSn.Calc('SYg'); } @@ -181,7 +175,7 @@ export class cHautConjuguee extends acNewton { // Réinitialisation des paramètres hydrauliques de oSn avec l'appel this->oSn->Calc('S',rX) if (this.rS > 0 && this.Sn.Calc('S', rX) > 0) { var Fn = this.rQ2 * (1 / this.rS - 1 / this.Sn.Calc('S')); - Fn = Fn + this.G * (this.rSYg - this.Sn.Calc('SYg')); + Fn = Fn + cParamsCanal.G * (this.rSYg - this.Sn.Calc('SYg')); } else { Fn = -Infinity; @@ -197,7 +191,7 @@ export class cHautConjuguee extends acNewton { // L'initialisation a été faite lors de l'appel à CalcFn if (this.rS > 0 && this.Sn.Calc('S') > 0) { var Der = this.rQ2 * this.Sn.Calc('dS') * Math.pow(this.Sn.Calc('S'), -2); - Der = Der - this.G * this.Sn.Calc('dSYg', rX); + Der = Der - cParamsCanal.G * this.Sn.Calc('dSYg', rX); } else { Der = -Infinity; @@ -220,7 +214,7 @@ export class cParamsCanal { // public If; /// Pente du fond // public Dx; /// Pas d'espace (positif en partant de l'aval, négatif en partant de l'amont) // public Prec; /// Précision de calcul et d'affichage - // public G = 9.81;/// Constante de gravité + public static readonly G: number = 9.81;/// Constante de gravité // public iPrec; /// Précision en nombre de décimales // public YB; /// Hauteur de berge // public Resolution; /// Méthode de résolution "Euler" ou "RK4" @@ -248,14 +242,14 @@ export class cParamsCanal { export abstract class acSection extends Debug { private _v: IParamsEquation; - //public Y; /// Tirant d'eau - public HautCritique; /// Tirant d'eau critique + public HautCritique: number; /// Tirant d'eau critique public HautNormale; /// Tirant d'eau normal public oP: cParamsCanal; /// Paramètres du système canal (classe oParam) protected oLog: cLog; /// Pour l'affichage du journal de calcul //public LargeurBerge; /// largeur au débordement - protected bSnFermee = false; /// true si la section est fermée (fente de Preissmann) + protected bSnFermee: boolean = false; /// true si la section est fermée (fente de Preissmann) + /** * Tableau contenant les données dépendantes du tirant d'eau this->rY. * @@ -274,16 +268,18 @@ export abstract class acSection extends Debug { protected calcGeo = {}; /// Données ne dépendant pas de la cote de l'eau private Y_old; /// Mémorisation du tirant d'eau pour calcul intermédiaire private Calc_old = {}; /// Mémorisation des données hydrauliques pour calcul intermédiaire + /** * Nombre de points nécessaires pour le dessin de la section (hors point de berge) * Valeur de 1 par défaut pour les sections rectangulaires et trapézoïdales */ protected nbDessinPoints = 1; + /** * Construction de la classe. * Calcul des hauteurs normale et critique */ - constructor(oLog, oP, dbg = false) { + constructor(oLog: cLog, oP: cParamsCanal, dbg: boolean = false) { super(dbg); this.oP = oP; this.oLog = oLog; @@ -307,6 +303,7 @@ export abstract class acSection extends Debug { this.calcGeo = {}; } } + /** * Mémorise les données hydraulique en cours ou les restitue * @param bMem true pour mémorisation, false pour restitution @@ -530,7 +527,7 @@ export abstract class acSection extends Debug { */ Calc_Fr() { if (this.Calc('S') != 0) { - return this.oP.v.Q / this.Calc('S') * Math.sqrt(this.Calc('B') / this.Calc('S') / this.oP.v.G); + return this.oP.v.Q / this.Calc('S') * Math.sqrt(this.Calc('B') / this.Calc('S') / cParamsCanal.G); } else { return Infinity; @@ -614,7 +611,7 @@ export abstract class acSection extends Debug { * @return Charge spécifique */ Calc_Hs() { - return this.v.Y + Math.pow(this.Calc('V'), 2) / (2 * this.oP.v.G); + return this.v.Y + Math.pow(this.Calc('V'), 2) / (2 * cParamsCanal.G); } /** * Calcul de la charge spécifique critique. @@ -712,7 +709,7 @@ export abstract class acSection extends Debug { * @return contrainte de cisaillement */ Calc_Tau0() { - return 1000 * this.oP.v.G * this.Calc('R') * this.Calc('J'); + return 1000 * cParamsCanal.G * this.Calc('R') * this.Calc('J'); } /** * Calcul de la distance du centre de gravité de la section à la surface libre @@ -735,7 +732,7 @@ export abstract class acSection extends Debug { * @return Impulsion hydraulique */ Calc_Imp() { - return 1000 * (this.oP.v.Q * this.Calc('V') + this.oP.v.G * this.Calc('SYg')); + return 1000 * (this.oP.v.Q * this.Calc('V') + cParamsCanal.G * this.Calc('SYg')); } /** * Calcul de l'angle Alpha entre la surface libre et le fond pour les sections circulaires. @@ -770,4 +767,3 @@ export abstract class acSection extends Debug { }*/ } -