diff --git a/spec/nubtest.ts b/spec/nubtest.ts index 6a0f699a22f75998a4adac1021c8cc47ab6b29fb..2044b7db0baecbd9c22699a97f75fb4653fcd499 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 33f2462ce25b964c396a5c3d4adf3fec90eef971..d574a9fa1a561fbd6f4b4f96e8318ab198b7bf57 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 1b97c1bd95c9caa878d5899abd7b0ff0edd82068..0fd13ae6246ee81a03a667ed9a66592ac9cca5a4 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 a00363fce1eda374cd487a1f7de8ac0761d9b1d9..fba3f127b0f97962f14da3e43a7ab0bf0ad14467 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 97fa19e024cd59836f0c66d86e58606b26b08b95..f2cdd0252ca2adf5fd1aaeb51e73618fde6ce0a3 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 b0be7702436c7b0147bd8570f74bf079609e2715..26dbc8a8a1aa09b44a5b98bf11d20422013a3a28 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 37f8b21f744bbd019801bc73ac0a7e5ac6af9ab8..55275db5bc08764d3f1bba838a6af74d7ee92d4a 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 355f806a57e944256353b2e02c78f16f924c6eb2..036aa49875e794b08002ad1a6ba552ef0d31ecfa 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 1318dc1b064d74ec52498ad76b127af721a69c6d..f843c767cc257f15750298d33b49277e903acb25 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 e02dbc953cf1558d961cd98c99f9719cad3363bb..cc5c9afae9b69383a1efdeb014b0578ed051dad0 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 d4d003a914ae54b929baf8eda3ee6bdfe339021c..a2003e2ef5a4ed572d04816c282026f7435d644c 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 8221977d6fba21ae077ba0e9c6a837d90e0eecc4..2276f0f5c88e12b885f3438c15689f66fe1c6532 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 f2c3eedfbbbf7ce1580628dba5b8d96be06ee522..64295d2c39404e775c332f9b84286a81cb959ae2 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 f811fbef59de152f20d685f9a73c014ea0891b9a..dd72feb87b33924e714be3b167714802e0902b73 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 23c3a824dced5615a6a20d7fb63a67e506dffc57..94079c526d81621763b27967b214ebca251dd4be 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 a16139b1add29f298e4376ed3f2cbad0bc8f0d9a..886ee53dbe5bdf8b58f4e8622f0912756d276af6 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 90397455ff2ceac447d845649a03bd9697317071..7da977193f6df78202d3d744dcc2ad841c7c8635 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 797f184f8bf7de0e3554ba51ea7164501e68681a..06de167a2ff5877aaeab5e533b76ead933316fc6 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 3350831d1ce05a352267bacee58666c7cbdbe6c9..67ec3d61e4723bea80341a4c0b8efaa443ac3c06 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 9bb18b97b252ae3eb663cf9f4dd6627c39cffb1d..5b89e0a2c9b51e812676f443487ce58adb75dd58 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 fe775d2de10becea247a29803573427d8e0e77f6..bb71b307d9cedf55ddbc52402dd21c98f858efa8 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 c3a6a21f3f8f136fc8d7898f2626c74e6153666c..85fc1704d7d12bf2fb02b6dc9aafd5bed3b2f67b 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 beb63a2b7c9236e0357da08f1f0d0b2aa0c2d49a..fe1b429b8ff25b6f82584166cc14c9bcb0f48b12 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 444dc37259efab1ba4d2a4305cc5b7273ce756f0..4346adbbb50c59be9fa41f13c33934b5fd46f88b 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 f3468ac4fbeff4041c132ac789d61c267ce11b98..afb6ec391bd47ac305b63f230575dd30644af7ac 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 e4054ee1c799d450266962f05430624a3eeb0f42..aeff109304d67eac6063f03dda210abbf0ef3630 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); } /**