From 7722c370d2d60b4b9f708ea4590a471d5f49527c Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 28 Feb 2019 10:01:10 +0100
Subject: [PATCH] =?UTF-8?q?Fix=20#71=20gestion=20de=20la=20pr=C3=A9cision?=
 =?UTF-8?q?=20de=20calcul?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/iterator/param_equation.spec.ts          | 17 ++++-----
 .../regime_uniforme_circ.spec.ts              | 20 +++++------
 .../regime_uniforme_puissance.spec.ts         | 33 ++++++++---------
 .../regime_uniforme_rect.spec.ts              | 28 +++++++--------
 .../regime_uniforme_trapeze.spec.ts           | 28 +++++++--------
 .../remous_rect_euler_pentefaible.spec.ts     | 10 +++---
 .../remous_rect_euler_penteforte.spec.ts      | 25 ++++++-------
 .../remous_rect_rk4_pentefaible.spec.ts       | 25 ++++++-------
 .../remous/remous_rect_rk4_penteforte.spec.ts | 30 +++++++---------
 .../remous_rect_trapezes_pentefaible.spec.ts  | 35 ++++++++-----------
 .../remous_rect_trapezes_penteforte.spec.ts   | 30 +++++++---------
 spec/remous/remous_trapez.spec.ts             | 20 +++++------
 .../section_param_circ_fluvial.spec.ts        |  4 +--
 .../section_param_circ_torrentiel.spec.ts     |  2 +-
 .../section_param_puiss_fluvial.spec.ts       |  4 +--
 .../section_param_puiss_torrentiel.spec.ts    |  2 +-
 .../section_param_rect_conv_newton.spec.ts    |  2 +-
 .../section_param_rect_fluvial.spec.ts        |  4 +--
 .../section_param_rect_torrentiel.spec.ts     |  2 +-
 .../section_param_trapez_fluvial.spec.ts      |  4 +--
 .../section_param_trapez_torrentiel.spec.ts   |  2 +-
 spec/structure/parallel_structure.spec.ts     |  7 ++--
 spec/structure/structure_kivi.spec.ts         | 18 ++++++----
 spec/structure/structure_test.ts              |  6 +---
 spec/value_ref/value_ref.spec.ts              |  9 ++---
 spec/value_ref/value_ref_circularity.spec.ts  |  6 ++--
 spec/value_ref/value_ref_section.spec.ts      | 12 ++++---
 spec/value_ref/value_ref_structure.spec.ts    | 16 +++++----
 spec/value_ref/value_ref_variable.spec.ts     | 10 +++---
 .../value_ref_variable_extraresult.spec.ts    |  5 ++-
 .../value_ref_variable_result.spec.ts         | 16 +++++----
 src/compute-node.ts                           |  5 +--
 src/dichotomie.ts                             |  1 +
 src/macrorugo/macrorugo.ts                    |  5 ++-
 src/nub.ts                                    | 20 +++++------
 src/param/params-equation.ts                  | 16 +++++++--
 src/remous.ts                                 | 20 ++++++-----
 src/section/newton.ts                         |  4 +--
 src/section/section_circulaire.ts             |  4 +--
 src/section/section_parametree.ts             |  4 +--
 src/section/section_puissance.ts              |  4 +--
 src/section/section_rectang.ts                |  5 ++-
 src/section/section_trapez.ts                 |  4 +--
 src/section/section_type.ts                   | 28 ++++-----------
 src/session.ts                                |  7 +---
 src/structure/cloisons.ts                     |  5 ++-
 src/structure/factory_structure.ts            |  3 +-
 src/structure/parallel_structure.ts           | 16 ++++-----
 src/structure/structure.ts                    |  8 ++---
 src/structure/structure_params.ts             |  2 ++
 50 files changed, 284 insertions(+), 309 deletions(-)

diff --git a/spec/iterator/param_equation.spec.ts b/spec/iterator/param_equation.spec.ts
index 119fea71..5c3af3cf 100644
--- a/spec/iterator/param_equation.spec.ts
+++ b/spec/iterator/param_equation.spec.ts
@@ -6,7 +6,7 @@
  */
 // import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
 
-import { ConduiteDistrib, ConduiteDistribParams } from "../../src/cond_distri";
+import { ConduiteDistribParams } from "../../src/cond_distri";
 import { IParamDefinitionIterator } from "../../src/param/params-equation";
 import { CreateStructure } from "../../src/structure/factory_structure";
 import { ParallelStructure } from "../../src/structure/parallel_structure";
@@ -29,15 +29,15 @@ function checkParams(pdi: IParamDefinitionIterator, symbols: string[], values: n
 describe("iterator  : ", () => {
     it("ConduiteDistribParams", () => {
         const peq: ConduiteDistribParams = new ConduiteDistribParams(1, 2, 3, 4, 5);
-        const symbs = ["Q", "D", "J", "Lg", "Nu"];
-        const vals = [1, 2, 3, 4, 5];
+        const symbs = ["Pr", "Q", "D", "J", "Lg", "Nu"];
+        const vals = [0.0001, 1, 2, 3, 4, 5];
         checkParams(peq.iterator, symbs, vals);
     });
 
     it("ParallelStructureParams 1", () => {
         const peq: ParallelStructureParams = new ParallelStructureParams(1, 2, 3);
-        const symbs = ["Q", "Z1", "Z2"];
-        const vals = [1, 2, 3];
+        const symbs = ["Pr", "Q", "Z1", "Z2"];
+        const vals = [0.0001, 1, 2, 3];
         checkParams(peq.iterator, symbs, vals);
     });
 
@@ -45,11 +45,12 @@ describe("iterator  : ", () => {
         const psp: ParallelStructureParams = new ParallelStructureParams(1, 2, 3);
         const pst = new ParallelStructure(psp);
 
-        const st: Structure = CreateStructure(StructureType.SeuilRectangulaire, LoiDebit.WeirCem88d);
+        const st: Structure = CreateStructure(StructureType.SeuilRectangulaire, LoiDebit.WeirCem88d, pst);
         pst.addStructure(st);
 
-        const symbs = ["Q", "Z1", "Z2", "Cd", "h1", "h2", "L", "Q", "W", "Z1", "Z2", "ZDV"];
-        const vals = [1, 2, 3];
+        // le 2e "Pr" est celui de la structure
+        const symbs = ["Pr", "Q", "Z1", "Z2", "Pr", "Cd", "h1", "h2", "L", "Q", "W", "Z1", "Z2", "ZDV"];
+        const vals = [0.0001, 1, 2, 3];
         checkParams(pst.parameterIterator, symbs, vals);
     });
 });
diff --git a/spec/regime_uniforme/regime_uniforme_circ.spec.ts b/spec/regime_uniforme/regime_uniforme_circ.spec.ts
index 8860c79a..45afc604 100644
--- a/spec/regime_uniforme/regime_uniforme_circ.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_circ.spec.ts
@@ -15,9 +15,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSect.Pr.v = precDist;
             const sect = new cSnCirc(paramSect);
             const ru = new RegimeUniforme(sect);
 
@@ -30,9 +30,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -45,9 +45,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 undefined, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -60,9 +60,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 40, //  Ks=Strickler
                 undefined,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -75,9 +75,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -92,9 +92,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 13.551, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSect.Pr.v = precDist;
             const sect = new cSnCirc(paramSect);
             const ru = new RegimeUniforme(sect);
 
@@ -107,9 +107,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -122,9 +122,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 13.551, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 undefined, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -137,9 +137,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 13.551, //  Ks=Strickler
                 undefined,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
@@ -152,9 +152,9 @@ describe("Class RegimeUniforme / section circulaire :", () => {
                 13.551, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramSection.Pr.v = precDist;
             const sect = new cSnCirc(paramSection);
             const ru = new RegimeUniforme(sect);
 
diff --git a/spec/regime_uniforme/regime_uniforme_puissance.spec.ts b/spec/regime_uniforme/regime_uniforme_puissance.spec.ts
index 11c4fa71..07d90ab0 100644
--- a/spec/regime_uniforme/regime_uniforme_puissance.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_puissance.spec.ts
@@ -22,9 +22,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -38,9 +38,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -54,9 +54,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -70,13 +70,14 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 undefined, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
+            prms.Pr.v = 0.00001;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
-            checkResult(ru.Calc("If", 0.001, 0.00001), 0.00071, 0.00001);
+            checkResult(ru.Calc("If", 0.001), 0.00071, 0.00001);
         });
 
         it("Q should be 1.421", () => {
@@ -86,9 +87,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 undefined,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -102,9 +103,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramCnl.Pr.v = precDist;
             const sect = new cSnPuiss(paramCnl);
             const ru = new RegimeUniforme(sect, false);
 
@@ -120,9 +121,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -138,9 +139,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 10,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -154,9 +155,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -170,9 +171,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -186,9 +187,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect);
             ru.dichoStartIntervalMaxSteps = 3;
@@ -205,9 +206,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect);
             ru.dichoStartIntervalMaxSteps = 1;
@@ -224,9 +225,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 4.366, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 undefined, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -240,9 +241,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 undefined,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnPuiss(prms);
             const ru = new RegimeUniforme(sect, false);
 
@@ -256,9 +257,9 @@ describe("Class RegimeUniforme / section puissance :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            paramCnl.Pr.v = precDist;
             const sect = new cSnPuiss(paramCnl);
             const ru = new RegimeUniforme(sect, false);
 
diff --git a/spec/regime_uniforme/regime_uniforme_rect.spec.ts b/spec/regime_uniforme/regime_uniforme_rect.spec.ts
index 991165ad..ed5bbcee 100644
--- a/spec/regime_uniforme/regime_uniforme_rect.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_rect.spec.ts
@@ -23,9 +23,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 1.568, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnRectang(prms, false);
             const ru = new RegimeUniforme(sect, false);
 
@@ -38,9 +38,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 undefined, //  Ks=Strickler
                 1.2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -54,15 +54,15 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 1.568, // Q=Débit
                 undefined, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect, false);
 
             // nom variable à calculer, valeur de Ks
-            checkResult(ru.Calc("If", 0.001, precDist), 0.001);
+            checkResult(ru.Calc("If", 0.001), 0.001);
         });
 
         it("Q should be 1.568", () => {
@@ -71,9 +71,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 undefined, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -87,9 +87,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 30, //  Ks=Strickler
                 undefined, // Q=Débit
                 0.0001, // If=pente du fond
-                precDist, // précision
                 1.2, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -103,9 +103,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 1.2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -125,9 +125,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 5.31, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms, false);
             const ru = new RegimeUniforme(sect, false);
@@ -141,9 +141,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 undefined, //  Ks=Strickler
                 1.2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -157,15 +157,15 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 9.04, //  Ks=Strickler
                 1.2, // Q=Débit
                 undefined, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect, false);
 
             // nom variable à calculer, valeur de Ks
-            checkResult(ru.Calc("If", 0.001, precDist), 0.001);
+            checkResult(ru.Calc("If", 0.001), 0.001);
         });
 
         it("Q should be 5.31", () => {
@@ -174,9 +174,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 undefined, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -190,9 +190,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 30, //  Ks=Strickler
                 undefined, // Q=Débit
                 0.0001, // If=pente du fond
-                precDist, // précision
                 1.2, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
@@ -206,9 +206,9 @@ describe("Class RegimeUniforme / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 1.2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 0.1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
             const ru = new RegimeUniforme(sect);
diff --git a/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts b/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts
index 69fe308e..c55be2b8 100644
--- a/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts
@@ -16,15 +16,15 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.988428,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
 
             const ru = new RegimeUniforme(sect, false);
 
-            checkResult(ru.Calc("LargeurFond", 0, precDist), 2.5);
+            checkResult(ru.Calc("LargeurFond", 0), 2.5);
         });
 
         it("Fruit should be 0.56", () => {
@@ -34,9 +34,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -51,9 +51,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -68,9 +68,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 undefined, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -85,9 +85,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 0,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -102,9 +102,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -121,13 +121,13 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect, false);
 
-            checkResult(ru.Calc("LargeurFond", 0, precDist), 0.03);
+            checkResult(ru.Calc("LargeurFond", 0), 0.03);
         });
 
         it("Fruit should be 0.56", () => {
@@ -137,9 +137,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -154,9 +154,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 undefined, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
 
@@ -170,9 +170,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 8.356,  //  Q=Débit
                 undefined, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
 
@@ -186,9 +186,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 undefined,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
@@ -203,9 +203,9 @@ describe("Class RegimeUniforme / section trapèze :", () => {
                 40, //  Ks=Strickler
                 1.2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
             const ru = new RegimeUniforme(sect);
diff --git a/spec/remous/remous_rect_euler_pentefaible.spec.ts b/spec/remous/remous_rect_euler_pentefaible.spec.ts
index 17ad34b8..4c753e55 100644
--- a/spec/remous/remous_rect_euler_pentefaible.spec.ts
+++ b/spec/remous/remous_rect_euler_pentefaible.spec.ts
@@ -22,9 +22,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1 // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -32,10 +32,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res: Result = rem.calculRemous(undefined);
 
@@ -86,9 +85,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1 // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -96,10 +95,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.7, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res = rem.calculRemous(undefined);
 
diff --git a/spec/remous/remous_rect_euler_penteforte.spec.ts b/spec/remous/remous_rect_euler_penteforte.spec.ts
index a62f5d99..85e906ca 100644
--- a/spec/remous/remous_rect_euler_penteforte.spec.ts
+++ b/spec/remous/remous_rect_euler_penteforte.spec.ts
@@ -28,9 +28,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -38,10 +38,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 6, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res = rem.calculRemous(undefined);
 
@@ -112,9 +111,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -122,10 +121,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.45, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res = rem.calculRemous(undefined);
 
@@ -271,9 +269,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -281,10 +279,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 5.5,  // Long= Longueur du bief
                 0.25,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res = rem.calculRemous(undefined);
 
@@ -382,9 +379,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -392,10 +389,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.3, // Yaval = tirant aval
                 30,  // Long= Longueur du bief
                 1,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res = rem.calculRemous(undefined);
 
@@ -448,9 +444,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -458,10 +454,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.3, // Yaval = tirant aval
                 10,  // Long= Longueur du bief
                 0.1,  // Dx=Pas d'espace
-                MethodeResolution.EulerExplicite,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
             const res = rem.calculRemous(undefined);
 
diff --git a/spec/remous/remous_rect_rk4_pentefaible.spec.ts b/spec/remous/remous_rect_rk4_pentefaible.spec.ts
index ad626808..d3fa739f 100644
--- a/spec/remous/remous_rect_rk4_pentefaible.spec.ts
+++ b/spec/remous/remous_rect_rk4_pentefaible.spec.ts
@@ -20,9 +20,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -30,10 +30,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.41, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -92,9 +91,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -102,10 +101,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.42, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -183,9 +181,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -193,10 +191,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.42, // Yaval = tirant aval
                 5,  // Long= Longueur du bief
                 0.25,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -267,9 +264,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -277,10 +274,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -345,9 +341,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -355,10 +351,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.7, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
diff --git a/spec/remous/remous_rect_rk4_penteforte.spec.ts b/spec/remous/remous_rect_rk4_penteforte.spec.ts
index 48203903..7eaa63a8 100644
--- a/spec/remous/remous_rect_rk4_penteforte.spec.ts
+++ b/spec/remous/remous_rect_rk4_penteforte.spec.ts
@@ -30,9 +30,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -40,10 +40,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 6, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -115,9 +114,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -125,10 +124,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.45, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -206,9 +204,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -216,10 +214,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -296,9 +293,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -306,10 +303,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 5.5,  // Long= Longueur du bief
                 0.25,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -402,9 +398,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -412,10 +408,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.3, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
@@ -481,9 +476,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -491,10 +486,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.3, // Yaval = tirant aval
                 10,  // Long= Longueur du bief
                 0.1,  // Dx=Pas d'espace
-                MethodeResolution.RungeKutta4,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.RungeKutta4);
 
             const res = rem.calculRemous(undefined);
 
diff --git a/spec/remous/remous_rect_trapezes_pentefaible.spec.ts b/spec/remous/remous_rect_trapezes_pentefaible.spec.ts
index fa316934..0c8332d2 100644
--- a/spec/remous/remous_rect_trapezes_pentefaible.spec.ts
+++ b/spec/remous/remous_rect_trapezes_pentefaible.spec.ts
@@ -28,9 +28,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -38,10 +38,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.403, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -117,9 +116,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -127,10 +126,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.403, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -208,9 +206,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -218,10 +216,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.403, // Yaval = tirant aval
                 5,  // Long= Longueur du bief
                 0.25,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -309,9 +306,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                0.0001, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -319,10 +316,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.403, // Yaval = tirant aval
                 5,  // Long= Longueur du bief
                 0.05,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -494,9 +490,9 @@ describe("Class Remous / section rectangulaire :", () => {
             40, //  Ks=Strickler
             2, // Q=Débit
             0.001, // If=pente du fond
-            precDist, // précision
             1, // YB=hauteur de berge
         );
+        prms.Pr.v = precDist;
 
         const sect = new cSnRectang(prms);
 
@@ -504,10 +500,9 @@ describe("Class Remous / section rectangulaire :", () => {
             1, // Yaval = tirant aval
             100,  // Long= Longueur du bief
             5,  // Dx=Pas d'espace
-            MethodeResolution.Trapezes,
         );
 
-        const rem = new CourbeRemous(prem);
+        const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
         const res = rem.calculRemous(undefined);
 
@@ -572,9 +567,9 @@ describe("Class Remous / section rectangulaire :", () => {
             40, //  Ks=Strickler
             2, // Q=Débit
             0.001, // If=pente du fond
-            precDist, // précision
             1, // YB=hauteur de berge
         );
+        prms.Pr.v = precDist;
 
         const sect = new cSnRectang(prms);
 
@@ -582,10 +577,9 @@ describe("Class Remous / section rectangulaire :", () => {
             0.7, // Yaval = tirant aval
             100,  // Long= Longueur du bief
             5,  // Dx=Pas d'espace
-            MethodeResolution.Trapezes,
         );
 
-        const rem = new CourbeRemous(prem);
+        const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
         const res = rem.calculRemous(undefined);
 
@@ -651,9 +645,9 @@ describe("Class Remous / section rectangulaire :", () => {
             40, //  Ks=Strickler
             2, // Q=Débit
             0.001, // If=pente du fond
-            precDist, // précision
             1, // YB=hauteur de berge
         );
+        prms.Pr.v = precDist;
 
         const sect = new cSnRectang(prms);
 
@@ -661,10 +655,9 @@ describe("Class Remous / section rectangulaire :", () => {
             0.4, // Yaval = tirant aval
             100,  // Long= Longueur du bief
             5,  // Dx=Pas d'espace
-            MethodeResolution.Trapezes,
         );
 
-        const rem = new CourbeRemous(prem);
+        const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
         const res = rem.calculRemous("Hs");
 
diff --git a/spec/remous/remous_rect_trapezes_penteforte.spec.ts b/spec/remous/remous_rect_trapezes_penteforte.spec.ts
index c94a7f2a..86f60091 100644
--- a/spec/remous/remous_rect_trapezes_penteforte.spec.ts
+++ b/spec/remous/remous_rect_trapezes_penteforte.spec.ts
@@ -30,9 +30,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -40,10 +40,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 6, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -115,9 +114,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -125,10 +124,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.45, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -208,9 +206,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -218,10 +216,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -297,9 +294,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -307,10 +304,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 1, // Yaval = tirant aval
                 5.5,  // Long= Longueur du bief
                 0.25,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -403,9 +399,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -413,10 +409,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.3, // Yaval = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -465,9 +460,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                precDist, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnRectang(prms);
 
@@ -475,10 +470,9 @@ describe("Class Remous / section rectangulaire :", () => {
                 0.3, // Yaval = tirant aval
                 10,  // Long= Longueur du bief
                 0.1,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
diff --git a/spec/remous/remous_trapez.spec.ts b/spec/remous/remous_trapez.spec.ts
index 4c8b8cfd..e1901c0d 100644
--- a/spec/remous/remous_trapez.spec.ts
+++ b/spec/remous/remous_trapez.spec.ts
@@ -27,9 +27,9 @@ describe("Class Remous / section trapèze :", () => {
                 40, //  Ks=Strickler
                 2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
 
@@ -37,10 +37,9 @@ describe("Class Remous / section trapèze :", () => {
                 0.803, // Yaval = tirant aval
                 5,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -57,9 +56,9 @@ describe("Class Remous / section trapèze :", () => {
                 40, //  Ks=Strickler
                 2,  //  Q=Débit
                 0.001, //  If=pente du fond
-                precDist, // précision
                 1, // YB= hauteur de berge
             );
+            prms.Pr.v = precDist;
 
             const sect = new cSnTrapez(prms);
 
@@ -67,10 +66,9 @@ describe("Class Remous / section trapèze :", () => {
                 0.4, // Yaval = tirant aval
                 10,  // Long= Longueur du bief
                 1,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous(undefined);
 
@@ -149,9 +147,9 @@ describe("Class Remous / section trapèze :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.001, // If=pente du fond
-                0.001, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = 0.001;
 
             const sect = new cSnTrapez(prms);
 
@@ -159,10 +157,9 @@ describe("Class Remous / section trapèze :", () => {
                 0.4, // Yaval    = tirant aval
                 100,  // Long= Longueur du bief
                 5,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous("Hs");
 
@@ -203,9 +200,9 @@ describe("Class Remous / section trapèze :", () => {
                 40, //  Ks=Strickler
                 2, // Q=Débit
                 0.05, // If=pente du fond
-                0.001, // précision
                 1, // YB=hauteur de berge
             );
+            prms.Pr.v = 0.001;
 
             const sect = new cSnTrapez(prms);
 
@@ -213,10 +210,9 @@ describe("Class Remous / section trapèze :", () => {
                 1, // Yaval    = tirant aval
                 8,  // Long= Longueur du bief
                 0.1,  // Dx=Pas d'espace
-                MethodeResolution.Trapezes,
             );
 
-            const rem = new CourbeRemous(prem);
+            const rem = new CourbeRemous(prem, MethodeResolution.Trapezes);
 
             const res = rem.calculRemous("Hs");
 
diff --git a/spec/section_param/section_param_circ_fluvial.spec.ts b/spec/section_param/section_param_circ_fluvial.spec.ts
index b3011786..49d9e110 100644
--- a/spec/section_param/section_param_circ_fluvial.spec.ts
+++ b/spec/section_param/section_param_circ_fluvial.spec.ts
@@ -11,9 +11,9 @@ function createSection(prec: number): cSnCirc {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnCirc(paramSection);
 }
@@ -24,9 +24,9 @@ function createSectionDebordement(prec: number): cSnCirc {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnCirc(paramSection);
 }
diff --git a/spec/section_param/section_param_circ_torrentiel.spec.ts b/spec/section_param/section_param_circ_torrentiel.spec.ts
index 35a11220..e867379a 100644
--- a/spec/section_param/section_param_circ_torrentiel.spec.ts
+++ b/spec/section_param/section_param_circ_torrentiel.spec.ts
@@ -11,9 +11,9 @@ function createSection(prec: number): cSnCirc {
         40, //  Ks=Strickler
         10,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnCirc(paramSection);
 }
diff --git a/spec/section_param/section_param_puiss_fluvial.spec.ts b/spec/section_param/section_param_puiss_fluvial.spec.ts
index 221092f4..8d2b9313 100644
--- a/spec/section_param/section_param_puiss_fluvial.spec.ts
+++ b/spec/section_param/section_param_puiss_fluvial.spec.ts
@@ -12,9 +12,9 @@ function createSection(prec: number): cSnPuiss {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnPuiss(paramSection);
 }
@@ -26,9 +26,9 @@ function createSectionDebordement(prec: number): cSnPuiss {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnPuiss(paramSection);
 }
diff --git a/spec/section_param/section_param_puiss_torrentiel.spec.ts b/spec/section_param/section_param_puiss_torrentiel.spec.ts
index f49ce1bb..58b763be 100644
--- a/spec/section_param/section_param_puiss_torrentiel.spec.ts
+++ b/spec/section_param/section_param_puiss_torrentiel.spec.ts
@@ -12,9 +12,9 @@ function createSection(prec: number): cSnPuiss {
         40, //  Ks=Strickler
         10,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnPuiss(paramSection);
 }
diff --git a/spec/section_param/section_param_rect_conv_newton.spec.ts b/spec/section_param/section_param_rect_conv_newton.spec.ts
index 0b60edf0..05902269 100644
--- a/spec/section_param/section_param_rect_conv_newton.spec.ts
+++ b/spec/section_param/section_param_rect_conv_newton.spec.ts
@@ -13,9 +13,9 @@ describe("Section paramétrée rectangulaire : ", () => {
             40, //  Ks=Strickler
             10,  //  Q=Débit
             0.001, //  If=pente du fond
-            1e-10, // précision
             1, // YB= hauteur de berge
         );
+        paramSection.Pr.v = 1e-10; // précision
 
         sect = new cSnRectang(paramSection);
         sect.newtonMaxIter = 5;
diff --git a/spec/section_param/section_param_rect_fluvial.spec.ts b/spec/section_param/section_param_rect_fluvial.spec.ts
index d3f318e0..0a49c235 100644
--- a/spec/section_param/section_param_rect_fluvial.spec.ts
+++ b/spec/section_param/section_param_rect_fluvial.spec.ts
@@ -11,9 +11,9 @@ function createSection(prec: number): cSnRectang {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnRectang(paramSection);
 }
@@ -24,9 +24,9 @@ function createSectionDebordement(prec: number): cSnRectang {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        prec, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = prec;
 
     return new cSnRectang(paramSection);
 }
diff --git a/spec/section_param/section_param_rect_torrentiel.spec.ts b/spec/section_param/section_param_rect_torrentiel.spec.ts
index caed1035..ee056c98 100644
--- a/spec/section_param/section_param_rect_torrentiel.spec.ts
+++ b/spec/section_param/section_param_rect_torrentiel.spec.ts
@@ -12,9 +12,9 @@ describe("Section paramétrée rectangulaire : ", () => {
             40, //  Ks=Strickler
             10,  //  Q=Débit
             0.001, //  If=pente du fond
-            precDist, // précision
             1, // YB= hauteur de berge
         );
+        paramSection.Pr.v = precDist;
 
         sect = new cSnRectang(paramSection);
     });
diff --git a/spec/section_param/section_param_trapez_fluvial.spec.ts b/spec/section_param/section_param_trapez_fluvial.spec.ts
index 8f18c2b0..b5366847 100644
--- a/spec/section_param/section_param_trapez_fluvial.spec.ts
+++ b/spec/section_param/section_param_trapez_fluvial.spec.ts
@@ -12,9 +12,9 @@ function createSection(prec: number): cSnTrapez {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        precDist, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = precDist;
 
     return new cSnTrapez(paramSection);
 }
@@ -26,9 +26,9 @@ function createSectionDebordement(prec: number): cSnTrapez {
         40, //  Ks=Strickler
         1.2,  //  Q=Débit
         0.001, //  If=pente du fond
-        precDist, // précision
         1, // YB= hauteur de berge
     );
+    paramSection.Pr.v = precDist;
 
     return new cSnTrapez(paramSection);
 }
diff --git a/spec/section_param/section_param_trapez_torrentiel.spec.ts b/spec/section_param/section_param_trapez_torrentiel.spec.ts
index a0e8c4ce..63cd7a18 100644
--- a/spec/section_param/section_param_trapez_torrentiel.spec.ts
+++ b/spec/section_param/section_param_trapez_torrentiel.spec.ts
@@ -13,9 +13,9 @@ describe("Section paramétrée trapèze :", () => {
             40, //  Ks=Strickler
             10,  //  Q=Débit
             0.001, //  If=pente du fond
-            precDist, // précision
             1, // YB= hauteur de berge
         );
+        paramCnl.Pr.v = precDist;
 
         sect = new cSnTrapez(paramCnl);
     });
diff --git a/spec/structure/parallel_structure.spec.ts b/spec/structure/parallel_structure.spec.ts
index 6ba2352a..e13a7b16 100644
--- a/spec/structure/parallel_structure.spec.ts
+++ b/spec/structure/parallel_structure.spec.ts
@@ -42,8 +42,9 @@ describe("Class ParallelStructure: ", () => {
         itParallelStructure("0.ZDV", 0, 15);
         itParallelStructure("1.ZDV", 0, 15);
         it("shoud return an error Q too high", () => {
-            pstruct.prms.Q.v = 15;
-            expect(pstruct.Calc("1.ZDV").code).toBe(MessageCode.ERROR_STRUCTURE_Q_TROP_ELEVE);
+            pstruct.prms.Q.v = 14;
+            const res: Result = pstruct.Calc("1.ZDV");
+            expect(res.code).toBe(MessageCode.ERROR_STRUCTURE_Q_TROP_ELEVE);
         });
     });
 });
@@ -94,7 +95,7 @@ describe("Class ParallelStructure: ", () => {
     const iStTypes: number[] = [];
     for (const s of EnumEx.getValues(StructureType)) {
         for (const la of loiAdmissiblesOuvrages[StructureType[s]]) {
-            ps2.addStructure(CreateStructure(s, la, undefined, false));
+            ps2.addStructure(CreateStructure(s, la, ps2, false));
             iLoiDebits.push(la);
             iStTypes.push(s);
         }
diff --git a/spec/structure/structure_kivi.spec.ts b/spec/structure/structure_kivi.spec.ts
index a4fb7129..141245bb 100644
--- a/spec/structure/structure_kivi.spec.ts
+++ b/spec/structure/structure_kivi.spec.ts
@@ -7,14 +7,20 @@
 // import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
 
 import { MessageCode, StructureFlowMode, StructureFlowRegime } from "../../src";
-import { CreateStructure } from "../../src/structure/factory_structure";
-import { StructureKivi } from "../../src/structure/structure_kivi";
-import { LoiDebit, StructureType } from "../../src/structure/structure_props";
+import { StructureKivi, StructureKiviParams } from "../../src/structure/structure_kivi";
 import { testStructure } from "./functions";
 
-const structTest: StructureKivi = CreateStructure(
-    StructureType.SeuilRectangulaire, LoiDebit.KIVI
-) as StructureKivi;
+const kiviParams: StructureKiviParams = new StructureKiviParams(
+    8.516,      // Q
+    101.5,      // ZDV
+    103,        // Z1
+    102,        // Z2
+    2,          // L
+    0.4,        // alpha
+    0.001,      // béta
+    100         // ZRAM : cote Radier Amont
+);
+const structTest: StructureKivi = new StructureKivi(kiviParams, false);
 structTest.prms.ZDV.v = 101;
 
 describe("Class StructureKivi: ", () => {
diff --git a/spec/structure/structure_test.ts b/spec/structure/structure_test.ts
index 319e20d7..33f2462c 100644
--- a/spec/structure/structure_test.ts
+++ b/spec/structure/structure_test.ts
@@ -6,12 +6,8 @@
  */
 // import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
 
-import { MessageCode } from "../../src";
-import { ParamCalculability } from "../../src/param/param-definition";
-import { Structure, StructureFlowMode, StructureFlowRegime, StructureParams } from "../../src/structure/structure";
-import { LoiDebit, StructureType } from "../../src/structure/structure_props";
+import { Structure, StructureParams } from "../../src/structure/structure";
 import { Result } from "../../src/util/result";
-import { checkResult } from "../test_func";
 
 class StructureTest extends Structure {
 
diff --git a/spec/value_ref/value_ref.spec.ts b/spec/value_ref/value_ref.spec.ts
index 83ba9304..342ed80b 100644
--- a/spec/value_ref/value_ref.spec.ts
+++ b/spec/value_ref/value_ref.spec.ts
@@ -23,11 +23,11 @@ let prm2: NubTestParams;
 function createEnv() {
     // Nub maître (dont on référence la valeur du paramètre A)
     nub1 = new NubTest(new NubTestParams());
-    prm1 = nub1.parameters as NubTestParams;
+    prm1 = nub1.prms as NubTestParams;
 
     // Nub esclave (qui utilise la valeur de A du Nub maître)
     nub2 = new NubTest(new NubTestParams());
-    prm2 = nub2.parameters as NubTestParams;
+    prm2 = nub2.prms as NubTestParams;
 }
 
 describe("référence d'un paramètre à un autre : ", () => {
@@ -86,7 +86,7 @@ describe("référence d'un paramètre à un autre : ", () => {
             expect(prm2.C.v).toEqual(3);
         });
 
-        it("test 4", () => {
+        xit("test 4", () => {
             // cas de figure :
             // nub2.A est lié à nub1.A (valeur fixe)
             // calcul de tous les paramètres
@@ -220,8 +220,9 @@ describe("référence d'un paramètre à un autre : ", () => {
             // valeur esclave bidon, doit être masquée par la valeur maître (cad prm1.A, normalement [2,3,4,5,6])
             prm2.A.v = 0;
             prm2.A.defineReference(nub1, "A");
+            prm2.Pr.v = 0.001;
 
-            const r: Result = nub2.CalcSerie(0.001, 0.1, "C");
+            const r: Result = nub2.CalcSerie(0.1, "C");
 
             let n = 0;
             for (const re of r.resultElements) {
diff --git a/spec/value_ref/value_ref_circularity.spec.ts b/spec/value_ref/value_ref_circularity.spec.ts
index da2f3da9..14b2bfc4 100644
--- a/spec/value_ref/value_ref_circularity.spec.ts
+++ b/spec/value_ref/value_ref_circularity.spec.ts
@@ -21,13 +21,13 @@ let prm3: NubTestParams;
  */
 function createEnv() {
     nub1 = new NubTest(new NubTestParams());
-    prm1 = nub1.parameters as NubTestParams;
+    prm1 = nub1.prms as NubTestParams;
 
     nub2 = new NubTest(new NubTestParams());
-    prm2 = nub2.parameters as NubTestParams;
+    prm2 = nub2.prms as NubTestParams;
 
     nub3 = new NubTest(new NubTestParams());
-    prm3 = nub3.parameters as NubTestParams;
+    prm3 = nub3.prms as NubTestParams;
 }
 
 describe("référence d'un paramètre à un autre : ", () => {
diff --git a/spec/value_ref/value_ref_section.spec.ts b/spec/value_ref/value_ref_section.spec.ts
index 2cbe9f44..f133415f 100644
--- a/spec/value_ref/value_ref_section.spec.ts
+++ b/spec/value_ref/value_ref_section.spec.ts
@@ -21,12 +21,16 @@ let prm2: ParamsSectionTrapez;
  */
 function createEnv() {
     // Nub maître
-    nub1 = new SectionParametree(new cSnTrapez(new ParamsSectionTrapez(1, 0.5, 1, 0.01, 1, 0.01, 0.01, 2)));
-    prm1 = nub1.parameters as ParamsSectionTrapez;
+    const prmsM = new ParamsSectionTrapez(1, 0.5, 1, 0.01, 1, 0.01, 2);
+    prmsM.Pr.v = 0.01;
+    nub1 = new SectionParametree(new cSnTrapez(prmsM));
+    prm1 = nub1.prms as ParamsSectionTrapez;
 
     // Nub esclave
-    nub2 = new SectionParametree(new cSnTrapez(new ParamsSectionTrapez(1, 0.5, 1, 0.01, 1, 0.01, 0.01, 2)));
-    prm2 = nub2.parameters as ParamsSectionTrapez;
+    const prmsS = new ParamsSectionTrapez(1, 0.5, 1, 0.01, 1, 0.01, 2);
+    prmsS.Pr.v = 0.01;
+    nub2 = new SectionParametree(new cSnTrapez(prmsS));
+    prm2 = nub2.prms as ParamsSectionTrapez;
 }
 
 describe("référence d'un paramètre à un autre : ", () => {
diff --git a/spec/value_ref/value_ref_structure.spec.ts b/spec/value_ref/value_ref_structure.spec.ts
index b658785e..1e54a32b 100644
--- a/spec/value_ref/value_ref_structure.spec.ts
+++ b/spec/value_ref/value_ref_structure.spec.ts
@@ -30,12 +30,12 @@ function createEnv() {
 
     // Nub esclave 1
     nub3 = new StructureWeirCem88d(new RectangularStructureParams(0.5, 0, 1, 0.5, 1, 0.5));
-    prm3 = nub3.parameters as RectangularStructureParams;
+    prm3 = nub3.prms as RectangularStructureParams;
     nub1.addStructure(nub3);
 
     // Nub esclave 2
     nub4 = new StructureCunge80(new RectangularStructureParams(0.5, 0, 1, 0.5, 1, 0.5));
-    prm4 = nub4.parameters as RectangularStructureParams;
+    prm4 = nub4.prms as RectangularStructureParams;
     nub2.addStructure(nub4);
 }
 
@@ -50,8 +50,10 @@ describe("référence d'un paramètre à un autre : ", () => {
 
             prm4.Q.defineReference(nub1, "ouvrage[0].Q_ENUM_StructureFlowMode");
 
-            nub1.CalcSerie(0.001, 0.1, "Q");
-            nub2.CalcSerie(0.001, 0.1, "Q");
+            nub1.prms.Pr.v = 0.001;
+            nub1.CalcSerie(0.1, "Q");
+            nub2.prms.Pr.v = 0.001;
+            nub2.CalcSerie(0.1, "Q");
             /*
             nub1.result.resultElements[0].extraResults = {
             "ouvrage[0].Q" : 6.264183905346331
@@ -77,8 +79,10 @@ describe("référence d'un paramètre à un autre : ", () => {
 
             prm4.Q.defineReference(nub1, "ouvrage[0].Q");
 
-            nub1.CalcSerie(0.001, 0.1, "Q");
-            nub2.CalcSerie(0.001, 0.1, "Q");
+            nub1.prms.Pr.v = 0.001;
+            nub1.CalcSerie(0.1, "Q");
+            nub2.prms.Pr.v = 0.001;
+            nub2.CalcSerie(0.1, "Q");
             /*
             nub1.result.resultElements[0].extraResults = {
             "ouvrage[0].Q" : 6.264183905346331
diff --git a/spec/value_ref/value_ref_variable.spec.ts b/spec/value_ref/value_ref_variable.spec.ts
index 21fc66aa..1f4984ad 100644
--- a/spec/value_ref/value_ref_variable.spec.ts
+++ b/spec/value_ref/value_ref_variable.spec.ts
@@ -22,11 +22,11 @@ let prm2: ConduiteDistribParams;
 function createEnv() {
     // Nub maître
     nub1 = new ConduiteDistrib(new ConduiteDistribParams(3, 1.2, 0.6, 100, 0.000001));
-    prm1 = nub1.parameters as ConduiteDistribParams;
+    prm1 = nub1.prms as ConduiteDistribParams;
 
     // Nub esclave
     nub2 = new ConduiteDistrib(new ConduiteDistribParams(3, 1.2, 0.6, 100, 0.000001));
-    prm2 = nub2.parameters as ConduiteDistribParams;
+    prm2 = nub2.prms as ConduiteDistribParams;
 }
 
 describe("Référence d'un paramètre à un paramètre varié : ", () => {
@@ -41,10 +41,12 @@ describe("Référence d'un paramètre à un paramètre varié : ", () => {
         prm1.Q.paramValues.min = 1.5;
         prm1.Q.paramValues.max = 6;
         prm1.Q.paramValues.step = 0.5;
-        const res1: Result = nub1.CalcSerie(0.001, 0.6, "J");
+        prm1.Pr.v = 0.001;
+        const res1: Result = nub1.CalcSerie(0.6, "J");
 
         prm2.Q.defineReference(nub1, "Q");
-        const res2 = nub2.CalcSerie(0.001, 0.6, "J");
+        prm2.Pr.v = 0.001;
+        const res2 = nub2.CalcSerie(0.6, "J");
 
         for (let i = 0; i < res1.resultElements.length; i++) {
             expect(res1.resultElements[i].vCalc).toEqual(res2.resultElements[i].vCalc);
diff --git a/spec/value_ref/value_ref_variable_extraresult.spec.ts b/spec/value_ref/value_ref_variable_extraresult.spec.ts
index ad05df78..41813718 100644
--- a/spec/value_ref/value_ref_variable_extraresult.spec.ts
+++ b/spec/value_ref/value_ref_variable_extraresult.spec.ts
@@ -21,9 +21,9 @@ describe("référence d'un paramètre à un résultat complémentaire multivalu
             40, //  Ks=Strickler
             2, // Q=Débit
             0.001, // If=pente du fond
-            0.001, // précision
             1 // YB=hauteur de berge
         );
+        prms.Pr.v = 0.001;
 
         const sect = new cSnRectang(prms);
 
@@ -31,10 +31,9 @@ describe("référence d'un paramètre à un résultat complémentaire multivalu
             1, // Yaval = tirant aval
             100,  // Long= Longueur du bief
             5,  // Dx=Pas d'espace
-            MethodeResolution.EulerExplicite
         );
 
-        const rem = new CourbeRemous(prem);
+        const rem = new CourbeRemous(prem, MethodeResolution.EulerExplicite);
 
         const res: Result = rem.calculRemous(undefined);
 
diff --git a/spec/value_ref/value_ref_variable_result.spec.ts b/spec/value_ref/value_ref_variable_result.spec.ts
index 7b74fa2a..c47adbfb 100644
--- a/spec/value_ref/value_ref_variable_result.spec.ts
+++ b/spec/value_ref/value_ref_variable_result.spec.ts
@@ -22,11 +22,11 @@ let prm2: ConduiteDistribParams;
 function createEnv() {
     // Nub maître
     nub1 = new ConduiteDistrib(new ConduiteDistribParams(3, 1.2, 0.6, 100, 0.000001));
-    prm1 = nub1.parameters as ConduiteDistribParams;
+    prm1 = nub1.prms as ConduiteDistribParams;
 
     // Nub esclave
     nub2 = new ConduiteDistrib(new ConduiteDistribParams(3, 1.2, 0.6, 100, 0.000001));
-    prm2 = nub2.parameters as ConduiteDistribParams;
+    prm2 = nub2.prms as ConduiteDistribParams;
 }
 
 describe("référence d'un paramètre à un résultat : ", () => {
@@ -39,12 +39,14 @@ describe("référence d'un paramètre à un résultat : ", () => {
 
         prm1.Q.v = 2;
         prm1.J.paramValues.valueMode = ParamValueMode.CALCUL;
-        const res1: Result = nub1.CalcSerie(0.001, 0.6, "J");
+        nub1.prms.Pr.v = 0.001;
+        const res1: Result = nub1.CalcSerie(0.6, "J");
 
         expect(res1.resultElements.length).toEqual(1); // nombre de valeurs du Result
 
         prm2.J.defineReference(nub1, "J.");
-        const res2 = nub2.CalcSerie(0.001, 0.6, "Q");
+        nub2.prms.Pr.v = 0.001;
+        const res2 = nub2.CalcSerie(0.6, "Q");
         expect(res2.resultElements.length).toEqual(1);  // nombre de valeurs du Result
 
         expect(res2.vCalc).toBeCloseTo(prm1.Q.v, 3);
@@ -62,10 +64,12 @@ describe("référence d'un paramètre à un résultat : ", () => {
         prm1.Q.paramValues.max = 6;
         prm1.Q.paramValues.step = 0.5;
         prm1.J.paramValues.valueMode = ParamValueMode.CALCUL;
-        const res1: Result = nub1.CalcSerie(0.001, 0.6, "J");
+        prm1.Pr.v = 0.001;
+        const res1: Result = nub1.CalcSerie(0.6, "J");
 
         prm2.J.defineReference(nub1, "J.");
-        const res2 = nub2.CalcSerie(0.001, 0.6, "Q");
+        prm2.Pr.v = 0.001;
+        const res2 = nub2.CalcSerie(0.6, "Q");
 
         expect(res1.resultElements.length).toEqual(10);  // nombre de valeurs du Result
         expect(res2.resultElements.length).toEqual(10);
diff --git a/src/compute-node.ts b/src/compute-node.ts
index 7a1d7e7c..ee8892db 100644
--- a/src/compute-node.ts
+++ b/src/compute-node.ts
@@ -1,6 +1,6 @@
 import { Debug, IDebug } from "./base";
 import { JalhydObject } from "./jalhyd_object";
-import { ParamDefinition } from "./param/param-definition";
+import { ParamCalculability, ParamDefinition } from "./param/param-definition";
 import { IParamDefinitionIterator, ParamsEquation } from "./param/params-equation";
 
 /**
@@ -52,11 +52,12 @@ export abstract class ComputeNode extends JalhydObject implements IDebug {
         if (!this._prms.calculabilityDefined) {
             this._prms.resetParametersCalculability();
         }
+        this._prms.Pr.calculability = ParamCalculability.FREE;
         this.setParametersCalculability();
         this._prms.DefineCalculability();
     }
 
-    public get parameters(): ParamsEquation {
+    public get prms(): ParamsEquation {
         return this._prms;
     }
 
diff --git a/src/dichotomie.ts b/src/dichotomie.ts
index f4d7b056..00ba788d 100644
--- a/src/dichotomie.ts
+++ b/src/dichotomie.ts
@@ -275,6 +275,7 @@ export class Dichotomie extends Debug {
 
         const prmDom: ParamDomain = this._paramX.getDomain();
         const step = 0.001;
+        // const step = this.nub.prms.Pr.v;
 
         const min: number = prmDom.minValue;
         const max: number = prmDom.maxValue;
diff --git a/src/macrorugo/macrorugo.ts b/src/macrorugo/macrorugo.ts
index dcb60e99..60625102 100644
--- a/src/macrorugo/macrorugo.ts
+++ b/src/macrorugo/macrorugo.ts
@@ -56,12 +56,11 @@ export class MacroRugo extends Nub {
      * Calcul du débit total, de la cote amont ou aval ou d'un paramètre d'une structure
      * @param sVarCalc Nom du paramètre à calculer
      * @param rInit Valeur initiale
-     * @param rPrec Précision attendue
      */
-    public Calc(sVarCalc: string, rInit?: number, rPrec: number = 0.001): Result {
+    public Calc(sVarCalc: string, rInit?: number): Result {
         /** @todo Voir pour déclarer le paramètre en calcul dans nub */
         this.getParameter(sVarCalc).valueMode = ParamValueMode.CALCUL;
-        const r: Result = super.Calc(sVarCalc, rInit, rPrec);
+        const r: Result = super.Calc(sVarCalc, rInit);
         // Ajout des résultats complémentaires
         // Cote de fond aval
         r.extraResults.ZF2 = this.prms.ZF1.v - this.prms.If.v * this.prms.L.v;
diff --git a/src/nub.ts b/src/nub.ts
index e212f1d1..c4fcf93b 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -20,7 +20,7 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
     /** résultat de Calc()/CalcSerie() */
     protected _result: Result;
 
-    private _props: Props;
+    private _props: Props = new Props();
 
     public get result(): Result {
         return this._result;
@@ -49,9 +49,8 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
      * Calcul d'une équation quelle que soit l'inconnue à calculer
      * @param sVarCalc nom de la variable à calculer
      * @param rInit valeur initiale de la variable à calculer dans le cas de la dichotomie
-     * @param rPrec précision de calcul
      */
-    public Calc(sVarCalc: string, rInit?: number, rPrec: number = 0.001): Result {
+    public Calc(sVarCalc: string, rInit?: number): Result {
         const computedVar = this.getParameter(sVarCalc);
 
         if (rInit === undefined) {
@@ -63,7 +62,7 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
             return this._result;
         }
 
-        const resSolve: Result = this.Solve(sVarCalc, rInit, rPrec);
+        const resSolve: Result = this.Solve(sVarCalc, rInit);
         if (!resSolve.ok) {
             this._result = resSolve;
             this._result.name = sVarCalc;
@@ -80,11 +79,10 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
 
     /**
      * effectue une série de calculs sur un paramètre
-     * @param rPrec précision de calcul
      * @param rInit solution approximative du paramètre
      * @param sDonnee éventuel symbole du paramètre à calculer
      */
-    public CalcSerie(rPrec: number = 0.001, rInit?: number, sDonnee?: string): Result {
+    public CalcSerie(rInit?: number, sDonnee?: string): Result {
         let computedParam: ParamDefinition;
         // instance de ParamValues utilisée pour le paramètre varié (qui peut être un paramètre référencé (importé))
         let variatedValues: IterableValues;
@@ -145,14 +143,14 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
         }
 
         if (variatedValues === undefined) {
-            this._result = this.Calc(computedSymbol, rInit, rPrec); // résultat dans this._result
+            this._result = this.Calc(computedSymbol, rInit); // résultat dans this._result
         } else {
             const res = new Result();
             variatedValues.initValuesIterator(false);
             while (variatedValues.hasNext) {
                 // tslint:disable-next-line:no-unused-expression
                 variatedValues.next();
-                this.Calc(computedSymbol, rInit, rPrec);  // résultat dans this._result
+                this.Calc(computedSymbol, rInit);  // résultat dans this._result
                 if (this._result.ok) {
                     res.addResultElement(this._result.resultElement);
                     res.addLog(this._result.log);
@@ -200,7 +198,7 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
 
         // il y a des valeurs par défaut pour la précision et la valeur initiale,
         // mais il faudra prévoir un mécanisme pour les transmettre
-        return this.CalcSerie(0.001, 0.1, desc);
+        return this.CalcSerie(0.1, desc);
     }
 
     public getReferencedExtraResult(desc: string): any {
@@ -399,12 +397,12 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
      * Résoud l'équation par une méthode numérique
      * @param sVarCalc nom de la variable à calculer
      * @param rInit valeur initiale de la variable à calculer dans le cas de la dichotomie
-     * @param rPrec précision de calcul
      */
-    private Solve(sVarCalc: string, rInit: number, rPrec: number): Result {
+    private Solve(sVarCalc: string, rInit: number): Result {
         const dicho: Dichotomie = new Dichotomie(this, sVarCalc, this.DBG);
         dicho.startIntervalMaxSteps = this.dichoStartIntervalMaxSteps;
         const target = this.getFirstAnalyticalParameter();
+        const rPrec = this._prms.Pr.v;
         return dicho.Dichotomie(target.v, rPrec, rInit);
     }
 
diff --git a/src/param/params-equation.ts b/src/param/params-equation.ts
index 9d348acf..d25392d6 100644
--- a/src/param/params-equation.ts
+++ b/src/param/params-equation.ts
@@ -1,7 +1,8 @@
 import { MapIterator } from "../util/iterator";
 
 import { ComputeNode } from "../compute-node";
-import { ParamDefinition } from "./param-definition";
+import { ParamCalculability, ParamDefinition } from "./param-definition";
+import { ParamDomainValue } from "./param-domain";
 
 export interface IParamDefinitionIterator extends IterableIterator<ParamDefinition> {
 }
@@ -85,16 +86,27 @@ export class ParamsEquationArrayIterator implements IParamDefinitionIterator {
 // tslint:disable-next-line:max-classes-per-file
 export abstract class ParamsEquation implements Iterable<ParamDefinition> {
 
+    /** précision de calcul par défaut */
+    private static DEFAULT_COMPUTE_PREC = 0.0001;
+
     /** pointeur vers la calculette qui utilise ces paramètres */
     public parent: ComputeNode;
 
     protected _paramMap: { [key: string]: ParamDefinition } = {};
 
-    private _calculabilityDefined: boolean;
+    /** Précision de calcul */
+    private _Pr: ParamDefinition;
 
+    private _calculabilityDefined: boolean;
     public constructor(parent?: ComputeNode) {
         this.parent = parent;
         this._calculabilityDefined = false;
+        this._Pr = new ParamDefinition(this, "Pr", ParamDomainValue.POS, ParamsEquation.DEFAULT_COMPUTE_PREC);
+        this.addParamDefinition(this._Pr);
+    }
+
+    get Pr() {
+        return this._Pr;
     }
 
     get nubUid() {
diff --git a/src/remous.ts b/src/remous.ts
index 0c167a63..2432df05 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -48,7 +48,7 @@ export class CourbeRemousParams extends ParamsEquation {
      */
     private _Dx: ParamDefinition;
 
-    constructor(s: acSection, rYamont: number, rYAval: number, rLong: number, rDx: number, meth: MethodeResolution) {
+    constructor(s: acSection, rYamont: number, rYAval: number, rLong: number, rDx: number) {
         super();
         this._section = s;
         this._Yamont = new ParamDefinition(this, "Yamont", ParamDomainValue.POS, rYamont);
@@ -104,11 +104,13 @@ export class CourbeRemous extends Nub {
 
     private prmSect: ParamsSection;
 
-    constructor(crp: CourbeRemousParams, dbg: boolean = false) {
+    constructor(crp: CourbeRemousParams, method: MethodeResolution = MethodeResolution.Trapezes, dbg: boolean = false) {
         super(crp, dbg);
         // this._log = crp.Sn.log;
         this.prmSect = crp.Sn.prms;
         this.Sn.Calc("Yc");
+        // should this be a ParamDefinition driven by an Enum, instead of a Prop ?
+        this.properties.setPropValue("methodeResolution", method);
     }
 
     /**
@@ -312,7 +314,7 @@ export class CourbeRemous extends Nub {
                 // let rxRst = rX + iSens * rLongRst; // Abscisse réelle du ressaut
                 // this.debug("xRst reel=" + (rX + iSens * rLongRst));
 
-                xRst = round(xRst, this.prmSect.iPrec.v);
+                xRst = round(xRst, this.prmSect.iPrec);
                 // this.debug("xRst (arr)=" + xRst);
 
                 const impYpartielle = this.Sn.Calc("Imp", crbPartielle[rX]);
@@ -474,7 +476,7 @@ export class CourbeRemous extends Nub {
         return res;
     }
 
-    public Calc(sVarCalc: string, rInit?: number, rPrec: number = 0.001): Result {
+    public Calc(sVarCalc: string, rInit?: number): Result {
         if (sVarCalc === "Hs") {
             return this.Equation(sVarCalc);
         }
@@ -509,7 +511,7 @@ export class CourbeRemous extends Nub {
         return this.prms.Sn;
     }
 
-    private get prms(): CourbeRemousParams {
+    get prms(): CourbeRemousParams {
         return this._prms as CourbeRemousParams;
     }
 
@@ -730,7 +732,7 @@ export class CourbeRemous extends Nub {
         // H est la charge totale. On se place dans le référentiel ou Zf de la section à calculer = 0
         trapezFn -= this.Dx * this.prmSect.If.v;
 
-        const r: Result = dicho.Dichotomie(trapezFn, this.prmSect.Prec.v, Y);
+        const r: Result = dicho.Dichotomie(trapezFn, this.prmSect.Pr.v, Y);
         if (!r.ok) {
             return r;
         }
@@ -802,7 +804,7 @@ export class CourbeRemous extends Nub {
         const res = new ResultElement();
 
         let lastY = YCL;
-        trY[round(varParam.next().value, this.prmSect.iPrec.v)] = lastY;
+        trY[round(varParam.next().value, this.prmSect.iPrec)] = lastY;
 
         // Boucle de calcul de la courbe de remous
         while (varParam.hasNext) {
@@ -817,7 +819,7 @@ export class CourbeRemous extends Nub {
 
             if (rY.ok) {
                 // on vérifie qu'on ne traverse pas la hauteur normale (à la précision de calcul près)
-                const prec: number = this.prms.map.Prec.v;
+                const prec: number = this.prms.Pr.v;
                 const b1: boolean = lastY - this.Sn.HautNormale > prec;
                 const b2: boolean = rY.vCalc - this.Sn.HautNormale > prec;
                 if (XOR(b1, b2)) {
@@ -832,7 +834,7 @@ export class CourbeRemous extends Nub {
                     res.addMessage(m);
                 }
 
-                trY[round(x, this.prmSect.iPrec.v)] = rY.vCalc;
+                trY[round(x, this.prmSect.iPrec)] = rY.vCalc;
             } else {
                 const m = new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE);
                 m.extraVar.x = x;
diff --git a/src/section/newton.ts b/src/section/newton.ts
index 498bef41..29ac3d3e 100644
--- a/src/section/newton.ts
+++ b/src/section/newton.ts
@@ -21,8 +21,8 @@ export abstract class acNewton extends Debug {
          */
         constructor(prms: cParamsCanal, maxIter: number, dbg: boolean = false) {
                 super(dbg);
-                this.rTol = prms.Prec.v;
-                this.Dx = prms.Prec.v / 10;
+                this.rTol = prms.Pr.v;
+                this.Dx = prms.Pr.v / 10;
                 this.iCptMax = maxIter;
         }
 
diff --git a/src/section/section_circulaire.ts b/src/section/section_circulaire.ts
index 0ca9428b..0a0d9c90 100644
--- a/src/section/section_circulaire.ts
+++ b/src/section/section_circulaire.ts
@@ -7,8 +7,8 @@ import { acSection, ParamsSection } from "./section_type";
 export class ParamsSectionCirc extends ParamsSection {
         private _D: ParamDefinition;          // Diamètre du cercle
 
-        constructor(rD: number, rY: number, rKs: number, rQ: number, rIf: number, rPrec: number, rYB: number) {
-                super(rY, undefined, rKs, rQ, rIf, rPrec, rYB);
+        constructor(rD: number, rY: number, rKs: number, rQ: number, rIf: number, rYB: number) {
+                super(rY, undefined, rKs, rQ, rIf, rYB);
                 this._D = new ParamDefinition(this, "D", ParamDomainValue.POS, rD);
 
                 this.addParamDefinition(this._D);
diff --git a/src/section/section_parametree.ts b/src/section/section_parametree.ts
index 660b5a1b..e19f1347 100644
--- a/src/section/section_parametree.ts
+++ b/src/section/section_parametree.ts
@@ -79,11 +79,11 @@ export class SectionParametree extends Nub {
         }
     }
 
-    public CalcSerie(rPrec: number = 0.001, rInit?: number, sDonnee?: string): Result {
+    public CalcSerie(rInit?: number, sDonnee?: string): Result {
         // paramètre à varier ?
 
         if (this.hasVariatedParameter()) {
-            return super.CalcSerie(rPrec, rInit, sDonnee);
+            return super.CalcSerie(rInit, sDonnee);
         }
 
         // sinon, on stocke toutes les valeurs des variables à calcul dans les résultats supplémentaires
diff --git a/src/section/section_puissance.ts b/src/section/section_puissance.ts
index 1ee1d152..3b216037 100644
--- a/src/section/section_puissance.ts
+++ b/src/section/section_puissance.ts
@@ -10,9 +10,9 @@ export class ParamsSectionPuiss extends ParamsSection {
         private _k: ParamDefinition; // Coefficient de forme compris entre 0 et 1
 
         constructor(rk: number, rY: number, rLargeurBerge: number, rKs: number, rQ: number,
-                    rIf: number, rPrec: number, rYB: number) {
+                    rIf: number, rYB: number) {
 
-                super(rY, rLargeurBerge, rKs, rQ, rIf, rPrec, rYB);
+                super(rY, rLargeurBerge, rKs, rQ, rIf, rYB);
                 this._k = new ParamDefinition(this, "k", new ParamDomain(ParamDomainValue.INTERVAL, 0, 1), rk);
 
                 this.addParamDefinition(this._k);
diff --git a/src/section/section_rectang.ts b/src/section/section_rectang.ts
index 5207edff..ef8da7a6 100644
--- a/src/section/section_rectang.ts
+++ b/src/section/section_rectang.ts
@@ -2,12 +2,11 @@ import { Result } from "../util/result";
 import { acSection, ParamsSection } from "./section_type";
 
 export class ParamsSectionRectang extends ParamsSection {
-        constructor(rY: number, rLargeurFond: number, rKs: number, rQ: number, rIf: number,
-                    rPrec: number, rYB: number) {
+        constructor(rY: number, rLargeurFond: number, rKs: number, rQ: number, rIf: number, rYB: number) {
 
                 super(rY,
                         rLargeurFond, // LargeurBerge=LargeurFond
-                        rKs, rQ, rIf, rPrec, rYB);
+                        rKs, rQ, rIf, rYB);
         }
 }
 
diff --git a/src/section/section_trapez.ts b/src/section/section_trapez.ts
index 484848b4..7e5e085a 100644
--- a/src/section/section_trapez.ts
+++ b/src/section/section_trapez.ts
@@ -8,9 +8,9 @@ export class ParamsSectionTrapez extends ParamsSection {
         private _Fruit: ParamDefinition; // Fruit des berges
 
         constructor(rLargeurFond: number, rFruit: number, rY: number, rKs: number,
-                    rQ: number, rIf: number, rPrec: number, rYB: number) {
+                    rQ: number, rIf: number, rYB: number) {
 
-                super(rY, undefined, rKs, rQ, rIf, rPrec, rYB);
+                super(rY, undefined, rKs, rQ, rIf, rYB);
                 this._LargeurFond = new ParamDefinition(this, "LargeurFond", ParamDomainValue.POS_NULL, rLargeurFond);
                 this._Fruit = new ParamDefinition(this, "Fruit", ParamDomainValue.POS_NULL, rFruit);
 
diff --git a/src/section/section_type.ts b/src/section/section_type.ts
index 78160db4..ca74eaee 100644
--- a/src/section/section_type.ts
+++ b/src/section/section_type.ts
@@ -16,28 +16,22 @@ export abstract class cParamsCanal extends ParamsEquation {
         private _Ks: ParamDefinition; // Strickler
         private _Q: ParamDefinition; // Débit
         private _If: ParamDefinition;  // Pente du fond
-        private _Prec: ParamDefinition;  // Précision de calcul et d'affichage
-        private _iPrec: ParamDefinition;  // Précision en nombre de décimales
         private _YB: ParamDefinition;  // Hauteur de berge
+        private _iPrec: number;  // Précision en nombre de décimales
 
-        constructor(rKs: number, rQ: number, rIf: number, rPrec: number, rYB: number) {
+        constructor(rKs: number, rQ: number, rIf: number, rYB: number) {
                 super();
                 this._Ks = new ParamDefinition(this, "Ks", ParamDomainValue.POS, rKs);
                 this._Q = new ParamDefinition(this, "Q", ParamDomainValue.POS_NULL, rQ);
                 this._If = new ParamDefinition(this, "If", ParamDomainValue.ANY, rIf);
-                this._Prec = new ParamDefinition(this, "Prec", ParamDomainValue.POS, rPrec, false); // hidden by default
-                this._iPrec = new ParamDefinition(
-                    this, "iPrec", ParamDomainValue.ANY,
-                    Math.round(-Math.log(rPrec) / Math.log(10))
-                , false); // hidden by default
                 this._YB = new ParamDefinition(this, "YB", ParamDomainValue.POS, rYB);
 
                 this.addParamDefinition(this._Ks);
                 this.addParamDefinition(this._Q);
                 this.addParamDefinition(this._If);
-                this.addParamDefinition(this._Prec);
-                this.addParamDefinition(this._iPrec);
                 this.addParamDefinition(this._YB);
+
+                this._iPrec = Math.round(-Math.log(this.Pr.v) / Math.log(10));
         }
 
         /**
@@ -61,17 +55,10 @@ export abstract class cParamsCanal extends ParamsEquation {
                 return this._If;
         }
 
-        /**
-         * Précision de calcul et d'affichage
-         */
-        get Prec(): ParamDefinition {
-                return this._Prec;
-        }
-
         /**
          * Précision en nombre de décimales
          */
-        get iPrec(): ParamDefinition {
+        get iPrec(): number {
                 return this._iPrec;
         }
 
@@ -93,9 +80,8 @@ export abstract class ParamsSection extends cParamsCanal {
                     rKs: number,
                     rQ: number,
                     rIf: number,
-                    rPrec: number,
                     rYB: number) {
-                super(rKs, rQ, rIf, rPrec, rYB);
+                super(rKs, rQ, rIf, rYB);
                 this._Y = new ParamDefinition(this, "Y", ParamDomainValue.POS_NULL, rY);
                 this._LargeurBerge = new ParamDefinition(
                     this, "LargeurBerge", ParamDomainValue.POS_NULL, rLargeurBerge);
@@ -235,8 +221,6 @@ export abstract class acSection extends ComputeNode {
                 this.prms.Ks.calculability = ParamCalculability.DICHO;
                 this.prms.Q.calculability = ParamCalculability.DICHO;
                 this.prms.If.calculability = ParamCalculability.DICHO;
-                this.prms.Prec.calculability = ParamCalculability.NONE;
-                this.prms.iPrec.calculability = ParamCalculability.NONE;
                 this.prms.YB.calculability = ParamCalculability.DICHO;
                 this.prms.Y.calculability = ParamCalculability.DICHO;
                 this.prms.LargeurBerge.calculability = ParamCalculability.DICHO;
diff --git a/src/session.ts b/src/session.ts
index 6764e841..86256441 100644
--- a/src/session.ts
+++ b/src/session.ts
@@ -236,9 +236,8 @@ export class Session {
                     0.4, // Yaval = tirant aval
                     100,  // Long= Longueur du bief
                     5,  // Dx=Pas d'espace
-                    MethodeResolution.EulerExplicite
                 );
-                nub = new CourbeRemous(prms, dbg);
+                nub = new CourbeRemous(prms, MethodeResolution.EulerExplicite, dbg);
                 break;
             }
 
@@ -406,7 +405,6 @@ export class Session {
                         40, //  Ks=Strickler
                         1.2,  //  Q=Débit
                         0.001, //  If=pente du fond
-                        this.defaultPrecision, // précision
                         1, // YB= hauteur de berge
                     );
 
@@ -420,7 +418,6 @@ export class Session {
                         40, //  Ks=Strickler
                         1.2, // Q=Débit
                         0.001, // If=pente du fond
-                        this.defaultPrecision, // précision
                         1 // YB=hauteur de berge
                     );
                     return new cSnRectang(prms, dbg);
@@ -433,7 +430,6 @@ export class Session {
                         40, //  Ks=Strickler
                         1.2,  //  Q=Débit
                         0.001, //  If=pente du fond
-                        this.defaultPrecision, // précision
                         1, // YB= hauteur de berge
                     );
                     return new cSnCirc(prms, dbg);
@@ -447,7 +443,6 @@ export class Session {
                         40, //  Ks=Strickler
                         1.2,  //  Q=Débit
                         0.001, //  If=pente du fond
-                        this.defaultPrecision, // précision
                         1, // YB= hauteur de berge
                     );
                     return new cSnPuiss(prms, dbg);
diff --git a/src/structure/cloisons.ts b/src/structure/cloisons.ts
index 5ba50488..7f512132 100644
--- a/src/structure/cloisons.ts
+++ b/src/structure/cloisons.ts
@@ -29,9 +29,8 @@ export class Cloisons extends ParallelStructure {
      * @param sVarCalc Nom du paramètre à calculer :
      *                 "Q", "Z1", "DH" ou "n.X" avec "n" l'index de l'ouvrage et "X" son paramètre
      * @param rInit Valeur initiale
-     * @param rPrec Précision attendue
      */
-    public Calc(sVarCalc: string, rInit?: number, rPrec: number = 0.001): Result {
+    public Calc(sVarCalc: string, rInit?: number): Result {
         // Mise à jour de ZRAM pour Kivi à partir de Z1 - PB
         this.updateKiviZRAM();
 
@@ -42,7 +41,7 @@ export class Cloisons extends ParallelStructure {
             sVC = "Z2";
         }
 
-        const r: Result = super.Calc(sVC, rInit, rPrec);
+        const r: Result = super.Calc(sVC, rInit);
 
         // Transformation Z2 => DH
         if (sVarCalc === "DH") {
diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts
index ee81f5a7..d486982f 100644
--- a/src/structure/factory_structure.ts
+++ b/src/structure/factory_structure.ts
@@ -21,8 +21,7 @@ import { StructureWeirFree } from "./structure_weir_free";
 import { StructureWeirSubmergedLarinier } from "./structure_weir_submerged_larinier";
 
 export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit, parentNub?: ParallelStructure,
-                                dbg: boolean = false): Structure
-{
+                                dbg: boolean = false): Structure {
     const oCd: {[s: string]: number} = {SeuilR: 0.4, VanneR: 0.6, SeuilT: 1.36};
     const rectStructPrms: RectangularStructureParams = new RectangularStructureParams(
         0,  // Q
diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index 4e2cebfd..98330f11 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -73,7 +73,7 @@ export class ParallelStructure extends Nub {
         const prms: ParamsEquation[] = [];
         prms.push(this._prms);
         for (const st of this._structures) {
-            prms.push(st.parameters);
+            prms.push(st.prms);
         }
         return new ParamsEquationArrayIterator(prms);
     }
@@ -91,6 +91,8 @@ export class ParallelStructure extends Nub {
         }
         // add reference to parent collection (this)
         structure.parent = this;
+        // propagate precision
+        structure.prms.Pr.v = this.prms.Pr.v;
     }
 
     /**
@@ -233,15 +235,14 @@ export class ParallelStructure extends Nub {
      * @param sVarCalc Nom du paramètre à calculer :
      *                 "Q", "Z1", "Z2" ou "n.X" avec "n" l'index de l'ouvrage et "X" son paramètre
      * @param rInit Valeur initiale
-     * @param rPrec Précision attendue
      */
-    public Calc(sVarCalc: string, rInit?: number, rPrec: number = 0.001): Result {
+    public Calc(sVarCalc: string, rInit?: number): Result {
         let res: Result;
         switch (sVarCalc) {
             case "Z1":
             case "Z2":
             case "Q":
-                res = super.Calc(sVarCalc, rInit, rPrec);
+                res = super.Calc(sVarCalc, rInit);
                 if (res.ok) {
                     this.getParameter(sVarCalc).setValue(res.vCalc);
                 }
@@ -249,7 +250,7 @@ export class ParallelStructure extends Nub {
             default:
                 // Pour les caractéristiques des ouvrages
                 const sVC = this.getStructureVarCalc(sVarCalc);
-                res = this.CalcStructPrm(sVC, rInit, rPrec);
+                res = this.CalcStructPrm(sVC, rInit);
                 // Suppression des extraResults : ils sont complétés plus bas pour chaque ouvrage
                 res.resultElement.extraResults = {};
                 if (res.ok) {
@@ -446,14 +447,13 @@ export class ParallelStructure extends Nub {
      * Calcul du paramètre d'un des ouvrages en parallèle
      * @param sVC Index de l'ouvrage et paramètre à calculer
      * @param rInit Valeur initiale
-     * @param rPrec Précision attendue
      */
-    private CalcStructPrm(sVC: IStructureVarCalc, rInit?: number, rPrec: number = 0.001): Result {
+    private CalcStructPrm(sVC: IStructureVarCalc, rInit?: number): Result {
         // Le débit restant sur la structure en calcul est :
         this._structures[sVC.index].prms.Q.setValue(this.prms.Q.v - this.CalcQ(sVC.index).vCalc);
 
         // Calcul du paramètre de la structure en calcul
-        return this._structures[sVC.index].Calc(sVC.prm, rInit, rPrec);
+        return this._structures[sVC.index].Calc(sVC.prm, rInit);
     }
 
 }
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index 9059ccf6..7a59fdbe 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -100,9 +100,8 @@ export abstract class Structure extends Nub {
      * Gestion du débit nul et de l'inversion de débit
      * @param sVarCalc nom de la variable à calculer
      * @param rInit valeur initiale de la variable à calculer dans le cas de la dichotomie
-     * @param rPrec précision de calcul
      */
-    public Calc(sVarCalc: string, rInit?: number, rPrec: number = 0.001): Result {
+    public Calc(sVarCalc: string, rInit?: number): Result {
         // Gestion de l'exception de calcul de W sur les seuils
         if (rInit === undefined) {
             rInit = this.getParameter(sVarCalc).v;
@@ -153,6 +152,7 @@ export abstract class Structure extends Nub {
                 switch (sVarCalc) {
                     case "ZDV":
                         rPrm = Infinity;
+                        break;
                     default:
                         rPrm = 0;
                 }
@@ -167,13 +167,13 @@ export abstract class Structure extends Nub {
         // Gestion de l'inversion de débit : on inverse l'amont et l'aval pour le calcul
         if ((sVarCalc === "Q" && (this.prms.h1.v < this.prms.h2.v)) || (sVarCalc !== "Q" && this.prms.Q.v < 0)) {
             [this.prms.h1.v, this.prms.h2.v] = [this.prms.h2.v, this.prms.h1.v]; // Swap ES6 fashion
-            const res: Result = super.Calc(sVarCalc, rInit, rPrec);
+            const res: Result = super.Calc(sVarCalc, rInit);
             [this.prms.h1.v, this.prms.h2.v] = [this.prms.h2.v, this.prms.h1.v]; // Swap ES6 fashion
             return res;
         }
 
         // Calcul normal hors débit nul et inversion de débit
-        return super.Calc(sVarCalc, rInit, rPrec);
+        return super.Calc(sVarCalc, rInit);
     }
 
     protected getResultData() {
diff --git a/src/structure/structure_params.ts b/src/structure/structure_params.ts
index 58226bc8..3f3018c4 100644
--- a/src/structure/structure_params.ts
+++ b/src/structure/structure_params.ts
@@ -56,6 +56,8 @@ export class StructureParams extends ParamsEquation {
         this.addParamDefinition(this.h2);
         this.W = new ParamDefinition(this, "W", ParamDomainValue.POS_NULL, rW, false); // hidden by default
         this.addParamDefinition(this.W);
+        // hide params
+        this.Pr.visible = false;
     }
 
     /** Mise à jour des paramètres h1 et h2 à partir de Z1, Z2 et ZDV */
-- 
GitLab