diff --git a/src/remous.ts b/src/remous.ts index e1dfcd4b3d6de06c4a2f1a688501a762ac97ea16..3231797be0103bdd4c6cb41a636c9db0e925df5f 100644 --- a/src/remous.ts +++ b/src/remous.ts @@ -9,6 +9,7 @@ import { cLog } from "./util/log"; import { Message, MessageCode } from "./util/message"; import { Result } from "./util/result"; import { ResultElement } from "./util/resultelement"; +import { ParamValueIterator, ParamValues } from "."; export enum MethodeResolution { Trapezes, EulerExplicite, RungeKutta4 @@ -111,11 +112,6 @@ export class CourbeRemous extends Nub { private prmSect: ParamsSection; - /** - * Pas de discrétisation de l'espace (positif en partant de l'aval, négatif en partant de l'amont) - */ - private Dx: number; - constructor(crp: CourbeRemousParams, dbg: boolean = false) { super(crp, dbg); // this._log = crp.Sn.log; @@ -123,10 +119,17 @@ export class CourbeRemous extends Nub { this.Sn.Calc("Yc"); } + /** + * Pas de discrétisation de l'espace (positif en partant de l'aval, négatif en partant de l'amont) + */ + private get Dx(): number { + return this.prms.Dx.v; + } + /** * calcul de la ligne fluviale depuis l'aval (si possible) */ - public calculFluvial(): ResultElement { + private calculFluvial(xValues: ParamValues): ResultElement { if (!this.Sn.HautCritique.ok) { return new ResultElement(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); } @@ -140,8 +143,7 @@ export class CourbeRemous extends Nub { this.debug( `Condition limite aval (${this.prms.Yaval.v}) >= ` + `Hauteur critique (${this.Sn.HautCritique}) : calcul de la partie fluviale à partir de l'aval`); - this.Dx = this.prms.Dx.v; - res = this.calcul(this.prms.Yaval.v); + res = this.calcul(this.prms.Yaval.v, xValues.getValuesIterator(true)); res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL)); } else { this.debug( @@ -159,7 +161,7 @@ export class CourbeRemous extends Nub { /** * calcul de la ligne torrentielle depuis l'amont (si possible) */ - public calculTorrentiel(): ResultElement { + private calculTorrentiel(xValues: ParamValues): ResultElement { if (!this.Sn.HautCritique.ok) { return new ResultElement(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); } @@ -174,8 +176,7 @@ export class CourbeRemous extends Nub { "Condition limite amont (" + this.prms.Yamont.v + ") <= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie torrentielle à partir de l'amont"); - this.Dx = -this.prms.Dx.v; - res = this.calcul(this.prms.Yamont.v); + res = this.calcul(this.prms.Yamont.v, xValues.getValuesIterator(false)); res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL)); } else { // this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); @@ -250,15 +251,17 @@ export class CourbeRemous extends Nub { // Calcul des courbes de remous + const xValues = new ParamValues(0, this.prms.Long.v, this.Dx) + // let crbFlu: { [key: number]: number; } = this.calculFluvial(); - const rCourbeFlu: ResultElement = this.calculFluvial(); + const rCourbeFlu: ResultElement = this.calculFluvial(xValues); // if (!rCourbeFlu.ok) { res.addLog(rCourbeFlu.log); // return res; // } // let crbTor: { [key: number]: number; } = this.calculTorrentiel(); - const rCourbeTor: ResultElement = this.calculTorrentiel(); + const rCourbeTor: ResultElement = this.calculTorrentiel(xValues); // if (!rCourbeTor.ok) { res.addLog(rCourbeTor.log); // return res; @@ -358,7 +361,7 @@ export class CourbeRemous extends Nub { // this.debug(trX); let bRessaut = false; - const Dx = this.prms.Dx.v; + const Dx = xValues.step; for (let irX = 0; irX < trX.length; irX++) { const rX: number = +trX[irX]; @@ -811,27 +814,15 @@ export class CourbeRemous extends Nub { * Calcul d'une courbe de remous en fluvial ou torrentiel * @param YCL Condition limite amont (torrentiel) ou aval (fluvial) */ - private calcul(YCL: number): ResultElement { + private calcul(YCL: number, valueIterator: ParamValueIterator): ResultElement { const trY: { [key: number]: number; } = {}; const res = new ResultElement(); - let deb: number; - let fin: number; - if (this.Dx > 0) { - // Calcul depuis l'aval - deb = this.prms.Long.v; - fin = 0; - } else { - // Calcul depuis l'amont - deb = 0; - fin = this.prms.Long.v; - } - const dx = -this.Dx; let lastY = YCL; - trY[round(deb, this.prmSect.iPrec.v)] = lastY; + trY[round(valueIterator.next().value, this.prmSect.iPrec.v)] = lastY; // Boucle de calcul de la courbe de remous - for (let x = deb + dx; (dx > 0 && x <= fin) || (dx < 0 && x >= fin); x += dx) { + for (const x of valueIterator) { // this.debug("lastY " + lastY); const rY: Result = this.Calc_Y(lastY); // this.debug("calcul : x " + x + " y " + rY.vCalc);