diff --git a/package.json b/package.json
index 971bacb9a1a9f4fde888e6e7302fc8ba98fd46d8..9229f68da75cd18d2c752b5ca0a40b0cd64c6032 100644
--- a/package.json
+++ b/package.json
@@ -27,6 +27,7 @@
   "scripts": {
     "build": "./node_modules/typescript/bin/tsc --p src/tsconfig.app.json",
     "buildspec": "./node_modules/typescript/bin/tsc --p spec/tsconfig.spec.json",
+    "runtestremous": "./node_modules/typescript/bin/tsc --p spec/tsconfig-remous-fenetre.spec.json && node ./build/spec/test-remous-fenetre.js",
     "jasmine": "npm run buildspec && ./node_modules/.bin/jasmine",
     "karma": "./node_modules/typescript/bin/tsc --p spec/tsconfig.spec.json && ./node_modules/karma/bin/karma start",
     "lint": "./node_modules/tslint/bin/tslint",
diff --git a/spec/base.spec.ts b/spec/base.spec.ts
index e06d92379a8bc8815805aaf6cf408089cc64fd4b..17f37c3f7852080e6a30b7de0ca487dd5792a37b 100644
--- a/spec/base.spec.ts
+++ b/spec/base.spec.ts
@@ -2,6 +2,7 @@
 
 import { Result } from "../src/base";
 import { nub, precDigits } from "./nubtest";
+import { Message, MessageCode, MessageSeverity } from "../src/util/message";
 
 
 describe('Class Nub: ', () => {
@@ -17,3 +18,12 @@ describe('Class Nub: ', () => {
         });
     });
 });
+
+describe('classe Message: ', () => {
+    describe('getSeverity(): ', () => {
+        it('criticité MessageCode.ERROR_DICHO_CONVERGE == MessageSeverity.ERROR', () => {
+            let m: Message = new Message(MessageCode.ERROR_DICHO_CONVERGE);
+            expect(m.getSeverity()).toEqual(MessageSeverity.ERROR);
+        });
+    });
+});
diff --git a/spec/nubtest.ts b/spec/nubtest.ts
index dc29daae30a78beae01673fab23025030bc2ce2e..f52ff13b99714ece1830698b17dbcbffc2c9273f 100644
--- a/spec/nubtest.ts
+++ b/spec/nubtest.ts
@@ -2,7 +2,7 @@ import { Result } from "../src/base";
 import { Nub } from "../src/nub";
 import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability, ParamsEquation } from "../src/param";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
 
 class NubTestParams extends ParamsEquation {
     private _A: ParamDefinition;
@@ -137,19 +137,19 @@ export function compareLog(logTest: cLog, logValid: cLog) {
     // codes
 
     for (let i = 0; i < n1; i++) {
-        let m1: ErrorMessage = logTest.messages[i];
-        let m2: ErrorMessage = logValid.messages[i];
+        let m1: Message = logTest.messages[i];
+        let m2: Message = logValid.messages[i];
         b = m1.code == m2.code;
-        expect(b).toBeTruthy("journal : message n°" + i + ", code " + ErrorCode[m1.code] + " incorrect, devrait être " + ErrorCode[m2.code]);
+        expect(b).toBeTruthy("journal : message n°" + i + ", code " + MessageCode[m1.code] + " incorrect, devrait être " + MessageCode[m2.code]);
         if (!b) return;
     }
 
     // données
 
     for (let i = 0; i < n1; i++) {
-        let m1: ErrorMessage = logTest.messages[i];
-        let m2: ErrorMessage = logValid.messages[i];
-        let code1 = ErrorCode[m1.code];
+        let m1: Message = logTest.messages[i];
+        let m2: Message = logValid.messages[i];
+        let code1 = MessageCode[m1.code];
 
         // taille des données
 
diff --git a/spec/regime_uniforme_circ.spec.ts b/spec/regime_uniforme_circ.spec.ts
index 93a964725b83cc68aed88e308b4c37b297cda8a3..0136d78bd1d23f17b30d3689c714821656752242 100644
--- a/spec/regime_uniforme_circ.spec.ts
+++ b/spec/regime_uniforme_circ.spec.ts
@@ -21,7 +21,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSect);
+            let sect = new cSnCirc(paramSect);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("D", 1e-8), 6.001);
@@ -37,7 +37,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Ks", 1e-8), 40.003);
@@ -53,7 +53,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("If"), 0.001);
@@ -68,7 +68,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 1.2);
@@ -83,7 +83,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Y"), 0.6613);
@@ -100,7 +100,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSect);
+            let sect = new cSnCirc(paramSect);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("D", 1e-8), 2);
@@ -116,7 +116,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Ks", 1e-8), 13.551);
@@ -132,7 +132,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("If"), 0.001);
@@ -147,7 +147,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 1.2);
@@ -162,7 +162,7 @@ describe('Class RegimeUniforme / section circulaire :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnCirc(undefined, paramSection);
+            let sect = new cSnCirc(paramSection);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Y"), 2);
diff --git a/spec/regime_uniforme_puissance.spec.ts b/spec/regime_uniforme_puissance.spec.ts
index cf13a8baa5ab1ccf95ba3b935efec40214806c2d..4f770d59cc1b7719bd66ad562c854ced6047a402 100644
--- a/spec/regime_uniforme_puissance.spec.ts
+++ b/spec/regime_uniforme_puissance.spec.ts
@@ -1,7 +1,7 @@
 /// <reference path="../node_modules/@types/jasmine/index.d.ts" />
 
 import { Result } from "../src/base";
-import { ErrorCode } from "../src/util/error";
+import { MessageCode } from "../src/util/message";
 import { RegimeUniforme } from "../src/regime_uniforme";
 import { ParamsSectionPuiss, cSnPuiss } from "../src/section/section_puissance";
 import { precDist, equalEpsilon } from "./nubtest";
@@ -22,7 +22,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("k"), 0.635);
@@ -38,7 +38,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("LargeurBerge"), 3.473);
@@ -54,7 +54,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("Ks", 1e-8), 33.774);
@@ -70,7 +70,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("If", 0, 0.00001), 0.00071, 0.00001);
@@ -86,7 +86,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("Q"), 1.421);
@@ -102,7 +102,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, paramCnl);
+            let sect = new cSnPuiss(paramCnl);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("Y"), 0.742);
@@ -120,12 +120,12 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             let res: Result = ru.Calc("k");
             expect(res.vCalc).toBeUndefined();
-            expect(res.code).toBe(ErrorCode.ERROR_DICHO_INIT_DOMAIN);
+            expect(res.code).toBe(MessageCode.ERROR_DICHO_INIT_DOMAIN);
         });
 
         it('k should be 0.635', () => {
@@ -138,7 +138,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("k"), 0.933);
@@ -154,7 +154,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("LargeurBerge"), 0.721);
@@ -170,7 +170,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("Ks", 1e-8), 4.367);
@@ -186,13 +186,13 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect);
             ru.dichoStartIntervalMaxSteps = 3;
 
             let res: Result = ru.Calc("Ks", 5000000);
             expect(res.vCalc).toBeUndefined();
-            expect(res.code).toBe(ErrorCode.ERROR_DICHO_INITVALUE_HIGH);
+            expect(res.code).toBe(MessageCode.ERROR_DICHO_INITVALUE_HIGH);
         });
 
         it('Ks should be undefined', () => {
@@ -205,13 +205,13 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect);
             ru.dichoStartIntervalMaxSteps = 1;
 
             let res: Result = ru.Calc("Ks", 1e-8);
             expect(res.vCalc).toBeUndefined();
-            expect(res.code).toBe(ErrorCode.ERROR_DICHO_INITVALUE_LOW);
+            expect(res.code).toBe(MessageCode.ERROR_DICHO_INITVALUE_LOW);
         });
 
         it('If should be 0.001', () => {
@@ -224,7 +224,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("If"), 0.001);
@@ -240,7 +240,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, prms);
+            let sect = new cSnPuiss(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("Q"), 10.993);
@@ -256,7 +256,7 @@ describe('Class RegimeUniforme / section puissance :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnPuiss(undefined, paramCnl);
+            let sect = new cSnPuiss(paramCnl);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("Y"), 0.742);
diff --git a/spec/regime_uniforme_rect.spec.ts b/spec/regime_uniforme_rect.spec.ts
index 3dd28219ec4234f1435f86ce213ef33575348042..1c7d9aad1b4808fd7078fd0f75fbd94909b82dc3 100644
--- a/spec/regime_uniforme_rect.spec.ts
+++ b/spec/regime_uniforme_rect.spec.ts
@@ -23,7 +23,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 precDist, // précision
                 1 // YB=hauteur de berge
             );
-            let sect = new cSnRectang(undefined, prms, false);
+            let sect = new cSnRectang(prms, false);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("LargeurBerge"), 2.5);
@@ -39,7 +39,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Ks", 1e-8), 30.619);
@@ -55,7 +55,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect, false);
 
             // nom variable à calculer, valeur de Ks
@@ -72,7 +72,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 1.568);
@@ -88,7 +88,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1.2 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 0.731);
@@ -104,7 +104,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             // nom variable à calculer, valeur de Ks
@@ -126,7 +126,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms, false);
+            let sect = new cSnRectang(prms, false);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("LargeurBerge"), 2.5);
@@ -142,7 +142,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Ks", 1e-8), 9.041);
@@ -158,7 +158,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect, false);
 
             // nom variable à calculer, valeur de Ks
@@ -175,7 +175,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 5.31);
@@ -191,7 +191,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 1.2 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 1.624);
@@ -207,7 +207,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => {
                 0.1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
             let ru = new RegimeUniforme(sect);
 
             // nom variable à calculer, valeur de Ks
diff --git a/spec/regime_uniforme_trapeze.spec.ts b/spec/regime_uniforme_trapeze.spec.ts
index 9639e8ad7697eb6ad0847afac8b0805bf485a818..4a08d1de55b31a214de8113e8b1efb0e90df9575 100644
--- a/spec/regime_uniforme_trapeze.spec.ts
+++ b/spec/regime_uniforme_trapeze.spec.ts
@@ -23,7 +23,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
 
             let ru = new RegimeUniforme(sect, false);
 
@@ -41,7 +41,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Fruit"), 0.56);
@@ -58,7 +58,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Ks", 1e-8), 24.14);
@@ -75,7 +75,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("If"), 0.001);
@@ -92,7 +92,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 1.2);
@@ -109,7 +109,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Y"), 0.587);
@@ -127,7 +127,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect, false);
 
             check(ru.Calc("LargeurFond", 0, precDist), 0.03);
@@ -144,7 +144,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Fruit"), 0.56);
@@ -160,7 +160,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Ks", 1e-8), 5.744);
@@ -176,7 +176,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 precDist, // précision
                 1 // YB= hauteur de berge
             );
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("If"), 0.001);
@@ -193,7 +193,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Q"), 8.356);
@@ -210,7 +210,7 @@ describe('Class RegimeUniforme / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
             let ru = new RegimeUniforme(sect);
 
             check(ru.Calc("Y"), 0.587);
diff --git a/spec/remous_rect_euler_pentefaible.spec.ts b/spec/remous_rect_euler_pentefaible.spec.ts
index cb6b713caecd142b673601814f5cd00ca8e559c1..0a0446abd56e211da570a16c6520533699cf82d4 100644
--- a/spec/remous_rect_euler_pentefaible.spec.ts
+++ b/spec/remous_rect_euler_pentefaible.spec.ts
@@ -3,7 +3,7 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
 
 describe('Class Remous / section rectangulaire :', () => {
     describe('méthode Euler explicite :', () => {
@@ -218,7 +218,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -227,8 +227,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -237,29 +236,29 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = { "0": 0.9872500000000014, "5": 0.9872500000000014, "10": 0.9872500000000014, "15": 0.9872500000000014, "20": 0.9880000000000013, "25": 0.9887500000000012, "30": 0.9895000000000012, "35": 0.9902500000000011, "40": 0.991000000000001, "45": 0.9917500000000009, "50": 0.9925000000000008, "55": 0.9932500000000007, "60": 0.9940000000000007, "65": 0.9947500000000006, "70": 0.9955000000000005, "75": 0.9962500000000004, "80": 0.9970000000000003, "85": 0.9977500000000002, "90": 0.9985000000000002, "95": 0.9992500000000001, "100": 1 };
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
+            expect(Object.keys(res["tor"]).length == 0).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
 
             let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
@@ -272,7 +271,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont
                 0.7, // Yaval = tirant aval
@@ -281,8 +280,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -291,29 +289,29 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = { "0": 0.805499999999999, "5": 0.802249999999999, "10": 0.7984999999999991, "15": 0.7947499999999992, "20": 0.7909999999999993, "25": 0.7867499999999993, "30": 0.7824999999999993, "35": 0.7782499999999993, "40": 0.7739999999999994, "45": 0.7692499999999994, "50": 0.7644999999999995, "55": 0.7592499999999995, "60": 0.7539999999999996, "65": 0.7482499999999996, "70": 0.7424999999999997, "75": 0.7362499999999997, "80": 0.7299999999999998, "85": 0.7232499999999998, "90": 0.7159999999999999, "95": 0.7082499999999999, "100": 0.7 };
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
+            expect(Object.keys(res["tor"]).length == 0).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
 
             let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
     });
 });
diff --git a/spec/remous_rect_euler_penteforte.spec.ts b/spec/remous_rect_euler_penteforte.spec.ts
index 3ddc543a54a06935af934d5352b9afc3603f8b98..9c518f6411c15387b6e07254647d0a05e9d54bbd 100644
--- a/spec/remous_rect_euler_penteforte.spec.ts
+++ b/spec/remous_rect_euler_penteforte.spec.ts
@@ -3,7 +3,14 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
+
+/*
+   Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale
+   pour la représentation graphique du ressaut (mais fausse car torrentielle).
+   Idem pour la réciproque fluvial/torrentiel.
+   Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes.
+ */
 
 describe('Class Remous / section rectangulaire :', () => {
     describe('méthode Euler explicite :', () => {
@@ -17,7 +24,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 6, // Yaval = tirant aval
@@ -26,8 +33,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -43,27 +49,27 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "amont";
             m.extraVar["x"] = 0;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut après l'aval", () => {
@@ -77,7 +83,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 0.45, // Yaval = tirant aval
@@ -86,8 +92,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -96,40 +101,40 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = {};
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.241, 15.000: 0.252, 20.000: 0.253, 25.000: 0.253, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 };
-            let t = { "0": 0.15, "5": 0.20725000000000002, "10": 0.23500000000000001, "15": 0.24675000000000002, "20": 0.251, "25": 0.25225, "30": 0.25249999999999995, "35": 0.2527499999999999, "40": 0.2529999999999999, "45": 0.2527499999999999, "50": 0.2529999999999999, "55": 0.2527499999999999, "60": 0.2529999999999999, "65": 0.2527499999999999, "70": 0.2529999999999999, "75": 0.2527499999999999, "80": 0.2529999999999999, "85": 0.2527499999999999, "90": 0.2529999999999999, "95": 0.2527499999999999, "100": 0.45 };
+            // let t = { "0": 0.15, "5": 0.20725000000000002, "10": 0.23500000000000001, "15": 0.24675000000000002, "20": 0.251, "25": 0.25225, "30": 0.25249999999999995, "35": 0.2527499999999999, "40": 0.2529999999999999, "45": 0.2527499999999999, "50": 0.2529999999999999, "55": 0.2527499999999999, "60": 0.2529999999999999, "65": 0.2527499999999999, "70": 0.2529999999999999, "75": 0.2527499999999999, "80": 0.2529999999999999, "85": 0.2527499999999999, "90": 0.2529999999999999, "95": 0.2527499999999999, "100": 0.45 };
+            let t = { "0": 0.15, "5": 0.20725000000000002, "10": 0.23500000000000001, "15": 0.24675000000000002, "20": 0.251, "25": 0.25225, "30": 0.25249999999999995, "35": 0.2527499999999999, "40": 0.2529999999999999, "45": 0.2527499999999999, "50": 0.2529999999999999, "55": 0.2527499999999999, "60": 0.2529999999999999, "65": 0.2527499999999999, "70": 0.2529999999999999, "75": 0.2527499999999999, "80": 0.2529999999999999, "85": 0.2527499999999999, "90": 0.2529999999999999, "95": 0.2527499999999999, "100": 0.253 }; // dernière valeur modifiée pour la raison en tête de fichier
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 95;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "aval";
             m.extraVar["x"] = 100;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         // it("forte pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -171,27 +176,27 @@ describe('Class Remous / section rectangulaire :', () => {
         //     compareArray("abscisses", res["trX"], x);
 
         //     let expLog = new cLog();
-        //     let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+        //     let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
         //     m.extraVar["B"] = 2.5;
         //     expLog.add(m);
 
-        //     m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+        //     m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
         //     m.extraVar["Yc"] = 0.403;
         //     expLog.add(m);
 
-        //     m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+        //     m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
         //     m.extraVar["Yn"] = 0.253;
         //     expLog.add(m);
 
-        //     expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+        //     expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-        //     m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+        //     m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
         //     m.extraVar["x"] = 85;
         //     expLog.add(m);
 
-        //     expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+        //     expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-        //     m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+        //     m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
         //     m.extraVar["xmin"] = 90;
         //     m.extraVar["xmax"] = 90;
         //     expLog.add(m);
@@ -209,7 +214,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -218,14 +223,14 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version Typescript (Oct 2017) méthode des trapèzes
 
-            let f = { "0": 0.15, "1": 0.7560000000000007, "2": 0.8120000000000005, "3": 0.8670000000000002, "4": 0.9205000000000001, "5": 0.9735, "5.5": 1, "5.25": 0.98675, "4.75": 0.96025, "4.5": 0.9470000000000001, "4.25": 0.9337500000000001, "3.75": 0.9072500000000001, "3.5": 0.8940000000000001, "3.25": 0.8807500000000001, "2.75": 0.8532500000000003, "2.5": 0.8395000000000004, "2.25": 0.8257500000000004, "1.75": 0.7982500000000006, "1.5": 0.7845000000000006, "1.25": 0.7702500000000007, "0.75": 0.7417500000000007, "0.5": 0.7275000000000007, "0.25": 0.7132500000000007 };
+            // let f = { "0": 0.15, "1": 0.7560000000000007, "2": 0.8120000000000005, "3": 0.8670000000000002, "4": 0.9205000000000001, "5": 0.9735, "5.5": 1, "5.25": 0.98675, "4.75": 0.96025, "4.5": 0.9470000000000001, "4.25": 0.9337500000000001, "3.75": 0.9072500000000001, "3.5": 0.8940000000000001, "3.25": 0.8807500000000001, "2.75": 0.8532500000000003, "2.5": 0.8395000000000004, "2.25": 0.8257500000000004, "1.75": 0.7982500000000006, "1.5": 0.7845000000000006, "1.25": 0.7702500000000007, "0.75": 0.7417500000000007, "0.5": 0.7275000000000007, "0.25": 0.7132500000000007 };
+            let f = { "0": 0.698, "1": 0.7560000000000007, "2": 0.8120000000000005, "3": 0.8670000000000002, "4": 0.9205000000000001, "5": 0.9735, "5.5": 1, "5.25": 0.98675, "4.75": 0.96025, "4.5": 0.9470000000000001, "4.25": 0.9337500000000001, "3.75": 0.9072500000000001, "3.5": 0.8940000000000001, "3.25": 0.8807500000000001, "2.75": 0.8532500000000003, "2.5": 0.8395000000000004, "2.25": 0.8257500000000004, "1.75": 0.7982500000000006, "1.5": 0.7845000000000006, "1.25": 0.7702500000000007, "0.75": 0.7417500000000007, "0.5": 0.7275000000000007, "0.25": 0.7132500000000007 }; // première valeur modifiée pour la raison en tête de fichier
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
             let t = { "0": 0.15, "1": 0.161, "2": 0.17200000000000001, "3": 0.18100000000000002, "0.25": 0.15275, "0.5": 0.1555, "0.75": 0.15825, "1.25": 0.16375, "1.5": 0.1665, "1.75": 0.16925, "2.25": 0.17425000000000002, "2.5": 0.17650000000000002, "2.75": 0.17875000000000002, "3.25": 0.18325000000000002, "3.5": 0.18550000000000003, "3.75": 0.9072500000000001 };
@@ -235,28 +240,28 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 3.75;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
@@ -269,7 +274,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.1, // Yamont = tirant amont
                 0.3, // Yaval = tirant aval
@@ -278,14 +283,13 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version Typescript (Oct 2017) méthode trapèzes
 
-            expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
+            expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
 
             let t = { "0": 0.1, "1": 0.11425000000000002, "2": 0.12750000000000003, "3": 0.14025000000000004, "4": 0.15200000000000005, "5": 0.16325000000000006, "6": 0.17350000000000007, "7": 0.18325000000000008, "8": 0.1920000000000001, "9": 0.1997500000000001, "10": 0.2070000000000001, "11": 0.2137500000000001, "12": 0.2195000000000001, "13": 0.22475000000000012, "14": 0.22900000000000012, "15": 0.23275000000000012, "16": 0.23600000000000013, "17": 0.23875000000000013, "18": 0.24100000000000013, "19": 0.24325000000000013, "20": 0.24500000000000013, "21": 0.24625000000000014, "22": 0.24750000000000014, "23": 0.2485000000000001, "24": 0.2492500000000001, "25": 0.2502500000000001, "26": 0.25050000000000006, "27": 0.25075000000000003, "28": 0.251, "29": 0.25125, "30": 0.25149999999999995 };
             compareObject("Ytorrentiel", res["tor"], t, 0.01);
@@ -294,23 +298,23 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
@@ -323,7 +327,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.35, // Yamont = tirant amont
                 0.3, // Yaval = tirant aval
@@ -332,14 +336,13 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.EulerExplicite
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode trapèzes
 
-            expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
+            expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
 
             let t = { 0.000: 0.35, 0.100: 0.345, 0.200: 0.34, 0.300: 0.336, 0.400: 0.332, 0.500: 0.329, 0.600: 0.326, 0.700: 0.323, 0.800: 0.32, 0.900: 0.318, 1.000: 0.316, 1.100: 0.313, 1.200: 0.311, 1.300: 0.309, 1.400: 0.308, 1.500: 0.306, 1.600: 0.305, 1.700: 0.303, 1.800: 0.302, 1.900: 0.3, 2.000: 0.298, 2.100: 0.297, 2.200: 0.295, 2.300: 0.294, 2.400: 0.293, 2.500: 0.292, 2.600: 0.291, 2.700: 0.291, 2.800: 0.29, 2.900: 0.289, 3.000: 0.288, 3.100: 0.287, 3.200: 0.287, 3.300: 0.286, 3.400: 0.285, 3.500: 0.284, 3.600: 0.283, 3.700: 0.283, 3.800: 0.282, 3.900: 0.281, 4.000: 0.28, 4.100: 0.28, 4.200: 0.279, 4.300: 0.278, 4.400: 0.277, 4.500: 0.276, 4.600: 0.276, 4.700: 0.275, 4.800: 0.274, 4.900: 0.273, 5.000: 0.272, 5.100: 0.272, 5.200: 0.271, 5.300: 0.27, 5.400: 0.269, 5.500: 0.269, 5.600: 0.269, 5.700: 0.269, 5.800: 0.269, 5.900: 0.269, 6.000: 0.269, 6.100: 0.269, 6.200: 0.269, 6.300: 0.269, 6.400: 0.269, 6.500: 0.269, 6.600: 0.269, 6.700: 0.269, 6.800: 0.269, 6.900: 0.269, 7.000: 0.269, 7.100: 0.269, 7.200: 0.269, 7.300: 0.269, 7.400: 0.269, 7.500: 0.269, 7.600: 0.269, 7.700: 0.269, 7.800: 0.269, 7.900: 0.269, 8.000: 0.269, 8.100: 0.269, 8.200: 0.269, 8.300: 0.269, 8.400: 0.269, 8.500: 0.269, 8.600: 0.269, 8.700: 0.269, 8.800: 0.269, 8.900: 0.269, 9.000: 0.269, 9.100: 0.269, 9.200: 0.269, 9.300: 0.269, 9.400: 0.269, 9.500: 0.269, 9.600: 0.269, 9.700: 0.269, 9.800: 0.269, 9.900: 0.269, 10.000: 0.269 };
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
@@ -348,23 +351,23 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
     });
 });
diff --git a/spec/remous_rect_rk4_pentefaible.spec.ts b/spec/remous_rect_rk4_pentefaible.spec.ts
index 38b260156046b1cff9719eaa2acc0472fda402ec..58828299a11da8b6a5b84d478175ee4c4e50e076 100644
--- a/spec/remous_rect_rk4_pentefaible.spec.ts
+++ b/spec/remous_rect_rk4_pentefaible.spec.ts
@@ -3,8 +3,14 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
 
+/*
+  Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus
+  ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0)
+  lign d'eau partielle : if (iSens * (rXCN - xRst) > 0)  remplacé par if (iSens * (rXCN - xRst) >= 0)
+  Les données de validation ont été modifiées en conséquence
+*/
 
 describe('Class Remous / section rectangulaire :', () => {
     describe('méthode Runge-Kutta ordre 4 :', () => {
@@ -18,7 +24,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.3, // Yamont = tirant amont
                 0.41, // Yaval = tirant aval
@@ -27,8 +33,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -44,32 +49,32 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "amont";
             m.extraVar["x"] = 0;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -82,7 +87,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 0.42, // Yaval = tirant aval
@@ -91,49 +96,50 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode RungeKutta4
 
-            let f = { 100.000: 0.42, 95.000: 0.583, 90.000: 0.604, 85.000: 0.621, 80.000: 0.636, 75.000: 0.65, 70.000: 0.662, 65.000: 0.673, 60.000: 0.683, 55.000: 0.692, 50.000: 0.701, 45.000: 0.709, 40.000: 0.717, 35.000: 0.724, 30.000: 0.731, 25.000: 0.737, 20.000: 0.743, 15.000: 0.749, 10.000: 0.755, 5.000: 0.76, 0.000: 0.15 };
+            // let f = { 100.000: 0.42, 95.000: 0.583, 90.000: 0.604, 85.000: 0.621, 80.000: 0.636, 75.000: 0.65, 70.000: 0.662, 65.000: 0.673, 60.000: 0.683, 55.000: 0.692, 50.000: 0.701, 45.000: 0.709, 40.000: 0.717, 35.000: 0.724, 30.000: 0.731, 25.000: 0.737, 20.000: 0.743, 15.000: 0.749, 10.000: 0.755, 5.000: 0.76, 0.000: 0.15 };
+            let f = { 100.000: 0.42, 95.000: 0.583, 90.000: 0.604, 85.000: 0.621, 80.000: 0.636, 75.000: 0.65, 70.000: 0.662, 65.000: 0.673, 60.000: 0.683, 55.000: 0.692, 50.000: 0.701, 45.000: 0.709, 40.000: 0.717, 35.000: 0.724, 30.000: 0.731, 25.000: 0.737, 20.000: 0.743, 15.000: 0.749, 10.000: 0.755, 5.000: 0.76 }; // dernière valeur supprimée pour la raison en tête de fichier
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            let t = { 0.000: 0.15, 5.000: 0.76 };
+            // let t = { 0.000: 0.15, 5.000: 0.76 };
+            let t = { 0.000: 0.15 }; // dernière valeur supprimée pour la raison en tête de fichier
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 15;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 5;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, ressaut (plusieurs points) à l'intérieur du bief", () => {
@@ -146,7 +152,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.01, // Yamont = tirant amont
                 0.42, // Yaval = tirant aval
@@ -155,8 +161,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -172,28 +177,28 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 1;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, pas de ressaut, Yamont > Yc, Yaval > Yn", () => {
@@ -206,7 +211,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -215,8 +220,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -225,29 +229,29 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = { 100.000: 1, 95.000: 0.999, 90.000: 0.999, 85.000: 0.998, 80.000: 0.997, 75.000: 0.997, 70.000: 0.996, 65.000: 0.996, 60.000: 0.995, 55.000: 0.994, 50.000: 0.994, 45.000: 0.993, 40.000: 0.993, 35.000: 0.992, 30.000: 0.991, 25.000: 0.991, 20.000: 0.99, 15.000: 0.99, 10.000: 0.989, 5.000: 0.989, 0.000: 0.988 };
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
+            expect(Object.keys(res["tor"]).length == 0).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
@@ -260,7 +264,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont
                 0.7, // Yaval = tirant aval
@@ -269,8 +273,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -279,29 +282,29 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = { 100.000: 0.7, 95.000: 0.708, 90.000: 0.716, 85.000: 0.723, 80.000: 0.73, 75.000: 0.737, 70.000: 0.743, 65.000: 0.749, 60.000: 0.754, 55.000: 0.759, 50.000: 0.764, 45.000: 0.769, 40.000: 0.774, 35.000: 0.779, 30.000: 0.783, 25.000: 0.787, 20.000: 0.791, 15.000: 0.795, 10.000: 0.799, 5.000: 0.802, 0.000: 0.806 };
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
+            expect(Object.keys(res["tor"]).length == 0).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
     });
 });
diff --git a/spec/remous_rect_rk4_penteforte.spec.ts b/spec/remous_rect_rk4_penteforte.spec.ts
index fc91619a88ba6165877508c0f37504837d602f8e..d816edb15947d1a0b8d0c4d0289f60393ec5eef9 100644
--- a/spec/remous_rect_rk4_penteforte.spec.ts
+++ b/spec/remous_rect_rk4_penteforte.spec.ts
@@ -3,7 +3,23 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
+
+/*
+   cas 1 :
+   Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale
+   pour la représentation graphique du ressaut (mais fausse car torrentielle).
+   Idem pour la réciproque fluvial/torrentiel.
+   Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes.
+ */
+
+/*
+  cas 2 :
+  Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus
+  ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0)
+  lign d'eau partielle : if (iSens * (rXCN - xRst) > 0)  remplacé par if (iSens * (rXCN - xRst) >= 0)
+  Les données de validation ont été modifiées en conséquence
+*/
 
 describe('Class Remous / section rectangulaire :', () => {
     describe('méthode Runge-Kutta ordre 4 :', () => {
@@ -17,7 +33,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 6, // Yaval = tirant aval
@@ -26,8 +42,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -43,27 +58,27 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "amont";
             m.extraVar["x"] = 0;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut après l'aval", () => {
@@ -77,7 +92,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 0.45, // Yaval = tirant aval
@@ -86,8 +101,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -96,39 +110,40 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = {};
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 };
+            // let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 };
+            let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 }; // dernière valeur remplacée pour la raison 1 en tête de fichier
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 95;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "aval";
             m.extraVar["x"] = 100;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -141,7 +156,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -150,49 +165,50 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode RungeKutta4
 
-            let f = { 100.000: 1, 95.000: 0.728, 90.000: 0.521 };
+            // let f = { 100.000: 1, 95.000: 0.728, 90.000: 0.521 };
+            let f = { 100.000: 1, 95.000: 0.728 }; // dernière valeur supprimée pour la raison 2 en tête de fichier
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.521 };
+            // let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.521 };
+            let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253 }; // dernière valeur remplacée pour la raison 1 en tête de fichier
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 85;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 90;
             m.extraVar["xmax"] = 90;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => {
@@ -205,7 +221,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -214,14 +230,14 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode RungeKutta4
 
-            let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.934, 4.000: 0.921, 3.750: 0.907, 3.500: 0.894, 3.250: 0.88, 3.000: 0.867, 2.750: 0.853, 2.500: 0.84, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.785, 1.250: 0.771, 1.000: 0.756, 0.750: 0.742, 0.500: 0.728, 0.250: 0.713, 0.000: 0.15 };
+            // let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.934, 4.000: 0.921, 3.750: 0.907, 3.500: 0.894, 3.250: 0.88, 3.000: 0.867, 2.750: 0.853, 2.500: 0.84, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.785, 1.250: 0.771, 1.000: 0.756, 0.750: 0.742, 0.500: 0.728, 0.250: 0.713, 0.000: 0.15 };
+            let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.934, 4.000: 0.921, 3.750: 0.907, 3.500: 0.894, 3.250: 0.88, 3.000: 0.867, 2.750: 0.853, 2.500: 0.84, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.785, 1.250: 0.771, 1.000: 0.756, 0.750: 0.742, 0.500: 0.728, 0.250: 0.713, 0.000: 0.699 }; // dernière valeur remplacée pour la raison 1 en tête de fichier
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
             let t = { 0.000: 0.15, 0.250: 0.153, 0.500: 0.156, 0.750: 0.158, 1.000: 0.161, 1.250: 0.164, 1.500: 0.166, 1.750: 0.169, 2.000: 0.171, 2.250: 0.174, 2.500: 0.176, 2.750: 0.179, 3.000: 0.181, 3.250: 0.183, 3.500: 0.186, 3.750: 0.907 };
@@ -231,28 +247,28 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 3.75;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
@@ -265,7 +281,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.1, // Yamont = tirant amont
                 0.3, // Yaval = tirant aval
@@ -274,14 +290,13 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode RungeKutta4
 
-            expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
+            expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
 
             let t = { 0.000: 0.1, 5.000: 0.162, 10.000: 0.206, 15.000: 0.232, 20.000: 0.244, 25.000: 0.25, 30.000: 0.252, 35.000: 0.252, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 };
             compareObject("Ytorrentiel", res["tor"], t, 0.01);
@@ -290,23 +305,23 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
@@ -319,7 +334,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.35, // Yamont = tirant amont
                 0.3, // Yaval = tirant aval
@@ -328,14 +343,13 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.RungeKutta4
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode RungeKutta4
 
-            expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
+            expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
 
             let t = { 0.000: 0.35, 0.100: 0.344, 0.200: 0.34, 0.300: 0.335, 0.400: 0.332, 0.500: 0.328, 0.600: 0.325, 0.700: 0.322, 0.800: 0.32, 0.900: 0.317, 1.000: 0.315, 1.100: 0.313, 1.200: 0.31, 1.300: 0.309, 1.400: 0.307, 1.500: 0.305, 1.600: 0.303, 1.700: 0.302, 1.800: 0.3, 1.900: 0.299, 2.000: 0.297, 2.100: 0.296, 2.200: 0.295, 2.300: 0.294, 2.400: 0.293, 2.500: 0.291, 2.600: 0.29, 2.700: 0.289, 2.800: 0.288, 2.900: 0.287, 3.000: 0.287, 3.100: 0.286, 3.200: 0.285, 3.300: 0.284, 3.400: 0.283, 3.500: 0.282, 3.600: 0.282, 3.700: 0.281, 3.800: 0.28, 3.900: 0.279, 4.000: 0.279, 4.100: 0.278, 4.200: 0.278, 4.300: 0.277, 4.400: 0.276, 4.500: 0.276, 4.600: 0.275, 4.700: 0.275, 4.800: 0.274, 4.900: 0.274, 5.000: 0.273, 5.100: 0.273, 5.200: 0.272, 5.300: 0.272, 5.400: 0.271, 5.500: 0.271, 5.600: 0.271, 5.700: 0.27, 5.800: 0.27, 5.900: 0.269, 6.000: 0.269, 6.100: 0.269, 6.200: 0.268, 6.300: 0.268, 6.400: 0.268, 6.500: 0.267, 6.600: 0.267, 6.700: 0.267, 6.800: 0.266, 6.900: 0.266, 7.000: 0.266, 7.100: 0.265, 7.200: 0.265, 7.300: 0.265, 7.400: 0.265, 7.500: 0.264, 7.600: 0.264, 7.700: 0.264, 7.800: 0.264, 7.900: 0.263, 8.000: 0.263, 8.100: 0.263, 8.200: 0.263, 8.300: 0.263, 8.400: 0.262, 8.500: 0.262, 8.600: 0.262, 8.700: 0.262, 8.800: 0.262, 8.900: 0.261, 9.000: 0.261, 9.100: 0.261, 9.200: 0.261, 9.300: 0.261, 9.400: 0.26, 9.500: 0.26, 9.600: 0.26, 9.700: 0.26, 9.800: 0.26, 9.900: 0.26, 10.000: 0.26 };
             compareObject("Ytorrentiel", res["tor"], t, 0.01);
@@ -344,23 +358,23 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
     });
 });
diff --git a/spec/remous_rect_trapezes_pentefaible.spec.ts b/spec/remous_rect_trapezes_pentefaible.spec.ts
index d54663466ccf2712720ebbc1bd96576a36dcfe93..10c56dbe511c519513292feea26ab686a382ccf4 100644
--- a/spec/remous_rect_trapezes_pentefaible.spec.ts
+++ b/spec/remous_rect_trapezes_pentefaible.spec.ts
@@ -3,8 +3,14 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
 
+/*
+  Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus
+  ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0)
+  lign d'eau partielle : if (iSens * (rXCN - xRst) > 0)  remplacé par if (iSens * (rXCN - xRst) >= 0)
+  Les données de validation ont été modifiées en conséquence
+*/
 
 describe('Class Remous / section rectangulaire :', () => {
     describe('méthode trapèzes :', () => {
@@ -18,7 +24,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.3, // Yamont = tirant amont
                 0.403, // Yaval = tirant aval
@@ -27,8 +33,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -44,32 +49,32 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "amont";
             m.extraVar["x"] = 0;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -82,7 +87,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 0.403, // Yaval = tirant aval
@@ -91,49 +96,50 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode trapèzes
 
-            let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75, 0.000: 0.15 };
+            // let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75, 0.000: 0.15 };
+            let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75 };  // dernière valeur supprimée pour la raison en tête de fichier
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            let t = { 0.000: 0.15, 5.000: 0.75 };
+            // let t = { 0.000: 0.15, 5.000: 0.75 };
+            let t = { 0.000: 0.15 }; // dernière valeur supprimée pour la raison en tête de fichier
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 15;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 5;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (1)", () => {
@@ -146,7 +152,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.01, // Yamont = tirant amont
                 0.403, // Yaval = tirant aval
@@ -155,8 +161,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -184,28 +189,28 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 1;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (2)", () => {
@@ -218,7 +223,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.01, // Yamont = tirant amont
                 0.403, // Yaval = tirant aval
@@ -227,8 +232,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -244,28 +248,28 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.953;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 0.9;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
     });
 
@@ -279,7 +283,7 @@ describe('Class Remous / section rectangulaire :', () => {
             1 // YB=hauteur de berge
         );
 
-        let sect = new cSnRectang(undefined, prms);
+        let sect = new cSnRectang(prms);
 
         let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont
             1, // Yaval = tirant aval
@@ -288,8 +292,7 @@ describe('Class Remous / section rectangulaire :', () => {
             MethodeResolution.Trapezes
         );
 
-        let log = new cLog();
-        let rem = new CourbeRemous(prem, log);
+        let rem = new CourbeRemous(prem);
 
         let res = rem.calculRemous(undefined);
 
@@ -298,29 +301,29 @@ describe('Class Remous / section rectangulaire :', () => {
         let f = { 100.000: 1, 95.000: 0.999, 90.000: 0.999, 85.000: 0.998, 80.000: 0.997, 75.000: 0.997, 70.000: 0.996, 65.000: 0.996, 60.000: 0.995, 55.000: 0.994, 50.000: 0.994, 45.000: 0.993, 40.000: 0.992, 35.000: 0.992, 30.000: 0.991, 25.000: 0.991, 20.000: 0.99, 15.000: 0.989, 10.000: 0.989, 5.000: 0.988, 0.000: 0.988 };
         compareObject("Yfluvial", res["flu"], f, 0.03);
 
-        expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
+        expect(Object.keys(res["tor"]).length == 0).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
 
         let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
         compareArray("abscisses", res["trX"], x);
 
         let expLog = new cLog();
-        let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+        let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
         m.extraVar["B"] = 2.5;
         expLog.add(m);
 
-        m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+        m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
         m.extraVar["Yc"] = 0.403;
         expLog.add(m);
 
-        m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+        m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
         m.extraVar["Yn"] = 0.953;
         expLog.add(m);
 
-        expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+        expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-        expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+        expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-        compareLog(log, expLog);
+        compareLog(rem.log, expLog);
     });
 
     it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
@@ -333,7 +336,7 @@ describe('Class Remous / section rectangulaire :', () => {
             1 // YB=hauteur de berge
         );
 
-        let sect = new cSnRectang(undefined, prms);
+        let sect = new cSnRectang(prms);
 
         let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont
             0.7, // Yaval = tirant aval
@@ -342,8 +345,7 @@ describe('Class Remous / section rectangulaire :', () => {
             MethodeResolution.Trapezes
         );
 
-        let log = new cLog();
-        let rem = new CourbeRemous(prem, log);
+        let rem = new CourbeRemous(prem);
 
         let res = rem.calculRemous(undefined);
 
@@ -352,28 +354,28 @@ describe('Class Remous / section rectangulaire :', () => {
         let f = { 100.000: 0.7, 95.000: 0.708, 90.000: 0.716, 85.000: 0.723, 80.000: 0.73, 75.000: 0.737, 70.000: 0.743, 65.000: 0.749, 60.000: 0.754, 55.000: 0.76, 50.000: 0.765, 45.000: 0.77, 40.000: 0.775, 35.000: 0.779, 30.000: 0.783, 25.000: 0.787, 20.000: 0.792, 15.000: 0.795, 10.000: 0.799, 5.000: 0.803, 0.000: 0.806 };
         compareObject("Yfluvial", res["flu"], f, 0.03);
 
-        expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
+        expect(Object.keys(res["tor"]).length == 0).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
 
         let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
         compareArray("abscisses", res["trX"], x);
 
         let expLog = new cLog();
-        let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+        let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
         m.extraVar["B"] = 2.5;
         expLog.add(m);
 
-        m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+        m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
         m.extraVar["Yc"] = 0.403;
         expLog.add(m);
 
-        m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+        m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
         m.extraVar["Yn"] = 0.953;
         expLog.add(m);
 
-        expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+        expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-        expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+        expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
 
-        compareLog(log, expLog);
+        compareLog(rem.log, expLog);
     });
 });
diff --git a/spec/remous_rect_trapezes_penteforte.spec.ts b/spec/remous_rect_trapezes_penteforte.spec.ts
index 7107c0e13a933676d48914e91b666fea5e865bca..4b8a237fe158a51a395e175a557b6789a35993d1 100644
--- a/spec/remous_rect_trapezes_penteforte.spec.ts
+++ b/spec/remous_rect_trapezes_penteforte.spec.ts
@@ -3,7 +3,23 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
-import { ErrorMessage, ErrorCode } from "../src/util/error";
+import { Message, MessageCode } from "../src/util/message";
+
+/*
+   cas 1 :
+   Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale
+   pour la représentation graphique du ressaut (mais fausse car torrentielle).
+   Idem pour la réciproque fluvial/torrentiel.
+   Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes.
+ */
+
+/*
+  cas 2 :
+  Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus
+  ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0)
+  lign d'eau partielle : if (iSens * (rXCN - xRst) > 0)  remplacé par if (iSens * (rXCN - xRst) >= 0)
+  Les données de validation ont été modifiées en conséquence
+*/
 
 describe('Class Remous / section rectangulaire :', () => {
     describe('méthode trapèzes :', () => {
@@ -17,7 +33,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 6, // Yaval = tirant aval
@@ -26,8 +42,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -43,27 +58,27 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "amont";
             m.extraVar["x"] = 0;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut après l'aval", () => {
@@ -77,7 +92,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 0.45, // Yaval = tirant aval
@@ -86,8 +101,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -97,39 +111,40 @@ describe('Class Remous / section rectangulaire :', () => {
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
             // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 };
-            let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 };
+            // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 }; // dernière valeur modifiée pour la raison 1 en tête de fichier
+            let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 };
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 95;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
             m.extraVar["sens"] = "aval";
             m.extraVar["x"] = 100;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut (1 point) à l'intérieur du bief", () => {
@@ -142,7 +157,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -151,8 +166,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
@@ -161,39 +175,40 @@ describe('Class Remous / section rectangulaire :', () => {
             let f = { 100.000: 1, 95.000: 0.729 };
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
-            let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.729 };
+            // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.729 };
+            let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253 }; // dernière valeur supprimée pour la raison 2 en tête de fichier
             compareObject("Ytorrentiel", res["tor"], t, 0.03);
 
             let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000];
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)
             m.extraVar["x"] = 90;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 90;
             m.extraVar["xmax"] = 95;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => {
@@ -206,7 +221,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 1, // Yaval = tirant aval
@@ -215,14 +230,14 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode trapèzes
 
-            let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.933, 4.000: 0.92, 3.750: 0.906, 3.500: 0.893, 3.250: 0.88, 3.000: 0.866, 2.750: 0.853, 2.500: 0.839, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.784, 1.250: 0.77, 1.000: 0.756, 0.750: 0.742, 0.500: 0.727, 0.250: 0.712, 0.000: 0.15 };
+            // let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.933, 4.000: 0.92, 3.750: 0.906, 3.500: 0.893, 3.250: 0.88, 3.000: 0.866, 2.750: 0.853, 2.500: 0.839, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.784, 1.250: 0.77, 1.000: 0.756, 0.750: 0.742, 0.500: 0.727, 0.250: 0.712, 0.000: 0.15 };
+            let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.933, 4.000: 0.92, 3.750: 0.906, 3.500: 0.893, 3.250: 0.88, 3.000: 0.866, 2.750: 0.853, 2.500: 0.839, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.784, 1.250: 0.77, 1.000: 0.756, 0.750: 0.742, 0.500: 0.727, 0.250: 0.712, 0.000: 0.699 };  // dernière valeur modifiée pour la raison 1 en tête de fichier
             compareObject("Yfluvial", res["flu"], f, 0.03);
 
             let t = { 0.000: 0.15, 0.250: 0.153, 0.500: 0.156, 0.750: 0.158, 1.000: 0.161, 1.250: 0.163, 1.500: 0.166, 1.750: 0.168, 2.000: 0.17, 2.250: 0.173, 2.500: 0.175, 2.750: 0.177, 3.000: 0.18, 3.250: 0.182, 3.500: 0.184, 3.750: 0.906 };
@@ -232,28 +247,28 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
             m.extraVar["xmin"] = 0;
             m.extraVar["xmax"] = 3.75;
             expLog.add(m);
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
@@ -266,7 +281,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.1, // Yamont = tirant amont
                 0.3, // Yaval = tirant aval
@@ -275,14 +290,13 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode trapèzes
 
-            expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
+            expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
 
             let t = { 0.000: 0.1, 5.000: 0.205, 10.000: 0.234, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 };
             compareObject("Ytorrentiel", res["tor"], t, 0.01);
@@ -291,23 +305,23 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
 
         it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
@@ -320,7 +334,7 @@ describe('Class Remous / section rectangulaire :', () => {
                 1 // YB=hauteur de berge
             );
 
-            let sect = new cSnRectang(undefined, prms);
+            let sect = new cSnRectang(prms);
 
             let prem = new CourbeRemousParams(sect, 0.35, // Yamont = tirant amont
                 0.3, // Yaval = tirant aval
@@ -329,14 +343,13 @@ describe('Class Remous / section rectangulaire :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             // données de validation : version PHP (Oct 2017) méthode trapèzes
 
-            expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
+            expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur");
 
             let t = { 0.000: 0.35, 0.100: 0.345, 0.200: 0.34, 0.300: 0.336, 0.400: 0.332, 0.500: 0.329, 0.600: 0.326, 0.700: 0.323, 0.800: 0.32, 0.900: 0.318, 1.000: 0.316, 1.100: 0.313, 1.200: 0.311, 1.300: 0.309, 1.400: 0.308, 1.500: 0.306, 1.600: 0.305, 1.700: 0.303, 1.800: 0.302, 1.900: 0.3, 2.000: 0.298, 2.100: 0.297, 2.200: 0.295, 2.300: 0.294, 2.400: 0.293, 2.500: 0.292, 2.600: 0.291, 2.700: 0.291, 2.800: 0.29, 2.900: 0.289, 3.000: 0.288, 3.100: 0.287, 3.200: 0.287, 3.300: 0.286, 3.400: 0.285, 3.500: 0.284, 3.600: 0.283, 3.700: 0.283, 3.800: 0.282, 3.900: 0.281, 4.000: 0.28, 4.100: 0.28, 4.200: 0.279, 4.300: 0.278, 4.400: 0.277, 4.500: 0.276, 4.600: 0.276, 4.700: 0.275, 4.800: 0.274, 4.900: 0.273, 5.000: 0.272, 5.100: 0.272, 5.200: 0.271, 5.300: 0.27, 5.400: 0.269, 5.500: 0.269, 5.600: 0.269, 5.700: 0.269, 5.800: 0.269, 5.900: 0.269, 6.000: 0.269, 6.100: 0.269, 6.200: 0.269, 6.300: 0.269, 6.400: 0.269, 6.500: 0.269, 6.600: 0.269, 6.700: 0.269, 6.800: 0.269, 6.900: 0.269, 7.000: 0.269, 7.100: 0.269, 7.200: 0.269, 7.300: 0.269, 7.400: 0.269, 7.500: 0.269, 7.600: 0.269, 7.700: 0.269, 7.800: 0.269, 7.900: 0.269, 8.000: 0.269, 8.100: 0.269, 8.200: 0.269, 8.300: 0.269, 8.400: 0.269, 8.500: 0.269, 8.600: 0.269, 8.700: 0.269, 8.800: 0.269, 8.900: 0.269, 9.000: 0.269, 9.100: 0.269, 9.200: 0.269, 9.300: 0.269, 9.400: 0.269, 9.500: 0.269, 9.600: 0.269, 9.700: 0.269, 9.800: 0.269, 9.900: 0.269, 10.000: 0.269 };
             compareObject("Ytorrentiel", res["tor"], t, 0.01);
@@ -345,23 +358,23 @@ describe('Class Remous / section rectangulaire :', () => {
             compareArray("abscisses", res["trX"], x);
 
             let expLog = new cLog();
-            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
             m.extraVar["B"] = 2.5;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
             m.extraVar["Yc"] = 0.403;
             expLog.add(m);
 
-            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
             m.extraVar["Yn"] = 0.253;
             expLog.add(m);
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
 
-            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+            expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
 
-            compareLog(log, expLog);
+            compareLog(rem.log, expLog);
         });
     });
 });
diff --git a/spec/remous_trapez.spec.ts b/spec/remous_trapez.spec.ts
index 9010db27e1399a1a82e285fad12fc50f5ce70ba5..350b68760a656d37f4459ce54f7bc62921aab6c1 100644
--- a/spec/remous_trapez.spec.ts
+++ b/spec/remous_trapez.spec.ts
@@ -3,32 +3,18 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo
 import { precDigits, precDist, equalEpsilon } from "./nubtest";
 import { round } from "../src/base";
 import { cLog } from "../src/util/log";
+import { compareObject, compareArray } from "./nubtest";
 
-function compObject(s: string, arr1: { [key: number]: number }, arr2: { [key: number]: number }) {
-    expect(Object.keys(arr1).length).toEqual(Object.keys(arr2).length, s + ": longueur incorrecte");
-
-    let arrVals: number[] = [];
-    for (let i in arr1) {
-        let v1: number = arr1[i];
-        let v2: number = arr2[i];
-        expect(equalEpsilon(v1, v2)).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + " " + v2);
-    }
-}
-
-function compArray(s: string, arr1: string[], arr2: number[]) {
-    expect(arr1.length).toEqual(arr2.length);
-
-    let arrVals: number[] = [];
-    for (let i = 0; i < arr1.length; i++) {
-        let v1: number = +arr1[i];
-        let v2: number = arr2[i];
-        expect(equalEpsilon(v1, v2)).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + " " + v2);
-    }
-}
-
-xdescribe('Class Remous / section trapèze :', () => {
+/*
+   Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale
+   pour la représentation graphique du ressaut (mais fausse car torrentielle).
+   Idem pour la réciproque fluvial/torrentiel.
+   Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes.
+ */
+
+describe('Class Remous / section trapèze :', () => {
     describe('méthode trapèzes :', () => {
-        it('test 1', () => {
+        it('pente faible, ressaut dans le bief sur plusieurs points', () => {
             let prms = new ParamsSectionTrapez(2.5, // largeur de fond
                 0.56, // fruit
                 undefined, // tirant d'eau
@@ -39,7 +25,7 @@ xdescribe('Class Remous / section trapèze :', () => {
                 1 // YB= hauteur de berge
             );
 
-            let sect = new cSnTrapez(undefined, prms);
+            let sect = new cSnTrapez(prms);
 
             let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
                 0.4, // Yaval = tirant aval
@@ -48,19 +34,117 @@ xdescribe('Class Remous / section trapèze :', () => {
                 MethodeResolution.Trapezes
             );
 
-            let log = new cLog();
-            let rem = new CourbeRemous(prem, log);
+            let rem = new CourbeRemous(prem);
 
             let res = rem.calculRemous(undefined);
 
             let f = { 9: 0.278, 10: 0.4 };
-            compObject("Yfluvial", res["flu"], f);
+            compareObject("Yfluvial", res["flu"], f, 0.002);
 
-            let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.4 };
-            compObject("Ytorrentiel", res["tor"], t);
+            // let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.4 };
+            let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.293 };  // dernière valeur modifiée pour la raison en tête de fichier
+            compareObject("Ytorrentiel", res["tor"], t, 0.002);
 
             let x = [0.000, 1.000, 2.000, 3.000, 4.000, 5.000, 6.000, 7.000, 8.000, 9.000, 10.000];
-            compArray("abcisses", res["trX"], x);
+            compareArray("abcisses", res["trX"], x);
+        });
+
+        // it('pente forte, ressaut dans le bief sur plusieurs points', () => {
+        //     let prms = new ParamsSectionTrapez(2.5, // largeur de fond
+        //         0.56, // fruit
+        //         undefined, // tirant d'eau
+        //         40, //  Ks=Strickler
+        //         2,  //  Q=Débit
+        //         0.05, //  If=pente du fond
+        //         precDist, // précision
+        //         1 // YB= hauteur de berge
+        //     );
+
+        //     let sect = new cSnTrapez(prms);
+
+        //     let prem = new CourbeRemousParams(sect,
+        //         0.15, // Yamont = tirant amont
+        //         1, // Yaval = tirant aval
+        //         8,  // Long= Longueur du bief
+        //         0.1,  // Dx=Pas d'espace
+        //         MethodeResolution.Trapezes
+        //     );
+
+        //     let rem = new CourbeRemous(prem);
+
+        //     let res = rem.calculRemous(undefined);
+
+        //     let f = { 8.000: 1, 7.900: 0.995, 7.800: 0.989, 7.700: 0.984, 7.600: 0.978, 7.500: 0.973, 7.400: 0.967, 7.300: 0.962, 7.200: 0.956, 7.100: 0.951, 7.000: 0.945, 6.900: 0.94, 6.800: 0.934, 6.700: 0.929, 6.600: 0.923, 6.500: 0.918, 6.400: 0.912, 6.300: 0.907, 6.200: 0.901, 6.100: 0.896, 6.000: 0.89, 5.900: 0.885, 5.800: 0.879, 5.700: 0.874, 5.600: 0.868, 5.500: 0.863, 5.400: 0.857, 5.300: 0.852, 5.200: 0.846, 5.100: 0.841, 5.000: 0.835, 4.900: 0.83, 4.800: 0.824, 4.700: 0.819, 4.600: 0.813, 4.500: 0.808, 4.400: 0.802, 4.300: 0.797, 4.200: 0.791, 4.100: 0.786, 4.000: 0.78, 3.900: 0.775, 3.800: 0.769, 3.700: 0.764, 3.600: 0.758, 3.500: 0.753, 3.400: 0.747, 3.300: 0.742, 3.200: 0.737, 3.100: 0.731, 3.000: 0.726, 2.900: 0.72, 2.800: 0.715, 2.700: 0.709, 2.600: 0.704, 2.500: 0.698, 2.400: 0.693, 2.300: 0.686, 2.200: 0.68, 2.100: 0.674, 2.000: 0.668, 1.900: 0.662, 1.800: 0.656, 1.700: 0.65, 1.600: 0.644, 1.500: 0.638, 1.400: 0.632, 1.300: 0.625, 1.200: 0.619, 1.100: 0.613, 1.000: 0.607, 0.900: 0.601, 0.800: 0.594, 0.700: 0.588, 0.600: 0.581, 0.500: 0.574, 0.400: 0.567, 0.300: 0.561, 0.200: 0.554, 0.100: 0.547, 0.000: 0.15 };
+        //     compareObject("Yfluvial", res["flu"], f, 0.011);
+
+        //     let t = { 0.000: 0.15, 0.100: 0.151, 0.200: 0.151, 0.300: 0.152, 0.400: 0.153, 0.500: 0.154, 0.600: 0.155, 0.700: 0.155, 0.800: 0.156, 0.900: 0.157, 1.000: 0.158, 1.100: 0.158, 1.200: 0.159, 1.300: 0.16, 1.400: 0.161, 1.500: 0.161, 1.600: 0.162, 1.700: 0.163, 1.800: 0.164, 1.900: 0.164, 2.000: 0.165, 2.100: 0.166, 2.200: 0.167, 2.300: 0.168, 2.400: 0.168, 2.500: 0.698, 2.6: 0.709500000000002 };
+        //     compareObject("Ytorrentiel", res["tor"], t, 0.004);
+
+        //     let x = [0.000, 0.100, 0.200, 0.300, 0.400, 0.500, 0.600, 0.700, 0.800, 0.900, 1.000, 1.100, 1.200, 1.300, 1.400, 1.500, 1.600, 1.700, 1.800, 1.900, 2.000, 2.100, 2.200, 2.300, 2.400, 2.500, 2.600, 2.700, 2.800, 2.900, 3.000, 3.100, 3.200, 3.300, 3.400, 3.500, 3.600, 3.700, 3.800, 3.900, 4.000, 4.100, 4.200, 4.300, 4.400, 4.500, 4.600, 4.700, 4.800, 4.900, 5.000, 5.100, 5.200, 5.300, 5.400, 5.500, 5.600, 5.700, 5.800, 5.900, 6.000, 6.100, 6.200, 6.300, 6.400, 6.500, 6.600, 6.700, 6.800, 6.900, 7.000, 7.100, 7.200, 7.300, 7.400, 7.500, 7.600, 7.700, 7.800, 7.900, 8.000];
+        //     compareArray("abcisses", res["trX"], x);
+        // });
+    });
+
+    describe('paramètre à calculer :', () => {
+        it('Hs (test 1)', () => {
+            let prms = new ParamsSectionTrapez(
+                2.5, // largeur de fond
+                0.56, // fruit
+                undefined, // tirant d'eau
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                0.001, // précision
+                1 // YB=hauteur de berge
+            );
+
+            let sect = new cSnTrapez(prms);
+
+            let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
+                0.4, // Yaval    = tirant aval
+                100,  // Long= Longueur du bief
+                5,  // Dx=Pas d'espace
+                MethodeResolution.Trapezes
+            );
+
+            let rem = new CourbeRemous(prem);
+
+            let res = rem.calculRemous("Hs");
+
+            // données de validation : version PHP (oct 2017)
+            let hs = { 0.000: 1.507, 5.000: 0.735, 10.000: 0.731, 15.000: 0.727, 20.000: 0.723, 25.000: 0.719, 30.000: 0.715, 35.000: 0.71, 40.000: 0.704, 45.000: 0.699, 50.000: 0.693, 55.000: 0.687, 60.000: 0.68, 65.000: 0.673, 70.000: 0.665, 75.000: 0.656, 80.000: 0.646, 85.000: 0.634, 90.000: 0.62, 95.000: 0.603, 100.000: 0.572 };
+            compareObject("Hs", res["tRes"], hs, 0.002);
+        });
+
+        it('Hs (test 2)', () => {
+            let prms = new ParamsSectionTrapez(
+                2.5, // largeur de fond
+                0.56, // fruit
+                undefined, // tirant d'eau
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                0.001, // précision
+                1 // YB=hauteur de berge
+            );
+
+            let sect = new cSnTrapez(prms);
+
+            let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont
+                1, // Yaval    = tirant aval
+                8,  // Long= Longueur du bief
+                0.1,  // Dx=Pas d'espace
+                MethodeResolution.Trapezes
+            );
+
+            let rem = new CourbeRemous(prem);
+
+            let res = rem.calculRemous("Hs");
+
+            // données de validation : version PHP (oct 2017)
+            // ici j'ai supprimé un point (x=2.5)
+            let hs = { 0.000: 1.507, 2.600: 0.753, 2.700: 0.757, 2.800: 0.762, 2.900: 0.767, 3.000: 0.771, 3.100: 0.776, 3.200: 0.781, 3.300: 0.786, 3.400: 0.79, 3.500: 0.795, 3.600: 0.8, 3.700: 0.805, 3.800: 0.81, 3.900: 0.814, 4.000: 0.819, 4.100: 0.824, 4.200: 0.829, 4.300: 0.834, 4.400: 0.839, 4.500: 0.844, 4.600: 0.849, 4.700: 0.854, 4.800: 0.859, 4.900: 0.864, 5.000: 0.869, 5.100: 0.874, 5.200: 0.879, 5.300: 0.884, 5.400: 0.889, 5.500: 0.894, 5.600: 0.899, 5.700: 0.904, 5.800: 0.909, 5.900: 0.914, 6.000: 0.919, 6.100: 0.924, 6.200: 0.929, 6.300: 0.934, 6.400: 0.939, 6.500: 0.944, 6.600: 0.95, 6.700: 0.955, 6.800: 0.96, 6.900: 0.965, 7.000: 0.97, 7.100: 0.975, 7.200: 0.98, 7.300: 0.986, 7.400: 0.991, 7.500: 0.996, 7.600: 1.001, 7.700: 1.006, 7.800: 1.012, 7.900: 1.017, 8.000: 1.022 };
+            compareObject("Hs", res["tRes"], hs, 0.009);
         });
     });
 });
diff --git a/spec/section_param_circ_fluvial.spec.ts b/spec/section_param_circ_fluvial.spec.ts
index ba76e792e6c1b263bae46f5e24944f7768fe0197..a03a99faebb2399043f3c163d19583ceeb05da8b 100644
--- a/spec/section_param_circ_fluvial.spec.ts
+++ b/spec/section_param_circ_fluvial.spec.ts
@@ -17,7 +17,7 @@ function createSection(prec: number): cSnCirc {
         1 // YB= hauteur de berge
     );
 
-    return new cSnCirc(undefined, paramSection);
+    return new cSnCirc(paramSection);
 }
 
 function createSectionDebordement(prec: number): cSnCirc {
@@ -30,7 +30,7 @@ function createSectionDebordement(prec: number): cSnCirc {
         1 // YB= hauteur de berge
     );
 
-    return new cSnCirc(undefined, paramSection);
+    return new cSnCirc(paramSection);
 }
 
 function check(val1: number, val2: number) {
diff --git a/spec/section_param_circ_torrentiel.spec.ts b/spec/section_param_circ_torrentiel.spec.ts
index ebb27a9ebf503b9675a2a5e036cb406a71c881c4..3b26bd609934e20fed40af8064bde04951c823dc 100644
--- a/spec/section_param_circ_torrentiel.spec.ts
+++ b/spec/section_param_circ_torrentiel.spec.ts
@@ -17,7 +17,7 @@ function createSection(prec: number): cSnCirc {
         1 // YB= hauteur de berge
     );
 
-    return new cSnCirc(undefined, paramSection);
+    return new cSnCirc(paramSection);
 }
 
 function check(val1: number, val2: number) {
diff --git a/spec/section_param_puiss_fluvial.spec.ts b/spec/section_param_puiss_fluvial.spec.ts
index e4070f596001287d12481d0ffb62685d2f6f45ee..6adea424c71bf903e45eaee91784fa9bb646488c 100644
--- a/spec/section_param_puiss_fluvial.spec.ts
+++ b/spec/section_param_puiss_fluvial.spec.ts
@@ -18,7 +18,7 @@ function createSection(prec: number): cSnPuiss {
         1 // YB= hauteur de berge
     );
 
-    return new cSnPuiss(undefined, paramSection);
+    return new cSnPuiss(paramSection);
 }
 
 function createSectionDebordement(prec: number): cSnPuiss {
@@ -32,7 +32,7 @@ function createSectionDebordement(prec: number): cSnPuiss {
         1 // YB= hauteur de berge
     );
 
-    return new cSnPuiss(undefined, paramSection);
+    return new cSnPuiss(paramSection);
 }
 
 function check(val1: number, val2: number) {
diff --git a/spec/section_param_puiss_torrentiel.spec.ts b/spec/section_param_puiss_torrentiel.spec.ts
index 045271fab5b96d0b03b4cb0e513846a1567eba8c..e412bc1dcc32519a7f8bff06b1679244d6934470 100644
--- a/spec/section_param_puiss_torrentiel.spec.ts
+++ b/spec/section_param_puiss_torrentiel.spec.ts
@@ -18,7 +18,7 @@ function createSection(prec: number): cSnPuiss {
         1 // YB= hauteur de berge
     );
 
-    return new cSnPuiss(undefined, paramSection);
+    return new cSnPuiss(paramSection);
 }
 
 function check(val1: number, val2: number) {
diff --git a/spec/section_param_rect_conv_newton.spec.ts b/spec/section_param_rect_conv_newton.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..83d7e90acfe6c7137cd76615c83efd4114bde1b0
--- /dev/null
+++ b/spec/section_param_rect_conv_newton.spec.ts
@@ -0,0 +1,99 @@
+/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
+
+import { Result } from "../src/base";
+import { precDist, equalEpsilon } from "./nubtest";
+import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang";
+import { MessageCode } from "../src/util/message";
+
+let paramSection: ParamsSectionRectang;
+let sect: cSnRectang;
+
+function check(val1: number, val2: number) {
+    expect(equalEpsilon(val1, val2)).toBeTruthy("expected " + val2 + ", got " + val1);
+}
+
+describe('Section paramétrée rectangulaire : ', () => {
+    beforeEach(() => {
+        paramSection = new ParamsSectionRectang(0.8, // tirant d'eau
+            2.5, // largeur de fond
+            40, //  Ks=Strickler
+            10,  //  Q=Débit
+            0.001, //  If=pente du fond
+            1e-10, // précision
+            1 // YB= hauteur de berge
+        );
+
+        sect = new cSnRectang(paramSection);
+        sect.newtonMaxIter = 5;
+    });
+
+    describe('non convergence de la méthode de Newton :', () => {
+        it('hauteur critique', () => {
+            sect.Calc("Yc");
+            expect(sect.log.messages.length).toEqual(1);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+        });
+
+        it('hauteur normale', () => {
+            sect.Calc("Yn");
+            expect(sect.log.messages.length).toEqual(2);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE);
+        });
+
+        it('hauteur normale, pente négative', () => {
+            sect.prms.If.v = -0.001;
+            sect.Calc("Yn");
+            expect(sect.log.messages.length).toEqual(1);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF);
+        });
+
+        it('hauteur fluviale, Y < Yc', () => {
+            sect.Calc("Yf");
+            expect(sect.log.messages.length).toEqual(3);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU);
+        });
+
+        it('hauteur fluviale, Y > Yc', () => {
+            sect.prms.Y.v = 2;
+            sect.Calc("Yf");
+            expect(sect.log.messages.length).toEqual(1);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+        });
+
+        it('hauteur torrentielle, Y < Yc', () => {
+            sect.Calc("Yt");
+            expect(sect.log.messages.length).toEqual(1);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+        });
+
+        it('hauteur torrentielle, Y > Yc', () => {
+            sect.prms.Y.v = 2;
+            sect.Calc("Yt");
+            expect(sect.log.messages.length).toEqual(2);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR);
+        });
+
+        it('hauteur conjuguée, Froude < 1', () => {
+            sect.prms.Y.v = 2;
+            sect.Calc("Yco");
+            console.log(sect.log.toString());
+            expect(sect.log.messages.length).toEqual(3);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR);
+            expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG);
+        });
+
+        it('hauteur conjuguée, Froude > 1', () => {
+            sect.Calc("Yco");
+            expect(sect.log.messages.length).toEqual(4);
+            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+            expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU);
+            expect(sect.log.messages[3].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG);
+        });
+    });
+});
diff --git a/spec/section_param_rect_fluvial.spec.ts b/spec/section_param_rect_fluvial.spec.ts
index 38ebd5dd3ff7dd8146b8b9c43e8bede5d25ef933..be5be98ca25add9c50fe16c826a2f7a62c6a2c7b 100644
--- a/spec/section_param_rect_fluvial.spec.ts
+++ b/spec/section_param_rect_fluvial.spec.ts
@@ -17,7 +17,7 @@ function createSection(prec: number): cSnRectang {
         1 // YB= hauteur de berge
     );
 
-    return new cSnRectang(undefined, paramSection);
+    return new cSnRectang(paramSection);
 }
 
 function createSectionDebordement(prec: number): cSnRectang {
@@ -30,7 +30,7 @@ function createSectionDebordement(prec: number): cSnRectang {
         1 // YB= hauteur de berge
     );
 
-    return new cSnRectang(undefined, paramSection);
+    return new cSnRectang(paramSection);
 }
 
 function check(val1: number, val2: number) {
diff --git a/spec/section_param_rect_torrentiel.spec.ts b/spec/section_param_rect_torrentiel.spec.ts
index ddf25e29b7e248bbcb26dbc828add475812fdc24..456ea6207dc9df2d306ecfd3ab66356494d0b3de 100644
--- a/spec/section_param_rect_torrentiel.spec.ts
+++ b/spec/section_param_rect_torrentiel.spec.ts
@@ -22,7 +22,7 @@ describe('Section paramétrée rectangulaire : ', () => {
             1 // YB= hauteur de berge
         );
 
-        sect = new cSnRectang(undefined, paramSection);
+        sect = new cSnRectang(paramSection);
     });
 
     describe('torrentiel :', () => {
diff --git a/spec/section_param_trapez_fluvial.spec.ts b/spec/section_param_trapez_fluvial.spec.ts
index 13a1f1f5f69709df6b31f49739ae08519327f7cf..7443a4d372ed36b7d041cc8e82900695c85a621f 100644
--- a/spec/section_param_trapez_fluvial.spec.ts
+++ b/spec/section_param_trapez_fluvial.spec.ts
@@ -18,7 +18,7 @@ function createSection(prec: number): cSnTrapez {
         1 // YB= hauteur de berge
     );
 
-    return new cSnTrapez(undefined, paramSection);
+    return new cSnTrapez(paramSection);
 }
 
 function createSectionDebordement(prec: number): cSnTrapez {
@@ -32,7 +32,7 @@ function createSectionDebordement(prec: number): cSnTrapez {
         1 // YB= hauteur de berge
     );
 
-    return new cSnTrapez(undefined, paramSection);
+    return new cSnTrapez(paramSection);
 }
 
 function check(val1: number, val2: number) {
diff --git a/spec/section_param_trapez_torrentiel.spec.ts b/spec/section_param_trapez_torrentiel.spec.ts
index 13730e0b2945a85cdd2589e2bea633a4033a425f..7526c24db9037e7b157d2f0ef243d72b9177e488 100644
--- a/spec/section_param_trapez_torrentiel.spec.ts
+++ b/spec/section_param_trapez_torrentiel.spec.ts
@@ -23,7 +23,7 @@ describe('Section paramétrée trapèze :', () => {
             1 // YB= hauteur de berge
         );
 
-        sect = new cSnTrapez(undefined, paramCnl);
+        sect = new cSnTrapez(paramCnl);
     });
 
     describe('torrentiel :', () => {
diff --git a/spec/test-remous-fenetre.ts b/spec/test-remous-fenetre.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fc4c7fded58e89fdb249ae42f366af12a9f71db1
--- /dev/null
+++ b/spec/test-remous-fenetre.ts
@@ -0,0 +1,360 @@
+import { Message, MessageCode, MessageSeverity } from "../src/util/message";
+import { CourbeRemous, CourbeRemousParams, MethodeResolution } from "../src/remous";
+import { cLog } from "../src/util/log";
+
+//import { ParamsSectionTrapez, cSnTrapez } from "../src/section/section_trapez";
+import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang";
+import { nub, precDist, equalEpsilon } from "../spec/nubtest";
+
+/*
+   Tentative de validation automatique du calcul des courbes de remous.
+   Le principe :
+    - calculer d'abord les remous sur un bief (avec par exemple un ressaut au milieu) qui servira de référence
+    - déplacer dans ce bief une fenêtre dans laquelle on calcule les courbes de remous
+    - comparer les courbes obtenus dans la fenêtre avec celles se trouvant au même endroit dans le bief de référence
+
+   Ce code de validation n'est pas sous la forme d'un test unitaire, il doit être lancé à la main :
+   $ npm run runtestremous
+ */
+
+class Expect {
+    constructor(private b: boolean) {
+
+    }
+    public toBeTruthy(m: string) {
+        if (!this.b)
+            console.log(m);
+    }
+}
+
+function expect(b: boolean): Expect {
+    return new Expect(b);
+}
+
+export function compareObject(s: string, objTest: { [key: number]: number }, objValid: { [key: number]: number }, epsilon: number): boolean {
+    let n1 = Object.keys(objTest).length;
+    let n2 = Object.keys(objValid).length;
+    let b: boolean = n1 == n2;
+    expect(b).toBeTruthy(s + ": longueur incorrecte " + n1 + ", devrait etre " + n2);
+    if (!b) return false;
+
+    let kTest = Object.keys(objTest);
+    kTest.sort((a, b) => {
+        if (+a > +b) return 1;
+        if (+a < +b) return -1;
+        return 0;
+    });
+
+    let kValid = Object.keys(objValid);
+    kValid.sort((a, b) => {
+        if (+a > +b) return 1;
+        if (+a < +b) return -1;
+        return 0;
+    });
+
+    for (let i = 0; i < n1; i++) {
+        // let v1: number = objTest[+Object.keys(objTest)[i]];
+        let v1: number = objTest[+kTest[i]];
+        // let v2: number = objValid[+Object.keys(objValid)[i]];
+        let v2: number = objValid[+kValid[i]];
+        b = equalEpsilon(v1, v2, epsilon);
+        expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2);
+        if (!b) return false;
+    }
+
+    return true;
+}
+
+export function compareArray(s: string, arrTest: string[], arrValid: string[]): boolean {
+    let n1 = arrTest.length;
+    let n2 = arrValid.length;
+    let b: boolean = n1 == n2;
+    expect(b).toBeTruthy(s + ": longueur incorrecte " + n1 + ", devrait etre " + n2);
+    if (!b) return false;
+
+    for (let i = 0; i < arrTest.length; i++) {
+        let v1: number = +arrTest[i];
+        let v2: number = +arrValid[i];
+        b = equalEpsilon(v1, v2);
+        expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2);
+        if (!b) return false;
+    }
+
+    return true;
+}
+
+function logObject(obj: {}, m?: string) {
+    // évite le message "Value below was evaluated just now" dans le debugger de Chrome
+    if (m == undefined)
+        console.log(JSON.stringify(obj));
+    else
+        console.log(m + " " + JSON.stringify(obj));
+}
+
+function logArray(m: string, arr: { [key: string]: number }) {
+    console.log(m);
+
+    let keys = Object.keys(arr);
+    keys.sort((a, b) => {
+        if (+a > +b) return 1;
+        if (+a < +b) return -1;
+        return 0;
+    });
+
+    for (let k of keys)
+        console.log("[" + (+k).toFixed(3) + "]=" + arr[k]);
+}
+
+// function computeFenetreTrapez(yAmont: number, yAval: number, longBief: number, dxBief: number, prec: number) {
+//     let prms = new ParamsSectionTrapez(
+//         2.5, // largeur de fond
+//         0.56, // fruit
+//         undefined, // tirant d'eau
+//         40, //  Ks=Strickler
+//         2.5, // Q=Débit
+//         0.05, // If=pente du fond
+//         prec, // précision
+//         1 // YB=hauteur de berge
+//     );
+
+//     let sect = new cSnTrapez(prms);
+
+//     let prem = new CourbeRemousParams(sect,
+//         yAmont, // Yamont = tirant amont
+//         yAval, // Yaval = tirant aval
+//         longBief,  // Long = Longueur du bief
+//         dxBief,  // Dx = Pas d'espace
+//         MethodeResolution.Trapezes
+//     );
+
+//     // console.log("computeFenetre longBief=" + longBief + " y am/av=" + yAmont + " " + yAval);
+//     console.log("computeFenetre y am/av=" + yAmont + " " + yAval);
+
+//     let rem = new CourbeRemous(prem);
+//     return rem.calculRemous(undefined);
+// }
+
+function saveCSV(res) {
+    const fs = require('fs');
+
+    let csvFlu = "x;flu;tor";
+    for (let x of res.trX) {
+        if (res.flu[x] == undefined)
+            var flu = "";
+        else
+            flu = String(res.flu[x]).replace(".", ",");
+
+        if (res.tor[x] == undefined)
+            var tor = "";
+        else
+            tor = String(res.tor[x]).replace(".", ",");
+
+        csvFlu += "\n" + x.replace(".", ",") + ";" + flu + ";" + tor;
+    }
+
+    fs.writeFile("/tmp/flu.csv", csvFlu, function (err) {
+        if (err) {
+            return console.log(err);
+        }
+
+        console.log("The file was saved!");
+    });
+}
+
+function createSectionRect(prec: number, dbg: boolean = false): cSnRectang {
+    let prms = new ParamsSectionRectang(
+        undefined, // tirant d'eau
+        2, // largeur de fond
+        40, //  Ks=Strickler
+        2.5, // Q=Débit
+        0.001, // If=pente du fond
+        prec, // précision
+        1 // YB=hauteur de berge
+    );
+
+    return new cSnRectang(prms, dbg);
+}
+
+function computeFenetreRect(yAmont: number, yAval: number, longBief: number, dbg: boolean = false) {
+    // let prms = new ParamsSectionRectang(
+    //     undefined, // tirant d'eau
+    //     2, // largeur de fond
+    //     40, //  Ks=Strickler
+    //     2.5, // Q=Débit
+    //     0.001, // If=pente du fond
+    //     prec, // précision
+    //     1 // YB=hauteur de berge
+    // );
+    // let sect = new cSnRectang(prms);
+    let sect = createSectionRect(prec);
+
+    let prem = new CourbeRemousParams(sect,
+        yAmont, // Yamont = tirant amont
+        yAval, // Yaval = tirant aval
+        longBief,  // Long = Longueur du bief
+        dxBief,  // Dx = Pas d'espace
+        MethodeResolution.Trapezes
+    );
+
+    let rem = new CourbeRemous(prem, dbg);
+    return { "remous": rem, "res": rem.calculRemous(undefined) };
+}
+
+// ressaut entre x=8 et x=12.5
+const prec = 1e-3; // précision de calcul
+const longBief = 20; // longueur totale du bief
+const Yaval = 1.1; // tirant aval
+const Yamont = 0.1; // tirant amont
+const dxBief = 0.25; // pas de discrétisation
+
+function testFenetre() {
+    console.log("CALCUL DU BIEF\n\n");
+
+    // calcul du bief
+
+    let r = computeFenetreRect(Yamont, Yaval, longBief, false);
+    let res: {
+        "flu": { [key: number]: number; },
+        "tor": { [key: number]: number; },
+        "trX": string[],
+        "tRes": { [key: number]: number }
+    } = r["res"];
+
+    let remous = r["remous"];
+
+    // ligne fluviale totale, utilisée pour les conditions initiales
+    let ligneFluviale: { [key: number]: number; } = remous.calculFluvial();
+
+    // ligne torrentielle totale, utilisée pour les conditions initiales
+    let ligneTorrentielle: { [key: number]: number; } = remous.calculTorrentiel();
+
+    console.log(remous.log.toString());
+    // let ms = r["remous"].log.messages;
+
+    //  saveCSV(res);
+
+    console.log("X")
+    logObject(res.trX);
+    logArray("flu", res.flu);
+    logArray("tor", res.tor);
+
+    // mouvement de la fenêtre
+
+    console.log("\n\nMOUVEMENT DE LA FENETRE\n\n");
+
+    let sizeFenetre = Math.round(res.trX.length / 3.5);
+    console.log("taille de la fenetre (points) " + sizeFenetre);
+    if (sizeFenetre < 3)
+        throw "pas de discrétisation trop grand !";
+
+    let nFlu = Object.keys(res.flu).length;
+    if (nFlu < sizeFenetre * 2)
+        throw "pb de calcul de la ligne fluviale : nb de points (" + nFlu + ") < fenetre * 2";
+
+    let nTor = Object.keys(res.tor).length;
+    if (nTor < sizeFenetre * 2)
+        throw "pb de calcul de la ligne torrentielle : nb de points (" + nTor + ") < fenetre * 2";
+
+
+    let nX = res.trX.length;
+    console.log("taille du bief (points)=" + nX);
+
+    let ni = 13;
+    for (let i1 = 0; i1 <= nX - sizeFenetre; i1++) {
+        console.log();
+        console.log("i1", i1);
+
+        let i2 = i1 + sizeFenetre - 1;
+        let xBief1: string = res.trX[i1];
+        let xBief2: string = res.trX[i2];
+        console.log("test fenetre xBief=[" + xBief1 + "," + xBief2 + "]");
+        console.log("longueur fenetre " + (+xBief2 - +xBief1));
+
+        // let yAmont: number = res.tor[xBief1];
+        let yAmont: number = ligneTorrentielle[xBief1];
+        if (yAmont == undefined) {
+            // yAmont = res.flu[xBief1];
+            yAmont = ligneFluviale[xBief1];
+            // console.log("yAmont (flu)=" + yAmont);
+        }
+        // else
+        // console.log("yAmont (tor)=" + yAmont);
+
+        // let yAval = res.flu[xBief2];
+        let yAval = ligneFluviale[xBief2];
+        if (yAval == undefined) {
+            // yAval = res.tor[xBief2];
+            yAval = ligneTorrentielle[xBief2];
+            // console.log("yAval (tor)=" + yAval);
+        }
+        // else
+        // console.log("yAval (flu)=" + yAval   );
+
+        if (yAmont == undefined || yAval == undefined)
+            throw "pb ! yAmont == undefined || yAval == undefined";
+
+        // console.log("computeFenetre longBief=" + longBief + " y am/av=" + yAmont + " " + yAval);
+        console.log("computeFenetre y am/av=" + yAmont + " " + yAval);
+
+        let r = computeFenetreRect(yAmont, yAval, +xBief2 - +xBief1, i1 == ni);
+        let resFenetre = r["res"];
+
+        // validation du tableau d'abscisses
+
+        let validX: string[] = [];
+        for (let i = i1; i <= i2; i++)
+            validX.push(String(+res.trX[i] - dxBief * i1));
+        if (!compareArray("X", resFenetre.trX, validX)) {
+            console.log("X valid")
+            logObject(validX);
+            console.log("X fenetre")
+            logObject(resFenetre.trX);
+            break;
+        }
+        /**/
+
+        // if (xBief1 == "3.1")
+        //     console.log();
+
+        // validation de la courbe fluviale
+
+        let validFlu: { [key: number]: number; } = {};
+        for (let i = i1; i <= i2; i++) {
+            let x: number = +res.trX[i];
+            let y: number = res.flu[x];
+            if (y != undefined)
+                validFlu[(i - i1) * dxBief] = y;
+            // validFlu[x] = y;
+        }
+        if (Object.keys(validFlu).length > 0)
+            if (!compareObject("Flu", resFenetre.flu, validFlu, prec)) {
+                console.log("flu valid")
+                logObject(validFlu);
+                console.log("flu fenetre")
+                logObject(resFenetre.flu);
+                // break;
+            }
+        /**/
+
+        // validation de la courbe torrentielle
+
+        let validTor: { [key: number]: number; } = {};
+        for (let i = i1; i <= i2; i++) {
+            let x: number = +res.trX[i];
+            let y: number = res.tor[x];
+            if (y != undefined)
+                validTor[(i - i1) * dxBief] = y;
+            // validTor[x] = y;
+        }
+        if (Object.keys(validTor).length > 0)
+            if (!compareObject("Tor", resFenetre.tor, validTor, prec)) {
+                console.log("tor valid")
+                logObject(validTor);
+                console.log("tor fenetre")
+                logObject(resFenetre.tor);
+                // break;
+            }
+    }
+}
+
+testFenetre()
diff --git a/spec/tsconfig-remous-fenetre.spec.json b/spec/tsconfig-remous-fenetre.spec.json
new file mode 100644
index 0000000000000000000000000000000000000000..dc5c20a03c3babd16acd097165b9f3fde6c49fd8
--- /dev/null
+++ b/spec/tsconfig-remous-fenetre.spec.json
@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "noImplicitAny": false
+  },
+  "extends": "../tsconfig.json",
+  "include": [
+    "../src/remous.ts",
+    "../spec/test-remous-fenetre.ts"
+  ]
+}
\ No newline at end of file
diff --git a/spec/tsconfig.spec.json b/spec/tsconfig.spec.json
index 5ce23c667a28850cbef329d45012843197183b51..86e4fca2e4fc36961b7a48563ddcb38ce153c982 100644
--- a/spec/tsconfig.spec.json
+++ b/spec/tsconfig.spec.json
@@ -3,5 +3,8 @@
   "include": [
     "../src/**/*.ts",
     "../spec/**/*.ts"
+  ],
+  "exclude": [
+    "../spec/test-remous-fenetre.ts"
   ]
 }
diff --git a/src/base.ts b/src/base.ts
index 3006c6d1e398ddb27b1bce759be08c3a95b06945..9e7c06fed8ec509d9ed578c3282cb0e94c6f1e2d 100644
--- a/src/base.ts
+++ b/src/base.ts
@@ -1,60 +1,4 @@
-import { ErrorMessage, ErrorCode } from "./util/error";
-
-// export enum ResultCode {
-//     OK = 0,
-
-//     /**
-//      * la dichotomie n'a pas pu trouver automatiquement d'intervalle de départ
-//      * car la valeur initiale de la variable est trop haute
-//      */
-//     ERROR_DICHO_INITVALUE_HIGH = -1,
-
-//     /**
-//      * la dichotomie n'a pas pu trouver automatiquement d'intervalle de départ
-//      * car la valeur initiale de la variable est trop basse
-//      */
-//     ERROR_DICHO_INITVALUE_LOW = -2,
-
-//     /**
-//      * la dichotomie n'a pas pu trouver automatiquement d'intervalle de départ
-//      * car la valeur cible de la fonction n'existe pas pour des valeurs de la
-//      * variable dans son domaine de définition, cad il n'existe pas de solution
-//      */
-//     ERROR_DICHO_INIT_DOMAIN = -3,
-
-//     /**
-//      * la dichotomie n'a pas pu converger
-//      */
-//     ERROR_DICHO_CONVERGE = -4,
-// }
-
-// /**
-//  * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
-//  */
-// export class Result {
-//     /** Valeur calculée */
-//     private _vCalc: number;
-
-//     /**
-//      * code d'erreur
-//      */
-//     private _code: ResultCode;
-
-//     /** Variables intermédiaires, flags d'erreur */
-//     // public extraVar: {};
-//     public extraVar: { [key: string]: any };
-
-//     constructor(v: number, c: ResultCode = ResultCode.OK) {
-//         this._vCalc = v
-//         this._code = c;
-//         this.extraVar = {}
-//     };
-
-//     get vCalc() { return this._vCalc; }
-
-//     get code() { return this._code; }
-// }
-
+import { Message, MessageCode } from "./util/message";
 
 /**
  * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
@@ -63,22 +7,22 @@ export class Result {
     /** Valeur calculée */
     private _vCalc: number;
 
-    private _errorMessage: ErrorMessage;
+    private _message: Message;
 
-    constructor(v: number, e: ErrorMessage = undefined) {
+    constructor(v: number, e: Message = undefined) {
         this._vCalc = v;
-        this._errorMessage = e;
+        this._message = e;
     };
 
     get vCalc() { return this._vCalc; }
 
     get code() {
-        if (this._errorMessage == undefined)
-            return ErrorCode.ERROR_OK;
-        return this._errorMessage.code;
+        if (this._message == undefined)
+            return MessageCode.ERROR_OK;
+        return this._message.code;
     }
 
-    get errorMessage() { return this._errorMessage; }
+    get Message() { return this._message; }
 }
 
 /**
diff --git a/src/dichotomie.ts b/src/dichotomie.ts
index f25f9f67a9127b4678081fec5085594ea42e80d2..9485690c41128933c5a53034e6b579464b2aad21 100644
--- a/src/dichotomie.ts
+++ b/src/dichotomie.ts
@@ -1,6 +1,6 @@
 // import { XOR, BoolIdentity, Debug, Result, ResultCode, UndefinedError } from "./base";
 import { XOR, BoolIdentity, Debug, Result } from "./base";
-import { ErrorMessage, ErrorCode } from "./util/error";
+import { Message, MessageCode } from "./util/message";
 import { Nub } from "./nub";
 import { ParamDefinition, ParamDomain, ParamDomainValue } from "./param"
 
@@ -60,12 +60,12 @@ class Interval extends Pair {
 
     checkValue(v: number) {
         if (v == undefined) {
-            let e = new ErrorMessage(ErrorCode.ERROR_INTERVAL_UNDEF);
+            let e = new Message(MessageCode.ERROR_INTERVAL_UNDEF);
             throw e;
         }
 
         if (!this.intervalHasValue(v)) {
-            let e = new ErrorMessage(ErrorCode.ERROR_INTERVAL_OUTSIDE);
+            let e = new Message(MessageCode.ERROR_INTERVAL_OUTSIDE);
             e.extraVar["value"] = v;
             e.extraVar["interval"] = this.toString();
             throw e;
@@ -101,7 +101,7 @@ class SearchInterval extends Interval {
     constructor(d: Dichotomie, min: number, max: number, s: number) {
         super(min, max);
         if (s == 0) {
-            let e = new ErrorMessage(ErrorCode.ERROR_DICHO_NULL_STEP);
+            let e = new Message(MessageCode.ERROR_DICHO_NULL_STEP);
             throw e;
         }
         this._step = s;
@@ -114,7 +114,7 @@ class SearchInterval extends Interval {
 
     growStep(k: number) {
         if (k == 0) {
-            let e = new ErrorMessage(ErrorCode.ERROR_DICHO_INVALID_STEP_GROWTH);
+            let e = new Message(MessageCode.ERROR_DICHO_INVALID_STEP_GROWTH);
             throw e;
         }
         this._step *= k;
@@ -363,7 +363,7 @@ export class Dichotomie extends Debug {
         // la valeur cible de la fonction est elle trouvable ?    
 
         let m;
-        let res: ErrorMessage;
+        let res: Message;
         let errDomain = false;
         switch (prmDom.domain) {
             case ParamDomainValue.INTERVAL:
@@ -385,7 +385,7 @@ export class Dichotomie extends Debug {
         }
 
         if (errDomain) {
-            res = new ErrorMessage(ErrorCode.ERROR_DICHO_INIT_DOMAIN);
+            res = new Message(MessageCode.ERROR_DICHO_INIT_DOMAIN);
             res.extraVar["targetSymbol"] = this.analyticalSymbol; // symbole de la variable calculée par la fonction
             res.extraVar["targetValue"] = rTarget; // valeur cible pour la fonction
             res.extraVar["variableInterval"] = intMax.toString(); // intervalle de valeurs pour la variable d'entrée de la fonction
@@ -394,9 +394,9 @@ export class Dichotomie extends Debug {
         else {
             // if (intSearch.step < 0)
             if (BoolIdentity(initTarget > rTarget, inc))
-                res = new ErrorMessage(ErrorCode.ERROR_DICHO_INITVALUE_HIGH);
+                res = new Message(MessageCode.ERROR_DICHO_INITVALUE_HIGH);
             else
-                res = new ErrorMessage(ErrorCode.ERROR_DICHO_INITVALUE_LOW);
+                res = new Message(MessageCode.ERROR_DICHO_INITVALUE_LOW);
 
             res.extraVar["variableSymbol"] = this._paramX.symbol; // symbole de la variable de la fonction
             res.extraVar["variableInitValue"] = rInit; // valeur initiale de la variable
diff --git a/src/error_messages.en.json b/src/error_messages.en.json
deleted file mode 100644
index e5306844dce4077bf5bc8d366694e59c4959704c..0000000000000000000000000000000000000000
--- a/src/error_messages.en.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-    "ERROR_DICHO_INIT_DOMAIN": "Dichotomy : target %targetSymbol%=%targetValue% does not exist for variable %variableSymbol% valued in interval %variableInterval%",
-    "ERROR_DICHO_INITVALUE_LOW": "Dichotomy : initial value %variableSymbol%=%variableInitValue% is too low (target is %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
-    "ERROR_DICHO_INITVALUE_HIGH": "Dichotomy : initial value %variableSymbol%=%variableInitValue% is too high (target is %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
-    "ERROR_DICHO_NULL_STEP": "Dichotomy (initial interval search) : invalid null step",
-    "ERROR_DICHO_INVALID_STEP_GROWTH": "Dichotomy (initial interval search) : invalid null step growth",
-    "ERROR_DICHO_FUNCTION_VARIATION": "unable to determinate function direction of variation",
-    "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "invalid %minValue%/%maxValue% min/max boundaries for 'interval' parameter definition domain",
-    "ERROR_PARAMDEF_CALC_UNDEFINED": "calculability of '%symbol%' parameter is undefined",
-    "ERROR_PARAMDEF_VALUE_UNDEFINED": "value of '%symbol%' parameter is undefined",
-    "ERROR_PARAMDEF_VALUE_FIXED": "value of '%symbol%' parameter cannot be changed",
-    "ERROR_PARAMDEF_VALUE_POS": "value %value% of '%symbol%' parameter is invalid (cannot be <=0)",
-    "ERROR_PARAMDEF_VALUE_POSNULL": "value %value% of '%symbol%' parameter is invalid (cannot be <0)",
-    "ERROR_PARAMDEF_VALUE_NULL": "value of '%symbol%' parameter cannot be 0",
-    "ERROR_PARAMDEF_VALUE_INTERVAL": "parameter '%symbol%' : value %value% is out of [%minValue%, %maxValue%] interval",
-    "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%' : non supported '%domain%' definition domain",
-    "ERROR_INTERVAL_UNDEF": "Interval : invalid 'undefined' value",
-    "ERROR_INTERVAL_OUTSIDE": "Interval : value %value% is outside of %interval",
-    "ERROR_LANG_UNSUPPORTED": "internationalisation : unsupported '%locale%' locale",
-    "ERROR_REMOUS_ARRET_CRITIQUE": "Calculation stopped: critical elevation reached at abscissa %x%",
-    "ERROR_REMOUS_CALCUL_FLUVIAL": "Downstream boundary condition >= Critical elevation : calculation of subcritical part from downstream",
-    "ERROR_REMOUS_CALCUL_TORRENTIEL": "Uptream boundary condition <= Critical elevation : calculation of supercritical part from upstream",
-    "ERROR_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m",
-    "ERROR_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m",
-    "ERROR_REMOUS_H_CRITIQUE": "Width at embankment level = %Yc% m",
-    "ERROR_REMOUS_H_NORMALE": "Normal water level = %Yn% m",
-    "ERROR_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin and %xmax m",
-    "ERROR_REMOUS_PENTE_FORTE": "The water line slope is too steep at abscissa %x m (the discretisation step should be reduced)",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Downstream boundary condition < Critical elevation : no possible calculation from downstream",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Upstream boundary condition < Critical elevation : no possible calculation from upstream"
-}
\ No newline at end of file
diff --git a/src/error_messages.fr.json b/src/error_messages.fr.json
deleted file mode 100644
index f1f6878f3d0590389e707d1ea799e25c163c0897..0000000000000000000000000000000000000000
--- a/src/error_messages.fr.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-    "ERROR_DICHO_INIT_DOMAIN": "Dichotomie : la valeur cible %targetSymbol%=%targetValue% n'existe pas pour la variable %variableSymbol% prise dans l'intervalle %variableInterval%",
-    "ERROR_DICHO_INITVALUE_LOW": "Dichotomie : la valeur initiale %variableSymbol%=%variableInitValue% est trop petite (la valeur cible est %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
-    "ERROR_DICHO_INITVALUE_HIGH": "Dichotomie : la valeur initiale %variableSymbol%=%variableInitValue% est trop grande (la valeur cible est %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)",
-    "ERROR_DICHO_NULL_STEP": "Dichotomie : le pas pour la recherche de l'intervalle de départ ne devrait pas être nul",
-    "ERROR_DICHO_INVALID_STEP_GROWTH": "Dichotomie : l'augmentation du pas pour la recherche de l'intervalle de départ est incorrecte (=0)",
-    "ERROR_DICHO_FUNCTION_VARIATION": "Dichotomie : impossible de determiner le sens de  variation de la fonction",
-    "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "Les bornes (%minValue%/%maxValue%) de l'intervalle sont incorrectes",
-    "ERROR_PARAMDEF_CALC_UNDEFINED": "La calculabilité du paramètre %symbol% n'est pas définie",
-    "ERROR_PARAMDEF_VALUE_UNDEFINED": "La valeur du paramètre %symbol% n'est pas définie",
-    "ERROR_PARAMDEF_VALUE_FIXED": "La valeur du paramètre %symbol% ne peut pas être changée",
-    "ERROR_PARAMDEF_VALUE_POS": "La valeur %value% du paramètre '%symbol%' est incorrecte (<=0)",
-    "ERROR_PARAMDEF_VALUE_POSNULL": "La valeur %value% du paramètre '%symbol%' est incorrecte (<0)",
-    "ERROR_PARAMDEF_VALUE_NULL": "La valeur du paramètre '%symbol%' ne peut pas être nulle",
-    "ERROR_PARAMDEF_VALUE_INTERVAL": "Paramètre '%symbol%' : la valeur %value% est en dehors de l'intervalle [%minValue%, %maxValue%]",
-    "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%' : le domaine de définition '%domain%' est incorrect",
-    "ERROR_INTERVAL_UNDEF": "Interval : valeur 'undefined' incorrecte",
-    "ERROR_INTERVAL_OUTSIDE": "Interval : la valeur %value% est hors de l'intervalle %interval",
-    "ERROR_LANG_UNSUPPORTED": "Internationalisation : locale '%locale%' non prise en charge",
-    "ERROR_REMOUS_ARRET_CRITIQUE": "Arrêt du calcul : hauteur critique atteinte à l'abscisse %x%",
-    "ERROR_REMOUS_CALCUL_FLUVIAL": "Condition limite aval >= Hauteur critique: calcul de la partie fluviale à partir de l'aval",
-    "ERROR_REMOUS_CALCUL_TORRENTIEL": "Condition limite amont <= Hauteur critique: calcul de la partie torrentielle à partir de l'amont",
-    "ERROR_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m",
-    "ERROR_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m",
-    "ERROR_REMOUS_H_CRITIQUE": "Tirant d'eau critique = %Yc% m",
-    "ERROR_REMOUS_H_NORMALE": "Tirant d'eau normal = %Yn% m",
-    "ERROR_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin et %xmax m",
-    "ERROR_REMOUS_PENTE_FORTE": "La pente de la ligne d'eau est trop forte à l'abscisse %x m (il faudrait réduire le pas de discrétisation)",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Condition limite aval < Hauteur critique: pas de calcul possible depuis l'aval",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Condition limite amont > Hauteur critique : pas de calcul possible depuis l'amont"
-}
\ No newline at end of file
diff --git a/src/index.ts b/src/index.ts
index fd917ff2d315cffe99e5f530646912e3d65b7860..71662d2b6467c27d3c37b42adce992a27dbe0aae 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -14,5 +14,5 @@ export * from './section/section_circulaire';
 export * from './section/section_puissance';
 export * from './util/definedvalue';
 export * from './util/numericalstring';
-export * from './util/error';
+export * from './util/message';
 export * from './util/log';
diff --git a/src/param.ts b/src/param.ts
index 1da96e1594d9eb83cf8e7936e1b321afd03b61b6..4fbf6b9715f111d8d62dfff331c1f824147a598c 100644
--- a/src/param.ts
+++ b/src/param.ts
@@ -1,7 +1,7 @@
 // import { Debug, UndefinedError } from './base';
 import { Debug } from './base';
 import { DefinedNumber } from './util/definedvalue';
-import { ErrorMessage, ErrorCode } from './util/error';
+import { Message, MessageCode } from "./util/message";
 
 /**
  * domaine de définition du paramètre
@@ -53,7 +53,7 @@ export class ParamDomain {
             case ParamDomainValue.INTERVAL:
                 if (min == undefined || max == undefined || min > max) {
                     // throw "invalid " + min + "/" + max + " min/max boundaries for 'interval' parameter definition domain"
-                    let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS);
+                    let e: Message = new Message(MessageCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS);
                     e.extraVar["minValue"] = min;
                     e.extraVar["maxValue"] = max;
                     throw e;
@@ -63,7 +63,7 @@ export class ParamDomain {
             default:
                 // en dehors du cas INTERVAL, on ne doit pas fournir de valeur
                 if (min != undefined || max != undefined) {
-                    let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS);
+                    let e: Message = new Message(MessageCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS);
                     e.extraVar["minValue"] = min;
                     e.extraVar["maxValue"] = max;
                     throw e;
@@ -87,7 +87,7 @@ export class ParamDomain {
     public static getDefaultBounds(d: ParamDomainValue): { min: number, max: number } {
         switch (d) {
             case ParamDomainValue.INTERVAL:
-                let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INVALID);
+                let e: Message = new Message(MessageCode.ERROR_PARAMDOMAIN_INVALID);
                 throw e;
 
             case ParamDomainValue.ANY:
@@ -229,7 +229,7 @@ export class ParamDefinition extends DefinedNumber {
     get calculability(): ParamCalculability {
         if (this._calc == undefined) {
             //   throw "value of parameter '" + this._symbol + "' calculability is not defined";
-            let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_CALC_UNDEFINED);
+            let e = new Message(MessageCode.ERROR_PARAMDEF_CALC_UNDEFINED);
             e.extraVar["symbol"] = this.symbol;
             throw e;
         }
@@ -248,7 +248,7 @@ export class ParamDefinition extends DefinedNumber {
         // if (this._value == undefined)
         if (!this.isDefined) {
             //   throw new UndefinedError("value of '" + this._symbol + "' parameter is not defined");
-            let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_UNDEFINED);
+            let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_UNDEFINED);
             e.extraVar["symbol"] = this.symbol;
             throw e;
         }
@@ -262,7 +262,7 @@ export class ParamDefinition extends DefinedNumber {
 
         if (this.calculability == ParamCalculability.NONE) {
             //   throw "value of '" + this._symbol + "' parameter cannot be changed";
-            let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_FIXED);
+            let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_FIXED);
             e.extraVar["symbol"] = this.symbol;
             throw e;
         }
@@ -287,7 +287,7 @@ export class ParamDefinition extends DefinedNumber {
             case ParamDomainValue.POS:
                 if (v <= 0) {
                     //   throw "parameter '" + this._symbol + "' : invalid " + v + " value (cannot be <=0)";
-                    let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_POS);
+                    let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_POS);
                     e.extraVar["symbol"] = this.symbol;
                     e.extraVar["value"] = v;
                     throw e;
@@ -297,7 +297,7 @@ export class ParamDefinition extends DefinedNumber {
             case ParamDomainValue.POS_NULL:
                 if (v < 0) {
                     //   throw "parameter '" + this._symbol + "' : invalid " + v + " value (cannot be <0)";
-                    let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_POSNULL);
+                    let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_POSNULL);
                     e.extraVar["symbol"] = this.symbol;
                     e.extraVar["value"] = v;
                     throw e;
@@ -307,7 +307,7 @@ export class ParamDefinition extends DefinedNumber {
             case ParamDomainValue.NOT_NULL:
                 if (v == 0) {
                     //   throw "parameter '" + this._symbol + "' : value cannot be 0";
-                    let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_NULL);
+                    let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_NULL);
                     e.extraVar["symbol"] = this.symbol;
                     throw e;
                 }
@@ -318,7 +318,7 @@ export class ParamDefinition extends DefinedNumber {
                 let max = this._domain.maxValue;
                 if (v < min || v > max) {
                     // throw "parameter '" + this._symbol + "' : value " + v + " is out of [" + min + ", " + max + "] interval";
-                    let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_INTERVAL);
+                    let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_INTERVAL);
                     e.extraVar["symbol"] = this.symbol;
                     e.extraVar["value"] = v;
                     e.extraVar["minValue"] = min;
@@ -329,7 +329,7 @@ export class ParamDefinition extends DefinedNumber {
 
             default:
                 //throw "parameter '" + this._symbol + "' : non supported '" + sDomain + "' definition domain";
-                let e = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INVALID);
+                let e = new Message(MessageCode.ERROR_PARAMDOMAIN_INVALID);
                 e.extraVar["symbol"] = this.symbol;
                 e.extraVar["domain"] = sDomain;
                 throw e;
diff --git a/src/parameters.ts b/src/parameters.ts
index 7406cd4f039c81f99f96d5fd0d7f4349e5216cb4..6ac00df8d2d92e77a4bba31d5ff2c13bf7ad0499 100644
--- a/src/parameters.ts
+++ b/src/parameters.ts
@@ -40,7 +40,7 @@ export class ComputeNodeParameters {
                 {
                     let cn = new ParamsSectionTrapez(undefined, undefined, undefined, undefined,
                         undefined, undefined, undefined, undefined, undefined, undefined);
-                    let n = new cSnTrapez(undefined, cn); // pour initialiser la calculabilité des paramètres
+                    let n = new cSnTrapez(cn); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
 
@@ -48,7 +48,7 @@ export class ComputeNodeParameters {
                 {
                     let cn = new ParamsSectionRectang(undefined, undefined, undefined, undefined,
                         undefined, undefined, undefined, undefined);
-                    let n = new cSnRectang(undefined, cn); // pour initialiser la calculabilité des paramètres
+                    let n = new cSnRectang(cn); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
 
@@ -56,7 +56,7 @@ export class ComputeNodeParameters {
                 {
                     let cn = new ParamsSectionCirc(undefined, undefined, undefined, undefined,
                         undefined, undefined, undefined, undefined, undefined);
-                    let n = new cSnCirc(undefined, cn); // pour initialiser la calculabilité des paramètres
+                    let n = new cSnCirc(cn); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
 
@@ -64,7 +64,7 @@ export class ComputeNodeParameters {
                 {
                     let cn = new ParamsSectionPuiss(undefined, undefined, undefined, undefined,
                         undefined, undefined, undefined, undefined, undefined, undefined);
-                    let n = new cSnPuiss(undefined, cn); // pour initialiser la calculabilité des paramètres
+                    let n = new cSnPuiss(cn); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
 
@@ -74,7 +74,7 @@ export class ComputeNodeParameters {
                         undefined, undefined, undefined, undefined, undefined,
                         ComputeNodeType.RegimeUniformeTrapeze,
                         ComputeNodeType.RegimeUniforme);
-                    let n = new cSnTrapez(undefined, cn);
+                    let n = new cSnTrapez(cn);
                     let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
@@ -84,7 +84,7 @@ export class ComputeNodeParameters {
                     let cn = new ParamsSectionRectang(undefined, undefined, undefined,
                         undefined, undefined, undefined, undefined,
                         ComputeNodeType.RegimeUniforme);
-                    let n = new cSnRectang(undefined, cn);
+                    let n = new cSnRectang(cn);
                     let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
@@ -95,7 +95,7 @@ export class ComputeNodeParameters {
                         undefined, undefined, undefined, undefined,
                         ComputeNodeType.RegimeUniformeCercle,
                         ComputeNodeType.RegimeUniforme);
-                    let n = new cSnCirc(undefined, cn);
+                    let n = new cSnCirc(cn);
                     let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
@@ -106,7 +106,7 @@ export class ComputeNodeParameters {
                         undefined, undefined, undefined, undefined, undefined,
                         ComputeNodeType.RegimeUniformePuissance,
                         ComputeNodeType.RegimeUniforme);
-                    let n = new cSnPuiss(undefined, cn);
+                    let n = new cSnPuiss(cn);
                     let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres
                     return cn;
                 }
@@ -117,9 +117,9 @@ export class ComputeNodeParameters {
                         0.001, 1,
                         ComputeNodeType.CourbeRemousCercle,
                         ComputeNodeType.CourbeRemous);
-                    let n = new cSnCirc(undefined, cn);
+                    let n = new cSnCirc(cn);
                     let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined);
-                    let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres
+                    let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres
                     return crp
                 }
 
@@ -129,9 +129,9 @@ export class ComputeNodeParameters {
                         undefined, 0.001, 1,
                         ComputeNodeType.CourbeRemousPuissance,
                         ComputeNodeType.CourbeRemous);
-                    let n = new cSnPuiss(undefined, cn);
+                    let n = new cSnPuiss(cn);
                     let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined);
-                    let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres
+                    let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres
                     return crp;
                 }
 
@@ -140,9 +140,9 @@ export class ComputeNodeParameters {
                     let cn = new ParamsSectionRectang(undefined, 1, undefined, 1, undefined,
                         0.001, 1,
                         ComputeNodeType.CourbeRemous);
-                    let n = new cSnRectang(undefined, cn);
+                    let n = new cSnRectang(cn);
                     let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined);
-                    let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres
+                    let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres
                     return crp;
                 }
 
@@ -152,9 +152,9 @@ export class ComputeNodeParameters {
                         undefined, 0.001, 1,
                         ComputeNodeType.CourbeRemousTrapeze,
                         ComputeNodeType.CourbeRemous);
-                    let n = new cSnTrapez(undefined, cn);
+                    let n = new cSnTrapez(cn);
                     let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined);
-                    let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres
+                    let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres
                     return crp;
                 }
 
diff --git a/src/remous.ts b/src/remous.ts
index bf6210e49e07fcaca95155717925d077b8dc2a6f..3df80f2727b25f2d226e9d153f6cf0aeeff36252 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -3,7 +3,7 @@ import { XOR, Result, round } from "./base";
 import { ParamsEquation, ParamDefinition, ParamCalculability, ComputeNodeType, ParamDomainValue } from "./param";
 import { Dichotomie } from "./dichotomie";
 import { Nub } from "./nub";
-import { ErrorCode, ErrorMessage } from "./util/error";
+import { Message, MessageCode } from "./util/message";
 import { cLog } from "./util/log";
 
 export enum MethodeResolution {
@@ -100,8 +100,6 @@ export class CourbeRemous extends Nub {
 
 	private _debugDicho: boolean = false;
 
-	private static DBG: boolean = false; /// Pour loguer les messages de debug de cette classe
-
 	/**
 	 * Journal de calcul
 	 */
@@ -114,13 +112,17 @@ export class CourbeRemous extends Nub {
 	 */
 	private Dx: number;
 
-	constructor(crp: CourbeRemousParams, log: cLog) {
-		super(crp, CourbeRemous.DBG);
-		this._log = log;
+	constructor(crp: CourbeRemousParams, dbg: boolean = false) {
+		super(crp, dbg);
+		this._log = crp.Sn.log;
 		this.prmSect = crp.Sn.prms;
 		this.Sn.Calc("Yc");
 	}
 
+	public get log() {
+		return this._log;
+	}
+
 	private get Sn(): acSection {
 		return this.prms.Sn;
 	}
@@ -167,7 +169,7 @@ export class CourbeRemous extends Nub {
 		// L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
 		let Y2 = Y + this.Dx * this.Calc_dYdX(Y);
 		if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique)))
-			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
+			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		return new Result(Y2);
 	}
@@ -188,21 +190,21 @@ export class CourbeRemous extends Nub {
 
 		//if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk1 < $this ->oSect ->rHautCritique)) { return false; }
 		if (XOR(Dx > 0, !(Y + Dx / 2 * k1 < hc)))
-			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
+			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		//$rk2 = $this ->Calc_dYdX($Y + $rDx / 2 * $rk1);
 		let k2 = this.Calc_dYdX(Y + Dx / 2 * k1);
 
 		//if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk2 < $this ->oSect ->rHautCritique)) { return false; }
 		if (XOR(Dx > 0, !(Y + Dx / 2 * k2 < hc)))
-			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
+			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		//$rk3 = $this ->Calc_dYdX($Y + $rDx / 2 * $rk2);
 		let k3 = this.Calc_dYdX(Y + Dx / 2 * k2);
 
 		//if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk3 < $this ->oSect ->rHautCritique)) { return false; }
 		if (XOR(Dx > 0, !(Y + Dx / 2 * k3 < hc)))
-			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
+			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		//$rk4 = $this ->Calc_dYdX($Y + $rDx * $rk3);
 		let k4 = this.Calc_dYdX(Y + Dx * k3);
@@ -212,7 +214,7 @@ export class CourbeRemous extends Nub {
 
 		//if ($this ->rDx > 0 xor !($Yout < $this ->oSect ->rHautCritique)) { return false; }
 		if (XOR(Dx > 0, !(Yout < hc)))
-			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
+			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		return new Result(Yout);
 	}
@@ -252,13 +254,13 @@ export class CourbeRemous extends Nub {
 		let r: Result = Dicho.Dichotomie(Trapez_Fn, this.prmSect.Prec.v, Y);
 
 		// if ($flag < 0) {
-		if (r.code != ErrorCode.ERROR_OK)
+		if (r.code != MessageCode.ERROR_OK)
 			return r;
 
 		let Y2 = r.vCalc;
 		// } elseif($this ->rDx > 0 xor !($Y2 < $this ->oSect ->rHautCritique)) {
 		if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique)))
-			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
+			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		return new Result(Y2);
 	}
@@ -335,7 +337,7 @@ export class CourbeRemous extends Nub {
 			// this.debug("end trY " + this.last(trY));
 			// this.debug("Yn " + this.Sn.HautNormale);
 
-			if (rY.code == ErrorCode.ERROR_OK) {
+			if (rY.code == MessageCode.ERROR_OK) {
 				// on vérifie qu'on ne traverse pas la hauteur normale (à la précision de calcul près)
 				let prec: number = this.prms.map.Prec.v;
 				let b1: boolean = lastY - this.Sn.HautNormale > prec;
@@ -343,14 +345,14 @@ export class CourbeRemous extends Nub {
 				if (XOR(b1, b2)) {
 					this.debug("La pente de la ligne d'eau est trop forte à l'abscisse " + x + " m (Il faudrait réduire le pas de discrétisation)");
 
-					let m: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE);
+					let m: Message = new Message(MessageCode.ERROR_REMOUS_PENTE_FORTE);
 					m.extraVar["x"] = x;
 					this._log.add(m);
 				}
 
 				trY[round(x, this.prmSect.iPrec.v)] = rY.vCalc;
 			} else {
-				let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE);
+				let m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE);
 				m.extraVar["x"] = x;
 				this._log.add(m);
 				this.debug("Arrêt du calcul : Hauteur critique atteinte à l'abscisse " + x + " m");
@@ -390,6 +392,50 @@ export class CourbeRemous extends Nub {
 		}
 	}
 
+	/**
+	 * calcul de la ligne fluviale depuis l'aval (si possible)
+	 */
+	public calculFluvial() {
+		let res: { [key: number]: number; } = {};
+
+		// Calcul depuis l'aval
+		if (this.Sn.HautCritique <= this.prms.Yaval.v) {
+			this._log.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+			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);
+		}
+		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));
+		}
+
+		return res;
+	}
+
+	/**
+	 * calcul de la ligne torrentielle depuis l'amont (si possible)
+	 */
+	public calculTorrentiel() {
+		let res: { [key: number]: number; } = {};
+
+		// Calcul depuis l'amont
+		if (this.Sn.HautCritique >= this.prms.Yamont.v) {
+			this._log.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+			this.debug("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);
+		}
+		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");
+		}
+
+		return res;
+	}
+
 	/**
 	 * @param val_a_cal nom de la variable à calculer
 	 */
@@ -397,20 +443,21 @@ export class CourbeRemous extends Nub {
 		"flu": { [key: number]: number; },
 		"tor": { [key: number]: number; },
 		"trX": string[],
-		"tRes": number[]
+		"tRes": { [key: number]: number }
 	} {
 		let Yc: number = this.Sn.Calc("Yc");
 
-		let m: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
-		m.extraVar["B"] = this.Sn.Calc("B");
+		let m: Message = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE);
+		m.extraVar["B"] = this.Sn.Calc("B", this.Sn.prms.YB.v);
 		this._log.add(m);
 
-		m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+		m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE);
 		m.extraVar["Yc"] = Yc;
 		this._log.add(m);
 
-		m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
-		m.extraVar["Yn"] = this.Sn.Calc("Yn");
+		let Yn = this.Sn.Calc("Yn");
+		m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE);
+		m.extraVar["Yn"] = Yn;
 		this._log.add(m);
 
 		this.debug("largeur berge " + this.Sn.Calc("B"));
@@ -419,59 +466,43 @@ export class CourbeRemous extends Nub {
 		this.debug("hauteur normale " + this.Sn.HautNormale);
 
 		// Calcul des courbes de remous
-		let crbFlu: { [key: number]: number; } = undefined;
-		let crbTor: { [key: number]: number; } = undefined;
+		let crbFlu: { [key: number]: number; } = this.calculFluvial();
+		let crbTor: { [key: number]: number; } = this.calculTorrentiel();
 
 		//this.debug("HautCritique ", this.Sn.HautCritique);
 
-		// Calcul depuis l'aval
-		if (this.Sn.HautCritique <= this.prms.Yaval.v) {
-			this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
-
-			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;
-			crbFlu = this.calcul(this.prms.Yaval.v);
-		}
-		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 ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL));
-		}
-
 		this.debug("flu ");
 		// this.logObject(crbFlu);
 		this.debug(JSON.stringify(crbFlu));
 
-		// Calcul depuis l'amont
-		if (this.Sn.HautCritique >= this.prms.Yamont.v) {
-			this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
-
-			this.debug("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;
-			crbTor = this.calcul(this.prms.Yamont.v);
-		}
-		else {
-			this._log.add(new ErrorMessage(ErrorCode.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");
-		}
-
 		this.debug("tor");
 		// this.logObject(crbTor);
 		this.debug(JSON.stringify(crbTor));
 
+		for (let xflu in crbFlu) {
+			let yflu = crbFlu[xflu];
+			this.debug("imp x " + xflu + " flu " + this.Sn.Calc('Imp', yflu));
+		}
+
+		for (let xtor in crbTor) {
+			let ytor = crbTor[xtor];
+			this.debug("imp x " + xtor + " tor " + this.Sn.Calc('Imp', ytor));
+		}
+
 		// Détection du ressaut hydraulique
 		let nFlu: number = this.size(crbFlu);
 		let nTor: number = this.size(crbTor);
 		if (nFlu != 0 && nTor != 0) {
-			let xMaxFlu = crbFlu[0];
-			let xMaxTor = this.last(crbTor);
-			// this.debug("end flu " + xMaxFlu);
-			// this.debug("end tor " + xMaxTor);
+			let firstYFlu = crbFlu[0];
+			let lastYTor = this.last(crbTor);
+			// this.debug("end flu " + firstYFlu);
+			// this.debug("end tor " + lastYTor);
 			// this.debug("nFlu " + nFlu);
 			// this.debug("nTor " + nTor);
-			// this.debug("Imp flu " + this.Sn.Calc('Imp', xMaxFlu));
-			// this.debug("Imp tor " + this.Sn.Calc('Imp', xMaxTor));
-			// if (nFlu > nTor || (nFlu == nTor && this.Sn.Calc('Imp', this.last(crbFlu)) > this.Sn.Calc('Imp', this.last(crbTor)))) {
-			if (nFlu > nTor || (nFlu == nTor && this.Sn.Calc('Imp', xMaxFlu) > this.Sn.Calc('Imp', xMaxTor))) {
+			// this.debug("Imp flu " + this.Sn.Calc('Imp', firstYFlu));
+			// this.debug("Imp tor " + this.Sn.Calc('Imp', lastYTor));
+
+			if (nFlu > nTor || (nFlu == nTor && Yn < Yc)) {
 				// La courbe fluviale va jusqu'au bout
 				var crbComplete = crbFlu;  // courbe calculée sur tout le bief
 				var crbPartielle = crbTor;  // courbe calculée sur une partie seulement du bief
@@ -497,13 +528,13 @@ export class CourbeRemous extends Nub {
 
 			// Parcours des sections de la ligne d'eau la plus courte
 			let trX: string[] = Object.keys(crbPartielle);
-			if (iSens == -1)
+			if (iSens == -1) // tri dans l'ordre croissant
 				trX.sort((a, b) => {
 					if (+a > +b) return 1;
 					if (+a < +b) return -1;
 					return 0;
 				});
-			else
+			else  // tri dans l'ordre décroissant
 				trX.sort((a, b) => {
 					if (+a > +b) return -1;
 					if (+a < +b) return 1;
@@ -539,49 +570,41 @@ export class CourbeRemous extends Nub {
 				xRst = round(xRst, this.prmSect.iPrec.v);
 				// this.debug("xRst (arr)=" + xRst);
 
+				let impYpartielle = this.Sn.Calc('Imp', crbPartielle[rX]);
+				// this.debug("imp(Ypartiel[rX=" + rX + "]=" + crbPartielle[rX] + ")=" + impYpartielle);
+
 				if (crbComplete[xRst] != undefined) {
 					// Hauteur décalée de la longueur du ressaut (il faut gérer la pente du fond)
 					let Ydec: number = crbComplete[xRst] + rLongRst * this.prmSect.If.v * iSens;
 					// this.debug("Ydec=" + Ydec);
-					// this.debug("imp(Ycomplet[xRst=" + xRst + "]=" + crbComplete[xRst] + ")=" + this.Sn.Calc('Imp', crbComplete[xRst]));
-					// this.debug("imp(Ypartiel[rX=" + rX + "]=" + crbPartielle[rX] + ")=" + this.Sn.Calc('Imp', crbPartielle[rX]));
+					let impYcomplete = this.Sn.Calc('Imp', crbComplete[xRst]);
+					// this.debug("imp(Ycomplet[xRst=" + xRst + "]=" + crbComplete[xRst] + ")=" + impYcomplete);
 
-					// if (iSens == 1 ? Yco > Ydec : Yco < Ydec) {
-					if (Yco > Ydec) {
+					if (impYpartielle > impYcomplete) {
 						this.debug("Ressaut hydraulique détecté entre les abscisses " + Math.min(rX, xRst) + " et " + Math.max(rX, xRst));
-						m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+						m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO);
 						m.extraVar["xmin"] = Math.min(rX, xRst);
 						m.extraVar["xmax"] = Math.max(rX, xRst);
 						this._log.add(m);
 						// this.debug("rX=" + rX + " xRst=" + xRst);
 
-						// Modification de la ligne d'eau CC
+						// Modification de la ligne d'eau complète
 						for (let pi of trXr) {
 							let rXCC: number = +pi;
 							// this.debug("rXCC=" + rXCC);
-							if (iSens * (rXCC - rX) < 0) {
+							if (iSens * (rXCC - rX) <= 0) {
 								delete crbComplete[rXCC];
-								this.debug("Modification de la ligne d'eau complète : suppression de la valeur à rX=" + rXCC);
-							} else if (rXCC == rX) {
-								this.debug("Modification de la ligne d'eau complète : valeur " + crbComplete[rXCC] + " remplacée par " + crbPartielle[rXCC] + " à rX=" + rXCC);
-								crbComplete[rXCC] = crbPartielle[rXCC];
-								this.debug("Fin de la modification de la ligne d'eau complète");
-								break;
+								this.debug("Modification de la ligne d'eau complète : suppression de la valeur à rXCC=" + rXCC + ", rX=" + rX + ", iSens*(rXCC-rX)=" + (iSens * (rXCC - rX)));
 							}
 						}
 
-						// Modification de la ligne d'eau CN
+						// Modification de la ligne d'eau partielle
 						for (let xcn of trX) {
 							let rXCN = +xcn;
 							// this.debug("rXCN=" + rXCN);
-							if (iSens * (rXCN - xRst) > 0) {
+							if (iSens * (rXCN - xRst) >= 0) {
 								this.debug("Modification de la ligne d'eau partielle : suppression de la valeur à rX=" + rXCN);
 								delete crbPartielle[rXCN];
-							} else if (rXCN == xRst) {
-								this.debug("Modification de la ligne d'eau partielle : valeur " + crbPartielle[rXCN] + " remplacée par " + crbComplete[rXCN] + " à rX=" + rXCN);
-								crbPartielle[rXCN] = crbComplete[rXCN];
-								this.debug("Fin de la modification de la ligne d'eau partielle");
-								break;
 							}
 						}
 						bRessaut = true;
@@ -591,7 +614,7 @@ export class CourbeRemous extends Nub {
 			}
 			if (!bRessaut) {
 				// Le ressaut est en dehors du canal
-				let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+				let m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS);
 				m.extraVar["sens"] = sSens;
 				m.extraVar["x"] = +this.last(trX);
 				this._log.add(m);
@@ -640,23 +663,28 @@ export class CourbeRemous extends Nub {
 
 		// Calcul de la variable à calculer
 
-		let tRes: number[] = [];
+		let tRes: { [key: number]: number } = {};
 		if (val_a_cal != undefined && nFlu != 0 && nTor != 0) {
 			for (let rX of trX) {
 				let rY = undefined;
+				let hasFlu: boolean = crbFlu[+rX] != undefined;
+				let hasTor: boolean = crbTor[+rX] != undefined;
 
-				if (crbFlu[+rX] != undefined && crbTor[+rX] == undefined) {
+				if (hasFlu && !hasTor)
 					rY = crbFlu[+rX];
-				}
-				if (crbTor[+rX] != undefined) {
-					if (crbFlu[+rX] == undefined || (crbFlu[+rX] != undefined && crbFlu[+rX] == crbTor[+rX])) {
+
+				if (hasTor)
+					if (!hasFlu || (hasFlu && crbFlu[+rX] == crbTor[+rX]))
 						rY = crbTor[+rX];
-					}
 
-					if (rY != undefined)
-						tRes[+rX] = this.Sn.Calc(val_a_cal, rY);
+				if (rY != undefined) {
+					tRes[+rX] = this.Sn.Calc(val_a_cal, rY);
+					this.debug('X=' + rX + ' Calc(' + val_a_cal + ', Y=' + rY + ')=' + tRes[+rX]);
 				}
 			}
+
+			this.debug("extra param " + val_a_cal);
+			this.logObject(tRes);
 		}
 
 		return { "flu": crbFlu, "tor": crbTor, "trX": trX, "tRes": tRes };
diff --git a/src/section/hauteur.ts b/src/section/hauteur.ts
index 63d181c1dd7b170645fbee4bc5a8a73bafb2af3b..9a3faa0eac9f8eb35aa251a768a78a89d12a0f85 100644
--- a/src/section/hauteur.ts
+++ b/src/section/hauteur.ts
@@ -15,8 +15,8 @@ export class cHautCritique extends acNewton {
          * Constructeur de la classe
          * @param Sn Section sur laquelle on fait le calcul
          */
-        constructor(Sn: acSection, dbg: boolean = false) {
-                super(Sn.prms, dbg);
+        constructor(Sn: acSection, maxIter: number, dbg: boolean = false) {
+                super(Sn.prms, maxIter, dbg);
                 this.Sn = Sn.clone();
         }
 
@@ -77,8 +77,8 @@ export class cHautNormale extends acNewton {
          * Constructeur de la classe
          * @param oSn Section sur laquelle on fait le calcul
          */
-        constructor(Sn: acSection, dbg: boolean = false) {
-                super(Sn.prms, dbg);
+        constructor(Sn: acSection, maxIter: number, dbg: boolean = false) {
+                super(Sn.prms, maxIter, dbg);
                 this.Sn = Sn;
                 this.Q = Sn.prms.Q.v;
                 this.Ks = Sn.prms.Ks.v;
@@ -135,8 +135,8 @@ export class cHautCorrespondante extends acNewton {
          * Constructeur de la classe
          * @param oSn Section sur laquelle on fait le calcul
          */
-        constructor(Sn: acSection, dbg: boolean = false) {
-                super(Sn.prms, dbg);
+        constructor(Sn: acSection, maxIter: number, dbg: boolean = false) {
+                super(Sn.prms, maxIter, dbg);
                 this.Y = Sn.prms.Y.v;
                 this.rS2 = Math.pow(Sn.Calc("S"), -2);
                 this.Sn = Sn;
@@ -186,8 +186,8 @@ export class cHautConjuguee extends acNewton {
          * Constructeur de la classe
          * @param oSn Section sur laquelle on fait le calcul
          */
-        constructor(oSn: acSection, dbg: boolean = false) {
-                super(oSn.prms, dbg);
+        constructor(oSn: acSection, maxIter: number, dbg: boolean = false) {
+                super(oSn.prms, maxIter, dbg);
                 this.rQ2 = Math.pow(oSn.prms.Q.v, 2);
                 this.Sn = oSn;
                 this.rS = oSn.Calc("S");
diff --git a/src/section/newton.ts b/src/section/newton.ts
index fd1d0813fa987e3a574850afef5dfde872fa5ecd..f3b76d66cac86dd9b5af65076b95d3497f23d211 100644
--- a/src/section/newton.ts
+++ b/src/section/newton.ts
@@ -4,8 +4,8 @@ import { cParamsCanal } from "./section_type"
 export abstract class acNewton extends Debug {
         protected rTol: number;
         protected Dx: number;
-        private iCpt = 0;
-        private readonly iCptMax = 50;
+        private iCpt: number = 0;
+        private iCptMax: number;
         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
@@ -14,10 +14,11 @@ export abstract class acNewton extends Debug {
          * Constructeur de la classe
          * @param prms Paramètres supplémentaires (Débit, précision...)
          */
-        constructor(prms: cParamsCanal, dbg: boolean = false) {
+        constructor(prms: cParamsCanal, maxIter: number, dbg: boolean = false) {
                 super(dbg);
                 this.rTol = prms.Prec.v;
                 this.Dx = prms.Prec.v / 10;
+                this.iCptMax = maxIter;
         }
 
         /**
@@ -92,4 +93,12 @@ export abstract class acNewton extends Debug {
                 // Echec de la résolution
                 return undefined;
         }
+
+        /**
+	 * Pour savoir si le Newton a convergé
+	 * @return true si oui, false sinon
+	 */
+        public hasConverged(): boolean {
+                return this.iCpt < this.iCptMax;
+        }
 }
\ No newline at end of file
diff --git a/src/section/section_circulaire.ts b/src/section/section_circulaire.ts
index d469a9be84bb727f5e1825bcae6e75dc31d7b294..a9814d6d64abd5ad3a15f3dad804523791786223 100644
--- a/src/section/section_circulaire.ts
+++ b/src/section/section_circulaire.ts
@@ -1,7 +1,7 @@
 import { ComputeNodeType, ParamDefinition, ParamDomainValue, ParamCalculability } from "../param";
 import { acSection, ParamsSection } from "./section_type";
 import { cLog } from "../util/log";
-import { ErrorMessage, ErrorCode } from '../util/error';
+import { Message, MessageCode } from "../util/message";
 
 export class ParamsSectionCirc extends ParamsSection {
         private _D: ParamDefinition;          // Diamètre du cercle
@@ -30,8 +30,8 @@ export class ParamsSectionCirc extends ParamsSection {
 export class cSnCirc extends acSection {
         protected nbDessinPoints = 50;
 
-        constructor(oLog: cLog, prms: ParamsSectionCirc, dbg: boolean = false) {
-                super(oLog, prms, dbg);
+        constructor(prms: ParamsSectionCirc, dbg: boolean = false) {
+                super(prms, dbg);
                 // commenté car si D est la variable à déterminer, il peut valoir n'importe quoi... if (prms.YB.v > D) { prms.YB.v = D; } // On place la berge au sommet du cercle 
 
                 // if (this.prms.D.isDefined() && this.prms.YB.isDefined())
@@ -144,7 +144,7 @@ export class cSnCirc extends acSection {
                         return res;
                 }
 
-                let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_UNDEFINED);
+                let e: Message = new Message(MessageCode.ERROR_PARAMDEF_VALUE_UNDEFINED);
                 e.extraVar["diameterValue"] = this.prms.D.isDefined ? String(this.prms.D.v) : "undefined";
                 e.extraVar["yValue"] = this.prms.Y.isDefined ? String(this.prms.Y.v) : "undefined";
                 throw e;
diff --git a/src/section/section_puissance.ts b/src/section/section_puissance.ts
index 9d734043444a5cc507509f1d5c6b2bb7218f8b7b..8105e14f5fe185e205e0ad743d768e62a6ce4e2c 100644
--- a/src/section/section_puissance.ts
+++ b/src/section/section_puissance.ts
@@ -1,6 +1,5 @@
 import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability } from "../param";
 import { acSection, ParamsSection } from "./section_type";
-import { cLog } from "../util/log";
 
 /**
  * Paramètres de la section parabolique ou "puissance"
@@ -31,8 +30,8 @@ export class ParamsSectionPuiss extends ParamsSection {
 export class cSnPuiss extends acSection {
         protected nbDessinPoints = 50;
 
-        constructor(oLog: cLog, prms: ParamsSectionPuiss, dbg: boolean = false) {
-                super(oLog, prms, dbg);
+        constructor(prms: ParamsSectionPuiss, dbg: boolean = false) {
+                super(prms, dbg);
         }
 
         protected setParametersCalculability() {
diff --git a/src/section/section_rectang.ts b/src/section/section_rectang.ts
index 94e8194c45a6f48ccb07de6b4a0f1c8d513a2c8d..67299a61ad8b4aa6d34a3e7a5212fe3e488a99a0 100644
--- a/src/section/section_rectang.ts
+++ b/src/section/section_rectang.ts
@@ -15,8 +15,8 @@ export class ParamsSectionRectang extends ParamsSection {
  * Calculs de la section rectangulaire
  */
 export class cSnRectang extends acSection {
-        constructor(oLog: cLog, prms: ParamsSectionRectang, dbg: boolean = false) {
-                super(oLog, prms, dbg);
+        constructor(prms: ParamsSectionRectang, dbg: boolean = false) {
+                super(prms, dbg);
         }
 
         get prms(): ParamsSectionRectang {
diff --git a/src/section/section_trapez.ts b/src/section/section_trapez.ts
index cbe149dcdb42dfd8d855639cd801223580d671d3..4bf29e2ad2a460edbb987d954fefa481fa9f6da7 100644
--- a/src/section/section_trapez.ts
+++ b/src/section/section_trapez.ts
@@ -38,8 +38,8 @@ export class ParamsSectionTrapez extends ParamsSection {
  * Calculs de la section trapézoïdale
  */
 export class cSnTrapez extends acSection {
-        constructor(oLog: cLog, prms: ParamsSectionTrapez, dbg: boolean = false) {
-                super(oLog, prms, dbg);
+        constructor(prms: ParamsSectionTrapez, dbg: boolean = false) {
+                super(prms, dbg);
         }
 
         protected setParametersCalculability() {
diff --git a/src/section/section_type.ts b/src/section/section_type.ts
index c898f5d8fd84bc0ff0a085a7170b39e391630b75..5a6a944f57db7700d756031c07652654db30298b 100644
--- a/src/section/section_type.ts
+++ b/src/section/section_type.ts
@@ -1,5 +1,6 @@
 import { XOR } from "../base";
 import { cLog } from "../util/log";
+import { MessageCode, Message } from "../util/message";
 import { ComputeNodeType, ComputeNode, ParamDefinition, ParamDomainValue, ParamCalculability, ParamsEquation } from "../param";
 import { cHautCritique, cHautNormale, cHautCorrespondante, cHautConjuguee } from "./hauteur";
 
@@ -149,18 +150,17 @@ export abstract class acSection extends ComputeNode {
         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
+         * itérations max pour Newton
          */
-        protected nbDessinPoints = 1;
+        private _newtonMaxIter: number = 50;
 
         /**
          * Construction de la classe.
          * Calcul des hauteurs normale et critique
          */
-        constructor(oLog: cLog, prms: ParamsSection, dbg: boolean = false) {
+        constructor(prms: ParamsSection, dbg: boolean = false) {
                 super(prms, dbg);
-                this.oLog = oLog;
+                this.oLog = new cLog();
 
                 // this._v = oP.v;  // copie la référence au tableau
                 // this.prms.Y.v = 0;
@@ -188,6 +188,14 @@ export abstract class acSection extends ComputeNode {
                 return Object.create(this);
         }
 
+        public set newtonMaxIter(n: number) {
+                this._newtonMaxIter = n;
+        }
+
+        public get log(): cLog {
+                return this.oLog;
+        }
+
         /**
          * Efface toutes les données calculées pour forcer le recalcul
          * @param bGeo Réinitialise les données de géométrie aussi
@@ -500,8 +508,12 @@ export abstract class acSection extends ComputeNode {
          * @return tirant d'eau critique
          */
         private Calc_Yc(): number {
-                var hautCritique = new cHautCritique(this, this.DBG);
+                let hautCritique = new cHautCritique(this, this._newtonMaxIter, this.DBG);
                 this.HautCritique = hautCritique.Newton(this.prms.YB.v);
+                if (this.HautCritique == undefined || !hautCritique.hasConverged()) {
+                        let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
+                        this.oLog.add(m);
+                }
                 return this.HautCritique;
         }
 
@@ -511,11 +523,20 @@ export abstract class acSection extends ComputeNode {
          */
         private Calc_Yn(): number {
                 this.debug("in calc_Yn");
-                if (this.prms.If.v <= 0)
+                if (this.prms.If.v <= 0) {
+                        let m = new Message(MessageCode.ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF);
+                        this.oLog.add(m);
                         return undefined;
+                }
+
+                let oHautNormale = new cHautNormale(this, this._newtonMaxIter, this.DBG);
+                let res = oHautNormale.Newton(this.CalcGeo("Yc"));
+                if (res == undefined || !oHautNormale.hasConverged()) {
+                        let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE);
+                        this.oLog.add(m);
+                }
 
-                var oHautNormale = new cHautNormale(this, this.DBG);
-                return oHautNormale.Newton(this.CalcGeo("Yc"));
+                return res;
         }
 
         /**
@@ -526,8 +547,14 @@ export abstract class acSection extends ComputeNode {
                 if (this.prms.Y.v > this.CalcGeo("Yc"))
                         return this.prms.Y.v;
 
-                var oHautCorrespondante = new cHautCorrespondante(this, this.DBG);
-                return oHautCorrespondante.Newton(this.Calc("Yc") * 2);
+                var oHautCorrespondante = new cHautCorrespondante(this, this._newtonMaxIter, this.DBG);
+                let res = oHautCorrespondante.Newton(this.Calc("Yc") * 2);
+                if (res == undefined || !oHautCorrespondante.hasConverged()) {
+                        let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU);
+                        this.oLog.add(m);
+                }
+
+                return res;
         }
 
         /**
@@ -538,8 +565,14 @@ export abstract class acSection extends ComputeNode {
                 if (this.prms.Y.v < this.CalcGeo("Yc"))
                         return this.prms.Y.v;
 
-                var oHautCorrespondante = new cHautCorrespondante(this, this.DBG);
-                return oHautCorrespondante.Newton(this.CalcGeo("Yc") / 2);
+                var oHautCorrespondante = new cHautCorrespondante(this, this._newtonMaxIter, this.DBG);
+                let res = oHautCorrespondante.Newton(this.CalcGeo("Yc") / 2);
+                if (res == undefined || !oHautCorrespondante.hasConverged()) {
+                        let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR);
+                        this.oLog.add(m);
+                }
+
+                return res;
         }
 
         /**
@@ -548,7 +581,7 @@ export abstract class acSection extends ComputeNode {
          */
         private Calc_Yco(): number {
                 this.Swap(true);
-                var oHautConj = new cHautConjuguee(this, this.DBG);
+                var oHautConj = new cHautConjuguee(this, this._newtonMaxIter, this.DBG);
                 // Choisir une valeur initiale du bon côté de la courbe
                 if (this.Calc("Fr") < 1) {
                         // Ecoulement fluvial, on cherche la conjuguée à partir du tirant d'eau torrentiel
@@ -559,6 +592,11 @@ export abstract class acSection extends ComputeNode {
                         Y0 = this.Calc("Yf");
                 }
                 let Yco = oHautConj.Newton(Y0);
+                if (Yco == undefined || !oHautConj.hasConverged()) {
+                        let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG);
+                        this.oLog.add(m);
+                }
+
                 this.Swap(false);
                 return Yco;
         }
diff --git a/src/util/log.ts b/src/util/log.ts
index 25001043d6c2385eab6f92659144679882cdb0f4..401fbc9c9dbcdfe364ee600a4994eab1e1cbce0e 100644
--- a/src/util/log.ts
+++ b/src/util/log.ts
@@ -1,9 +1,9 @@
-import { ErrorMessage } from "./error";
+import { Message, MessageCode } from "./message";
 
 export class cLog {
-    private _messages: ErrorMessage[] = [];
+    private _messages: Message[] = [];
 
-    public add(m: ErrorMessage) {
+    public add(m: Message) {
         this._messages.push(m);
     }
 
diff --git a/src/util/error.ts b/src/util/message.ts
similarity index 71%
rename from src/util/error.ts
rename to src/util/message.ts
index 79d568bda4b88a829f7982fc697b1b08afc3a671..a4ee532a837b1b54450f50e938a7ec690bd44021 100644
--- a/src/util/error.ts
+++ b/src/util/message.ts
@@ -1,4 +1,4 @@
-export enum ErrorCode {
+export enum MessageCode {
     /**
      * pas de pb !
      */
@@ -157,29 +157,77 @@ export enum ErrorCode {
      * courbe de remous : Condition limite amont > Hauteur critique : pas de calcul possible depuis l'amont
      */
     ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT = -510,
+
+    /**
+     * section : Non convergence du calcul de la hauteur critique (Méthode de Newton)
+     */
+    ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE = -600,
+
+    /**
+     * section : Non convergence du calcul de la hauteur normale (Méthode de Newton)
+     */
+    ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE = -601,
+
+    /**
+     * section : Non convergence du calcul de la hauteur conjuguée (Méthode de Newton)
+     */
+    ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG = -602,
+
+    /**
+     * section : Non convergence du calcul de la hauteur correspondante (Méthode de Newton) pour le calcul de la hauteur fluviale
+     */
+    ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU = -603,
+
+    /**
+     * section : Non convergence du calcul de la hauteur correspondante (Méthode de Newton) pour le calcul de la hauteur torrentielle
+     */
+    ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR = -604,
+
+    /**
+     * section : La pente est négative ou nulle, la hauteur normale est infinie
+     */
+    ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF = -605,
+}
+
+/**
+ * niveau de criticité du message
+ */
+export enum MessageSeverity {
+    ERROR, WARNING, INFO
 }
 
 /**
  * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
  */
-export class ErrorMessage {
+export class Message {
     /**
-     * code d'erreur
+     * code du message
      */
-    private _code: ErrorCode;
+    private _code: MessageCode;
 
     /** Variables intermédiaires, flags d'erreur */
-    // public extraVar: {};
     public extraVar: { [key: string]: any };
 
-    constructor(c: ErrorCode) {
+    constructor(c: MessageCode) {
         this._code = c;
         this.extraVar = {}
     };
 
     get code() { return this._code; }
 
+    /**
+     * retourne le niveau de criticité (erreur, warning, info) du message
+     */
+    public getSeverity(): MessageSeverity {
+        let m: string = MessageCode[this._code];
+        let prefix: string = m.split("_")[0];
+        for (let s in MessageSeverity) // pas nécessaire, mais permet d'avoir un contrôle de validité
+            if (MessageSeverity[s] == prefix)
+                return eval("MessageSeverity." + prefix);
+        throw "Message.getSeverity() : valeur de code '" + this._code + "' invalide";
+    }
+
     public toString(): string {
-        return ErrorCode[this._code] + " " + JSON.stringify(this.extraVar);
+        return MessageCode[this._code] + " " + JSON.stringify(this.extraVar);
     }
 }