From c45cedbbac40ca5505e57e6bbdd78b025064f6c1 Mon Sep 17 00:00:00 2001 From: "mathias.chouet" <mathias.chouet@irstea.fr> Date: Tue, 16 Apr 2019 10:36:10 +0200 Subject: [PATCH] Result nos haw a pointer to origin Nub --- spec/nubtest.ts | 2 +- spec/structure/structure_test.ts | 2 +- src/cond_distri.ts | 2 +- src/lechaptcalmon.ts | 2 +- src/macrorugo/macrorugo.ts | 2 +- src/nub.ts | 3 +- src/pab/pab_chute.ts | 2 +- src/pab/pab_dimension.ts | 2 +- src/pab/pab_nombre.ts | 2 +- src/pab/pab_puissance.ts | 2 +- src/regime_uniforme.ts | 4 +-- src/remous.ts | 28 +++++++++---------- src/structure/parallel_structure.ts | 2 +- src/structure/structure.ts | 12 ++++---- src/structure/structure_cem88d.ts | 2 +- src/structure/structure_cem88v.ts | 2 +- src/structure/structure_cunge80.ts | 2 +- src/structure/structure_kivi.ts | 2 +- src/structure/structure_orifice_submerged.ts | 2 +- .../structure_rectangular_orifice_free.ts | 2 +- ...structure_rectangular_orifice_submerged.ts | 2 +- .../structure_triangular_trunc_weir_free.ts | 2 +- .../structure_triangular_weir_free.ts | 2 +- src/structure/structure_weir_free.ts | 2 +- .../structure_weir_submerged_larinier.ts | 2 +- src/util/result.ts | 20 +++++++++---- 26 files changed, 59 insertions(+), 50 deletions(-) diff --git a/spec/nubtest.ts b/spec/nubtest.ts index 6a0f699a..2044b7db 100644 --- a/spec/nubtest.ts +++ b/spec/nubtest.ts @@ -40,7 +40,7 @@ export class NubTest extends Nub { public Equation(): Result { // C = A+B - return new Result(this.prms.A.v + this.prms.B.v); + return new Result(this.prms.A.v + this.prms.B.v, this); } protected setParametersCalculability() { diff --git a/spec/structure/structure_test.ts b/spec/structure/structure_test.ts index 33f2462c..d574a9fa 100644 --- a/spec/structure/structure_test.ts +++ b/spec/structure/structure_test.ts @@ -36,7 +36,7 @@ class StructureTest extends Structure { Structure.CheckEquation(sVarCalc); const data = this.getResultData(); - return new Result(this.prms.Z1.v - this.prms.Z2.v - this.prms.ZDV.v, data); + return new Result(this.prms.Z1.v - this.prms.Z2.v - this.prms.ZDV.v, this, data); } /** diff --git a/src/cond_distri.ts b/src/cond_distri.ts index 1b97c1bd..0fd13ae6 100644 --- a/src/cond_distri.ts +++ b/src/cond_distri.ts @@ -98,7 +98,7 @@ export class ConduiteDistrib extends Nub { throw new Error("ConduiteDistrib.Equation() : invalid parameter name " + sVarCalc); } - return new Result(v); + return new Result(v, this); } /** diff --git a/src/lechaptcalmon.ts b/src/lechaptcalmon.ts index a00363fc..fba3f127 100644 --- a/src/lechaptcalmon.ts +++ b/src/lechaptcalmon.ts @@ -121,7 +121,7 @@ export class LechaptCalmon extends Nub { throw new Error("LechaptCalmon.Equation() : invalid variable name " + sVarCalc); } - return new Result(v); + return new Result(v, this); } /** diff --git a/src/macrorugo/macrorugo.ts b/src/macrorugo/macrorugo.ts index 97fa19e0..f2cdd025 100644 --- a/src/macrorugo/macrorugo.ts +++ b/src/macrorugo/macrorugo.ts @@ -120,7 +120,7 @@ export class MacroRugo extends Nub { public Equation(sVarCalc: string): Result { const Q = uniroot(this.resolveQ, this, 0, 1E7) * this.prms.B.v; - return new Result(Q); + return new Result(Q, this); } /** diff --git a/src/nub.ts b/src/nub.ts index b0be7702..26dbc8a8 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -326,7 +326,8 @@ export abstract class Nub extends ComputeNode implements IObservable { const nbValues = variatedValues.valuesIterator.count(); progressStep = remainingProgress / nbValues; - const res = new Result(); + const res = new Result(undefined, this); + variatedValues.initValuesIterator(false); while (variatedValues.hasNext) { variatedValues.next(); diff --git a/src/pab/pab_chute.ts b/src/pab/pab_chute.ts index 37f8b21f..55275db5 100644 --- a/src/pab/pab_chute.ts +++ b/src/pab/pab_chute.ts @@ -75,7 +75,7 @@ export class PabChute extends Nub { throw new Error("PabChute.Equation() : invalid variable name " + sVarCalc); } - return new Result(v); + return new Result(v, this); } /** diff --git a/src/pab/pab_dimension.ts b/src/pab/pab_dimension.ts index 355f806a..036aa498 100644 --- a/src/pab/pab_dimension.ts +++ b/src/pab/pab_dimension.ts @@ -86,7 +86,7 @@ export class PabDimension extends Nub { throw new Error("PabDimension.Equation() : invalid variable name " + sVarCalc); } - return new Result(v); + return new Result(v, this); } /** diff --git a/src/pab/pab_nombre.ts b/src/pab/pab_nombre.ts index 1318dc1b..f843c767 100644 --- a/src/pab/pab_nombre.ts +++ b/src/pab/pab_nombre.ts @@ -77,7 +77,7 @@ export class PabNombre extends Nub { throw new Error("PabNombre.Equation() : invalid variable name " + sVarCalc); } - const r = new Result(v); + const r = new Result(v, this); r.extraResults.DHR = DHR; return r; diff --git a/src/pab/pab_puissance.ts b/src/pab/pab_puissance.ts index e02dbc95..cc5c9afa 100644 --- a/src/pab/pab_puissance.ts +++ b/src/pab/pab_puissance.ts @@ -76,7 +76,7 @@ export class PabPuissance extends Nub { throw new Error("PabPuissance.Equation() : invalid variable name " + sVarCalc); } - return new Result(v); + return new Result(v, this); } /** diff --git a/src/regime_uniforme.ts b/src/regime_uniforme.ts index d4d003a9..a2003e2e 100644 --- a/src/regime_uniforme.ts +++ b/src/regime_uniforme.ts @@ -42,7 +42,7 @@ export class RegimeUniforme extends Nub { */ private Calc_Qn(): Result { if (this.Sn.prms.If.v <= 0) { - return new Result(0); + return new Result(0, this); } const rR: Result = this.Sn.Calc("R", this.Sn.prms.Y.v); @@ -56,7 +56,7 @@ export class RegimeUniforme extends Nub { } const v = this.Sn.prms.Ks.v * Math.pow(rR.vCalc, 2 / 3) * rS.vCalc * Math.sqrt(this.Sn.prms.If.v); - return new Result(v); + return new Result(v, this); } } diff --git a/src/remous.ts b/src/remous.ts index 8221977d..2276f0f5 100644 --- a/src/remous.ts +++ b/src/remous.ts @@ -133,7 +133,7 @@ export class CourbeRemous extends Nub { // "tRes": { [key: number]: number } // } Result { - const res = new Result(); + const res = new Result(undefined, this); // let Yc: number = this.Sn.Calc("Yc"); const rYC = this.Sn.Calc("Yc"); @@ -511,7 +511,7 @@ export class CourbeRemous extends Nub { } const res: number = rHS.vCalc - rJ.vCalc / 2 * this.Dx; - return new Result(res); + return new Result(res, this); } throw new Error("CourbeRemous.Equation() : parameter " + sVarCalc + " not allowed"); @@ -621,7 +621,7 @@ export class CourbeRemous extends Nub { } const v = - (this.prmSect.If.v - rJ.vCalc) / (1 - Math.pow(rFR.vCalc, 2)); - return new Result(v); + return new Result(v, this); } /** @@ -631,7 +631,7 @@ export class CourbeRemous extends Nub { */ private Calc_Y_EulerExplicite(Y: number): Result { if (!this.Sn.HautCritique.ok) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau @@ -644,7 +644,7 @@ export class CourbeRemous extends Nub { // let Y2 = Y + this.Dx * this.Calc_dYdX(Y); const Y2 = Y + this.Dx * rDXDY.vCalc; - return new Result(Y2); + return new Result(Y2, this); } /** @@ -654,7 +654,7 @@ export class CourbeRemous extends Nub { */ private Calc_Y_RK4(Y: number): Result { if (!this.Sn.HautCritique.ok) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau @@ -670,7 +670,7 @@ export class CourbeRemous extends Nub { const hc = this.Sn.HautCritique.vCalc; if (XOR(rDx > 0, !(Y + rDx / 2 * k1 < hc))) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } // let k2 = this.Calc_dYdX(Y + Dx / 2 * k1); @@ -681,7 +681,7 @@ export class CourbeRemous extends Nub { const k2 = rDXDY2.vCalc; if (XOR(rDx > 0, !(Y + rDx / 2 * k2 < hc))) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } // let k3 = this.Calc_dYdX(Y + Dx / 2 * k2); @@ -692,7 +692,7 @@ export class CourbeRemous extends Nub { const k3 = rDXDY3.vCalc; if (XOR(rDx > 0, !(Y + rDx / 2 * k3 < hc))) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } // let k4 = this.Calc_dYdX(Y + Dx * k3); @@ -707,10 +707,10 @@ export class CourbeRemous extends Nub { // if ($this ->rDx > 0 xor !($Yout < $this ->oSect ->rHautCritique)) { return false; } if (XOR(rDx > 0, !(Yout < hc))) { - const res = new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + const res = new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } - return new Result(Yout); + return new Result(Yout, this); } /** @@ -720,7 +720,7 @@ export class CourbeRemous extends Nub { */ private Calc_Y_Trapez(Y: number): Result { if (!this.Sn.HautCritique.ok) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } const dicho = new Dichotomie(this, "Y", this._debugDicho, "Hs"); @@ -747,7 +747,7 @@ export class CourbeRemous extends Nub { return r; } - // return new Result(Y2); + // return new Result(Y2, this); return r; } @@ -777,7 +777,7 @@ export class CourbeRemous extends Nub { } if (!res.ok || XOR(this.Dx > 0, !(res.vCalc < this.Sn.HautCritique.vCalc))) { - return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE)); + return new Result(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE), this); } return res; diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts index f2c3eedf..64295d2c 100644 --- a/src/structure/parallel_structure.ts +++ b/src/structure/parallel_structure.ts @@ -213,7 +213,7 @@ export class ParallelStructure extends Nub { ); } } - const calcRes: Result = new Result(0); + const calcRes: Result = new Result(0, this); let qTot: number = 0; for (let i = 0; i < this._structures.length; i++) { if (i !== iExcept) { diff --git a/src/structure/structure.ts b/src/structure/structure.ts index f811fbef..dd72feb8 100644 --- a/src/structure/structure.ts +++ b/src/structure/structure.ts @@ -184,21 +184,21 @@ export abstract class Structure extends Nub { ENUM_StructureFlowRegime: StructureFlowRegime.NULL }; if (sVarCalc === "Q") { if (this.prms.h1.v <= 0 || this.prms.Z1.v === this.prms.Z2.v || this.prms.W.v <= 0) { - return new Result(0, flagsNull); + return new Result(0, this, flagsNull); } } else if (this.prms.Q.v === 0) { // Débit nul <=> tirant d'eau amont = tirant d'eau aval ou tout autre paramètre nul switch (sVarCalc) { case "Z1": - return new Result(this.prms.Z2.v, flagsNull); + return new Result(this.prms.Z2.v, this, flagsNull); case "Z2": - return new Result(this.prms.Z1.v, flagsNull); + return new Result(this.prms.Z1.v, this, flagsNull); default: // Est-ce toujours vrai ? Nécessitera peut-être d'étendre la méthode - return new Result(0, flagsNull); + return new Result(0, this, flagsNull); } } else if (this.prms.W.v === 0 && sVarCalc === "Z1") { - return new Result(Infinity, flagsNull); // Si la vanne est fermée la cote amont est infinie + return new Result(Infinity, this, flagsNull); // Si la vanne est fermée la cote amont est infinie } // Gestion du cas d'écoulement impossible Z1 > Z2 et Q <= 0 @@ -216,7 +216,7 @@ export abstract class Structure extends Nub { default: rPrm = 0; } - const res: Result = new Result(new Message(MessageCode.ERROR_STRUCTURE_Q_TROP_ELEVE), flagsNull); + const res: Result = new Result(new Message(MessageCode.ERROR_STRUCTURE_Q_TROP_ELEVE), this, flagsNull); res.vCalc = rPrm; // "Les cotes et le débit ne sont pas cohérents => fermeture de l'ouvrage diff --git a/src/structure/structure_cem88d.ts b/src/structure/structure_cem88d.ts index 23c3a824..94079c52 100644 --- a/src/structure/structure_cem88d.ts +++ b/src/structure/structure_cem88d.ts @@ -64,7 +64,7 @@ export class StructureWeirCem88d extends RectangularStructure { "StructureWeirCem88d.Equation(h1=" + this.prms.h1.v + ",h2=" + this.prms.h2.v + ",W=" + this.prms.W.v + ") => Q=" + v); - return new Result(v, data); + return new Result(v, this, data); } } diff --git a/src/structure/structure_cem88v.ts b/src/structure/structure_cem88v.ts index a16139b1..886ee53d 100644 --- a/src/structure/structure_cem88v.ts +++ b/src/structure/structure_cem88v.ts @@ -66,7 +66,7 @@ export class StructureWeirCem88v extends RectangularStructure { "StructureWeirCem88v.Equation(h1=" + this.prms.h1.v + ",h2=" + this.prms.h2.v + ",W=" + this.prms.W.v + ") => Q=" + v); - return new Result(v, data); + return new Result(v, this, data); } /** diff --git a/src/structure/structure_cunge80.ts b/src/structure/structure_cunge80.ts index 90397455..7da97719 100644 --- a/src/structure/structure_cunge80.ts +++ b/src/structure/structure_cunge80.ts @@ -52,7 +52,7 @@ export class StructureCunge80 extends RectangularStructure { } } - return new Result(v, data); + return new Result(v, this, data); } protected getFlowRegime() { diff --git a/src/structure/structure_kivi.ts b/src/structure/structure_kivi.ts index 797f184f..06de167a 100644 --- a/src/structure/structure_kivi.ts +++ b/src/structure/structure_kivi.ts @@ -22,7 +22,7 @@ export class StructureKivi extends Structure { public Equation(sVarCalc: string): Result { Structure.CheckEquation(sVarCalc); - const res: Result = new Result(0, this.getResultData()); + const res: Result = new Result(0, this, this.getResultData()); // p : pelle let p: number = this.prms.ZDV.v - this.prms.ZRAM.v; diff --git a/src/structure/structure_orifice_submerged.ts b/src/structure/structure_orifice_submerged.ts index 3350831d..67ec3d61 100644 --- a/src/structure/structure_orifice_submerged.ts +++ b/src/structure/structure_orifice_submerged.ts @@ -32,7 +32,7 @@ export class StructureOrificeSubmerged extends Structure { const v = this.prms.Cd.v * this.prms.S.v * Structure.R2G * Math.sqrt(this.prms.Z1.v - this.prms.Z2.v); - return new Result(v, data); + return new Result(v, this, data); } public calcA(): number { diff --git a/src/structure/structure_rectangular_orifice_free.ts b/src/structure/structure_rectangular_orifice_free.ts index 9bb18b97..5b89e0a2 100644 --- a/src/structure/structure_rectangular_orifice_free.ts +++ b/src/structure/structure_rectangular_orifice_free.ts @@ -26,7 +26,7 @@ export class StructureRectangularOrificeFree extends RectangularStructure { const v = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v * Structure.R2G * Math.sqrt(this.prms.h1.v); - return new Result(v, data); + return new Result(v, this, data); } protected getFlowRegime() { diff --git a/src/structure/structure_rectangular_orifice_submerged.ts b/src/structure/structure_rectangular_orifice_submerged.ts index fe775d2d..bb71b307 100644 --- a/src/structure/structure_rectangular_orifice_submerged.ts +++ b/src/structure/structure_rectangular_orifice_submerged.ts @@ -29,7 +29,7 @@ export class StructureRectangularOrificeSubmerged extends RectangularStructure { const v = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v * Structure.R2G * Math.sqrt(this.prms.h1.v - this.prms.h2.v); - return new Result(v, data); + return new Result(v, this, data); } protected getFlowRegime() { diff --git a/src/structure/structure_triangular_trunc_weir_free.ts b/src/structure/structure_triangular_trunc_weir_free.ts index c3a6a21f..85fc1704 100644 --- a/src/structure/structure_triangular_trunc_weir_free.ts +++ b/src/structure/structure_triangular_trunc_weir_free.ts @@ -36,7 +36,7 @@ export class StructureTriangularTruncWeirFree extends Structure { v = v * (Math.pow(this.prms.h1.v, 2.5) - Math.pow(this.prms.Z1.v - this.prms.ZT.v, 2.5)); } - return new Result(v, data); + return new Result(v, this, data); } /** diff --git a/src/structure/structure_triangular_weir_free.ts b/src/structure/structure_triangular_weir_free.ts index beb63a2b..fe1b429b 100644 --- a/src/structure/structure_triangular_weir_free.ts +++ b/src/structure/structure_triangular_weir_free.ts @@ -32,7 +32,7 @@ export class StructureTriangularWeirFree extends Structure { const v = this.prms.Cd.v * this.getTanFromDegrees(this.prms.alpha2.v) * Math.pow(this.prms.h1.v, 2.5); - return new Result(v, data); + return new Result(v, this, data); } /** diff --git a/src/structure/structure_weir_free.ts b/src/structure/structure_weir_free.ts index 444dc372..4346adbb 100644 --- a/src/structure/structure_weir_free.ts +++ b/src/structure/structure_weir_free.ts @@ -19,7 +19,7 @@ export class StructureWeirFree extends RectangularStructure { const v = this.prms.Cd.v * this.prms.L.v * Structure.R2G * Math.pow(this.prms.h1.v, 1.5); - return new Result(v, data); + return new Result(v, this, data); } protected getFlowRegime() { diff --git a/src/structure/structure_weir_submerged_larinier.ts b/src/structure/structure_weir_submerged_larinier.ts index f3468ac4..afb6ec39 100644 --- a/src/structure/structure_weir_submerged_larinier.ts +++ b/src/structure/structure_weir_submerged_larinier.ts @@ -22,7 +22,7 @@ export class StructureWeirSubmergedLarinier extends RectangularStructure { const v = this.prms.Cd.v * this.prms.L.v * Structure.R2G * this.prms.h1.v * Math.sqrt(this.prms.h1.v - this.prms.h2.v); - return new Result(v, data); + return new Result(v, this, data); } protected getFlowRegime() { diff --git a/src/util/result.ts b/src/util/result.ts index e4054ee1..aeff1093 100644 --- a/src/util/result.ts +++ b/src/util/result.ts @@ -1,4 +1,5 @@ import { JalhydObject } from "../jalhyd_object"; +import { Nub } from "../nub"; import { ParamFamily } from "../param/param-definition"; import { INamedIterableValues, @@ -17,12 +18,15 @@ import { ResultElement } from "./resultelement"; // tslint:disable-next-line:max-classes-per-file export class Result extends JalhydObject implements INamedIterableValues { - /** nom de la variable/paramètre calculé */ + /** nom de la variable/paramètre calculé (= symbol) */ public name: string; /** "parameters" family, for linked parameters */ public family: ParamFamily; + /** Nub that produced this result */ + private _sourceNub: Nub; + /** * Messages (erreurs, infos, ...) */ @@ -35,7 +39,7 @@ export class Result extends JalhydObject implements INamedIterableValues { */ private _iterator: INumberIterator; - constructor(v?: number | Message | ResultElement, d?: any) { + constructor(v?: number | Message | ResultElement, sourceNub?: Nub, extraResults?: any) { super(); this._globalLog = new cLog(); this._resultElements = []; @@ -44,9 +48,9 @@ export class Result extends JalhydObject implements INamedIterableValues { } else if (v instanceof ResultElement) { this._resultElements.push(v); } - - if (d !== undefined) { - this.resultElement.extraResults = d; + this._sourceNub = sourceNub; + if (extraResults !== undefined) { // for setter + this.resultElement.extraResults = extraResults; } } @@ -93,6 +97,10 @@ export class Result extends JalhydObject implements INamedIterableValues { return this._resultElements.length > 0; } + public get sourceNub(): Nub { + return this._sourceNub; + } + /** * @return le résultat de calcul du 1er ResultElement */ @@ -138,7 +146,7 @@ export class Result extends JalhydObject implements INamedIterableValues { if (i < 0 || i >= this._resultElements.length) { throw new Error("Result.extractResult index outside [0;" + (this._resultElements.length - 1) + "]"); } - return new Result(this._resultElements[i]); + return new Result(this._resultElements[i], this._sourceNub); } /** -- GitLab