diff --git a/spec/mock_jasmine.ts b/spec/mock_jasmine.ts
index acb2b503f4896e06cc625e3af4e671d86f6a8d80..8f03ee968fd9695c3b0ce6b1619a724d6b577bfb 100644
--- a/spec/mock_jasmine.ts
+++ b/spec/mock_jasmine.ts
@@ -1,10 +1,10 @@
+// tslint:disable:no-console
 /**
  * Mock fonction describe de Jasmine
  * @param sTxt Texte de la suite de test
  * @param fFun Fonction de la suite de test
  */
 export function describe(sTxt: string, fFun: () => void) {
-    // tslint:disable-next-line:no-console
     console.log(sTxt);
     fFun();
 }
@@ -15,7 +15,6 @@ export function describe(sTxt: string, fFun: () => void) {
  * @param fFun Fonction de la suite de test
  */
 export function xdescribe(sTxt: string, fFun: () => void) {
-    // tslint:disable-next-line:no-console
     console.log(sTxt + " ignored ***");
 }
 
@@ -25,7 +24,6 @@ export function xdescribe(sTxt: string, fFun: () => void) {
  * @param fFun Function à lancer pour la spec
  */
 export function it(sTxt: string, fFun: () => void) {
-    // tslint:disable-next-line:no-console
     console.log(sTxt);
     fFun();
 }
@@ -52,7 +50,6 @@ class Expect {
         const delta = Math.abs(expected - this.actual);
         const maxDelta = Math.pow(10, -precision) / 2;
         if (Math.round(delta * pow) / pow > maxDelta) {
-            // tslint:disable-next-line:no-console
             console.error("Expected " + this.actual + " to be close to " + expected + "," + precision);
         }
         return this;
@@ -64,8 +61,9 @@ class Expect {
      */
     public toBe(expected: any) {
         const res = this.actual === expected;
-        if (!res)
+        if (!res) {
             console.error("Error : expected " + this.actual + " to be " + expected);
+        }
         return res;
     }
 
@@ -75,8 +73,9 @@ class Expect {
      */
     public toEqual(expected: any) {
         const res = this.actual === expected;
-        if (!res)
-            console.error("Error : expected " + this.actual + " to be equal to " + expected);
+        if (!res) {
+            console.warn("Warning : test 'to be equal to' not tested");
+        }
         return res;
     }
 
@@ -85,8 +84,9 @@ class Expect {
      * @param message message d'erreur
      */
     public toBeTruthy(message: string) {
-        if (!this.actual)
+        if (!this.actual) {
             console.error(message);
+        }
     }
 
     /**
@@ -94,8 +94,9 @@ class Expect {
      * @param message message d'erreur
      */
     public toBeFalsy(message: string) {
-        if (this.actual)
+        if (this.actual) {
             console.error(message);
+        }
     }
 }
 
diff --git a/spec/structure/rectangular_structure.ts b/spec/structure/rectangular_structure.ts
index e960a7135be139759e2677ced7a28866cb055f16..a55774991cd3e5994d151cb9d9a4b94c07b1f703 100644
--- a/spec/structure/rectangular_structure.ts
+++ b/spec/structure/rectangular_structure.ts
@@ -1,9 +1,13 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ */
+// import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
-import { Result } from "../../src/util/result";
 import { RectangularStructure } from "../../src/structure/rectangular_structure";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
+import { Result } from "../../src/util/result";
 import { precDigits } from "../test_config";
 
 /**
@@ -23,27 +27,27 @@ export class Describer {
 }
 
 export function itCalcQ(
-    struct: RectangularStructure, h1: number, W: number, Q: number,
+    struct: RectangularStructure, Z1: number, W: number, Q: number,
     mode?: StructureFlowMode, regime?: StructureFlowRegime) {
 
-    struct.debug("itCalQ " + Describer.getName(struct) + " h1=" + h1 + " W=" + W + " Q=" + Q);
+    struct.debug("itCalQ " + Describer.getName(struct) + " Z1=" + Z1 + " W=" + W + " Q=" + Q);
 
-    struct.prms.h1.v = h1;
+    struct.prms.Z1.v = Z1;
     struct.prms.W.v = W;
     const res: Result = struct.Calc("Q");
     struct.debug("struct.Calc(Q)=" + res.vCalc);
 
-    it("Q(h1=" + h1 + ",W=" + W + ") should be " + Q, () => {
+    it("Q(Z1=" + Z1 + ",W=" + W + ") should be " + Q, () => {
         struct.debug("struct.Calc(Q)=" + res.vCalc);
         expect(res.vCalc).toBeCloseTo(Q, precDigits);
     });
     if (mode !== undefined) {
-        it("Q(h1=" + h1 + ",W=" + W + ") Mode should be " + mode, () => {
+        it("Q(Z1=" + Z1 + ",W=" + W + ") Mode should be " + mode, () => {
             expect(res.extraVar.Mode).toBe(mode);
        });
     }
     if (regime !== undefined) {
-        it("Q(h1=" + h1 + ",W=" + W + ") Regime should be " + regime, () => {
+        it("Q(Z1=" + Z1 + ",W=" + W + ") Regime should be " + regime, () => {
             expect(res.extraVar.Regime).toBe(regime);
         });
     }
diff --git a/spec/structure/structure.spec.ts b/spec/structure/structure.spec.ts
index 1c764d056c924e95878ba26b401b06fb0f8b9e63..2f6cc9e5b9f2db59e4ee1cf69804204adfb8c15b 100644
--- a/spec/structure/structure.spec.ts
+++ b/spec/structure/structure.spec.ts
@@ -1,8 +1,13 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier test_func.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
-import { Result } from "../../src/util/result";
 import { Structure, StructureFlowMode, StructureFlowRegime, StructureParams } from "../../src/structure/structure";
+import { Result } from "../../src/util/result";
 import { checkResult } from "../test_func";
 
 class StructureTest extends Structure {
@@ -15,6 +20,7 @@ class StructureTest extends Structure {
      * Test of getFlowMode
      */
     public testGetFlowMode() {
+        this.prms.update_h1h2();
         return this.getFlowMode();
     }
 
@@ -22,24 +28,19 @@ class StructureTest extends Structure {
      * Test of getFlowRegime
      */
     public testGetFlowRegime() {
+        this.prms.update_h1h2();
         return this.getFlowRegime();
     }
 
     public Equation(sVarCalc: string): Result {
-        let v: number;
-        switch (sVarCalc) {
-            case "Q":
-                v = this.prms.h1.v - this.prms.h2.v;
-                break;
-            default:
-                throw new Error("StructureTest.Equation() : invalid parameter name " + sVarCalc);
-        }
-        return new Result(v);
+        this.prms.update_h1h2();
+        this.CheckEquation(sVarCalc);
+        return new Result(this.prms.Z1.v - this.prms.Z2.v);
     }
 
 }
 
-const structTestPrm: StructureParams = new StructureParams(1, 30, 15);
+const structTestPrm: StructureParams = new StructureParams(1, 0, 30, 15);
 const structTest: StructureTest = new StructureTest(structTestPrm, false);
 
 describe("Class Structure: ", () => {
@@ -60,30 +61,30 @@ describe("Class Structure: ", () => {
             expect(structTest.testGetFlowRegime()).toBe(StructureFlowRegime.FREE);
         });
         it("Flow Regime should be SUBMERGED (WEIR)", () => {
-            structTest.prms.h2.v = 21;
+            structTest.prms.Z2.v = 21;
             expect(structTest.testGetFlowRegime()).toBe(StructureFlowRegime.SUBMERGED);
         });
         it("Flow Regime should be PARTIAL (ORIFICE)", () => {
-            structTest.prms.h2.v = 21;
+            structTest.prms.Z2.v = 21;
             structTest.prms.W.v = 15;
             expect(structTest.testGetFlowRegime()).toBe(StructureFlowRegime.PARTIAL);
         });
         it("Flow Regime should be SUBMERGED (ORIFICE)", () => {
-            structTest.prms.h2.v = 25;
+            structTest.prms.Z2.v = 25;
             structTest.prms.W.v = 15;
             expect(structTest.testGetFlowRegime()).toBe(StructureFlowRegime.SUBMERGED);
         });
-        structTest.prms.h2.v = 15;
+        structTest.prms.Z2.v = 15;
         structTest.prms.W.v = Infinity;
     });
 
     describe("Calc()", () => {
         const flagsNull = { Mode: StructureFlowMode.NULL, Regime: StructureFlowRegime.NULL };
         it("h1=h2 => Q=0", () => {
-            structTest.prms.h2.v = structTest.prms.h1.v;
+            structTest.prms.Z2.v = structTest.prms.Z1.v;
             checkResult(structTest.Calc("Q"), 0);
             expect(structTest.Calc("Q").extraVar).toEqual(flagsNull);
-            structTest.prms.h2.v = 15;
+            structTest.prms.Z2.v = 15;
         });
         it("W=0 => Q=0", () => {
             structTest.prms.W.v = 0;
diff --git a/spec/structure/structure_cem88d.spec.ts b/spec/structure/structure_cem88d.spec.ts
index 779ee7423d1ff6d3781bd4c14bfde3f70556f469..0ec076f5e4788aadde63a4f5d2cb7bf7bc6ce857 100644
--- a/spec/structure/structure_cem88d.spec.ts
+++ b/spec/structure/structure_cem88d.spec.ts
@@ -1,12 +1,18 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier rectangular_structure.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCem88d } from "../../src/structure/structure_cem88d";
+import { Result } from "../../src/util/result";
 import { itCalcQ } from "./rectangular_structure";
 
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
+const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 0, 1, 1, 2, 0.6, 0);
 const structTest: StructureCem88d = new StructureCem88d(structPrm, false);
 
 describe("Class StructureCem88d: ", () => {
diff --git a/spec/structure/structure_cem88v.spec.ts b/spec/structure/structure_cem88v.spec.ts
index e7b440612f8ebfc0464817761bd8fbbe0a7ac042..b250b8756435a74f06599d62ceec02dad0d06865 100644
--- a/spec/structure/structure_cem88v.spec.ts
+++ b/spec/structure/structure_cem88v.spec.ts
@@ -1,12 +1,18 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier rectangular_structure.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCem88v } from "../../src/structure/structure_cem88v";
+import { Result } from "../../src/util/result";
 import { itCalcQ } from "./rectangular_structure";
 
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
+const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 0, 1, 1, 2, 0.6, 0);
 const structTest: StructureCem88v = new StructureCem88v(structPrm, false);
 
 describe("Class StructureCem88v: ", () => {
diff --git a/spec/structure/structure_cunge80.spec.ts b/spec/structure/structure_cunge80.spec.ts
index 31fd7bb11e06a8c2fedadc99586edea3052bd6f0..f5d40c04866937b5ee816c12b1064b415c20f5fd 100644
--- a/spec/structure/structure_cunge80.spec.ts
+++ b/spec/structure/structure_cunge80.spec.ts
@@ -1,12 +1,18 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier rectangular_structure.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCunge80 } from "../../src/structure/structure_cunge80";
+import { Result } from "../../src/util/result";
 import { itCalcQ } from "./rectangular_structure";
 
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
+const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 0, 1, 1, 2, 0.6, 0);
 const structTest: StructureCunge80 = new StructureCunge80(structPrm, false);
 
 describe("Class StructureCunge80: ", () => {
diff --git a/spec/structure/structure_orifice_free.spec.ts b/spec/structure/structure_orifice_free.spec.ts
index 04323a813216e56b81fd778c45772ff35cf82cdc..96f831154c5256e4a044df8b1b140e5d1ef96c37 100644
--- a/spec/structure/structure_orifice_free.spec.ts
+++ b/spec/structure/structure_orifice_free.spec.ts
@@ -1,12 +1,18 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier rectangular_structure.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureOrificeFree } from "../../src/structure/structure_orifice_free";
+import { Result } from "../../src/util/result";
 import { itCalcQ } from "./rectangular_structure";
 
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
+const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 0, 1, 1, 2, 0.6, 0);
 const structTest: StructureOrificeFree = new StructureOrificeFree(structPrm, false);
 
 describe("Class StructureOrificeFree: ", () => {
diff --git a/spec/structure/structure_orifice_submerged.spec.ts b/spec/structure/structure_orifice_submerged.spec.ts
index 3f18b07f1f1dbedb6c8886f32c97771719e8fc68..bc92235cbb75b590f71b96476e80f7fac5f46b5a 100644
--- a/spec/structure/structure_orifice_submerged.spec.ts
+++ b/spec/structure/structure_orifice_submerged.spec.ts
@@ -1,12 +1,18 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier rectangular_structure.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureOrificeSubmerged } from "../../src/structure/structure_orifice_submerged";
+import { Result } from "../../src/util/result";
 import { itCalcQ } from "./rectangular_structure";
 
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
+const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 0, 1, 1, 2, 0.6, 0);
 const structTest: StructureOrificeSubmerged = new StructureOrificeSubmerged(structPrm, false);
 
 describe("Class StructureOrificeSubmerged: ", () => {
diff --git a/spec/structure/structure_weir_free.spec.ts b/spec/structure/structure_weir_free.spec.ts
index 49bd92967d325fc580dc1bfb31c668f85f915a12..97c30a367bc1c95f10cf7aa3cad0e83399d1d249 100644
--- a/spec/structure/structure_weir_free.spec.ts
+++ b/spec/structure/structure_weir_free.spec.ts
@@ -1,12 +1,18 @@
-// tslint:disable-next-line:no-reference
-/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier rectangular_structure.ts
+ */
+import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureWeirFree } from "../../src/structure/structure_weir_free";
+import { Result } from "../../src/util/result";
 import { itCalcQ } from "./rectangular_structure";
 
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
+const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 0, 1, 1, 2, 0.6, 0);
 const structTest: StructureWeirFree = new StructureWeirFree(structPrm, false);
 
 describe("Class StructureWeirFree: ", () => {
diff --git a/spec/structure/test_rectangular_structure.ts b/spec/structure/test_rectangular_structure.ts
deleted file mode 100644
index 77742fc64b5ccfcaac670eea6fa0e05b0a79e066..0000000000000000000000000000000000000000
--- a/spec/structure/test_rectangular_structure.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Result } from "../../src/util/result";
-import { RectangularStructure } from "../../src/structure/rectangular_structure";
-import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
-import { expect, it } from "../mock_jasmine";
-import { precDigits } from "../test_config";
-import { Describer } from "./rectangular_structure";
-
-export function itCalcQ(
-    struct: RectangularStructure, h1: number, W: number, Q: number,
-    mode?: StructureFlowMode, regime?: StructureFlowRegime) {
-
-    struct.debug("itCalQ " + Describer.getName(struct) + " h1=" + h1 + " W=" + W + " Q=" + Q);
-
-    struct.prms.h1.v = h1;
-    struct.prms.W.v = W;
-    const res: Result = struct.Calc("Q");
-    struct.debug("struct.Calc(Q)=" + res.vCalc);
-
-    it("Q(h1=" + h1 + ",W=" + W + ") should be " + Q, () => {
-        struct.debug("struct.Calc(Q)=" + res.vCalc);
-        expect(res.vCalc).toBeCloseTo(Q, precDigits);
-    });
-    if (mode !== undefined) {
-        it("Q(h1=" + h1 + ",W=" + W + ") Mode should be " + mode, () => {
-            expect(res.extraVar.Mode).toBe(mode);
-       });
-    }
-    if (regime !== undefined) {
-        it("Q(h1=" + h1 + ",W=" + W + ") Regime should be " + regime, () => {
-            expect(res.extraVar.Regime).toBe(regime);
-        });
-    }
-}
diff --git a/spec/structure/test_structure_cem88d.ts b/spec/structure/test_structure_cem88d.ts
deleted file mode 100644
index 75b888335df45667732855186d49601563540f34..0000000000000000000000000000000000000000
--- a/spec/structure/test_structure_cem88d.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { RectangularStructureParams, StructureCem88d } from "../../src/structure/structure_cem88d";
-import { describe, xdescribe } from "../mock_jasmine";
-import { itCalcQ } from "./test_rectangular_structure";
-
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
-const structTest: StructureCem88d = new StructureCem88d(structPrm, true);
-
-describe("Class StructureCem88d: ", () => {
-
-    describe("Calcul Q avec W croissant: ", () => {
-        const W: number[] = [0.000000, 0.100000, 0.200000, 0.300000, 0.400000, 0.500000,
-            0.600000, 0.700000, 0.800000, 0.900000, 1.000000, 1.100000, 1.200000, 1.300000];
-        const h1: number = 1.200000;
-        const Q: number[] = [0.000000, 0.617586, 1.235173, 1.852759, 2.470345, 3.087931, 3.705518,
-            4.296608, 4.831177, 5.302464, 5.700445, 6.007777, 6.175863, 6.175863];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1, W[i], Q[i]);
-        }
-    });
-    describe("Calcul Q en charge avec h1 croissant: ", () => {
-        const W: number = 0.8;
-        const h1: number[] = [1.050000, 1.300000, 1.500000];
-        const Q: number[] = [2.470345, 5.684601, 6.651906];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1[i], W, Q[i]);
-        }
-    });
-    describe("Calcul Q a surface libre avec h1 croissant: ", () => {
-        const W: number = Infinity;
-        const h1: number[] = [1.100000, 1.500000];
-        const Q: number[] = [4.366994, 9.764896];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1[i], W, Q[i]);
-        }
-    });
-});
diff --git a/spec/structure/test_structure_cem88v.ts b/spec/structure/test_structure_cem88v.ts
deleted file mode 100644
index a996471ce38b2c620cd2e4a65962028a520478ef..0000000000000000000000000000000000000000
--- a/spec/structure/test_structure_cem88v.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { RectangularStructureParams, StructureCem88v } from "../../src/structure/structure_cem88v";
-import { describe, xdescribe } from "../mock_jasmine";
-import { itCalcQ } from "./test_rectangular_structure";
-
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
-const structTest: StructureCem88v = new StructureCem88v(structPrm, true);
-
-describe("Class StructureCem88v: ", () => {
-    describe("Calcul Q avec W croissant: ", () => {
-        const W: number[] = [0.000000, 0.100000, 0.200000, 0.300000, 0.400000, 0.500000, 0.600000,
-            0.700000, 0.800000, 0.900000, 1.000000, 1.100000, 1.200000, 1.300000];
-        const h1: number = 1.200000;
-        const Q: number[] = [.000000, 0.328260, 0.641822, 0.823867, 1.117381, 1.720738,
-            2.225472, 2.575336, 2.873893, 3.113250, 3.280545, 3.349403, 3.149324, 3.149324];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1, W[i], Q[i]);
-        }
-    });
-    xdescribe("Calcul Q en charge avec h1 croissant: ", () => {
-        const W: number = 0.8;
-        const h1: number[] = [1.05, 1.3, 1.5];
-        const Q: number[] = [1.365897, 3.623277, 4.214572];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1[i], W, Q[i]);
-        }
-    });
-    xdescribe("Calcul Q a surface libre avec h1 croissant: ", () => {
-        const W: number = Infinity;
-        const h1: number[] = [1.100000, 1.500000];
-        const Q: number[] = [2.086781, 5.207945];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1[i], W, Q[i]);
-        }
-    });
-});
diff --git a/spec/structure/test_structure_cunge80.ts b/spec/structure/test_structure_cunge80.ts
deleted file mode 100644
index 7969dc9d92212d1e20e702445b972cdf8e85b096..0000000000000000000000000000000000000000
--- a/spec/structure/test_structure_cunge80.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
-import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
-import { StructureCunge80 } from "../../src/structure/structure_cunge80";
-import { describe, xdescribe } from "../mock_jasmine";
-import { itCalcQ } from "./test_rectangular_structure";
-
-const structPrm: RectangularStructureParams = new RectangularStructureParams(1, 1, 1, 2, 0.6, 0);
-const structTest: StructureCunge80 = new StructureCunge80(structPrm, true);
-
-describe("Class StructureCunge80: ", () => {
-    describe("Calcul Q avec W croissant: ", () => {
-        const W: number[] = [
-            0.000000, 0.100000, 0.200000, 0.300000, 0.400000, 0.500000, 0.600000,
-            0.700000, 0.800000, 0.900000, 1.000000, 1.100000, 1.200000, 1.300000];
-        const h1: number = 1.200000;
-        const Q: number[] = [0.000000, 0.237709, 0.475418, 0.713127, 0.950836, 1.188545,
-            1.426254, 1.663963, 1.901673, 2.139382, 2.377091, 2.377091, 2.377091, 2.377091];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1, W[i], Q[i]);
-        }
-    });
-    describe("Calcul Q en charge avec h1 croissant: ", () => {
-        const W: number = 0.8;
-        const h1: number[] = [1.050000, 1.300000, 1.500000];
-        const Q: number[] = [0.950836, 2.329064, 3.557704];
-        const mode: StructureFlowMode[] = [
-            StructureFlowMode.ORIFICE, StructureFlowMode.ORIFICE, StructureFlowMode.ORIFICE];
-        const regime: StructureFlowRegime[] = [
-            StructureFlowRegime.SUBMERGED, StructureFlowRegime.SUBMERGED, StructureFlowRegime.FREE];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1[i], W, Q[i], mode[i], regime[i]);
-        }
-    });
-    describe("Calcul Q a surface libre avec h1 croissant: ", () => {
-        const W: number = Infinity;
-        const h1: number[] = [1.100000, 1.500000];
-        const Q: number[] = [1.680857, 3.758510];
-        const mode: StructureFlowMode[] = [
-            StructureFlowMode.WEIR, StructureFlowMode.WEIR];
-        const regime: StructureFlowRegime[] = [
-            StructureFlowRegime.SUBMERGED, StructureFlowRegime.FREE];
-
-        for (let i = 0; i < Q.length; i++) {
-            itCalcQ(structTest, h1[i], W, Q[i], mode[i], regime[i]);
-        }
-    });
-});
diff --git a/spec/test_func.ts b/spec/test_func.ts
index 1cf84cdd4627d8f03e5c4ba494515ead74e0c05b..938e8e09eb8d054a3512150929fd31e996408e1b 100644
--- a/spec/test_func.ts
+++ b/spec/test_func.ts
@@ -3,13 +3,13 @@
  * décommenter la ligne suivante (import { expect } from "./mock_jasmine") dans le cas d'une fonction
  * qui utilise la fonction expect() de Jasmine mais qui doit être exécutée en dehors de tests Jasmine
  */
-//import { expect } from "./mock_jasmine"
+import { describe, expect, it, xdescribe } from "./mock_jasmine";
 
 import { cLog } from "../src/util/log";
 import { Message, MessageCode } from "../src/util/message";
-import { precDist } from "./test_config";
 import { Result } from "../src/util/result";
-import { precDigits } from "./test_config"
+import { precDist } from "./test_config";
+import { precDigits } from "./test_config";
 
 /**
  * Compare deux valeurs réelles à un epsilon près
@@ -140,7 +140,7 @@ export function compareLog(logTest: cLog, logValid: cLog) {
 
         // clés des données
 
-        for (const j in m1.extraVar) {
+        for (let j = 0; j < m1.extraVar.length; j++) {
             b = m2.extraVar[j] !== undefined;
             expect(b).toBeTruthy(
                 "journal : message n°" + i + ", code " + code1 + " : la donnée " + j + "=" + m1.extraVar[j]
@@ -148,7 +148,7 @@ export function compareLog(logTest: cLog, logValid: cLog) {
             // if (!b) return;
         }
 
-        for (const j in m2.extraVar) {
+        for (let j = 0; j < m2.extraVar.length; j++) {
             b = m1.extraVar[j] !== undefined;
             expect(b).toBeTruthy(
                 "journal : message n°" + i + ", code " + code1 + " : la donnée " + j + "=" + m2.extraVar[j]
@@ -158,7 +158,7 @@ export function compareLog(logTest: cLog, logValid: cLog) {
 
         // type des données
 
-        for (const j in m1.extraVar) {
+        for (let j = 0; j < m1.extraVar.length; j++) {
             b = typeof m1.extraVar[j] === typeof m2.extraVar[j];
             expect(b).toBeTruthy(
                 "journal : " + i + "ieme message, code " + code1 + " : la donnée " + j + "=" + m1.extraVar[j]
@@ -169,7 +169,7 @@ export function compareLog(logTest: cLog, logValid: cLog) {
 
         // valeur des données
 
-        for (const j in m1.extraVar) {
+        for (let j = 0; j < m1.extraVar.length; j++) {
             const d: any = m1.extraVar[j];
             if (typeof d === "number") {
                 b = equalEpsilon(d, m2.extraVar[j]);
@@ -184,7 +184,7 @@ export function compareLog(logTest: cLog, logValid: cLog) {
     }
 }
 
-export function checkResult(val1: Result, val2: number, prec: number = undefined) {
+export function checkResult(val1: Result, val2: number, prec?: number) {
     expect(val1.ok).toBeTruthy("Result : computation error on Result " + val1.toString());
     if (val1.ok) {
         /*
@@ -195,8 +195,9 @@ export function checkResult(val1: Result, val2: number, prec: number = undefined
          *   valeur attendue 1.301
          *   valeur calculée 1.3016, arrondie à 1.302, faisant échouer le test
          */
-        if (prec == undefined)
+        if (prec === undefined) {
             prec = Math.max(0, precDigits - 1);
+        }
 
         expect(val1.vCalc).toBeCloseTo(val2, prec);
     }
diff --git a/src/structure/rectangular_structure_params.ts b/src/structure/rectangular_structure_params.ts
index edd24882d4056e5269a8d5361f6cb193c92fb18c..4d5d267e1a5f90482132903ea625e6d31aadd612 100644
--- a/src/structure/rectangular_structure_params.ts
+++ b/src/structure/rectangular_structure_params.ts
@@ -12,8 +12,18 @@ export class RectangularStructureParams extends StructureParams {
     /** Discharge coefficient */
     public Cd: ParamDefinition;
 
-    constructor(rQ: number, rh1: number, rh2: number, rL: number, rCd: number, rW: number = Infinity) {
-        super(rQ, rh1, rh2, rW);
+    /**
+     * Constructeur d'une structure rectangulaire
+     * @param rQ    Débit (m3/s)
+     * @param rZDV  Cote de la crête du déversoir ou du radier de la vanne (m)
+     * @param rZ1   Cote de l'eau amont (m)
+     * @param rZ2   Cote de l'eau aval (m)
+     * @param rL    Largeur de la vanne ou du déversoir (m)
+     * @param rCd   Coefficient de débit (-)
+     * @param rW    Ouverture de la vanne (m) (Valeur par défaut +infinity pour les déversoirs)
+     */
+    constructor(rQ: number, rZDV: number, rZ1: number, rZ2: number, rL: number, rCd: number, rW: number = Infinity) {
+        super(rQ, rZDV, rZ1, rZ2, rW);
         this.L = new ParamDefinition(ComputeNodeType.CondDistri, "L", ParamDomainValue.POS, rL);
         this.addParamDefinition(this.L);
         this.Cd = new ParamDefinition(ComputeNodeType.CondDistri, "Cd", ParamDomainValue.POS, rCd);
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index c9f43ae1a0e69ad7595bf9b4b3ab1dd7d93a07dc..612c197fb6ebb9ec7c39ec285675904da9135d3e 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -1,7 +1,7 @@
-import { Result } from "../util/result";
 import { Nub } from "../nub";
 import { ParamCalculability } from "../param";
 import { Message } from "../util/message";
+import { Result } from "../util/result";
 
 import { StructureParams } from "./structure_params";
 
@@ -57,13 +57,6 @@ export abstract class Structure extends Nub {
      */
     public abstract Equation(sVarCalc: string): Result;
 
-    protected defaultResultData() {
-        return {
-            Mode: this.getFlowMode(),
-            Regime: this.getFlowRegime()
-        };
-    }
-
     /**
      * Calcul d'une équation quelque soit l'inconnue à calculer.
      * Gestion du débit nul et de l'inversion de débit
@@ -72,8 +65,11 @@ export abstract class Structure extends Nub {
      * @param rPrec précision de calcul
      */
     public Calc(sVarCalc: string, rInit: number = 0, rPrec: number = 0.001): Result {
-        const flagsNull = {Mode: StructureFlowMode.NULL, Regime: StructureFlowRegime.NULL};
+        // Mise à jour de h1 et h2
+        this.prms.update_h1h2();
+
         // Gestion du débit nul
+        const flagsNull = {Mode: StructureFlowMode.NULL, Regime: StructureFlowRegime.NULL};
         if (sVarCalc === "Q") {
             if (this.prms.h1.v === this.prms.h2.v || this.prms.W.v <= 0) {
                 return new Result(0, flagsNull);
@@ -102,8 +98,15 @@ export abstract class Structure extends Nub {
             return res;
         }
 
+        // Calcul normal hors débit nul et inversion de débit
         return super.Calc(sVarCalc, rInit, rPrec);
+    }
 
+    protected defaultResultData() {
+        return {
+            Mode: this.getFlowMode(),
+            Regime: this.getFlowRegime(),
+        };
     }
 
     /**
@@ -111,8 +114,11 @@ export abstract class Structure extends Nub {
      */
     protected setParametersCalculability() {
         this.prms.Q.calculability = ParamCalculability.EQUATION;
-        this.prms.h1.calculability = ParamCalculability.DICHO;
-        this.prms.h2.calculability = ParamCalculability.DICHO;
+        this.prms.ZDV.calculability = ParamCalculability.DICHO;
+        this.prms.Z1.calculability = ParamCalculability.DICHO;
+        this.prms.Z2.calculability = ParamCalculability.DICHO;
+        this.prms.h1.calculability = ParamCalculability.FREE;
+        this.prms.h2.calculability = ParamCalculability.FREE;
         this.prms.W.calculability = ParamCalculability.DICHO;
     }
 
diff --git a/src/structure/structure_params.ts b/src/structure/structure_params.ts
index 539047181ae3b3e4971914c9a2f535b19f3bc33e..5929b5bc684b4804d56edf25b92a05ed895728bf 100644
--- a/src/structure/structure_params.ts
+++ b/src/structure/structure_params.ts
@@ -1,19 +1,26 @@
-import { Result } from "../util/result";
 import { Nub } from "../nub";
-import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamsEquation } from "../param";
-import { Message } from "../util/message";
+import { ComputeNodeType, ParamDefinition, ParamDomainValue, ParamsEquation } from "../param";
 
 /**
  * Common parameters of hydraulic structure equations
  */
 export class StructureParams extends ParamsEquation {
-    /** Débit */
+    /** Débit (m3/s) */
     public Q: ParamDefinition;
 
-    /** Tirant d'eau amont */
+    /** Cote de la crête du déversoir ou du radier de la vanne (m) */
+    public ZDV: ParamDefinition;
+
+    /** Cote de l'eau amont (m) */
+    public Z1: ParamDefinition;
+
+    /** Cote de l'eau aval (m) */
+    public Z2: ParamDefinition;
+
+    /** Tirant d'eau amont (m) */
     public h1: ParamDefinition;
 
-    /** Tirant d'eau aval */
+    /** Tirant d'eau aval (m) */
     public h2: ParamDefinition;
 
     /** Ouverture de la vanne
@@ -24,19 +31,34 @@ export class StructureParams extends ParamsEquation {
     /**
      * Paramètres communs à toutes les équations de structure
      * @param rQ Débit (m3/s)
-     * @param rh1 Hauteur amont au dessus de la crête (m)
-     * @param rh2 Hauteur aval au dessus de la crête (m)
+     * @param rZDV Cote de la crête du déversoir ou du radier de la vanne (m)
+     * @param rZ1 Cote de l'eau amont (m)
+     * @param rZ2 Cote de l'eau aval (m)
      * @param rW Ouverture de vanne (m) (infinity pour un seuil)
      */
-    constructor(rQ: number, rh1: number, rh2: number, rW: number = Infinity ) {
+    constructor(rQ: number, rZDV: number, rZ1: number, rZ2: number, rW: number = Infinity ) {
         super();
         this.Q = new ParamDefinition(ComputeNodeType.CondDistri, "Q", ParamDomainValue.POS_NULL, rQ);
         this.addParamDefinition(this.Q);
-        this.h1 = new ParamDefinition(ComputeNodeType.CondDistri, "h1", ParamDomainValue.POS_NULL, rh1);
+        this.ZDV = new ParamDefinition(ComputeNodeType.CondDistri, "ZDV", ParamDomainValue.POS_NULL, rZDV);
+        this.addParamDefinition(this.ZDV);
+        this.Z1 = new ParamDefinition(ComputeNodeType.CondDistri, "Z1", ParamDomainValue.POS_NULL, rZ1);
+        this.addParamDefinition(this.Z1);
+        this.Z2 = new ParamDefinition(ComputeNodeType.CondDistri, "Z2", ParamDomainValue.POS_NULL, rZ2);
+        this.addParamDefinition(this.Z2);
+        this.h1 = new ParamDefinition(ComputeNodeType.CondDistri, "h1", ParamDomainValue.POS_NULL,
+            Math.max(0, this.Z1.v - this.ZDV.v));
         this.addParamDefinition(this.h1);
-        this.h2 = new ParamDefinition(ComputeNodeType.CondDistri, "h2", ParamDomainValue.POS_NULL, rh2);
+        this.h2 = new ParamDefinition(ComputeNodeType.CondDistri, "h2", ParamDomainValue.POS_NULL,
+            Math.max(0, this.Z2.v - this.ZDV.v));
         this.addParamDefinition(this.h2);
         this.W = new ParamDefinition(ComputeNodeType.CondDistri, "W", ParamDomainValue.POS_NULL, rW);
         this.addParamDefinition(this.W);
     }
+
+    /** Mise à jour des paramètres h1 et h2 à partir de Z1, Z2 et ZDV */
+    public update_h1h2() {
+        this.h1.v = Math.max(0, this.Z1.v - this.ZDV.v);
+        this.h2.v = Math.max(0, this.Z2.v - this.ZDV.v);
+    }
 }