diff --git a/spec/remous_rect_rk4_pentefaible.spec.ts b/spec/remous_rect_rk4_pentefaible.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6eccf7892f9d65af4a88f555cf246f3c3a984a70
--- /dev/null
+++ b/spec/remous_rect_rk4_pentefaible.spec.ts
@@ -0,0 +1,313 @@
+import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang";
+import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous";
+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";
+
+
+describe('Class Remous / section rectangulaire :', () => {
+    describe('méthode Runge-Kutta ordre 4 :', () => {
+        it("faible pente, ressaut avant l'amont", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.3, // Yamont = tirant amont
+                0.41, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            let res = rem.calculRemous(undefined);
+
+            // données de validation : version PHP (Oct 2017) méthode RungeKutta4
+
+            let f = { 100.000: 0.41, 95.000: 0.876, 90.000: 0.877, 85.000: 0.879, 80.000: 0.88, 75.000: 0.881, 70.000: 0.883, 65.000: 0.884, 60.000: 0.885, 55.000: 0.886, 50.000: 0.888, 45.000: 0.889, 40.000: 0.89, 35.000: 0.891, 30.000: 0.892, 25.000: 0.893, 20.000: 0.894, 15.000: 0.895, 10.000: 0.896, 5.000: 0.897, 0.000: 0.898 };
+            compareObject("Yfluvial", res["flu"], f, 0.03);
+
+            let t = {};
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.953;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m.extraVar["x"] = 5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m.extraVar["sens"] = "amont";
+            m.extraVar["x"] = 0;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("faible pente, ressaut (1 point) à l'intérieur du bief", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont
+                0.42, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            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 };
+            compareObject("Yfluvial", res["flu"], f, 0.03);
+
+            let t = { 0.000: 0.15, 5.000: 0.76 };
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.953;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m.extraVar["x"] = 15;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m.extraVar["xmin"] = 0;
+            m.extraVar["xmax"] = 5;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("faible pente, ressaut (plusieurs points) à l'intérieur du bief", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                // 0.05,  // Dx=Pas d'espace
+                0.25,  // Dx=Pas d'espace
+                5  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.01, // Yamont = tirant amont
+                0.42, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            let res = rem.calculRemous(undefined);
+
+            // données de validation : version PHP (Oct 2017) méthode RungeKutta4
+
+            let f = { 5.000: 0.42, 4.750: 0.434, 4.500: 0.443, 4.250: 0.45, 4.000: 0.457, 3.750: 0.462, 3.500: 0.467, 3.250: 0.471, 3.000: 0.476, 2.750: 0.48, 2.500: 0.483, 2.250: 0.487, 2.000: 0.49, 1.750: 0.493, 1.500: 0.496, 1.250: 0.499, 1.000: 0.502, 0.750: 0.504, 0.500: 0.507, 0.250: 0.509, 0.000: 0.01 };
+            compareObject("Yfluvial", res["flu"], f, 0.03);
+
+            let t = { 0.000: 0.01, 0.250: 0.017, 0.500: 0.022, 0.750: 0.028, 1.000: 0.502 };
+            compareObject("Ytorrentiel", res["tor"], t, 0.03);
+
+            let x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000];
+            compareArray("abscisses", res["trX"], x);
+
+            let expLog = new cLog();
+            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.953;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m.extraVar["xmin"] = 0;
+            m.extraVar["xmax"] = 1;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("faible pente, pas de ressaut, Yamont > Yc, Yaval > Yn", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.5, // Yamont = tirant amont
+                1, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            let res = rem.calculRemous(undefined);
+
+            // données de validation : version PHP (Oct 2017) méthode RungeKutta4
+
+            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");
+
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.953;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+
+            compareLog(log, expLog);
+        });
+
+        it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.001, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.5, // Yamont = tirant amont
+                0.7, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            let res = rem.calculRemous(undefined);
+
+            // données de validation : version PHP (Oct 2017) méthode RungeKutta4
+
+            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");
+
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.953;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
+
+            compareLog(log, expLog);
+        });
+    });
+});
diff --git a/spec/remous_rect_rk4_penteforte.spec.ts b/spec/remous_rect_rk4_penteforte.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..928405827493be2b94633ad67aca6560b1fd50a0
--- /dev/null
+++ b/spec/remous_rect_rk4_penteforte.spec.ts
@@ -0,0 +1,372 @@
+import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang";
+import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous";
+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";
+
+describe('Class Remous / section rectangulaire :', () => {
+    describe('méthode Runge-Kutta ordre 4 :', () => {
+        it("forte pente, ressaut avant l'amont", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont
+                6, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            let res = rem.calculRemous(undefined);
+
+            // données de validation : version PHP (Oct 2017) méthode RungeKutta4
+
+            let f = { 100.000: 6, 95.000: 5.75, 90.000: 5.5, 85.000: 5.25, 80.000: 5, 75.000: 4.75, 70.000: 4.5, 65.000: 4.25, 60.000: 4, 55.000: 3.749, 50.000: 3.499, 45.000: 3.249, 40.000: 2.999, 35.000: 2.748, 30.000: 2.498, 25.000: 2.247, 20.000: 1.996, 15.000: 1.744, 10.000: 1.491, 5.000: 1.237, 0.000: 0.977 };
+            compareObject("Yfluvial", res["flu"], f, 0.01);
+
+            let t = {};
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.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));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m.extraVar["sens"] = "amont";
+            m.extraVar["x"] = 0;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("forte pente, ressaut après l'aval", () => {
+            // TODO algo à reprendre
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont
+                0.45, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            let res = rem.calculRemous(undefined);
+
+            // données de validation : version PHP (Oct 2017) méthode RungeKutta4
+
+            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 };
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.253;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m.extraVar["x"] = 95;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS);
+            m.extraVar["sens"] = "aval";
+            m.extraVar["x"] = 100;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("forte pente, ressaut (1 point) à l'intérieur du bief", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont
+                1, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            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 };
+            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 };
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE);
+            m.extraVar["Yn"] = 0.253;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)
+            m.extraVar["x"] = 85;
+            expLog.add(m);
+
+            expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m.extraVar["xmin"] = 90;
+            m.extraVar["xmax"] = 90;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                0.25,  // Dx=Pas d'espace
+                5.5  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont
+                1, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            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 };
+            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 };
+            compareObject("Ytorrentiel", res["tor"], t, 0.03);
+
+            let x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000, 5.250, 5.500];
+            compareArray("abscisses", res["trX"], x);
+
+            let expLog = new cLog();
+            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.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));
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO);
+            m.extraVar["xmin"] = 0;
+            m.extraVar["xmax"] = 3.75;
+            expLog.add(m);
+
+            compareLog(log, expLog);
+        });
+
+        it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                5,  // Dx=Pas d'espace
+                100  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.1, // Yamont = tirant amont
+                0.3, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            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");
+
+            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);
+
+            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);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.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 ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            compareLog(log, expLog);
+        });
+
+        it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => {
+            let prms = new ParamsSectionRectang(undefined, // tirant d'eau
+                2.5, // largeur de fond
+                40, //  Ks=Strickler
+                2, // Q=Débit
+                0.05, // If=pente du fond
+                precDist, // précision
+                1, // YB=hauteur de berge
+                undefined,// YCL=Condition limite en cote à l'amont ou à l'aval
+                1,  // Dx=Pas d'espace
+                30  // Long= Longueur du bief
+            );
+
+            let sect = new cSnRectang(undefined, prms);
+
+            let prem = new CourbeRemousParams(0.35, // Yamont = tirant amont
+                0.3, // Yaval = tirant aval
+                MethodeResolution.RungeKutta4
+            );
+
+            let log = new cLog();
+            let rem = new CourbeRemous(sect, prem, log);
+
+            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");
+
+            let t = { 0.000: 0.35, 1.000: 0.314, 2.000: 0.297, 3.000: 0.286, 4.000: 0.279, 5.000: 0.273, 6.000: 0.269, 7.000: 0.266, 8.000: 0.263, 9.000: 0.261, 10.000: 0.26, 11.000: 0.258, 12.000: 0.257, 13.000: 0.256, 14.000: 0.256, 15.000: 0.255, 16.000: 0.255, 17.000: 0.254, 18.000: 0.254, 19.000: 0.254, 20.000: 0.254, 21.000: 0.254, 22.000: 0.253, 23.000: 0.253, 24.000: 0.253, 25.000: 0.253, 26.000: 0.253, 27.000: 0.253, 28.000: 0.253, 29.000: 0.253, 30.000: 0.253 };
+            compareObject("Ytorrentiel", res["tor"], t, 0.01);
+
+            let x = [0.000, 1.000, 2.000, 3.000, 4.000, 5.000, 6.000, 7.000, 8.000, 9.000, 10.000, 11.000, 12.000, 13.000, 14.000, 15.000, 16.000, 17.000, 18.000, 19.000, 20.000, 21.000, 22.000, 23.000, 24.000, 25.000, 26.000, 27.000, 28.000, 29.000, 30.000];
+            compareArray("abscisses", res["trX"], x);
+
+            let expLog = new cLog();
+            let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE);
+            m.extraVar["B"] = 2.5;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE);
+            m.extraVar["Yc"] = 0.403;
+            expLog.add(m);
+
+            m = new ErrorMessage(ErrorCode.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 ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL));
+
+            compareLog(log, expLog);
+        });
+    });
+});
diff --git a/src/remous.ts b/src/remous.ts
index 2f4baa144d35ccac6e14b7a3af977cb764582f44..d64275bb8f4933ce114fa141c3e338d9c1eac283 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -155,21 +155,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 undefined;
+			return new Result(undefined, new ErrorMessage(ErrorCode.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 undefined;
+			return new Result(undefined, new ErrorMessage(ErrorCode.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 undefined;
+			return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE));
 
 		//$rk4 = $this ->Calc_dYdX($Y + $rDx * $rk3);
 		let k4 = this.Calc_dYdX(Y + Dx * k3);