diff --git a/src/remous.ts b/src/remous.ts
index e1dfcd4b3d6de06c4a2f1a688501a762ac97ea16..3231797be0103bdd4c6cb41a636c9db0e925df5f 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -9,6 +9,7 @@ import { cLog } from "./util/log";
 import { Message, MessageCode } from "./util/message";
 import { Result } from "./util/result";
 import { ResultElement } from "./util/resultelement";
+import { ParamValueIterator, ParamValues } from ".";
 
 export enum MethodeResolution {
     Trapezes, EulerExplicite, RungeKutta4
@@ -111,11 +112,6 @@ export class CourbeRemous extends Nub {
 
     private prmSect: ParamsSection;
 
-    /**
-     * Pas de discrétisation de l'espace (positif en partant de l'aval, négatif en partant de l'amont)
-     */
-    private Dx: number;
-
     constructor(crp: CourbeRemousParams, dbg: boolean = false) {
         super(crp, dbg);
         // this._log = crp.Sn.log;
@@ -123,10 +119,17 @@ export class CourbeRemous extends Nub {
         this.Sn.Calc("Yc");
     }
 
+    /**
+     * Pas de discrétisation de l'espace (positif en partant de l'aval, négatif en partant de l'amont)
+     */
+    private get Dx(): number {
+        return this.prms.Dx.v;
+    }
+
     /**
      * calcul de la ligne fluviale depuis l'aval (si possible)
      */
-    public calculFluvial(): ResultElement {
+    private calculFluvial(xValues: ParamValues): ResultElement {
         if (!this.Sn.HautCritique.ok) {
             return new ResultElement(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
         }
@@ -140,8 +143,7 @@ export class CourbeRemous extends Nub {
             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);
+            res = this.calcul(this.prms.Yaval.v, xValues.getValuesIterator(true));
             res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
         } else {
             this.debug(
@@ -159,7 +161,7 @@ export class CourbeRemous extends Nub {
     /**
      * calcul de la ligne torrentielle depuis l'amont (si possible)
      */
-    public calculTorrentiel(): ResultElement {
+    private calculTorrentiel(xValues: ParamValues): ResultElement {
         if (!this.Sn.HautCritique.ok) {
             return new ResultElement(new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE));
         }
@@ -174,8 +176,7 @@ export class CourbeRemous extends Nub {
                 "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);
+            res = this.calcul(this.prms.Yamont.v, xValues.getValuesIterator(false));
             res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
         } else {
             // this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
@@ -250,15 +251,17 @@ export class CourbeRemous extends Nub {
 
         // Calcul des courbes de remous
 
+        const xValues = new ParamValues(0, this.prms.Long.v, this.Dx)
+
         // let crbFlu: { [key: number]: number; } = this.calculFluvial();
-        const rCourbeFlu: ResultElement = this.calculFluvial();
+        const rCourbeFlu: ResultElement = this.calculFluvial(xValues);
         // if (!rCourbeFlu.ok) {
         res.addLog(rCourbeFlu.log);
         // 	return res;
         // }
 
         // let crbTor: { [key: number]: number; } = this.calculTorrentiel();
-        const rCourbeTor: ResultElement = this.calculTorrentiel();
+        const rCourbeTor: ResultElement = this.calculTorrentiel(xValues);
         // if (!rCourbeTor.ok) {
         res.addLog(rCourbeTor.log);
         // 	return res;
@@ -358,7 +361,7 @@ export class CourbeRemous extends Nub {
             // this.debug(trX);
 
             let bRessaut = false;
-            const Dx = this.prms.Dx.v;
+            const Dx = xValues.step;
 
             for (let irX = 0; irX < trX.length; irX++) {
                 const rX: number = +trX[irX];
@@ -811,27 +814,15 @@ export class CourbeRemous extends Nub {
      * Calcul d'une courbe de remous en fluvial ou torrentiel
      * @param YCL Condition limite amont (torrentiel) ou aval (fluvial)
      */
-    private calcul(YCL: number): ResultElement {
+    private calcul(YCL: number, valueIterator: ParamValueIterator): ResultElement {
         const trY: { [key: number]: number; } = {};
         const res = new ResultElement();
 
-        let deb: number;
-        let fin: number;
-        if (this.Dx > 0) {
-            // Calcul depuis l'aval
-            deb = this.prms.Long.v;
-            fin = 0;
-        } else {
-            // Calcul depuis l'amont
-            deb = 0;
-            fin = this.prms.Long.v;
-        }
-        const dx = -this.Dx;
         let lastY = YCL;
-        trY[round(deb, this.prmSect.iPrec.v)] = lastY;
+        trY[round(valueIterator.next().value, this.prmSect.iPrec.v)] = lastY;
 
         // Boucle de calcul de la courbe de remous
-        for (let x = deb + dx; (dx > 0 && x <= fin) || (dx < 0 && x >= fin); x += dx) {
+        for (const x of valueIterator) {
             // this.debug("lastY " + lastY);
             const rY: Result = this.Calc_Y(lastY);
             // this.debug("calcul : x " + x + " y " + rY.vCalc);