From cbe9cc2a6703ed7b88797ee942db67c74bf99bc1 Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Thu, 8 Feb 2018 12:19:45 +0100
Subject: [PATCH] =?UTF-8?q?ticket=20#36=20:=20Result=20renomm=C3=A9=20en?=
 =?UTF-8?q?=20ResultElement,=20CalcResult=20en=20Result=20et=20constitu?=
 =?UTF-8?q?=C3=A9=20d'un=20ResultElement[]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../remous_rect_euler_pentefaible.spec.ts     |   8 +-
 .../remous_rect_euler_penteforte.spec.ts      |  10 +-
 .../remous_rect_rk4_pentefaible.spec.ts       |  10 +-
 .../remous/remous_rect_rk4_penteforte.spec.ts |  12 +-
 .../remous_rect_trapezes_pentefaible.spec.ts  |  14 +-
 .../remous_rect_trapezes_penteforte.spec.ts   |  12 +-
 spec/remous/test-remous-fenetre.ts            |  14 +-
 spec/structure/rectangular_structure.ts       |   6 +-
 spec/structure/structure.spec.ts              |   8 +-
 src/index.ts                                  |   2 +-
 src/remous.ts                                 |  44 ++--
 src/section/newton.ts                         |   5 +-
 src/util/calcresult.ts                        | 142 ------------
 src/util/result.ts                            | 218 +++++++++++++-----
 src/util/resultelement.ts                     | 125 ++++++++++
 15 files changed, 353 insertions(+), 277 deletions(-)
 delete mode 100644 src/util/calcresult.ts
 create mode 100644 src/util/resultelement.ts

diff --git a/spec/remous/remous_rect_euler_pentefaible.spec.ts b/spec/remous/remous_rect_euler_pentefaible.spec.ts
index 1d7d6c2c..d107b505 100644
--- a/spec/remous/remous_rect_euler_pentefaible.spec.ts
+++ b/spec/remous/remous_rect_euler_pentefaible.spec.ts
@@ -4,7 +4,7 @@ import { cLog } from "../../src/util/log";
 import { Message, MessageCode } from "../../src/util/message";
 import { compareArray, compareLog, compareObject } from "../test_func";
 import { precDist } from "../test_config";
-import { CalcResult } from "../../src/util/calcresult";
+import { Result } from "../../src/util/result";
 
 describe("Class Remous / section rectangulaire :", () => {
     describe("méthode Euler explicite :", () => {
@@ -241,7 +241,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             let rem = new CourbeRemous(prem);
 
-            let res: CalcResult = rem.calculRemous(undefined);
+            let res: Result = rem.calculRemous(undefined);
 
             // données de validation : version Typescript (Oct 2017) méthode des trapèzes
 
@@ -270,7 +270,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
@@ -323,7 +323,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
     });
 });
diff --git a/spec/remous/remous_rect_euler_penteforte.spec.ts b/spec/remous/remous_rect_euler_penteforte.spec.ts
index 770317ea..8a6670d9 100644
--- a/spec/remous/remous_rect_euler_penteforte.spec.ts
+++ b/spec/remous/remous_rect_euler_penteforte.spec.ts
@@ -69,7 +69,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 0;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, ressaut après l'aval", () => {
@@ -134,7 +134,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 100;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         // it("forte pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -267,7 +267,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 3.75;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
@@ -331,7 +331,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
@@ -384,7 +384,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
     });
 });
diff --git a/spec/remous/remous_rect_rk4_pentefaible.spec.ts b/spec/remous/remous_rect_rk4_pentefaible.spec.ts
index dac7b903..25e8802c 100644
--- a/spec/remous/remous_rect_rk4_pentefaible.spec.ts
+++ b/spec/remous/remous_rect_rk4_pentefaible.spec.ts
@@ -80,7 +80,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 0;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("faible pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -145,7 +145,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 5;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         xit("faible pente, ressaut (plusieurs points) à l'intérieur du bief", () => { // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
@@ -204,7 +204,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 1;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("faible pente, pas de ressaut, Yamont > Yc, Yaval > Yn", () => {
@@ -257,7 +257,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
@@ -310,7 +310,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
     });
 });
diff --git a/spec/remous/remous_rect_rk4_penteforte.spec.ts b/spec/remous/remous_rect_rk4_penteforte.spec.ts
index de0ffec3..471d81c6 100644
--- a/spec/remous/remous_rect_rk4_penteforte.spec.ts
+++ b/spec/remous/remous_rect_rk4_penteforte.spec.ts
@@ -78,7 +78,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 0;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, ressaut après l'aval", () => {
@@ -143,7 +143,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 100;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         xit("forte pente, ressaut (1 point) à l'intérieur du bief", () => { // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
@@ -208,7 +208,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 90;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         xit("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => { // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
@@ -268,7 +268,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 3.75;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
@@ -321,7 +321,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
@@ -374,7 +374,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
     });
 });
diff --git a/spec/remous/remous_rect_trapezes_pentefaible.spec.ts b/spec/remous/remous_rect_trapezes_pentefaible.spec.ts
index 83dbfe08..7f5f3f93 100644
--- a/spec/remous/remous_rect_trapezes_pentefaible.spec.ts
+++ b/spec/remous/remous_rect_trapezes_pentefaible.spec.ts
@@ -74,7 +74,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 0;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("faible pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -139,7 +139,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 5;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         xit("faible pente, ressaut (plusieurs points) à l'intérieur du bief (1)", () => { // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
@@ -210,7 +210,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 1;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         xit("faible pente, ressaut (plusieurs points) à l'intérieur du bief (2)", () => { // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
@@ -269,7 +269,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 0.9;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
     });
 
@@ -323,7 +323,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
         expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-        compareLog(res.log, expLog);
+        compareLog(res.globalLog, expLog);
     });
 
     it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
@@ -376,7 +376,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
         expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-        compareLog(res.log, expLog);
+        compareLog(res.globalLog, expLog);
     });
 
     it("faible pente, pas de fluvial, torrentiel tronqué, calcul Hs", () => {
@@ -436,6 +436,6 @@ describe("Class Remous / section rectangulaire :", () => {
         m.extraVar.x = 15;
         expLog.add(m);
 
-        compareLog(res.log, expLog);
+        compareLog(res.globalLog, expLog);
     });
 });
diff --git a/spec/remous/remous_rect_trapezes_penteforte.spec.ts b/spec/remous/remous_rect_trapezes_penteforte.spec.ts
index 86363194..4104df84 100644
--- a/spec/remous/remous_rect_trapezes_penteforte.spec.ts
+++ b/spec/remous/remous_rect_trapezes_penteforte.spec.ts
@@ -78,7 +78,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 0;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, ressaut après l'aval", () => {
@@ -144,7 +144,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.x = 100;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -208,7 +208,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 95;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         xit("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => { // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
@@ -268,7 +268,7 @@ describe("Class Remous / section rectangulaire :", () => {
             m.extraVar.xmax = 3.75;
             expLog.add(m);
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
@@ -328,7 +328,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
@@ -381,7 +381,7 @@ describe("Class Remous / section rectangulaire :", () => {
 
             expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(res.log, expLog);
+            compareLog(res.globalLog, expLog);
         });
     });
 });
diff --git a/spec/remous/test-remous-fenetre.ts b/spec/remous/test-remous-fenetre.ts
index 481cb1b2..e62ae2aa 100644
--- a/spec/remous/test-remous-fenetre.ts
+++ b/spec/remous/test-remous-fenetre.ts
@@ -3,7 +3,7 @@ import { CourbeRemous, CourbeRemousParams, MethodeResolution } from "../../src/r
 import { cSnRectang, ParamsSectionRectang } from "../../src/section/section_rectang";
 import { equalEpsilon, compareArray } from "../test_func";
 import { Result } from "../../src/util/result";
-import { CalcResult } from "../../src/util/calcresult";
+import { ResultElement } from "../../src/util/resultelement";
 
 /*
    Tentative de validation automatique du calcul des courbes de remous.
@@ -190,22 +190,22 @@ function testFenetre() {
     //     "trX": string[],
     //     "tRes": { [key: number]: number },
     // } = r.res;
-    const res: CalcResult = r.res;
+    const res: Result = r.res;
     expect(res.ok).toBeTruthy("erreur de calcul de la courbe globale");
 
     const remous = r.remous;
 
     // ligne fluviale totale, utilisée pour les conditions initiales
     // const ligneFluviale: { [key: number]: number; } = remous.calculFluvial();
-    const rLigneFluviale: Result = remous.calculFluvial();
+    const rLigneFluviale: ResultElement = remous.calculFluvial();
     expect(rLigneFluviale.ok).toBeTruthy("erreur de calcul de la ligne fluviale");
-    const ligneFluviale: { [key: number]: number; } = rLigneFluviale.extraResults["trY"];
+    const ligneFluviale: { [key: number]: number; } = rLigneFluviale.getExtraResult("trY");
 
     // ligne torrentielle totale, utilisée pour les conditions initiales
     // const ligneTorrentielle: { [key: number]: number; } = remous.calculTorrentiel();
-    const rLigneTorrentielle: Result = remous.calculTorrentiel();
+    const rLigneTorrentielle: ResultElement = remous.calculTorrentiel();
     expect(rLigneTorrentielle.ok).toBeTruthy("erreur de calcul de la ligne torrentielle");
-    const ligneTorrentielle: { [key: number]: number; } = rLigneTorrentielle.extraResults["trY"];
+    const ligneTorrentielle: { [key: number]: number; } = rLigneTorrentielle.getExtraResult("trY");
 
     console.log(remous.log.toString());
     // let ms = r["remous"].log.messages;
@@ -283,7 +283,7 @@ function testFenetre() {
         console.log("computeFenetre y am/av=" + yAmont + " " + yAval);
 
         const r2 = computeFenetreRect(yAmont, yAval, +xBief2 - +xBief1, i1 === ni);
-        const resFenetre: CalcResult = r2.res;
+        const resFenetre: Result = r2.res;
         expect(resFenetre.ok).toBeTruthy("erreur de calcul de la fenêtre");
         let trX_fenetre = resFenetre.getExtraResult("trX");
         let flu_fenetre = resFenetre.getExtraResult("flu");
diff --git a/spec/structure/rectangular_structure.ts b/spec/structure/rectangular_structure.ts
index a5577499..b9b9cecd 100644
--- a/spec/structure/rectangular_structure.ts
+++ b/spec/structure/rectangular_structure.ts
@@ -43,12 +43,12 @@ export function itCalcQ(
     });
     if (mode !== undefined) {
         it("Q(Z1=" + Z1 + ",W=" + W + ") Mode should be " + mode, () => {
-            expect(res.extraVar.Mode).toBe(mode);
-       });
+            expect(res.extraResults.Mode).toBe(mode);
+        });
     }
     if (regime !== undefined) {
         it("Q(Z1=" + Z1 + ",W=" + W + ") Regime should be " + regime, () => {
-            expect(res.extraVar.Regime).toBe(regime);
+            expect(res.extraResults.Regime).toBe(regime);
         });
     }
 }
diff --git a/spec/structure/structure.spec.ts b/spec/structure/structure.spec.ts
index 53e0a674..5a976904 100644
--- a/spec/structure/structure.spec.ts
+++ b/spec/structure/structure.spec.ts
@@ -83,25 +83,25 @@ describe("Class Structure: ", () => {
         it("h1=h2 => Q=0", () => {
             structTest.prms.Z2.v = structTest.prms.Z1.v;
             checkResult(structTest.Calc("Q"), 0);
-            expect(structTest.Calc("Q").extraVar).toEqual(flagsNull);
+            expect(structTest.Calc("Q").extraResults).toEqual(flagsNull);
             structTest.prms.Z2.v = 15;
         });
         it("W=0 => Q=0", () => {
             structTest.prms.W.v = 0;
             checkResult(structTest.Calc("Q"), 0);
-            expect(structTest.Calc("Q").extraVar).toEqual(flagsNull);
+            expect(structTest.Calc("Q").extraResults).toEqual(flagsNull);
             structTest.prms.W.v = Infinity;
         });
         it("Q=0 => h1=h2", () => {
             structTest.prms.Q.v = 0;
             checkResult(structTest.Calc("h1"), structTest.prms.h2.v);
-            expect(structTest.Calc("h1").extraVar).toEqual(flagsNull);
+            expect(structTest.Calc("h1").extraResults).toEqual(flagsNull);
             structTest.prms.Q.v = 1;
         });
         it("Q=0 => W=0", () => {
             structTest.prms.Q.v = 0;
             checkResult(structTest.Calc("W"), 0);
-            expect(structTest.Calc("W").extraVar).toEqual(flagsNull);
+            expect(structTest.Calc("W").extraResults).toEqual(flagsNull);
             structTest.prms.Q.v = 1;
         });
         // TODO Test inversion de débit
diff --git a/src/index.ts b/src/index.ts
index a939be42..2da8a0d6 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -17,7 +17,7 @@ export * from "./util/numericalstring";
 export * from "./util/message";
 export * from "./util/log";
 export * from "./util/result";
-export * from "./util/calcresult";
+export * from "./util/resultelement";
 export * from "./util/pair";
 export * from "./util/interval";
 export * from "./pab/pab_dimension";
diff --git a/src/remous.ts b/src/remous.ts
index 9341d9da..b6255523 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -1,7 +1,7 @@
 import { ParamsSection, acSection } from "./section/section_type";
 import { XOR, round } from "./base";
+import { ResultElement } from "./util/resultelement";
 import { Result } from "./util/result";
-import { CalcResult } from "./util/calcresult";
 import { ParamsEquation, ParamDefinition, ParamCalculability, ComputeNodeType, ParamDomainValue } from "./param";
 import { Dichotomie } from "./dichotomie";
 import { Nub } from "./nub";
@@ -359,11 +359,11 @@ 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): Result
+	private calcul(YCL: number): ResultElement
 	// { [key: number]: number } 
 	{
 		let trY: { [key: number]: number; } = {};
-		const res = new Result(undefined);
+		const res = new ResultElement();
 
 		if (this.Dx > 0) {
 			// Calcul depuis l'aval
@@ -451,11 +451,9 @@ export class CourbeRemous extends Nub {
 	/**
 	 * calcul de la ligne fluviale depuis l'aval (si possible)
 	 */
-	public calculFluvial(): Result {
+	public calculFluvial(): ResultElement {
 		if (!this.Sn.HautCritique.ok)
-			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
-
-		// let res: { [key: number]: number; } = {};
+			return new ResultElement(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		// Calcul depuis l'aval
 		if (this.Sn.HautCritique.vCalc <= this.prms.Yaval.v) {
@@ -469,7 +467,7 @@ export class CourbeRemous extends Nub {
 		else {
 			this.debug("Condition limite aval (" + this.prms.Yaval.v + ") < Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'aval");
 			// this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
-			res = new Result(undefined);
+			res = new ResultElement();
 			res.addMessage(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 		}
 
@@ -479,11 +477,9 @@ export class CourbeRemous extends Nub {
 	/**
 	 * calcul de la ligne torrentielle depuis l'amont (si possible)
 	 */
-	public calculTorrentiel(): Result {
+	public calculTorrentiel(): ResultElement {
 		if (!this.Sn.HautCritique.ok)
-			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
-
-		// let res: { [key: number]: number; } = {};
+			return new ResultElement(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		// Calcul depuis l'amont
 		if (this.Sn.HautCritique.vCalc >= this.prms.Yamont.v) {
@@ -497,7 +493,7 @@ export class CourbeRemous extends Nub {
 		else {
 			// this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 			this.debug("Condition limite amont (" + this.prms.Yamont.v + ") > Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'amont");
-			res = new Result(undefined);
+			res = new ResultElement();
 			res.addMessage(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 		}
 
@@ -514,21 +510,19 @@ export class CourbeRemous extends Nub {
 		// "trX": string[],
 		// "tRes": { [key: number]: number }
 		// }
-		CalcResult {
-		const res = new CalcResult();
+		Result {
+		const res = new Result();
 
 		// let Yc: number = this.Sn.Calc("Yc");
 		const rYC = this.Sn.Calc("Yc");
 		if (!rYC.ok) {
-			res.addResult(rYC);
-			return res;
+			return rYC;
 		}
 		const Yc: number = rYC.vCalc;
 
 		const rB: Result = this.Sn.Calc("B", this.Sn.prms.YB.v)
 		if (!rB.ok) {
-			res.addResult(rB);
-			return res;
+			return rB;
 		}
 
 		let m: Message = new Message(MessageCode.INFO_REMOUS_LARGEUR_BERGE);
@@ -565,14 +559,14 @@ export class CourbeRemous extends Nub {
 		// Calcul des courbes de remous
 
 		// let crbFlu: { [key: number]: number; } = this.calculFluvial();
-		let rCourbeFlu: Result = this.calculFluvial();
+		let rCourbeFlu: ResultElement = this.calculFluvial();
 		// if (!rCourbeFlu.ok) {
 		res.addLog(rCourbeFlu.log);
 		// 	return res;
 		// }
 
 		// let crbTor: { [key: number]: number; } = this.calculTorrentiel();
-		let rCourbeTor: Result = this.calculTorrentiel();
+		let rCourbeTor: ResultElement = this.calculTorrentiel();
 		// if (!rCourbeTor.ok) {
 		res.addLog(rCourbeTor.log);
 		// 	return res;
@@ -827,19 +821,19 @@ export class CourbeRemous extends Nub {
 		}
 
 		//return { "flu": crbFlu, "tor": crbTor, "trX": trX, "tRes": tRes };
-		const rFlu = new Result(undefined);
+		const rFlu = new ResultElement();
 		rFlu.addExtraResult("flu", crbFlu);
 		res.addResult(rFlu);
 
-		const rTor = new Result(undefined);
+		const rTor = new ResultElement();
 		rTor.addExtraResult("tor", crbTor);
 		res.addResult(rTor);
 
-		const rX = new Result(undefined);
+		const rX = new ResultElement();
 		rX.addExtraResult("trX", trX);
 		res.addResult(rX);
 
-		const rVar = new Result(undefined);
+		const rVar = new ResultElement();
 		rVar.addExtraResult("tRes", tRes);
 		res.addResult(rVar);
 
diff --git a/src/section/newton.ts b/src/section/newton.ts
index 1751609c..78ddacb2 100644
--- a/src/section/newton.ts
+++ b/src/section/newton.ts
@@ -2,6 +2,7 @@ import { XOR, Debug } from "../base"
 import { cParamsCanal } from "./section_type"
 import { Result } from "../util/result";
 import { Message, MessageCode } from "../util/message";
+import { ResultElement } from "../util/resultelement";
 
 export abstract class acNewton extends Debug {
         protected rTol: number;
@@ -78,9 +79,9 @@ export abstract class acNewton extends Debug {
 
                 if (this.iCpt >= this.iCptMax) {  // non convergence
                         const m = new Message(MessageCode.ERROR_NEWTON_NON_CONVERGENCE);
-                        const res = new Result(m);
+                        const res = new ResultElement(m);
                         res.addExtraResult("res", rX);
-                        return res;
+                        return new Result(res);
                 }
 
                 const rDER = this.CalcDer(rX);
diff --git a/src/util/calcresult.ts b/src/util/calcresult.ts
deleted file mode 100644
index 0b5311fe..00000000
--- a/src/util/calcresult.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-import { cLog } from "./log";
-import { Result } from "./result";
-import { MessageSeverity, Message } from "./message";
-
-/**
- * Résultat global d'un calcul
- * Peut comporter un ou plusieurs Result.
- */
-// tslint:disable-next-line:max-classes-per-file
-export class CalcResult {
-    /**
-     * Messages (erreurs, infos, ...)
-     */
-    private _log: cLog;
-
-    private _results: Result[];
-
-    constructor() {
-        this._log = new cLog();
-        this._results = [];
-    }
-
-    public addResult(r: Result) {
-        this._results.push(r);
-    }
-
-    /**
-     * Insert result r at index i
-     * @param r Result to insert
-     * @param i Index position
-     */
-    public insertResult(r: Result, i: number) {
-        this._results.splice(i, 0, r);
-    }
-
-    /**
-     * @param name nom du résultat complémentaire
-     * @returns le nombre la taille d'un résultat complémentaire
-     */
-    public extraResultLength(name: string): number {
-        const r = this.getExtraResult(name);
-        if (r === undefined) {
-            return 0;
-        }
-        return Object.keys(r).length;
-    }
-
-    public getExtraResult(name: string): any {
-        const res = [];
-        for (const r of this._results) {
-            const er = r.getExtraResult(name);
-            if (er !== undefined) {
-                res.push(er);
-            }
-        }
-
-        switch (res.length) {
-            case 0:
-                return undefined;
-
-            case 1:
-                return res[0];
-
-            default:
-                throw new Error(
-                    "CalcResult.getExtraResult() : il existe plusieurs 'Result' avec le nom '" + name + "'",
-                );
-        }
-    }
-
-    public get log() {
-        return this._log;
-    }
-
-    protected get messageCount(): number {
-        return this._log.messages.length;
-    }
-
-    /**
-     * ajoute un message au journal
-     */
-    public addMessage(m: Message) {
-        this._log.add(m);
-    }
-
-    /**
-     * ajoute tous les messages d'un journal au journal
-     */
-    public addLog(l: cLog) {
-        this._log.addLog(l);
-    }
-
-    /**
-     * insert un message en début de liste
-     */
-    public insertMessage(m: Message) {
-        this._log.insert(m);
-    }
-
-    /**
-     * Teste si tous les résultats + complémentaires sont valides et journal sans erreur
-     * @returns true si le test est valide
-     */
-    public get ok(): boolean {
-        return this.resultsOk && !this.hasErrorMessages;
-    }
-
-    /**
-     * Teste si tous les résultats + complémentaires sont valides
-     * @returns true si le test est valide
-     */
-    public get resultsOk(): boolean {
-        if (this._results.length === 0 && this.log.messages.length === 0) {
-            return false;
-        }
-        for (const r of this._results) {
-            if (!r.resultsOk) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * @returns true si au moins un message de log comporte un code d'erreur
-     */
-    public get hasErrorMessages(): boolean {
-        for (const m of this.log.messages) {
-            if (m.getSeverity() === MessageSeverity.ERROR) {
-                return true;
-            }
-        }
-
-        for (const r of this._results) {
-            if (r.hasErrorMessages) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/src/util/result.ts b/src/util/result.ts
index 1c726fb1..2b64d20a 100644
--- a/src/util/result.ts
+++ b/src/util/result.ts
@@ -1,101 +1,199 @@
 import { cLog } from "./log";
-import { Message, MessageCode, MessageSeverity } from "./message";
-import { CalcResult } from "./calcresult";
+import { ResultElement } from "./resultelement";
+import { MessageSeverity, Message, MessageCode } from "./message";
 
 /**
- * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
- * Représente une valeur unique
+ * Résultat global d'un calcul
+ * Peut comporter un ou plusieurs Result.
  */
 // tslint:disable-next-line:max-classes-per-file
-export class Result extends CalcResult {
+export class Result {
     /**
-     * Valeur calculée
+     * Messages (erreurs, infos, ...)
      */
-    private _vCalc: number;
+    private _globalLog: cLog;
 
-    /**
-     * résultats complémentaires
-     */
-    private _extraResults: { [key: string]: any };
-
-    constructor(v: number | Message, d?: {}) {
-        super();
-        if (typeof v === "number") {
-            this._vCalc = v;
-            const m = new Message(MessageCode.ERROR_OK);
-            m.extraVar = d;
-            this.addMessage(m);
-        } else if (v instanceof Message) {
-            if (d !== undefined) {
-                throw new Error("appel à Result.constructor() invalide");
+    private _results: ResultElement[];
+
+    constructor(v?: number | Message | ResultElement, d?: any) {
+        this._globalLog = new cLog();
+        this._results = [];
+        if (typeof (v) === "number" || v instanceof Message)
+            this._results.push(new ResultElement(v));
+        else if (v instanceof ResultElement)
+            this._results.push(v);
+
+        if (d != undefined) {
+            for (const i in d) {
+                const re = new ResultElement();
+                re.addExtraResult(i, d[i]);
             }
-            this.addMessage(v);
         }
-        this._extraResults = {};
     }
 
-    get vCalc() { return this._vCalc; }
+    /**
+     * retourne le journal du 1er ResultElement
+     */
+    public get globalLog() {
+        return this._globalLog;
+    }
 
-    get code(): MessageCode {
-        if (this.messageCount !== 1) {
-            throw new Error("appel à Result.code invalide, il n'y pas exactement un message de log");
-        }
-        return this.log.messages[0].code;
+    private get result(): ResultElement {
+        if (this._results.length == 0)
+            throw new Error("appel à la méthode de Result.result() invalide, il n'y a pas au moins un 'ResultElement'");
+
+        return this._results[0];
     }
 
-    get extraVar() {
-        if (this.messageCount !== 1) {
-            throw new Error("appel à Result.extraVar invalide, il n'y pas exactement un message de log");
-        }
-        return this.log.messages[0].extraVar;
+    /**
+     * @return true si il existe au moins 1 ResultElement dans le tableau
+     */
+    get hasResults(): boolean {
+        return this._results.length > 0;
     }
 
-    private get hasExtraResults(): boolean {
-        return Object.keys(this._extraResults).length > 0;
+    /**
+     * @return le résultat de calcul du 1er ResultElement
+     */
+    get vCalc(): number {
+        return this.result.vCalc;
     }
 
-    public get resultsOk(): boolean {
-        return this._vCalc !== undefined || this.hasExtraResults;
+    /**
+     * retourne le journal du 1er ResultElement
+     */
+    public get log() {
+        // return this._globalLog;
+        return this.result.log;
     }
 
-    public get hasErrorMessages(): boolean {
-        for (const m of this.log.messages) {
-            if (m.code !== MessageCode.ERROR_OK && m.getSeverity() === MessageSeverity.ERROR) {
-                return true;
+    /**
+     * retourne le code du 1er ResultElement
+     */
+    public get code(): MessageCode {
+        return this.result.code;
+    }
+
+    /**
+      * retourne les résultats complémentaires du 1er ResultElement
+      */
+    get extraResults() {
+        return this.result.extraResults;
+    }
+
+    public addResult(r: ResultElement) {
+        this._results.push(r);
+    }
+
+    /**
+     * Insert result r at index i
+     * @param r Result to insert
+     * @param i Index position
+     */
+    public insertResult(r: ResultElement, i: number) {
+        this._results.splice(i, 0, r);
+    }
+
+    /**
+     * @param name nom du résultat complémentaire
+     * @returns le nombre la taille d'un résultat complémentaire
+     */
+    public extraResultLength(name: string): number {
+        const r = this.getExtraResult(name);
+        if (r === undefined) {
+            return 0;
+        }
+        return Object.keys(r).length;
+    }
+
+    public getExtraResult(name: string): any {
+        const res = [];
+        for (const r of this._results) {
+            const er = r.getExtraResult(name);
+            if (er !== undefined) {
+                res.push(er);
             }
         }
-        return false;
+
+        switch (res.length) {
+            case 0:
+                return undefined;
+
+            case 1:
+                return res[0];
+
+            default:
+                throw new Error(
+                    "Result.getExtraResult() : il existe plusieurs ResultElement avec un extratresult dont le nom est '" + name + "'",
+                );
+        }
     }
 
+    // protected get messageCount(): number {
+    //     return this._globalLog.messages.length;
+    // }
+
     /**
-     * résultats complémentaires
+     * ajoute un message au journal
      */
+    public addMessage(m: Message) {
+        this._globalLog.add(m);
+    }
 
-    public get extraResults() {
-        return this._extraResults;
+    /**
+     * ajoute tous les messages d'un journal au journal
+     */
+    public addLog(l: cLog) {
+        this._globalLog.addLog(l);
     }
 
-    public addExtraResult(name: string, value: any) {
-        this._extraResults[name] = value;
+    /**
+     * insert un message en début de liste
+     */
+    public insertMessage(m: Message) {
+        this._globalLog.insert(m);
     }
 
     /**
-     * @param name nom du résultat complémentaire à retourner
-     * @returns un résultat complémentaire par son nom
+     * Teste si tous les résultats + complémentaires sont valides et journal sans erreur
+     * @returns true si le test est valide
      */
-    public getExtraResult(name: string): any {
-        for (const n in this._extraResults) {
-            if (n === name) {
-                return this._extraResults[n];
+    public get ok(): boolean {
+        return this.resultsOk && !this.hasErrorMessages;
+    }
+
+    /**
+     * Teste si tous les résultats + complémentaires sont valides
+     * @returns true si le test est valide
+     */
+    public get resultsOk(): boolean {
+        if (this._results.length === 0 && this.log.messages.length === 0) {
+            return false;
+        }
+        for (const r of this._results) {
+            if (!r.resultsOk) {
+                return false;
             }
         }
-        return undefined;
+        return true;
     }
 
-    public toString(): string {
-        if (this._vCalc !== undefined) {
-            return String(this._vCalc);
+    /**
+     * @returns true si au moins un message de log comporte un code d'erreur
+     */
+    public get hasErrorMessages(): boolean {
+        for (const m of this.log.messages) {
+            if (m.getSeverity() === MessageSeverity.ERROR) {
+                return true;
+            }
+        }
+
+        for (const r of this._results) {
+            if (r.hasErrorMessages) {
+                return true;
+            }
         }
-        return JSON.stringify(this);
+
+        return false;
     }
 }
diff --git a/src/util/resultelement.ts b/src/util/resultelement.ts
new file mode 100644
index 00000000..8d58b6f4
--- /dev/null
+++ b/src/util/resultelement.ts
@@ -0,0 +1,125 @@
+import { cLog } from "./log";
+import { Message, MessageCode, MessageSeverity } from "./message";
+
+/**
+ * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
+ * Représente une valeur unique
+ */
+// tslint:disable-next-line:max-classes-per-file
+export class ResultElement {
+    /**
+     * Valeur calculée
+     */
+    private _vCalc: number;
+
+    /**
+     * Messages (erreurs, infos, ...)
+     */
+    private _log: cLog;
+
+    /**
+     * résultats complémentaires
+     */
+    private _extraResults: { [key: string]: any };
+
+    constructor(v?: number | Message) {
+        this._log = new cLog();
+        if (typeof v === "number") {
+            this._vCalc = v;
+        } else if (v instanceof Message) {
+            this.addMessage(v);
+        }
+        this._extraResults = {};
+    }
+
+    get vCalc() { return this._vCalc; }
+
+    public get log() {
+        return this._log;
+    }
+
+    get code(): MessageCode {
+        if (this.messageCount !== 1) {
+            throw new Error("appel à Result.code invalide, il n'y pas exactement un message de log");
+        }
+        return this._log.messages[0].code;
+    }
+
+    get extraVar() {
+        if (this.messageCount !== 1) {
+            throw new Error("appel à Result.extraVar invalide, il n'y pas exactement un message de log");
+        }
+        return this._log.messages[0].extraVar;
+    }
+
+    private get hasExtraResults(): boolean {
+        return Object.keys(this._extraResults).length > 0;
+    }
+
+    public get resultsOk(): boolean {
+        return this._vCalc !== undefined || this.hasExtraResults;
+    }
+
+    private get messageCount(): number {
+        return this._log.messages.length;
+    }
+
+    public get hasErrorMessages(): boolean {
+        for (const m of this._log.messages) {
+            if (m.code !== MessageCode.ERROR_OK && m.getSeverity() === MessageSeverity.ERROR) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public get ok(): boolean {
+        return this.resultsOk && !this.hasErrorMessages;
+    }
+
+    /**
+     * ajoute un message au journal
+     */
+    public addMessage(m: Message) {
+        this._log.add(m);
+    }
+
+    /**
+     * insert un message en début de liste
+     */
+    public insertMessage(m: Message) {
+        this._log.insert(m);
+    }
+
+    /**
+     * résultats complémentaires
+     */
+
+    public get extraResults() {
+        return this._extraResults;
+    }
+
+    public addExtraResult(name: string, value: any) {
+        this._extraResults[name] = value;
+    }
+
+    /**
+     * @param name nom du résultat complémentaire à retourner
+     * @returns un résultat complémentaire par son nom
+     */
+    public getExtraResult(name: string): any {
+        for (const n in this._extraResults) {
+            if (n === name) {
+                return this._extraResults[n];
+            }
+        }
+        return undefined;
+    }
+
+    public toString(): string {
+        if (this._vCalc !== undefined) {
+            return String(this._vCalc);
+        }
+        return JSON.stringify(this);
+    }
+}
-- 
GitLab