diff --git a/spec/structure/parallel_structure.spec.ts b/spec/structure/parallel_structure.spec.ts
index 8a4d442f68e2554d15ec08a883c5933d11a89098..d7bf22a27ade7686274e5996f6a318bc23386497 100644
--- a/spec/structure/parallel_structure.spec.ts
+++ b/spec/structure/parallel_structure.spec.ts
@@ -83,7 +83,6 @@ const ps2: ParallelStructure = new ParallelStructure(
     false // debug
 );
 
-// tslint:disable-next-line:prefer-for-of
 describe("Class ParallelStructure: ", () => {
     // Ajout d'une structure de chaque type dans ParallelStructure
     const iLoiDebits: number[] = [];
diff --git a/spec/structure/structure_test.ts b/spec/structure/structure_test.ts
index 6ff1af5f39e0eee3857d1fca6445608079c34e18..fd9a2a1b4d8fb415ae5203ba8cf0313cd861848d 100644
--- a/spec/structure/structure_test.ts
+++ b/spec/structure/structure_test.ts
@@ -42,6 +42,13 @@ class StructureTest extends Structure {
         return new Result(this.prms.Z1.v - this.prms.Z2.v, data);
     }
 
+    /**
+     * Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
+     */
+    public calcA(): number {
+        return Math.min(Math.max(this.prms.h1.v, this.prms.h2.v), this.prms.W.v);
+    }
+
 }
 
 /* Test structure with :
diff --git a/spec/structure/structure_triangular_trunc_weir_free.spec.ts b/spec/structure/structure_triangular_trunc_weir_free.spec.ts
index f11fc424ed3735e5ff034f07b81aa31f64d07adf..44f883598f0e336ed86c941e17700db4c73df905 100644
--- a/spec/structure/structure_triangular_trunc_weir_free.spec.ts
+++ b/spec/structure/structure_triangular_trunc_weir_free.spec.ts
@@ -8,7 +8,7 @@
 
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureTriangularTruncWeirFree } from "../../src/structure/structure_triangular_trunc_weir_free";
-import { TriangularTruncStructureParams } from "../../src/structure/triangular_trunc_structure_params";
+import { TriangularTruncStructureParams } from "../../src/structure/structure_triangular_trunc_weir_free_params";
 import { itCalcQ } from "./functions";
 
 const structPrm: TriangularTruncStructureParams =
diff --git a/spec/structure/structure_triangular_weir_free.spec.ts b/spec/structure/structure_triangular_weir_free.spec.ts
index c16821a86312cda7d44d01a700ff47036a5d6695..849811d4d95e3c415400f111dfbb82a3c938a741 100644
--- a/spec/structure/structure_triangular_weir_free.spec.ts
+++ b/spec/structure/structure_triangular_weir_free.spec.ts
@@ -8,7 +8,7 @@
 
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureTriangularWeirFree } from "../../src/structure/structure_triangular_weir_free";
-import { TriangularStructureParams } from "../../src/structure/triangular_structure_params";
+import { TriangularStructureParams } from "../../src/structure/structure_triangular_weir_free_params";
 import { itCalcQ } from "./functions";
 
 const structPrm: TriangularStructureParams = new TriangularStructureParams(0, 100.1, 100.1, 100, 45, 1.36);
diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts
index cb7846e564cddd5ded4412cf430f3cf42ec451d3..302113c65a33764816ee5e2e32a6c578ce5d3349 100644
--- a/src/structure/factory_structure.ts
+++ b/src/structure/factory_structure.ts
@@ -8,24 +8,28 @@ import { StructureKiviParams } from "./structure_kivi_params";
 import { StructureOrificeFree } from "./structure_orifice_free";
 import { StructureOrificeSubmerged } from "./structure_orifice_submerged";
 import { LoiDebit, StructureProperties, StructureType } from "./structure_props";
+// tslint:disable-next-line:max-line-length
+import { StructureTriangularTruncWeirFree, TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free";
 import { StructureTriangularWeirFree, TriangularStructureParams } from "./structure_triangular_weir_free";
 import { StructureWeirFree } from "./structure_weir_free";
 
+
 export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit, dbg: boolean = false): Structure {
+    const oCd: {[s: string]: number} = {SeuilR: 0.4, VanneR: 0.6, SeuilT: 1.36};
     const rectStructPrms: RectangularStructureParams = new RectangularStructureParams(
         0,  // Q
         100,        // ZDV
         102,        // Z1
         101.5,      // Z2
         2,          // L
-        0.4        // Cd pour un seuil rectangulaire
+        oCd.SeuilR        // Cd pour un seuil rectangulaire
         // W = Infinity par défaut pour un seuil
     );
 
     switch (structureType) {
         case StructureType.VanneRectangulaire:
             rectStructPrms.W.v = 0.5;
-            rectStructPrms.Cd.v = 0.6; // Cd pour une vanne rectangulaire
+            rectStructPrms.Cd.v = oCd.VanneR; // Cd pour une vanne rectangulaire
             break;
         case StructureType.SeuilRectangulaire:
         case StructureType.SeuilTriangulaire:
@@ -42,15 +46,15 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
 
     switch (loiDebit) {
         case LoiDebit.Cem88d:
-            rectStructPrms.Cd.v = 0.4; // Cd Cem88d qu'on soit en seuil ou vanne
+            rectStructPrms.Cd.v = oCd.SeuilR; // Cd Cem88d qu'on soit en seuil ou vanne
             return new StructureCem88d(rectStructPrms, dbg);
 
         case LoiDebit.Cem88v:
-            rectStructPrms.Cd.v = 0.6; // Cd Cem88d qu'on soit en seuil ou vanne
+            rectStructPrms.Cd.v = oCd.VanneR; // Cd Cem88d qu'on soit en seuil ou vanne
             return new StructureCem88v(rectStructPrms, dbg);
 
         case LoiDebit.Cunge80:
-            rectStructPrms.Cd.v = 0.6; // Cd Cunge80 qu'on soit en seuil ou vanne
+            rectStructPrms.Cd.v = oCd.VanneR; // Cd Cunge80 qu'on soit en seuil ou vanne
             return new StructureCunge80(rectStructPrms, dbg);
 
         case LoiDebit.OrificeFree:
@@ -64,26 +68,38 @@ export function CreateStructure(structureType: StructureType, loiDebit: LoiDebit
 
         case LoiDebit.KIVI:
             const structKiviPrm: StructureKiviParams = new StructureKiviParams(
-                8.516, // Q
-                101,    // ZDV
-                103,    // Z1
-                102,    // Z2
-                2,      // L
-                0.4,  // alpha
-                0.001,  // béta
-                100);    // ZRAM : cote Radier Amont
+                8.516,      // Q
+                101,        // ZDV
+                103,        // Z1
+                102,        // Z2
+                2,          // L
+                oCd.SeuilR, // alpha
+                0.001,      // béta
+                100);       // ZRAM : cote Radier Amont
             return new StructureKivi(structKiviPrm, dbg);
-        case LoiDebit.TriangularWeirFree:
-            const triangStructPrms: TriangularStructureParams = new TriangularStructureParams(
-                0,  // Q
+            case LoiDebit.TriangularWeirFree:
+            const structTriangPrms: TriangularStructureParams = new TriangularStructureParams(
+                0,          // Q
+                100,        // ZDV
+                102,        // Z1
+                101.5,      // Z2
+                45,         // Alpha2
+                oCd.SeuilT  // Cd pour un seuil triangulaire
+                // W = Infinity par défaut pour un seuil
+            );
+            return new StructureTriangularWeirFree(structTriangPrms, dbg);
+            case LoiDebit.TriangularTruncWeirFree:
+            const structTriTruncPrms: TriangularTruncStructureParams = new TriangularTruncStructureParams(
+                0,          // Q
                 100,        // ZDV
                 102,        // Z1
                 101.5,      // Z2
-                45,          // Alpha2
-                1.36        // Cd pour un seuil triangulaire
+                0.9,        // BT
+                101,        // ZT
+                oCd.SeuilT  // Cd pour un seuil triangulaire
                 // W = Infinity par défaut pour un seuil
             );
-            return new StructureTriangularWeirFree(triangStructPrms, dbg);
+            return new StructureTriangularTruncWeirFree(structTriTruncPrms, dbg);
 
         default:
             throw new Error(`type de LoiDebit ${LoiDebit[loiDebit]} non pris en charge`);
diff --git a/src/structure/parallel_structure_params.ts b/src/structure/parallel_structure_params.ts
index 71c037a59395b8602aaf2557a00d494eecec529e..40426c827c01707f1bd35ada4052c4eb130ef2fb 100644
--- a/src/structure/parallel_structure_params.ts
+++ b/src/structure/parallel_structure_params.ts
@@ -1,7 +1,6 @@
-import { Nub } from "../nub";
-import { ParamsEquation } from "../param/params-equation";
 import { ParamDefinition } from "../param/param-definition";
 import { ParamDomainValue } from "../param/param-domain";
+import { ParamsEquation } from "../param/params-equation";
 
 /**
  * Common parameters of hydraulic structure equations
diff --git a/src/structure/rectangular_structure.ts b/src/structure/rectangular_structure.ts
index da1956dc03148990cfa8b4b4fcbcccbf174ad72f..d127725e6d4a0643ce1ee87ad18c2ad886483b6c 100644
--- a/src/structure/rectangular_structure.ts
+++ b/src/structure/rectangular_structure.ts
@@ -20,6 +20,13 @@ export abstract class RectangularStructure extends Structure {
         return this._prms as RectangularStructureParams;
     }
 
+    /**
+     * Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
+     */
+    public calcA(): number {
+            return Math.min(Math.max(this.prms.h1.v, this.prms.h2.v), this.prms.W.v) * this.prms.L.v;
+    }
+
     /**
      * paramétrage de la calculabilité des paramètres
      */
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index 69ce4fea56d0962496d4b83b722be91fc48254d4..8965a98e88998f5072715bb6c92c961b4df3985e 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -67,6 +67,11 @@ export abstract class Structure extends Nub {
         return this._prms as StructureParams;
     }
 
+    /**
+     * Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
+     */
+    public abstract calcA(): number;
+
     /**
      * Calcul d'une équation quelque soit l'inconnue à calculer.
      * Gestion du débit nul et de l'inversion de débit
diff --git a/src/structure/structure_kivi.ts b/src/structure/structure_kivi.ts
index 6df85dd19b29c59246d92d38d3bfb705b06259db..e1bade6082007e4557476505f40156c0785a2c0a 100644
--- a/src/structure/structure_kivi.ts
+++ b/src/structure/structure_kivi.ts
@@ -52,6 +52,13 @@ export class StructureKivi extends Structure {
 
     }
 
+    /**
+     * Calcul de l'aire d'écoulement sur le seuil ou dans l'orifice
+     */
+    public calcA(): number {
+        return Math.min(Math.max(this.prms.h1.v, this.prms.h2.v), this.prms.W.v) * this.prms.L.v;
+    }
+
     protected getFlowRegime(): StructureFlowRegime {
         if (this.prms.h2.v > 0) {
             return StructureFlowRegime.SUBMERGED;
diff --git a/src/structure/structure_props.ts b/src/structure/structure_props.ts
index 114be3ac50472415209349efe33b2b3161ea2538..e8bc5aa5c6e2900d291f8ed403a6045ce19cc95a 100644
--- a/src/structure/structure_props.ts
+++ b/src/structure/structure_props.ts
@@ -20,7 +20,9 @@ export enum LoiDebit {
     // Loi Kindsvater-Carter et Villemonte
     KIVI,
     // Loi de débit seuil triangulaire dénoyé
-    TriangularWeirFree
+    TriangularWeirFree,
+    // Loi de débit seuil triangulaire tronqué
+    TriangularTruncWeirFree
 }
 
 export const loiAdmissibles: { [key: string]: LoiDebit[] } = {
@@ -29,7 +31,7 @@ export const loiAdmissibles: { [key: string]: LoiDebit[] } = {
         LoiDebit.KIVI
     ],
     SeuilTriangulaire: [
-        LoiDebit.TriangularWeirFree
+        LoiDebit.TriangularWeirFree, LoiDebit.TriangularTruncWeirFree
     ],
     VanneRectangulaire: [
         LoiDebit.Cem88d, LoiDebit.Cem88v, LoiDebit.Cunge80, LoiDebit.OrificeFree,
diff --git a/src/structure/structure_triangular_trunc_weir_free.ts b/src/structure/structure_triangular_trunc_weir_free.ts
index 93cb309e0d73eb454ce868e4874a987079ea8507..c3a6a21f3f8f136fc8d7898f2626c74e6153666c 100644
--- a/src/structure/structure_triangular_trunc_weir_free.ts
+++ b/src/structure/structure_triangular_trunc_weir_free.ts
@@ -1,6 +1,7 @@
+import { ParamCalculability } from "../param/param-definition";
 import { Result } from "../util/result";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
-import { TriangularTruncStructureParams } from "./triangular_trunc_structure_params";
+import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free_params";
 
 export { TriangularTruncStructureParams };
 
@@ -28,7 +29,7 @@ export class StructureTriangularTruncWeirFree extends Structure {
         Structure.CheckEquation(sVarCalc);
         const data = this.getResultData();
 
-        let v: number = this.prms.Cd.v * this.prms.B2.v / (this.prms.ZT.v - this.prms.ZDV.v);
+        let v: number = this.prms.Cd.v * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v);
         if (this.prms.Z1.v <= this.prms.ZT.v) {
             v = v * Math.pow(this.prms.h1.v, 2.5);
         } else {
@@ -38,6 +39,20 @@ export class StructureTriangularTruncWeirFree extends Structure {
         return new Result(v, data);
     }
 
+    /**
+     * Calcul de l'aire d'écoulement sur le seuil
+     */
+    public calcA(): number {
+        if (this.prms.Z1.v <= this.prms.ZT.v) {
+            const h: number = Math.max(this.prms.h1.v, this.prms.h2.v);
+            return h * h * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v);
+        } else {
+            const Z: number = Math.max(this.prms.Z1.v, this.prms.Z2.v);
+            return this.prms.BT.v * (this.prms.ZT.v - this.prms.ZDV.v)
+                + 2 * this.prms.BT.v * (Z - this.prms.ZT.v);
+        }
+    }
+
     protected getFlowRegime() {
         return StructureFlowRegime.FREE;
     }
@@ -46,4 +61,14 @@ export class StructureTriangularTruncWeirFree extends Structure {
         return StructureFlowMode.WEIR;
     }
 
+    /**
+     * paramétrage de la calculabilité des paramètres
+     */
+    protected setParametersCalculability() {
+        super.setParametersCalculability();
+        this.prms.BT.calculability = ParamCalculability.DICHO;
+        this.prms.ZT.calculability = ParamCalculability.DICHO;
+        this.prms.Cd.calculability = ParamCalculability.DICHO;
+    }
+
 }
diff --git a/src/structure/triangular_trunc_structure_params.ts b/src/structure/structure_triangular_trunc_weir_free_params.ts
similarity index 84%
rename from src/structure/triangular_trunc_structure_params.ts
rename to src/structure/structure_triangular_trunc_weir_free_params.ts
index bed29fa150dd3b08851f664a8ad48b992f17a4f2..81fc59fc21b39b37fa31e8f107ed4cde78c5d03d 100644
--- a/src/structure/triangular_trunc_structure_params.ts
+++ b/src/structure/structure_triangular_trunc_weir_free_params.ts
@@ -7,7 +7,7 @@ import { StructureParams } from "./structure_params";
  */
 export class TriangularTruncStructureParams extends StructureParams {
     /** Demi-ouverture du triangle (m) */
-    public B2: ParamDefinition;
+    public BT: ParamDefinition;
 
     /** Cote haute du triangle (m) */
     public ZT: ParamDefinition;
@@ -22,18 +22,18 @@ export class TriangularTruncStructureParams extends StructureParams {
      * @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 rB2   Demi-ouverture du triangle (m)
+     * @param rBT   Demi-ouverture du triangle (m)
      * @param rZT   Cote haute du triangle (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,
-        rB2: number, rZT: number, rCd: number, rW: number = Infinity
+        rBT: number, rZT: number, rCd: number, rW: number = Infinity
     ) {
         super(rQ, rZDV, rZ1, rZ2, rW);
-        this.B2 = new ParamDefinition("B2", ParamDomainValue.POS, rB2);
-        this.addParamDefinition(this.B2);
+        this.BT = new ParamDefinition("BT", ParamDomainValue.POS, rBT);
+        this.addParamDefinition(this.BT);
         this.ZT = new ParamDefinition("ZT", ParamDomainValue.POS, rZT);
         this.addParamDefinition(this.ZT);
         this.Cd = new ParamDefinition("Cd", ParamDomainValue.POS, rCd);
diff --git a/src/structure/structure_triangular_weir_free.ts b/src/structure/structure_triangular_weir_free.ts
index fc87d58a999c1f37c20a9df5e3d40e820f9cd1dd..beb63a2b7c9236e0357da08f1f0d0b2aa0c2d49a 100644
--- a/src/structure/structure_triangular_weir_free.ts
+++ b/src/structure/structure_triangular_weir_free.ts
@@ -1,14 +1,26 @@
+import { ParamCalculability } from "../param/param-definition";
 import { Result } from "../util/result";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
-import { TriangularStructure } from "./triangular_structure";
-import { TriangularStructureParams } from "./triangular_structure_params";
+import { TriangularStructureParams } from "./structure_triangular_weir_free_params";
 
 export { TriangularStructureParams };
 
 /**
  * Equation classique seuil triangulaire dénoyé
  */
-export class StructureTriangularWeirFree extends TriangularStructure {
+export class StructureTriangularWeirFree extends Structure {
+
+    constructor(prms: TriangularStructureParams, dbg: boolean = false) {
+        super(prms, dbg);
+    }
+
+    /**
+     * paramètres castés au bon type
+     */
+    get prms(): TriangularStructureParams {
+        return this._prms as TriangularStructureParams;
+    }
+
     /**
      * Calcul analytique Q = f(Cd, L, h1, h2, W) seuil dénoyé
      * @param sVarCalc Variable à calculer (doit être "Q")
@@ -23,6 +35,13 @@ export class StructureTriangularWeirFree extends TriangularStructure {
         return new Result(v, data);
     }
 
+    /**
+     * Calcul de l'aire d'écoulement sur le seuil
+     */
+    public calcA(): number {
+        return Math.pow(Math.max(this.prms.h1.v, this.prms.h2.v), 2) * this.getTanFromDegrees(this.prms.alpha2.v);
+    }
+
     protected getFlowRegime() {
         return StructureFlowRegime.FREE;
     }
@@ -37,5 +56,14 @@ export class StructureTriangularWeirFree extends TriangularStructure {
      */
     protected getTanFromDegrees(degrees: number) {
         return Math.tan(degrees * Math.PI / 180);
-      }
+    }
+
+    /**
+     * paramétrage de la calculabilité des paramètres
+     */
+    protected setParametersCalculability() {
+        super.setParametersCalculability();
+        this.prms.alpha2.calculability = ParamCalculability.DICHO;
+        this.prms.Cd.calculability = ParamCalculability.DICHO;
+    }
 }
diff --git a/src/structure/triangular_structure_params.ts b/src/structure/structure_triangular_weir_free_params.ts
similarity index 100%
rename from src/structure/triangular_structure_params.ts
rename to src/structure/structure_triangular_weir_free_params.ts
diff --git a/src/structure/triangular_structure.ts b/src/structure/triangular_structure.ts
deleted file mode 100644
index 3ff33cb7ae4d287c7f0e6cfe235972c37ea63f7e..0000000000000000000000000000000000000000
--- a/src/structure/triangular_structure.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { ParamCalculability } from "../param/param-definition";
-import { Structure } from "./structure";
-import { TriangularStructureParams } from "./triangular_structure_params";
-
-export { TriangularStructureParams };
-
-/**
- * Classe mère pour toutes les structures ayant une base rectangulaire (vannes, seuils)
- */
-export abstract class TriangularStructure extends Structure {
-
-    constructor(prms: TriangularStructureParams, dbg: boolean = false) {
-        super(prms, dbg);
-    }
-
-    /**
-     * paramètres castés au bon type
-     */
-    get prms(): TriangularStructureParams {
-        return this._prms as TriangularStructureParams;
-    }
-
-    /**
-     * paramétrage de la calculabilité des paramètres
-     */
-    protected setParametersCalculability() {
-        super.setParametersCalculability();
-        this.prms.alpha2.calculability = ParamCalculability.DICHO;
-        this.prms.Cd.calculability = ParamCalculability.DICHO;
-    }
-
-}