diff --git a/spec/pab/cloisons.spec.ts b/spec/pab/cloisons.spec.ts
index 549b1d0a58630595536e1a6b8e110c79dfc56927..2ac797734329621b501beca26c333fb40f91b766 100755
--- a/spec/pab/cloisons.spec.ts
+++ b/spec/pab/cloisons.spec.ts
@@ -27,7 +27,7 @@ function getCloisonsTest(): Cloisons {
     const cloisons: Cloisons = getEmptyCloisonsTest();
     cloisons.addChild(CreateStructure(LoiDebit.WeirSubmergedLarinier));
     cloisons.calculatedParam = cloisons.prms.Q;
-    cloisons.structures[0].prms.h1.singleValue = 1;
+    cloisons.structures[0].prms.h1.singleValue = 2;
     return cloisons;
 }
 
@@ -37,11 +37,11 @@ describe("Class Cloisons: ", () => {
         beforeEach(() => {
             c = getCloisonsTest();
         });
-        it("vCalc should return 0.47", () => {
-            expect(c.CalcSerie().vCalc).toBeCloseTo(0.47, 3);
+        it("vCalc should return 0.94", () => {
+            expect(c.CalcSerie().vCalc).toBeCloseTo(0.94, 3);
         });
-        it("extraResults.PV should return 230.444", () => {
-            expect(c.CalcSerie().values.PV).toBeCloseTo(230.444, 1);
+        it("extraResults.PV should return 460.887", () => {
+            expect(c.CalcSerie().values.PV).toBeCloseTo(460.887, 1);
         });
         it("ZRMB should be 100.5", () => {
             c.CalcSerie();
diff --git a/spec/pab/pab.spec.ts b/spec/pab/pab.spec.ts
index e91dd0365d0e807cfc7e640015e493d54be3d406..70167e7b276f44a24f62b5e4713ce255e2943a32 100644
--- a/spec/pab/pab.spec.ts
+++ b/spec/pab/pab.spec.ts
@@ -272,7 +272,7 @@ describe("Class Pab: ", () => {
     describe("errors inherited from Cloisons −", () => {
 
         it("negative sill warning should be present", () => {
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-05-06T14:44:44.505Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"M29hc3","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"eDllOD","props":{"calcType":"Cloisons"},"children":[{"uid":"ZGMwc3","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":98},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"cGs5OX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":2.349},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"NzBlcD","props":{"calcType":"CloisonAval"},"children":[{"uid":"cG5xdX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":97.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGM1ZG","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-05-06T14:44:44.505Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"M29hc3","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"eDllOD","props":{"calcType":"Cloisons"},"children":[{"uid":"ZGMwc3","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":98},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"cGs5OX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":2.349},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101.1}],"downWall":{"uid":"NzBlcD","props":{"calcType":"CloisonAval"},"children":[{"uid":"cG5xdX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":97.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGM1ZG","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`;
             Session.getInstance().clear();
             Session.getInstance().unserialise(sess);
             const pab2 = Session.getInstance().findNubByUid("M29hc3") as Pab;
diff --git a/spec/structure/structure_weir_submerged.spec.ts b/spec/structure/structure_weir_submerged.spec.ts
index e86a30e73d2a23d25783c790c4191fb3428713b2..e73952c4d509d734af11a02c316ec254fa8d82d2 100644
--- a/spec/structure/structure_weir_submerged.spec.ts
+++ b/spec/structure/structure_weir_submerged.spec.ts
@@ -6,13 +6,13 @@ import { itCalcQ } from "../structure/functions";
 import { precDigits } from "../test_config";
 
 function getStructTest(): StructureWeirSubmerged {
-    return new StructureWeirSubmerged(new RectangularStructureParams(0, 101, 102, 101.5, 0.2, 0.9), false);
+    return new StructureWeirSubmerged(new RectangularStructureParams(0, 101, 102, 101.9, 0.2, 0.9), false);
 }
 
 describe("Class StructureWeirSubmerged: ", () => {
     describe("Calc(Q): ", () => {
         const Z1: number[] = [102];
-        const Q: number[] = [0.282];
+        const Q: number[] = [0.227];
         const mode: StructureFlowMode = StructureFlowMode.WEIR;
         const regime: StructureFlowRegime = StructureFlowRegime.SUBMERGED;
         for (let i = 0; i < Q.length; i++) {
@@ -35,10 +35,9 @@ describe("Class StructureWeirSubmerged: ", () => {
             structTest.prms.Z2.singleValue = 105;
             structTest.prms.ZDV.singleValue = 100;
             const res = structTest.CalcSerie().resultElement;
-            expect(res.log.messages.length).toBe(1);
-            expect(
-                res.log.messages[0].code
-            ).toBe(MessageCode.WARNING_WEIR_SUBMERGENCE_LOWER_THAN_08);
+            expect(res.log.messages.length).toBe(2);
+            const ok = res.log.messages[0].code === MessageCode.WARNING_WEIR_SUBMERGENCE_LOWER_THAN_08 || res.log.messages[1].code === MessageCode.WARNING_WEIR_SUBMERGENCE_LOWER_THAN_08;
+            expect(ok).toBe(true);
         });
     });
 });
diff --git a/spec/structure/structure_weir_submerged_larinier.spec.ts b/spec/structure/structure_weir_submerged_larinier.spec.ts
index 40c0e16849c710c377d8362211f64e421694fe13..ba486d4c254e5b02cf1f8fc3223866fe413f6889 100644
--- a/spec/structure/structure_weir_submerged_larinier.spec.ts
+++ b/spec/structure/structure_weir_submerged_larinier.spec.ts
@@ -54,4 +54,16 @@ describe("Class StructureWeirSubmergedLarinier: ", () => {
             ).toBe(MessageCode.WARNING_SLOT_SUBMERGENCE_NOT_BETWEEN_07_AND_09);
         });
     });
+    describe("Calcul avec h2/h1 < 0.5 (=0.4) : ", () => {
+        it("le log devrait contenir au moins un message d'erreur", () => {
+            const structTest = getStructTest();
+            structTest.prms.Z1.singleValue = 110;
+            structTest.prms.Z2.singleValue = 104;
+            structTest.prms.ZDV.singleValue = 100;
+            const res = structTest.CalcSerie().resultElement;
+            expect(res.log.messages.length).toBe(2);
+            const ok = res.log.messages[0].code === MessageCode.ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN || res.log.messages[1].code === MessageCode.ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN;
+            expect(ok).toBe(true);
+        });
+    });
 });
diff --git a/spec/verificateur/verificateur.spec.ts b/spec/verificateur/verificateur.spec.ts
index bc4d21b435187fc2da52d6760dc05625ad414cff..78ed594de7aee2fc04cb712d09f9e66b6420eb58 100644
--- a/spec/verificateur/verificateur.spec.ts
+++ b/spec/verificateur/verificateur.spec.ts
@@ -118,7 +118,7 @@ describe("vérificateur de franchissement −", () => {
             // contexte
             Session.getInstance().clear();
             // jets plongeants seulement
-            Session.getInstance().unserialise(`{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-04-23T08:02:44.556Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"eGx2aG","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"OGxiN3","props":{"calcType":"Cloisons"},"children":[{"uid":"cnU5bj","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.1},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":0.423},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"OXdpbm","props":{"calcType":"CloisonAval"},"children":[{"uid":"dmc0Nj","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.6},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`);
+            Session.getInstance().unserialise(`{"header":{"source":"jalhyd","format_version":"1.3","created":"2023-04-17T10:44:42.561Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"eGx2aG","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"OGxiN3","props":{"calcType":"Cloisons"},"children":[{"uid":"YXd1ZD","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.1},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":0.5},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"OXdpbm","props":{"calcType":"CloisonAval"},"children":[{"uid":"OW04cn","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.6},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`);
             const pab = Session.getInstance().findNubByUid("eGx2aG") as Pab;
             // vérificateur
             const v = new Verificateur();
@@ -260,7 +260,7 @@ describe("vérificateur de franchissement −", () => {
         it("Profondeur des bassins insuffisante", () => {
             // contexte
             Session.getInstance().clear();
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-04-23T12:33:41.272Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"enZvdm","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"d2llZG","props":{"calcType":"Cloisons"},"children":[{"uid":"ZDFven","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":101},{"symbol":"ZRAM","mode":"SINGLE","value":101.25},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":0.47},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":100.7}],"downWall":{"uid":"NzYwbG","props":{"calcType":"CloisonAval"},"children":[{"uid":"cmdzN2","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.75}]}}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2023-04-17T10:51:31.030Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"enZvdm","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"d2llZG","props":{"calcType":"Cloisons"},"children":[{"uid":"cGdmNn","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.4},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.7}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":101},{"symbol":"ZRAM","mode":"SINGLE","value":101.25},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":0.4},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"NzYwbG","props":{"calcType":"CloisonAval"},"children":[{"uid":"dW9pbD","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.7}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.75}]}}]}`;
             Session.getInstance().unserialise(sess);
             const pab = Session.getInstance().findNubByUid("enZvdm") as Pab;
             // vérificateur
@@ -312,7 +312,7 @@ describe("vérificateur de franchissement −", () => {
         it("Charge trop faible sur échancrures (surface)", () => {
             // contexte
             // jets de SURFACE seulement
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-08-11T13:16:17.677Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"Z2ZpYm","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"a2doNj","props":{"calcType":"Cloisons"},"children":[{"uid":"cTZjbD","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.8},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]},{"uid":"eHZzc2","props":{"calcType":"Cloisons"},"children":[{"uid":"N2J4Z2","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.3},{"symbol":"L","mode":"SINGLE","value":0.4},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100},{"symbol":"ZRAM","mode":"SINGLE","value":100.25},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"CALCUL","value":0.059},{"symbol":"Z1","mode":"SINGLE","value":102},{"symbol":"Z2","mode":"SINGLE","value":101.5}],"downWall":{"uid":"b2JobG","props":{"calcType":"CloisonAval"},"children":[{"uid":"ZnlodG","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.8},{"symbol":"L","mode":"SINGLE","value":0.4},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":99.75}]}}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-08-11T13:16:17.677Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"Z2ZpYm","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"a2doNj","props":{"calcType":"Cloisons"},"children":[{"uid":"cTZjbD","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirVillemonte"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.8},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]},{"uid":"eHZzc2","props":{"calcType":"Cloisons"},"children":[{"uid":"N2J4Z2","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirVillemonte"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.3},{"symbol":"L","mode":"SINGLE","value":0.4},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100},{"symbol":"ZRAM","mode":"SINGLE","value":100.25},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"CALCUL","value":0.059},{"symbol":"Z1","mode":"SINGLE","value":102},{"symbol":"Z2","mode":"SINGLE","value":101.5}],"downWall":{"uid":"b2JobG","props":{"calcType":"CloisonAval"},"children":[{"uid":"ZnlodG","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirVillemonte"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.8},{"symbol":"L","mode":"SINGLE","value":0.4},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":99.75}]}}]}`;
             Session.getInstance().clear();
             Session.getInstance().unserialise(sess);
             const pab = Session.getInstance().findNubByUid("Z2ZpYm") as Pab;
@@ -357,7 +357,7 @@ describe("vérificateur de franchissement −", () => {
         it("Plusieurs warnings entraînent la non-franchissabilité d'une cloison", () => {
             // contexte
             Session.getInstance().clear();
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-04-29T10:00:03.138Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"bjlnc2","props":{"calcType":"Espece","species":"SPECIES_CUSTOM"},"meta":{"title":"Croustibat®"},"children":[],"parameters":[{"symbol":"OK","mode":"CALCUL"},{"symbol":"DHMaxS","mode":"SINGLE","value":0.35},{"symbol":"DHMaxP","mode":"SINGLE","value":0.6},{"symbol":"BMin","mode":"SINGLE","value":0.18},{"symbol":"PMinS","mode":"SINGLE","value":0.9},{"symbol":"PMinP","mode":"SINGLE","value":0.9},{"symbol":"LMinS","mode":"SINGLE","value":2.5},{"symbol":"LMinP","mode":"SINGLE","value":25},{"symbol":"HMin","mode":"SINGLE","value":0.3},{"symbol":"YMin","mode":"SINGLE","value":0.4},{"symbol":"VeMax","mode":"SINGLE","value":2.5},{"symbol":"YMinSB","mode":"SINGLE","value":0.2},{"symbol":"YMinPB","mode":"SINGLE","value":0.3},{"symbol":"PVMaxPrec","mode":"SINGLE","value":30000},{"symbol":"PVMaxLim","mode":"SINGLE","value":50000}]},{"uid":"M29hc3","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"eDllOD","props":{"calcType":"Cloisons"},"children":[{"uid":"ZGMwc3","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":98},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"cGs5OX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":2.349},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"NzBlcD","props":{"calcType":"CloisonAval"},"children":[{"uid":"cG5xdX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":97.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGM1ZG","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2023-04-17T12:02:45.180Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"bjlnc2","props":{"calcType":"Espece","divingJetSupported":"NOT_SUPPORTED","species":"SPECIES_CUSTOM"},"meta":{"title":"Croustibat®"},"children":[],"parameters":[{"symbol":"OK","mode":"CALCUL"},{"symbol":"DHMaxS","mode":"SINGLE","value":0.35},{"symbol":"DHMaxP","mode":"SINGLE","value":0.6},{"symbol":"BMin","mode":"SINGLE","value":0.18},{"symbol":"PMinS","mode":"SINGLE","value":0.9},{"symbol":"PMinP","mode":"SINGLE","value":0.9},{"symbol":"LMinS","mode":"SINGLE","value":2.5},{"symbol":"LMinP","mode":"SINGLE","value":25},{"symbol":"HMin","mode":"SINGLE","value":0.3},{"symbol":"YMin","mode":"SINGLE","value":0.4},{"symbol":"VeMax","mode":"SINGLE","value":2.5},{"symbol":"YMinSB","mode":"SINGLE","value":0.2},{"symbol":"YMinPB","mode":"SINGLE","value":0.3}]},{"uid":"M29hc3","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"eDllOD","props":{"calcType":"Cloisons"},"children":[{"uid":"ZGMwc3","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":98},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"bzM2ZG","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.1},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":2.349},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"NzBlcD","props":{"calcType":"CloisonAval"},"children":[{"uid":"cG5xdX","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":97.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGM1ZG","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.49},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`;
             Session.getInstance().unserialise(sess);
             const pab = Session.getInstance().findNubByUid("M29hc3") as Pab;
             const espece = Session.getInstance().findNubByUid("bjlnc2") as Espece;
@@ -388,7 +388,7 @@ describe("vérificateur de franchissement −", () => {
         it("Plusieurs warnings entraînent la non-franchissabilité d'une cloison (2)", () => {
             // contexte
             Session.getInstance().clear();
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-04-29T10:00:03.138Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"bjlnc2","props":{"calcType":"Espece","species":"SPECIES_CUSTOM"},"meta":{"title":"Croustibat®"},"children":[],"parameters":[{"symbol":"OK","mode":"CALCUL"},{"symbol":"DHMaxS","mode":"SINGLE","value":0.35},{"symbol":"DHMaxP","mode":"SINGLE","value":0.35},{"symbol":"BMin","mode":"SINGLE","value":0.3},{"symbol":"PMinS","mode":"SINGLE","value":1},{"symbol":"PMinP","mode":"SINGLE","value":1},{"symbol":"LMinS","mode":"SINGLE","value":2.5},{"symbol":"LMinP","mode":"SINGLE","value":2.5},{"symbol":"HMin","mode":"SINGLE","value":0.3},{"symbol":"YMin","mode":"SINGLE","value":0.4},{"symbol":"VeMax","mode":"SINGLE","value":2.5},{"symbol":"YMinSB","mode":"SINGLE","value":0.2},{"symbol":"YMinPB","mode":"SINGLE","value":0.3},{"symbol":"PVMaxPrec","mode":"SINGLE","value":30000},{"symbol":"PVMaxLim","mode":"SINGLE","value":50000}]},{"uid":"M29hc3","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"eDllOD","props":{"calcType":"Cloisons"},"children":[{"uid":"ZGMwc3","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":98},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"cGs5OX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":2.349},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101}],"downWall":{"uid":"NzBlcD","props":{"calcType":"CloisonAval"},"children":[{"uid":"cG5xdX","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":97.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGM1ZG","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.5},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.25}]}}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2023-04-17T11:40:14.310Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"bjlnc2","props":{"calcType":"Espece","divingJetSupported":"NOT_SUPPORTED","species":"SPECIES_CUSTOM"},"meta":{"title":"Croustibat®"},"children":[],"parameters":[{"symbol":"OK","mode":"CALCUL"},{"symbol":"DHMaxS","mode":"SINGLE","value":0.35},{"symbol":"DHMaxP","mode":"SINGLE","value":0.35},{"symbol":"BMin","mode":"SINGLE","value":0.3},{"symbol":"PMinS","mode":"SINGLE","value":1},{"symbol":"PMinP","mode":"SINGLE","value":1},{"symbol":"LMinS","mode":"SINGLE","value":2.5},{"symbol":"LMinP","mode":"SINGLE","value":2.5},{"symbol":"HMin","mode":"SINGLE","value":0.3},{"symbol":"YMin","mode":"SINGLE","value":0.4},{"symbol":"VeMax","mode":"SINGLE","value":2.5},{"symbol":"YMinSB","mode":"SINGLE","value":0.2},{"symbol":"YMinPB","mode":"SINGLE","value":0.3}]},{"uid":"M29hc3","props":{"calcType":"Pab"},"meta":{"title":"PAB 1"},"children":[{"uid":"eDllOD","props":{"calcType":"Cloisons"},"children":[{"uid":"ZGMwc3","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100.75},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"NWRpcG","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.8},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.5},{"symbol":"ZRAM","mode":"SINGLE","value":100.75},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":2},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101.2}],"downWall":{"uid":"NzBlcD","props":{"calcType":"CloisonAval"},"children":[{"uid":"cG5xdX","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"dWRhdD","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.2}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100}]}}]}`;
             Session.getInstance().unserialise(sess);
             const pab = Session.getInstance().findNubByUid("M29hc3") as Pab;
             const espece = Session.getInstance().findNubByUid("bjlnc2") as Espece;
@@ -455,7 +455,7 @@ describe("vérificateur de franchissement −", () => {
         it("Orifices (structures dont le mode d'écoulement est en charge) non franchissables", () => {
             // contexte
             Session.getInstance().clear();
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-07-31T09:17:46.283Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"bzRjY3","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"c25hMW","props":{"calcType":"Cloisons"},"children":[{"uid":"MWN2aH","props":{"calcType":"Structure","loiDebit":"OrificeSubmerged"},"children":[],"parameters":[{"symbol":"S","mode":"SINGLE","value":0.1},{"symbol":"CdO","mode":"SINGLE","value":0.7}]},{"uid":"bm10ZG","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":0},{"symbol":"ZRAM","mode":"SINGLE","value":0},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":1.5},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":99}],"downWall":{"uid":"cm54MW","props":{"calcType":"CloisonAval"},"children":[{"uid":"dGhleD","props":{"calcType":"Structure","loiDebit":"GateCunge80"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100},{"symbol":"W","mode":"SINGLE","value":0.5},{"symbol":"L","mode":"SINGLE","value":2},{"symbol":"CdCunge","mode":"SINGLE","value":1}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":0}]}},{"uid":"NnB5b2","props":{"calcType":"Espece","divingJetSupported":"SUPPORTED","species":"SPECIES_CUSTOM"},"meta":{"title":"Espèce"},"children":[],"parameters":[{"symbol":"OK","mode":"CALCUL"},{"symbol":"DHMaxS","mode":"SINGLE","value":50},{"symbol":"DHMaxP","mode":"SINGLE","value":2},{"symbol":"BMin","mode":"SINGLE","value":0.1},{"symbol":"PMinS","mode":"SINGLE","value":1},{"symbol":"PMinP","mode":"SINGLE","value":1},{"symbol":"LMinS","mode":"SINGLE","value":2.5},{"symbol":"LMinP","mode":"SINGLE","value":2.5},{"symbol":"HMin","mode":"SINGLE","value":0.3},{"symbol":"YMin","mode":"SINGLE","value":0.4},{"symbol":"VeMax","mode":"SINGLE","value":2.5},{"symbol":"YMinSB","mode":"SINGLE","value":0.2},{"symbol":"YMinPB","mode":"SINGLE","value":0.3},{"symbol":"PVMaxPrec","mode":"SINGLE","value":150},{"symbol":"PVMaxLim","mode":"SINGLE","value":200}]}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2023-04-17T11:54:53.352Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"bzRjY3","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"c25hMW","props":{"calcType":"Cloisons"},"children":[{"uid":"MWN2aH","props":{"calcType":"Structure","loiDebit":"OrificeSubmerged","structureType":"Orifice"},"children":[],"parameters":[{"symbol":"S","mode":"SINGLE","value":0.1},{"symbol":"CdO","mode":"SINGLE","value":0.7}]},{"uid":"bm10ZG","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":99},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":0},{"symbol":"ZRAM","mode":"SINGLE","value":0},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":1.5},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":99}],"downWall":{"uid":"cm54MW","props":{"calcType":"CloisonAval"},"children":[{"uid":"dGhleD","props":{"calcType":"Structure","loiDebit":"GateCunge80"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":100},{"symbol":"W","mode":"SINGLE","value":0.5},{"symbol":"L","mode":"SINGLE","value":2},{"symbol":"CdCunge","mode":"SINGLE","value":1}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":0}]}},{"uid":"NnB5b2","props":{"calcType":"Espece","divingJetSupported":"SUPPORTED","species":"SPECIES_CUSTOM"},"meta":{"title":"Espèce"},"children":[],"parameters":[{"symbol":"OK","mode":"CALCUL"},{"symbol":"DHMaxS","mode":"SINGLE","value":50},{"symbol":"DHMaxP","mode":"SINGLE","value":2},{"symbol":"BMin","mode":"SINGLE","value":0.1},{"symbol":"PMinS","mode":"SINGLE","value":1},{"symbol":"PMinP","mode":"SINGLE","value":1},{"symbol":"LMinS","mode":"SINGLE","value":2.5},{"symbol":"LMinP","mode":"SINGLE","value":2.5},{"symbol":"HMin","mode":"SINGLE","value":0.3},{"symbol":"YMin","mode":"SINGLE","value":0.4},{"symbol":"VeMax","mode":"SINGLE","value":2.5},{"symbol":"YMinSB","mode":"SINGLE","value":0.2},{"symbol":"YMinPB","mode":"SINGLE","value":0.3}]}]}`;
             Session.getInstance().unserialise(sess);
             const pab = Session.getInstance().findNubByUid("bzRjY3") as Pab;
             const espece = Session.getInstance().findNubByUid("NnB5b2") as Espece;
@@ -498,7 +498,7 @@ describe("vérificateur de franchissement −", () => {
         it("jalhyd#265 (2) - charge minimale sur cloison aval régulée, avec une passe variée", () => {
             // contexte
             Session.getInstance().clear();
-            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-09-08T08:58:52.333Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"MnRyeT","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"OWEwZn","props":{"calcType":"Cloisons"},"children":[{"uid":"bHVyZ3","props":{"calcType":"Structure","loiDebit":"WeirSubmergedLarinier","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.8},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGd1MX","props":{"calcType":"Structure","loiDebit":"OrificeSubmerged","structureType":"Orifice"},"children":[],"parameters":[{"symbol":"S","mode":"SINGLE","value":0.1},{"symbol":"CdO","mode":"SINGLE","value":0.7}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.8},{"symbol":"ZRAM","mode":"SINGLE","value":100.9},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"MINMAX","min":0.14,"max":0.3,"step":0.15,"extensionStrategy":0},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101.5}],"downWall":{"uid":"ZWxnMz","props":{"calcType":"CloisonAval"},"children":[{"uid":"ZHJwcD","props":{"calcType":"Structure","loiDebit":"VanLevVillemonte"},"children":[],"parameters":[{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.4},{"symbol":"minZDV","mode":"SINGLE","value":100.7},{"symbol":"maxZDV","mode":"SINGLE","value":101.6},{"symbol":"DH","mode":"SINGLE","value":0.2}]},{"uid":"cWw4aX","props":{"calcType":"Structure","loiDebit":"OrificeSubmerged","structureType":"Orifice"},"children":[],"parameters":[{"symbol":"S","mode":"SINGLE","value":0.1},{"symbol":"CdO","mode":"SINGLE","value":0.7}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.7}]}},{"uid":"YXBxbn","props":{"calcType":"Verificateur","nubToVerify":"MnRyeT","speciesList":["SPECIES_7b"]},"meta":{"title":"Vérification"},"children":[],"parameters":[]}]}`;
+            const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-09-08T08:58:52.333Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"MnRyeT","props":{"calcType":"Pab"},"meta":{"title":"PAB"},"children":[{"uid":"OWEwZn","props":{"calcType":"Cloisons"},"children":[{"uid":"bHVyZ3","props":{"calcType":"Structure","loiDebit":"WeirVillemonte","structureType":"SeuilRectangulaire"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":101.8},{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWSL","mode":"SINGLE","value":0.75}]},{"uid":"aGd1MX","props":{"calcType":"Structure","loiDebit":"OrificeSubmerged","structureType":"Orifice"},"children":[],"parameters":[{"symbol":"S","mode":"SINGLE","value":0.1},{"symbol":"CdO","mode":"SINGLE","value":0.7}]}],"parameters":[{"symbol":"LB","mode":"SINGLE","value":10},{"symbol":"BB","mode":"SINGLE","value":1},{"symbol":"ZRMB","mode":"SINGLE","value":100.8},{"symbol":"ZRAM","mode":"SINGLE","value":100.9},{"symbol":"QA","mode":"SINGLE","value":0}]}],"parameters":[{"symbol":"Q","mode":"MINMAX","min":0.14,"max":0.3,"step":0.15,"extensionStrategy":0},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":101.5}],"downWall":{"uid":"ZWxnMz","props":{"calcType":"CloisonAval"},"children":[{"uid":"ZHJwcD","props":{"calcType":"Structure","loiDebit":"VanLevVillemonte"},"children":[],"parameters":[{"symbol":"L","mode":"SINGLE","value":0.2},{"symbol":"CdWR","mode":"SINGLE","value":0.4},{"symbol":"minZDV","mode":"SINGLE","value":100.7},{"symbol":"maxZDV","mode":"SINGLE","value":101.6},{"symbol":"DH","mode":"SINGLE","value":0.2}]},{"uid":"cWw4aX","props":{"calcType":"Structure","loiDebit":"OrificeSubmerged","structureType":"Orifice"},"children":[],"parameters":[{"symbol":"S","mode":"SINGLE","value":0.1},{"symbol":"CdO","mode":"SINGLE","value":0.7}]}],"parameters":[{"symbol":"ZRAM","mode":"SINGLE","value":100.7}]}},{"uid":"YXBxbn","props":{"calcType":"Verificateur","nubToVerify":"MnRyeT","speciesList":["SPECIES_7b"]},"meta":{"title":"Vérification"},"children":[],"parameters":[]}]}`;
             Session.getInstance().unserialise(sess);
             const pab = Session.getInstance().findNubByUid("MnRyeT") as Pab;
             const v = Session.getInstance().findNubByUid("YXBxbn") as Verificateur;
diff --git a/src/dichotomie.ts b/src/dichotomie.ts
index 115d1f6b0afb84c288dbbc5278f15e2bd98cc8d4..140cc546a3709eada09cd63a8d35701d005081b5 100644
--- a/src/dichotomie.ts
+++ b/src/dichotomie.ts
@@ -37,6 +37,11 @@ export class Dichotomie extends Debug {
 
     private _func: () => number;
 
+    /**
+     * si > 0, un calcul dichotomique est en cours
+     */
+    private static _inDicho: number = 0;
+
     /**
      * Construction de la classe.
      * @param nub Noeud de calcul contenant la méthode de calcul Equation
@@ -68,6 +73,10 @@ export class Dichotomie extends Debug {
         this._startIntervalMaxSteps = n;
     }
 
+    public static get inDicho(): boolean {
+        return Dichotomie._inDicho > 0;
+    }
+
     public CalculX(x: number): number {
         this.vX = x;
         return this.Calcul();
@@ -80,6 +89,8 @@ export class Dichotomie extends Debug {
      * @param rInit valeur initiale approximative de x
      */
     public Dichotomie(rTarget: number, rTol: number, rInit: number): Result {
+        Dichotomie._inDicho++;
+
         this._target = rTarget;
         // console.log("-----");
         // for (let x = 0; x <= 1; x += 0.1)
@@ -109,20 +120,24 @@ export class Dichotomie extends Debug {
                     this.debug(
                         `${this.analyticalSymbol}(${this.sVarCalc}=${s.value}) = ${rTarget}`
                     );
+                    Dichotomie._inDicho--;
                     return new Result(s.value);
                 } else {
                     this.debug(
                         "Non convergence"
                     );
+                    Dichotomie._inDicho--;
                     return new Result(new Message(MessageCode.ERROR_DICHO_CONVERGE, {
                         lastApproximation: s.value
                     }), this.nub);
                 }
             } else {
+                Dichotomie._inDicho--;
                 return new Result(r.res);
             }
         } catch (e) {
             // un appel à Calcul() a généré une erreur
+            Dichotomie._inDicho--;
             return this.nub.result;
         }
     }
diff --git a/src/nub.ts b/src/nub.ts
index e40d9c23efb7f1d431568cf3ff608f3948c9ded7..64e31c46d91211303adee731364c877dcbe67499 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -17,6 +17,46 @@ import { Result } from "./internal_modules";
 import { ResultElement } from "./internal_modules";
 import { VariatedDetails } from "./internal_modules";
 
+class NubIterator implements IterableIterator<Nub> {
+    private _nubs: Nub[];
+    private _index: number;
+
+    constructor(n: Nub) {
+        this._nubs = [];
+        this.fill(n);
+        this._index = 0;
+    }
+
+    private fill(n: Nub) {
+        this._nubs.push(n);
+        for (const c of n.getChildren()) {
+            this.fill(c);
+        }
+    }
+
+    // interface IterableIterator
+
+    public next(): IteratorResult<Nub> {
+        const i = this._index;
+        if (this._index < this._nubs.length) {
+            this._index = i + 1;
+            return {
+                done: false,
+                value: this._nubs[i]
+            };
+        } else {
+            return {
+                done: true,
+                value: undefined
+            };
+        }
+    }
+
+    [Symbol.iterator](): IterableIterator<Nub> {
+        return this;
+    }
+}
+
 /**
  * Classe abstraite de Noeud de calcul dans une session :
  * classe de base pour tous les calculs
@@ -569,7 +609,7 @@ export abstract class Nub extends ComputeNode implements IProperties {
         stats = this._result.resultElementsLogStats(0, stats);
 
         let sn = 1;
-        const it = this.allChildNubIterator();
+        const it = this.directChildNubIterator();
         let icn = it.next();
         while (!icn.done) {
             stats = icn.value.result.resultElementsLogStats(sn++, stats);
@@ -737,12 +777,19 @@ export abstract class Nub extends ComputeNode implements IProperties {
     }
 
     /**
-     * @returns iterator on all child nubs (may include extra nubs, see Pab nub)
+     * @returns iterator on direct child nubs (may include extra nubs, see Pab nub)
      */
-    public allChildNubIterator() {
+    public directChildNubIterator() {
         return this._children[Symbol.iterator]();
     }
 
+    /**
+     * @returns iterator on all child nubs (recursively)
+     */
+    public get allChildNubIterator() {
+        return new NubIterator(this);
+    }
+
     /**
      * Returns true if all parameters are valid; used to check validity of
      * parameters linked to Nub results
@@ -1601,6 +1648,41 @@ export abstract class Nub extends ComputeNode implements IProperties {
         }
     }
 
+    /**
+     * @returns true if results for this nub and all its children do not contain errors
+     */
+    public get allResultsOk(): boolean {
+        for (const n of this.allChildNubIterator) {
+            if (!n.result.ok) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @returns true if all messages in nub hierarchy have the same code
+     */
+    public hasOnlyMessage(code: MessageCode): boolean {
+        for (const n of this.allChildNubIterator) {
+            if (!n.result.hasOnlyMessage(code)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public get uniqueMessageCodes(): MessageCode[] {
+        let res: MessageCode[] = [];
+        for (const n of this.allChildNubIterator) {
+            if (n.uid === "MDZ3aH") {
+                debugger
+            }
+            res = res.concat(n.result.uniqueMessageCodes);
+        }
+        return res;
+    }
+
     // interface IObservable
 
     /**
diff --git a/src/pab/pab.ts b/src/pab/pab.ts
index f197cd5425da7a0c41eb3b898d00760de0a54db7..727ea2495ea2d5c9ab8aa7a8871cee5426426046 100644
--- a/src/pab/pab.ts
+++ b/src/pab/pab.ts
@@ -36,9 +36,9 @@ export class Pab extends FishPass {
 
     /**
     * @returns iterator on all child nubs (may include extra nubs, see Pab nub)
-    * @see Nub.allChildNubIterator()
+    * @see Nub.directChildNubIterator()
     */
-    public allChildNubIterator() {
+    public directChildNubIterator() {
         // clone children array
         const arr = Object.assign([], this.children);
         // append wall at downstream
diff --git a/src/prebarrage/pre_barrage.ts b/src/prebarrage/pre_barrage.ts
index 08122a1b53cd5c8fb221620acfe2fce9e5ec317c..82c9e16431f67fd3e442df3abb262796822c393b 100644
--- a/src/prebarrage/pre_barrage.ts
+++ b/src/prebarrage/pre_barrage.ts
@@ -1,4 +1,4 @@
-import { Nub } from "../internal_modules";
+import { Nub, Structure } from "../internal_modules";
 import { ParamCalculability, ParamDefinition } from "../internal_modules";
 import { Result } from "../internal_modules";
 import { PreBarrageParams } from "../internal_modules";
@@ -333,7 +333,18 @@ export class PreBarrage extends Nub {
             return this.result;
         }
 
+        for (const c of this._children) {
+            if (c instanceof PbCloison) {
+                c.inhibitSubmergenceError = true;
+            }
+        }
         const res = super.Calc(sVarCalc, rInit);
+        for (const c of this._children) {
+            if (c instanceof PbCloison) {
+                c.inhibitSubmergenceError = false;
+            }
+        }
+
         // calculate basins so that they have a proper .result
         for (const b of this._bassins) {
             b.Calc();
@@ -341,11 +352,13 @@ export class PreBarrage extends Nub {
         // calculate Q on all walls so that their result shows Q and not Z1
         for (const c of this._children) {
             if (c instanceof PbCloison) {
+                c.inhibitSubmergenceError = true;
                 // sauvegarde des messages générés pendant les itérations de dichotomie
                 const logBackup: cLog = c.result.resultElement.log.clone();
                 c.finalCalc();
                 // restitution des messages sauvés
                 c.result.resultElement.log.addLog(logBackup);
+                c.inhibitSubmergenceError = false;
             }
         }
 
@@ -356,6 +369,26 @@ export class PreBarrage extends Nub {
             }
         }
 
+        // recalculate Q on all walls without error inhibition
+        for (const c of this._children) {
+            if (c instanceof PbCloison) {
+                // sauvegarde des messages générés pendant les itérations de dichotomie
+                const logBackup: cLog = c.result.resultElement.log.clone();
+                c.finalCalc();
+                // restitution des messages sauvés
+                c.result.resultElement.log.addLog(logBackup);
+            }
+        }
+
+        // if an error occurred in any nub, remove all results
+        // except if it's a dichotomy convergence error (and only this error)
+
+        if (!this.allResultsOk && !this.hasOnlyMessage(MessageCode.ERROR_DICHO_CONVERGE)) {
+            for (const c of this.allChildNubIterator) {
+                c.result.resultElement.removeValues();
+            }
+        }
+
         return res;
     }
 
diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts
index 31927f6063b25e5b24a2f494c2209286ddef30bf..9c9d641d139108ce851232f227206c9078839aa6 100755
--- a/src/structure/factory_structure.ts
+++ b/src/structure/factory_structure.ts
@@ -109,8 +109,8 @@ export function CreateStructure(loiDebit: LoiDebit, parentNub?: ParallelStructur
             if (!nullParams) {
                 rectStructPrms.L.singleValue = 0.2;
                 rectStructPrms.CdWSL.singleValue = 0.75;
-                rectStructPrms.ZDV.singleValue = 101;
-                rectStructPrms.h1.singleValue = 1;
+                rectStructPrms.ZDV.singleValue = 100;
+                rectStructPrms.h1.singleValue = 2;
             }
             ret = new StructureWeirSubmergedLarinier(rectStructPrms, dbg);
             break;
diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index e22531ae1800083cad07623f6e869d42146e2a73..94346fb5074a6955715c91279416078a8907a0b9 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -33,6 +33,13 @@ export class ParallelStructure extends Nub {
         });
     }
 
+    /**
+     * true to inhibit emission of ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN error in Structure calculations and
+     * WARNING_SLOT_SUBMERGENCE_NOT_BETWEEN_07_AND_09 warning in StructureWeirSubmergedLarinier.
+     * Used during predams calculations.
+     */
+    public inhibitSubmergenceError: boolean = false;
+
     /**
      * paramètres castés au bon type
      */
@@ -104,6 +111,9 @@ export class ParallelStructure extends Nub {
         for (let i = 0; i < this._children.length; i++) {
             if (i !== iExcept) {
                 const res: Result = this._children[i].Calc("Q");
+                if (!res.ok) {
+                    return res;
+                }
                 qTot += res.vCalc;
                 // merge logs
                 calcRes.resultElement.log.addLog(res.log);
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index 09e64c33bf7a8e0008784f6f7c6064a6ab8285de..7cb91b8cf4c57d00f55a34b7ae191ba5faaa83bc 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -1,4 +1,4 @@
-import { ChildNub } from "../internal_modules";
+import { ChildNub, Dichotomie } from "../internal_modules";
 import { CalculatorType } from "../internal_modules";
 import { ParamCalculability, ParamDefinition, ParamFamily } from "../internal_modules";
 import { Props } from "../internal_modules";
@@ -77,6 +77,43 @@ export abstract class Structure extends ChildNub {
         return 100;
     }
 
+    /**
+     * méthode générique de vérification que l'ennoiement est supérieur à une valeur donnée
+     * @param min valeur minimum de l'ennoiement
+     */
+    protected checkSubmergenceMin(res: Result, min: number) {
+        // on fait le test si on est pas dans un calcul par dichotomie
+        if (!Dichotomie.inDicho && !(this.parent as ParallelStructure)?.inhibitSubmergenceError) {
+            const h2h1ratio = this.prms.h2.v / this.prms.h1.v;
+            if (h2h1ratio < min) {
+                res.resultElement.addMessage(new Message(
+                    // this._result.globalLog.add(new Message(
+                    MessageCode.ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN,
+                    {
+                        submergencePerc: this.computeSubmergencePercentage().toString(),
+                        min: min * 100
+                    }
+                ));
+            }
+        }
+    }
+
+    /**
+     * fonction appelée dans Calc() pour vérifier l'ennoiement (cf. classes dérivées)
+     */
+    public checkSubmergence(res: Result) {
+    }
+
+
+    // si une erreur d'ennoiement est survenue, on annule les résultats
+    public static filterResultsOnSubmergenceError(res: Result): boolean {
+        if (res.resultElement.hasMessage(MessageCode.ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN)) {
+            res.resultElement.removeValues();
+            return true;
+        }
+        return false;
+    }
+
     /** Constante utile : Racine de 2g */
     protected static readonly R2G: number = Math.sqrt(2 * 9.81);
 
@@ -96,6 +133,15 @@ export abstract class Structure extends ChildNub {
         this._intlType = "Ouvrage";
     }
 
+    /**
+     * true si la structure est une vanne levante
+     * @see StructureVanLevLarinier
+     * @see StructureVanLevVillemonte
+     */
+    protected get isVanneLevante(): boolean {
+        return false;
+    }
+
     public get isZDVcalculable(): boolean {
         return this._isZDVcalculable;
     }
@@ -252,7 +298,10 @@ export abstract class Structure extends ChildNub {
         }
 
         // Calcul normal hors débit nul
-        return super.Calc(sVarCalc, rInit);
+        const res = super.Calc(sVarCalc, rInit);
+        this.checkSubmergence(res);
+        Structure.filterResultsOnSubmergenceError(res);
+        return res;
     }
 
     /**
diff --git a/src/structure/structure_vanlev_larinier.ts b/src/structure/structure_vanlev_larinier.ts
index 002838b5da4ebd2a8c547da824bdb83945119dc4..0f01035454a1d4242b766b388fc235b3ea36b430 100644
--- a/src/structure/structure_vanlev_larinier.ts
+++ b/src/structure/structure_vanlev_larinier.ts
@@ -15,4 +15,8 @@ export class StructureVanLevLarinier extends StructureWeirSubmergedLarinier {
     get prms(): StructureVanLevParams {
         return this._prms as StructureVanLevParams;
     }
+
+    protected get isVanneLevante(): boolean {
+        return true;
+    }
 }
diff --git a/src/structure/structure_vanlev_villemonte.ts b/src/structure/structure_vanlev_villemonte.ts
index da61603d45c692b508ef5f50da3bd155a21a3416..9c01ef9f5fe638c286806d1c7203b9438739eefe 100644
--- a/src/structure/structure_vanlev_villemonte.ts
+++ b/src/structure/structure_vanlev_villemonte.ts
@@ -15,4 +15,8 @@ export class StructureVanLevVillemonte extends StructureWeirVillemonte {
     get prms(): StructureVanLevParams {
         return this._prms as StructureVanLevParams;
     }
+
+    protected get isVanneLevante(): boolean {
+        return true;
+    }
 }
diff --git a/src/structure/structure_weir_submerged.ts b/src/structure/structure_weir_submerged.ts
index 727c1ab3ad0d17b7767b3c3de772020d5dcc4328..f462873096fb7d6ee68bf68094525ad90c65d984 100644
--- a/src/structure/structure_weir_submerged.ts
+++ b/src/structure/structure_weir_submerged.ts
@@ -19,6 +19,13 @@ export class StructureWeirSubmerged extends RectangularStructure {
         this.prms.CdWS.visible = true;
     }
 
+    /**
+     * vérification que l'ennoiement est supérieur à une valeur donnée
+     */
+    public checkSubmergence(res: Result) {
+        this.checkSubmergenceMin(res, 0.6);
+    }
+
     public Calc(sVarCalc: string, rInit?: number): Result {
         this.currentResultElement = super.Calc(sVarCalc, rInit);
         const h2h1ratio = this.prms.h2.v / this.prms.h1.v;
diff --git a/src/structure/structure_weir_submerged_larinier.ts b/src/structure/structure_weir_submerged_larinier.ts
index 22db3d6e11bc9093cf323f3e523547de24dfe485..2051e77959bccbaefecd25d756772b6ab571f294 100644
--- a/src/structure/structure_weir_submerged_larinier.ts
+++ b/src/structure/structure_weir_submerged_larinier.ts
@@ -1,4 +1,4 @@
-import { Message, MessageCode, ParamCalculability } from "../internal_modules";
+import { Message, MessageCode, ParallelStructure, ParamCalculability } from "../internal_modules";
 import { Result } from "../internal_modules";
 import { RectangularStructure } from "../internal_modules";
 import { RectangularStructureParams } from "../internal_modules";
@@ -25,17 +25,25 @@ export class StructureWeirSubmergedLarinier extends RectangularStructure {
         return this._prms as RectangularStructureParams;
     }
 
+    /**
+     * vérification que l'ennoiement est supérieur à une valeur donnée
+     */
+    public checkSubmergence(res: Result) {
+        this.checkSubmergenceMin(res, 0.5);
+    }
+
     public Calc(sVarCalc: string, rInit?: number): Result {
         this.currentResultElement = super.Calc(sVarCalc, rInit);
         const h2h1ratio = this.prms.h2.v / this.prms.h1.v;
-        if (h2h1ratio < 0.7 || h2h1ratio > 0.9) {
-            this._result.resultElement.addMessage(new Message(
-                MessageCode.WARNING_SLOT_SUBMERGENCE_NOT_BETWEEN_07_AND_09,
-                {
-                    submergencePerc: this.computeSubmergencePercentage().toString()
-                }
-            ));
-        }
+        if (!(this.parent as ParallelStructure)?.inhibitSubmergenceError)
+            if (h2h1ratio < 0.7 || h2h1ratio > 0.9) {
+                this._result.resultElement.addMessage(new Message(
+                    MessageCode.WARNING_SLOT_SUBMERGENCE_NOT_BETWEEN_07_AND_09,
+                    {
+                        submergencePerc: this.computeSubmergencePercentage().toString()
+                    }
+                ));
+            }
         return this._result;
     }
 
diff --git a/src/util/log.ts b/src/util/log.ts
index 1398d152a2da3180422c4085352b09c193804910..d78c7d924738979c84b433498859f1370e382f35 100644
--- a/src/util/log.ts
+++ b/src/util/log.ts
@@ -94,6 +94,37 @@ export class cLog {
         return false;
     }
 
+    public getMessage(mc: MessageCode): Message {
+        for (const m of this.messages) {
+            if (m.code === mc) {
+                return m;
+            }
+        }
+        return undefined;
+    }
+
+    /**
+     * @returns true if all messages have the same code
+     */
+    public hasOnlyMessage(code: MessageCode): boolean {
+        for (const m of this.messages) {
+            if (m.code !== code) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public get uniqueMessageCodes(): MessageCode[] {
+        const res: MessageCode[] = [];
+        for (const m of this.messages) {
+            if (res.indexOf(m.code) === -1) {
+                res.push(m.code);
+            }
+        }
+        return res;
+    }
+
     /**
      * compute error, warning, info count in a message list
      */
diff --git a/src/util/message.ts b/src/util/message.ts
index 7f5e56d009dbb1af5b43d03ce361acccd5354cbb..77253f6882a12db3a022a8d7c5328b55b6956aca 100644
--- a/src/util/message.ts
+++ b/src/util/message.ts
@@ -512,6 +512,11 @@ export enum MessageCode {
      */
     ERROR_STRUCTURE_Z_EGAUX_Q_NON_NUL,
 
+    /**
+     * Structure : l'ennoiement %submergencePerc% est inférieur à %min%
+     */
+    ERROR_STRUCTURE_SUBMERGENCE_LOWER_THAN,
+
     /**
      * Il faut au moins un ouvrage dans une structure
      */
diff --git a/src/util/result.ts b/src/util/result.ts
index a1cb07b4cc629a7b0abb449db9af160a71d133a0..cba512d9e577696839624e314d4317fd690cbf7d 100644
--- a/src/util/result.ts
+++ b/src/util/result.ts
@@ -1,4 +1,4 @@
-import { JalhydObject } from "../internal_modules";
+import { JalhydObject, MessageCode } from "../internal_modules";
 import { Nub } from "../internal_modules";
 import { cLog } from "../internal_modules";
 import { Message, MessageSeverity } from "../internal_modules";
@@ -132,7 +132,7 @@ export class Result extends JalhydObject {
         if (re !== undefined) {
             res.push(re);
         }
-        const it: Iterator<Nub> = this._sourceNub.allChildNubIterator();
+        const it: Iterator<Nub> = this._sourceNub.directChildNubIterator();
         let inub = it.next()
         while (!inub.done) {
             let re = inub.value.result._resultElements[index];
@@ -272,6 +272,56 @@ export class Result extends JalhydObject {
         return true;
     }
 
+    /**
+     * determine if a message is present in result
+     * @param code message code to find
+     * @param recurs if true, search into nub children
+     */
+    public hasMessage(code: MessageCode, recurs: boolean = false): boolean {
+        if (this._globalLog.contains(code)) {
+            return true;
+        }
+
+        for (const r of this._resultElements) {
+            if (r.log.contains(code)) {
+                return true;
+            }
+        }
+
+        if (recurs && this._sourceNub !== undefined) {
+            for (const n of this._sourceNub.directChildNubIterator()) {
+                if (n.result.hasMessage(code, true)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * determine if all messages have the same code
+     * @param code message code to find
+     */
+    public hasOnlyMessage(code: MessageCode): boolean {
+        if (!this._globalLog.hasOnlyMessage(code)) {
+            return false;
+        }
+
+        if (!this.resultElement.log.hasOnlyMessage(code)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    public get uniqueMessageCodes(): MessageCode[] {
+        let res: MessageCode[] = [];
+        res = res.concat(this._globalLog.uniqueMessageCodes);
+        res = res.concat(this.resultElement.log.uniqueMessageCodes);
+        return res;
+    }
+
     /**
      * compute log stats (# of error, warning, info) on all result element
      */
diff --git a/src/util/resultelement.ts b/src/util/resultelement.ts
index 313e464a111501518922a4641ad1aa1718ac2b2e..72b4c02d12e7a54f18966f2fa8e3ad84b511cc02 100644
--- a/src/util/resultelement.ts
+++ b/src/util/resultelement.ts
@@ -1,4 +1,4 @@
-import { cLog } from "../internal_modules";
+import { MessageCode, cLog } from "../internal_modules";
 import { Message, MessageSeverity } from "../internal_modules";
 import { Result } from "../internal_modules";
 
@@ -192,6 +192,13 @@ export class ResultElement {
         }
     }
 
+    /**
+     * Removes all values
+     */
+    public removeValues() {
+        this._values = {};
+    }
+
     public toString(): string {
         if (this.vCalc !== undefined) {
             return String(this.vCalc);
@@ -234,6 +241,15 @@ export class ResultElement {
         return false;
     }
 
+    public hasMessage(code: MessageCode): boolean {
+        for (const m of this.log.messages) {
+            if (m.code === code) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * compute error, warning, info count on all log messages
      */