diff --git a/spec/nubtest.ts b/spec/nubtest.ts index d64c51344725f7c27cbf4ba1cd6ea9734062a6a6..bb097e4a1f06d8c6496d8f397ee418eab38ff5e8 100644 --- a/spec/nubtest.ts +++ b/spec/nubtest.ts @@ -1,6 +1,8 @@ import { Result } from "../src/base"; import { Nub } from "../src/nub"; import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability, IParamsEquation } from "../src/param"; +import { cLog } from "../src/util/log"; +import { ErrorMessage, ErrorCode } from "../src/util/error"; class NubTestParams implements IParamsEquation { private _A: ParamDefinition; @@ -65,4 +67,79 @@ export let precDist: number = Math.pow(10, -precDigits); export function equalEpsilon(val1: number, val2: number, epsilon: number = precDist) { return Math.abs(val1 - val2) < epsilon; +} + +/** + * compare 2 journaux + */ +export function compareLog(logTest: cLog, logValid: cLog) { + //console.log(JSON.stringify(logTest)); + + // taille + + let n1 = logTest.messages.length; + let n2 = logValid.messages.length; + let b: boolean = n1 == n2; + expect(b).toBeTruthy("journal : nombre de messages incorrect (" + n1 + "), devrait etre " + n2); + if (!b) return; + + // codes + + for (let i = 0; i < n1; i++) { + let m1: ErrorMessage = logTest.messages[i]; + let m2: ErrorMessage = logValid.messages[i]; + b = m1.code == m2.code; + expect(b).toBeTruthy("journal : message n°" + i + ", code " + ErrorCode[m1.code] + " incorrect, devrait être " + ErrorCode[m2.code]); + if (!b) return; + } + + // données + + for (let i = 0; i < n1; i++) { + let m1: ErrorMessage = logTest.messages[i]; + let m2: ErrorMessage = logValid.messages[i]; + let code1 = ErrorCode[m1.code]; + + // taille des données + + let nd1 = Object.keys(m1.extraVar).length; + let nd2 = Object.keys(m2.extraVar).length; + b = nd1 == nd2; + expect(b).toBeTruthy("journal : message n°" + i + ", code " + code1 + " : nombre de données incorrect " + nd1 + ", devrait etre " + nd2); + if (!b) return; + + // clés des données + + for (let j in m1.extraVar) { + b = m2.extraVar[j] != undefined; + expect(b).toBeTruthy("journal : message n°" + i + ", code " + code1 + " : la donnée " + j + "=" + m1.extraVar[j] + " ne devrait pas être présente"); + // if (!b) return; + } + + for (let j in m2.extraVar) { + b = m1.extraVar[j] != undefined; + expect(b).toBeTruthy("journal : message n°" + i + ", code " + code1 + " : la donnée " + j + "=" + m2.extraVar[j] + " devrait être présente"); + // if (!b) return; + } + + // type des données + + for (let j in m1.extraVar) { + 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] + " a un type " + (typeof m1.extraVar[j]) + " incorrect, devrait être du type " + (typeof m2.extraVar[j])); + if (!b) return; + } + + // valeur des données + + for (let j in m1.extraVar) { + let d: any = m1.extraVar[j]; + if (typeof d == "number") + b = equalEpsilon(d, m2.extraVar[j]); + else + b = d === m2.extraVar[j]; + expect(b).toBeTruthy("journal : " + i + "ieme message, code " + code1 + " : la donnée " + j + "=" + m1.extraVar[j] + " a une valeur incorrecte, devrait être " + m2.extraVar[j]); + if (!b) return; + } + } } \ No newline at end of file diff --git a/spec/remous_rect.spec.ts b/spec/remous_rect.spec.ts index c9be1b2ab3079d8bc95bac770043a2e0c4e2b177..3a616e8c80db0a40fccd7191e398bd6147c6a5fc 100644 --- a/spec/remous_rect.spec.ts +++ b/spec/remous_rect.spec.ts @@ -1,7 +1,9 @@ import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; -import { precDigits, precDist, equalEpsilon } from "./nubtest"; +import { precDigits, precDist, equalEpsilon, compareLog } from "./nubtest"; import { round } from "../src/base"; +import { cLog } from "../src/util/log"; +import { ErrorMessage, ErrorCode } from "../src/util/error"; /** * compare 2 objets @@ -70,7 +72,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -83,7 +86,30 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + + compareLog(log, expLog); }); it("forte pente, ressaut après l'aval", () => { @@ -107,7 +133,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -121,7 +148,35 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 95; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "aval"; + m.extraVar["x"] = 100; + expLog.add(m); + + compareLog(log, expLog); }); it("forte pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -144,7 +199,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -157,7 +213,35 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 90; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 90; + m.extraVar["xmax"] = 95; + expLog.add(m); + + compareLog(log, expLog); }); it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => { @@ -180,7 +264,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -193,7 +278,31 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000, 5.250, 5.500]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 0; + m.extraVar["xmax"] = 3.75; + expLog.add(m); + + compareLog(log, expLog); }); it("faible pente, ressaut avant l'amont", () => { @@ -216,7 +325,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -229,7 +339,35 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + + compareLog(log, expLog); }); it("faible pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -252,7 +390,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -265,7 +404,35 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 15; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 0; + m.extraVar["xmax"] = 5; + expLog.add(m); + + compareLog(log, expLog); }); it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (1)", () => { @@ -289,7 +456,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -304,7 +472,7 @@ describe('Class Remous / section rectangulaire :', () => { // compObject("Ytorrentiel", res["tor"], t, 0.03); // let x = [0.000, 0.050, 0.100, 0.150, 0.200, 0.250, 0.300, 0.350, 0.400, 0.450, 0.500, 0.550, 0.600, 0.650, 0.700, 0.750, 0.800, 0.850, 0.900, 0.950, 1.000, 1.050, 1.100, 1.150, 1.200, 1.250, 1.300, 1.350, 1.400, 1.450, 1.500, 1.550, 1.600, 1.650, 1.700, 1.750, 1.800, 1.850, 1.900, 1.950, 2.000, 2.050, 2.100, 2.150, 2.200, 2.250, 2.300, 2.350, 2.400, 2.450, 2.500, 2.550, 2.600, 2.650, 2.700, 2.750, 2.800, 2.850, 2.900, 2.950, 3.000, 3.050, 3.100, 3.150, 3.200, 3.250, 3.300, 3.350, 3.400, 3.450, 3.500, 3.550, 3.600, 3.650, 3.700, 3.750, 3.800, 3.850, 3.900, 3.950, 4.000, 4.050, 4.100, 4.150, 4.200, 4.250, 4.300, 4.350, 4.400, 4.450, 4.500, 4.550, 4.600, 4.650, 4.700, 4.750, 4.800, 4.850, 4.900, 4.950, 5.000]; - // compArray("abcisses", res["trX"], x); + // compArray("abscisses", res["trX"], x); //dx = 0.25 let f = { 5.000: 0.403, 4.750: 0.43, 4.500: 0.44, 4.250: 0.448, 4.000: 0.455, 3.750: 0.46, 3.500: 0.465, 3.250: 0.47, 3.000: 0.474, 2.750: 0.479, 2.500: 0.482, 2.250: 0.486, 2.000: 0.489, 1.750: 0.492, 1.500: 0.495, 1.250: 0.498, 1.000: 0.501, 0.750: 0.504, 0.500: 0.506, 0.250: 0.508, 0.000: 0.01 }; @@ -314,7 +482,31 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 0; + m.extraVar["xmax"] = 1; + expLog.add(m); + + compareLog(log, expLog); }); it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (2)", () => { @@ -337,7 +529,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -350,11 +543,35 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.0000, 0.0500, 0.1000, 0.1500, 0.2000, 0.2500, 0.3000, 0.3500, 0.4000, 0.4500, 0.5000, 0.5500, 0.6000, 0.6500, 0.7000, 0.7500, 0.8000, 0.8500, 0.9000, 0.9500, 1.0000, 1.0500, 1.1000, 1.1500, 1.2000, 1.2500, 1.3000, 1.3500, 1.4000, 1.4500, 1.5000, 1.5500, 1.6000, 1.6500, 1.7000, 1.7500, 1.8000, 1.8500, 1.9000, 1.9500, 2.0000, 2.0500, 2.1000, 2.1500, 2.2000, 2.2500, 2.3000, 2.3500, 2.4000, 2.4500, 2.5000, 2.5500, 2.6000, 2.6500, 2.7000, 2.7500, 2.8000, 2.8500, 2.9000, 2.9500, 3.0000, 3.0500, 3.1000, 3.1500, 3.2000, 3.2500, 3.3000, 3.3500, 3.4000, 3.4500, 3.5000, 3.5500, 3.6000, 3.6500, 3.7000, 3.7500, 3.8000, 3.8500, 3.9000, 3.9500, 4.0000, 4.0500, 4.1000, 4.1500, 4.2000, 4.2500, 4.3000, 4.3500, 4.4000, 4.4500, 4.5000, 4.5500, 4.6000, 4.6500, 4.7000, 4.7500, 4.8000, 4.8500, 4.9000, 4.9500, 5.0000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 0; + m.extraVar["xmax"] = 0.9; + expLog.add(m); + + compareLog(log, expLog); }); }); - describe('méthode Euler explicite :', () => { + xdescribe('méthode Euler explicite :', () => { it("forte pente, ressaut avant l'amont", () => { let prms = new ParamsSectionRectang(undefined, // tirant d'eau 2.5, // largeur de fond @@ -375,7 +592,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -388,7 +606,38 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 20; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 25; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + + compareLog(log, expLog); }); it("forte pente, ressaut après l'aval", () => { @@ -412,7 +661,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -425,7 +675,43 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 95; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 20; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 25; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "aval"; + m.extraVar["x"] = 100; + expLog.add(m); + + compareLog(log, expLog); }); it("forte pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -448,7 +734,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -461,7 +748,43 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 85; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 20; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 25; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 90; + m.extraVar["xmax"] = 90; + expLog.add(m); + + compareLog(log, expLog); }); it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => { @@ -484,7 +807,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -497,10 +821,34 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000, 5.250, 5.500]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.253; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 0; + m.extraVar["xmax"] = 3.75; + expLog.add(m); + + compareLog(log, expLog); }); - it("faible pente, ressaut avant l'amont", () => { + it("faible pente, ressaut avant l'amont (1)", () => { let prms = new ParamsSectionRectang(undefined, // tirant d'eau 2.5, // largeur de fond 40, // Ks=Strickler @@ -520,7 +868,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -533,10 +882,44 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 95; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 10; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + + compareLog(log, expLog); }); it("faible pente, ressaut (1 point) à l'intérieur du bief", () => { + // résultat incorrect (ressaut détecté à l'amont), vraisemblablement à cause du pas de discrétisation + let prms = new ParamsSectionRectang(undefined, // tirant d'eau 2.5, // largeur de fond 40, // Ks=Strickler @@ -556,7 +939,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -569,10 +953,44 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 5.000, 10.000, 15.000, 20.000, 25.000, 30.000, 35.000, 40.000, 45.000, 50.000, 55.000, 60.000, 65.000, 70.000, 75.000, 80.000, 85.000, 90.000, 95.000, 100.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 95; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 20; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + + compareLog(log, expLog); }); - it("faible pente, ressaut (plusieurs points) à l'intérieur du bief", () => { + it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (1)", () => { + // résultat incorrect (ressaut détecté à l'amont), vraisemblablement à cause du pas de discrétisation + let prms = new ParamsSectionRectang(undefined, // tirant d'eau 2.5, // largeur de fond 40, // Ks=Strickler @@ -593,7 +1011,8 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); @@ -606,7 +1025,163 @@ describe('Class Remous / section rectangulaire :', () => { compObject("Ytorrentiel", res["tor"], t, 0.03); let x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000]; - compArray("abcisses", res["trX"], x); + compArray("abscisses", res["trX"], x); + + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = 4.75; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + }); + + /* + it("faible pente, ressaut avant l'amont (2)", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 0.15, // Dx=Pas d'espace + 5 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.3, // Yamont = tirant amont + 0.403, // Yaval = tirant aval + MethodeResolution.EulerExplicite + ); + + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); + + let res = rem.calculRemous(undefined); + + // données de validation : version PHP (Oct 2017) méthode Euler + + let f = { 5.000: 0.403, 4.850: 0.915, 4.700: 0.915, 4.550: 0.915, 4.400: 0.915, 4.250: 0.915, 4.100: 0.915, 3.950: 0.915, 3.800: 0.915, 3.650: 0.915, 3.500: 0.915, 3.350: 0.915, 3.200: 0.915, 3.050: 0.915, 2.900: 0.915, 2.750: 0.915, 2.600: 0.915, 2.450: 0.915, 2.300: 0.915, 2.150: 0.915, 2.000: 0.915, 1.850: 0.915, 1.700: 0.915, 1.550: 0.915, 1.400: 0.915, 1.250: 0.915, 1.100: 0.915, 0.950: 0.915, 0.800: 0.915, 0.650: 0.915, 0.500: 0.915, 0.350: 0.915, 0.200: 0.915, 0.050: 0.915 }; + compObject("Yfluvial", res["flu"], f, 0.03); + + let t = {}; + compObject("Ytorrentiel", res["tor"], t, 0.03); + + let x = [0.050, 0.200, 0.350, 0.500, 0.650, 0.800, 0.950, 1.100, 1.250, 1.400, 1.550, 1.700, 1.850, 2.000, 2.150, 2.300, 2.450, 2.600, 2.750, 2.900, 3.050, 3.200, 3.350, 3.500, 3.650, 3.800, 3.950, 4.100, 4.250, 4.400, 4.550, 4.700, 4.850, 5.000]; + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m.extraVar["x"] = 3.15; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = "amont"; + m.extraVar["x"] = 0; + expLog.add(m); + + compareLog(log, expLog); }); + + + it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (2)", () => { + // résultat incorrect (ressaut détecté à l'amont), vraisemblablement à cause du pas de discrétisation + + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.001, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + // 0.05, // Dx=Pas d'espace + 0.1, // Dx=Pas d'espace + 5 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.01, // Yamont = tirant amont + 0.403, // Yaval = tirant aval + MethodeResolution.EulerExplicite + ); + + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); + + let res = rem.calculRemous(undefined); + + // données de validation : version PHP (Oct 2017) méthode Euler + + let f = { 5.000: 0.403, 4.900: 0.744, 4.800: 0.744, 4.700: 0.744, 4.600: 0.744, 4.500: 0.745, 4.400: 0.745, 4.300: 0.745, 4.200: 0.745, 4.100: 0.745, 4.000: 0.745, 3.900: 0.745, 3.800: 0.745, 3.700: 0.745, 3.600: 0.746, 3.500: 0.746, 3.400: 0.746, 3.300: 0.746, 3.200: 0.746, 3.100: 0.746, 3.000: 0.746, 2.900: 0.746, 2.800: 0.747, 2.700: 0.747, 2.600: 0.747, 2.500: 0.747, 2.400: 0.747, 2.300: 0.747, 2.200: 0.747, 2.100: 0.747, 2.000: 0.747, 1.900: 0.748, 1.800: 0.748, 1.700: 0.748, 1.600: 0.748, 1.500: 0.748, 1.400: 0.748, 1.300: 0.748, 1.200: 0.748, 1.100: 0.748, 1.000: 0.749, 0.900: 0.749, 0.800: 0.749, 0.700: 0.749, 0.600: 0.749, 0.500: 0.749, 0.400: 0.749, 0.300: 0.749, 0.200: 0.75, 0.100: 0.013 }; + compObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.01, 0.100: 0.013, 0.200: 0.016, 0.300: 0.018, 0.400: 0.02, 0.500: 0.023, 0.600: 0.025, 0.700: 0.027, 0.800: 0.029, 0.900: 0.031, 1.000: 0.033, 1.100: 0.035, 1.200: 0.037, 1.300: 0.039, 1.400: 0.041, 1.500: 0.043, 1.600: 0.045, 1.700: 0.046, 1.800: 0.048, 1.900: 0.05, 2.000: 0.052, 2.100: 0.054, 2.200: 0.055, 2.300: 0.057, 2.400: 0.059, 2.500: 0.06, 2.600: 0.062, 2.700: 0.064, 2.800: 0.065, 2.900: 0.746 }; + compObject("Ytorrentiel", res["tor"], t, 0.03); + + let x = [0.000, 0.100, 0.200, 0.300, 0.400, 0.500, 0.600, 0.700, 0.800, 0.900, 1.000, 1.100, 1.200, 1.300, 1.400, 1.500, 1.600, 1.700, 1.800, 1.900, 2.000, 2.100, 2.200, 2.300, 2.400, 2.500, 2.600, 2.700, 2.800, 2.900, 3.000, 3.100, 3.200, 3.300, 3.400, 3.500, 3.600, 3.700, 3.800, 3.900, 4.000, 4.100, 4.200, 4.300, 4.400, 4.500, 4.600, 4.700, 4.800, 4.900, 5.000]; + compArray("abscisses", res["trX"], x); + + let expLog = new cLog(); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = 2.5; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = 0.403; + expLog.add(m); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = 0.953; + expLog.add(m); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = 0.1; + m.extraVar["xmax"] = 2.9; + expLog.add(m); + }); */ }); }); diff --git a/spec/remous_trapez.spec.ts b/spec/remous_trapez.spec.ts index bddd8d011b62c3daa45517d364b3f239faaca6ea..9a0ea48457cf9bdfa53fa7955c5d0d23ad2b3595 100644 --- a/spec/remous_trapez.spec.ts +++ b/spec/remous_trapez.spec.ts @@ -2,6 +2,7 @@ import { ParamsSectionTrapez, cSnTrapez } from "../src/section/section_trapez"; import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; import { precDigits, precDist, equalEpsilon } from "./nubtest"; import { round } from "../src/base"; +import { cLog } from "../src/util/log"; function compObject(s: string, arr1: { [key: number]: number }, arr2: { [key: number]: number }) { expect(Object.keys(arr1).length).toEqual(Object.keys(arr2).length, s + ": longueur incorrecte"); @@ -48,7 +49,8 @@ xdescribe('Class Remous / section trapèze :', () => { MethodeResolution.Trapezes ); - let rem = new CourbeRemous(sect, prem); + let log = new cLog(); + let rem = new CourbeRemous(sect, prem, log); let res = rem.calculRemous(undefined); diff --git a/src/error_messages.en.json b/src/error_messages.en.json index aa3bdda4afcdd46a8dc761578e9200a6b18aea39..e5306844dce4077bf5bc8d366694e59c4959704c 100644 --- a/src/error_messages.en.json +++ b/src/error_messages.en.json @@ -16,5 +16,16 @@ "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%' : non supported '%domain%' definition domain", "ERROR_INTERVAL_UNDEF": "Interval : invalid 'undefined' value", "ERROR_INTERVAL_OUTSIDE": "Interval : value %value% is outside of %interval", - "ERROR_LANG_UNSUPPORTED": "internationalisation : unsupported '%locale%' locale" + "ERROR_LANG_UNSUPPORTED": "internationalisation : unsupported '%locale%' locale", + "ERROR_REMOUS_ARRET_CRITIQUE": "Calculation stopped: critical elevation reached at abscissa %x%", + "ERROR_REMOUS_CALCUL_FLUVIAL": "Downstream boundary condition >= Critical elevation : calculation of subcritical part from downstream", + "ERROR_REMOUS_CALCUL_TORRENTIEL": "Uptream boundary condition <= Critical elevation : calculation of supercritical part from upstream", + "ERROR_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m", + "ERROR_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m", + "ERROR_REMOUS_H_CRITIQUE": "Width at embankment level = %Yc% m", + "ERROR_REMOUS_H_NORMALE": "Normal water level = %Yn% m", + "ERROR_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin and %xmax m", + "ERROR_REMOUS_PENTE_FORTE": "The water line slope is too steep at abscissa %x m (the discretisation step should be reduced)", + "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Downstream boundary condition < Critical elevation : no possible calculation from downstream", + "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Upstream boundary condition < Critical elevation : no possible calculation from upstream" } \ No newline at end of file diff --git a/src/error_messages.fr.json b/src/error_messages.fr.json index 406d9f4371fbe96dbc22f77b21d3c6d3ea350252..f1f6878f3d0590389e707d1ea799e25c163c0897 100644 --- a/src/error_messages.fr.json +++ b/src/error_messages.fr.json @@ -16,5 +16,16 @@ "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%' : le domaine de définition '%domain%' est incorrect", "ERROR_INTERVAL_UNDEF": "Interval : valeur 'undefined' incorrecte", "ERROR_INTERVAL_OUTSIDE": "Interval : la valeur %value% est hors de l'intervalle %interval", - "ERROR_LANG_UNSUPPORTED": "internationalisation : locale '%locale%' non prise en charge" + "ERROR_LANG_UNSUPPORTED": "Internationalisation : locale '%locale%' non prise en charge", + "ERROR_REMOUS_ARRET_CRITIQUE": "Arrêt du calcul : hauteur critique atteinte à l'abscisse %x%", + "ERROR_REMOUS_CALCUL_FLUVIAL": "Condition limite aval >= Hauteur critique: calcul de la partie fluviale à partir de l'aval", + "ERROR_REMOUS_CALCUL_TORRENTIEL": "Condition limite amont <= Hauteur critique: calcul de la partie torrentielle à partir de l'amont", + "ERROR_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m", + "ERROR_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m", + "ERROR_REMOUS_H_CRITIQUE": "Tirant d'eau critique = %Yc% m", + "ERROR_REMOUS_H_NORMALE": "Tirant d'eau normal = %Yn% m", + "ERROR_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin et %xmax m", + "ERROR_REMOUS_PENTE_FORTE": "La pente de la ligne d'eau est trop forte à l'abscisse %x m (il faudrait réduire le pas de discrétisation)", + "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Condition limite aval < Hauteur critique: pas de calcul possible depuis l'aval", + "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Condition limite amont > Hauteur critique : pas de calcul possible depuis l'amont" } \ No newline at end of file diff --git a/src/remous.ts b/src/remous.ts index 1c40b2609a53f6ba0ddeb6da7c3a5f23ee8deb43..904edd0e41d4bcc159a9bcaf344325b23ae431c2 100644 --- a/src/remous.ts +++ b/src/remous.ts @@ -4,7 +4,7 @@ import { IParamsEquation, ParamDefinition, ParamCalculability, ComputeNodeType, import { Dichotomie } from "./dichotomie"; import { Nub } from "./nub"; import { ErrorCode, ErrorMessage } from "./util/error"; -import { } from "./util/"; +import { cLog } from "./util/log"; export enum MethodeResolution { Trapezes, EulerExplicite, RungeKutta4 @@ -74,6 +74,8 @@ export class CourbeRemous extends Nub { // public $oSect; /// Section du bief // private $oLog; /// Journal de calcul + private _log: cLog; + /** * Pas de discrétisation de l'espace (positif en partant de l'aval, négatif en partant de l'amont) */ @@ -88,14 +90,9 @@ export class CourbeRemous extends Nub { //private HautCritique: number; // Yc de la section - /** - * dernière erreur rencontrée - */ - private _lastError: Result; - - // constructor(s: acSection, crp: CourbeRemousParams, log: cLog) { - constructor(s: acSection, crp: CourbeRemousParams) { + constructor(s: acSection, crp: CourbeRemousParams, log: cLog) { super(s.prms, false); + this._log = log; this.Sn = s; this.prmSect = s.prms; this.prmCR = crp; @@ -119,10 +116,6 @@ export class CourbeRemous extends Nub { throw "CourbeRemous.Equation() : paramètre " + sVarCalc + " non pris en charge"; } - public get lastError() { - return this._lastError; - } - /** * Calcul de dy/dx (utilisé par Euler explicite et Runge-Kutta 4) * @param Y Tirant d'eau initial @@ -278,29 +271,13 @@ export class CourbeRemous extends Nub { return res; } - // private maxKey(o: { [key: number]: any }): number { - // let res: number = - 1e+9; - - // for (let i in o) { - // let v: number = +i; - // if (v > res) - // res = v; - // } - - // return res; - // } - /** * Calcul d'une courbe de remous en fluvial ou torrentiel * @param YCL Condition limite amont (torrentiel) ou aval (fluvial) */ private calcul(YCL: number): { [key: number]: number } { - // $trY = array(); let trY: { [key: number]: number; } = {}; - //let n = -1; - // let m: Map<number, number>; - // if ($this ->rDx > 0) { if (this.Dx > 0) { // Calcul depuis l'aval var Deb: number = this.prmSect.Long.v; @@ -311,42 +288,38 @@ export class CourbeRemous extends Nub { Deb = 0; Fin = this.prmSect.Long.v; } - // $dx = - $this ->rDx; let dx = - this.Dx; - // spip_log($this, 'hydraulic', _LOG_DEBUG); - - // $trY[sprintf('%1.'.round($this ->oP ->iPrec).'f', $xDeb)] = (real)$rYCL; let lastY = YCL; trY[round(Deb, this.prmSect.iPrec.v)] = lastY; - //n++; // Boucle de calcul de la courbe de remous - // for ($x = $xDeb + $dx; ($dx > 0 && $x <= $xFin) || ($dx < 0 && $x >= $xFin); $x += $dx) { for (let x = Deb + dx; (dx > 0 && x <= Fin) || (dx < 0 && x >= Fin); x += dx) { - // $rY = (real)$this->Calc_Y(end($trY), $sResolution); - // this.debug("lastY", lastY); + this.debug("lastY " + lastY); let rY: Result = this.Calc_Y(lastY); - // this.debug("calcul : x " + x + " y " + rY.vCalc); + this.debug("calcul : x " + x + " y " + rY.vCalc); // this.debug("trY "); // this.logObject(trY); // this.debug("end trY " + this.last(trY)); - // this.debug("Yn " + this.Sn.HautNormale); + this.debug("Yn " + this.Sn.HautNormale); - // if ($rY) { if (rY.code == ErrorCode.ERROR_OK) { - // if (end($trY) > $this ->oSect ->rHautNormale xor $rY > $this ->oSect ->rHautNormale) { - if (XOR(lastY > this.Sn.HautNormale, rY.vCalc > this.Sn.HautNormale)) { - // $this ->oLog ->Add(_T('hydraulic:pente_forte').' '.$x. ' m ('._T('hydraulic:reduire_pas').')', true); + // on vérifie qu'on ne traverse pas la hauteur normale (à la précision de calcul près) + let b1: boolean = lastY - this.Sn.HautNormale > this._prms.rPrec; + let b2: boolean = rY.vCalc - this.Sn.HautNormale > this._prms.rPrec; + if (XOR(b1, b2)) { this.debug("La pente de la ligne d'eau est trop forte à l'abscisse " + x + " m (Il faudrait réduire le pas de discrétisation)"); + + let m: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + m.extraVar["x"] = x; + this._log.add(m); } - // $trY[sprintf('%1.'.round($this ->oP ->iPrec).'f', $x)] = $rY; trY[round(x, this.prmSect.iPrec.v)] = rY.vCalc; - // n++; } else { - // $this ->oLog ->Add(_T('hydraulic:arret_calcul').' '.$x. ' m'); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE); + m.extraVar["x"] = x; + this._log.add(m); this.debug("Arrêt du calcul : Hauteur critique atteinte à l'abscisse " + x + " m"); - this._lastError = rY; break; } lastY = rY.vCalc; @@ -375,68 +348,59 @@ export class CourbeRemous extends Nub { "trX": string[], "tRes": number[] } { - // $this ->creer_section_param(); - - // On transforme les champs du tableau des données du formulaire en variables - // extract($this ->data, EXTR_OVERWRITE | EXTR_REFS); - - // include_spip('hyd_inc/courbe_remous'); + let Yc: number = this.Sn.Calc("Yc"); - // $oLog = &$this ->oLog; + let m: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = this.Sn.Calc("B"); + this._log.add(m); - this._lastError = undefined; + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m.extraVar["Yc"] = Yc; + this._log.add(m); - // // On calcule les données pour créer un cache et afficher le résultat - // $this ->oLog ->Add(_T('hydraulic:largeur_berge').' = '.format_nombre($this ->oSn ->rLargeurBerge, $this ->oP ->iPrec).' m'); - // $this ->oLog ->Add(_T('hydraulic:h_critique').' = '.format_nombre($this ->oSn ->CalcGeo('Yc'), $this ->oP ->iPrec).' m'); - // $this ->oLog ->Add(_T('hydraulic:h_normale').' = '.format_nombre($this ->oSn ->CalcGeo('Yn'), $this ->oP ->iPrec).' m'); + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = this.Sn.Calc("Yn"); + this._log.add(m); - let Yc: number = this.Sn.Calc("Yc"); this.debug("largeur berge " + this.Sn.Calc("B")); this.debug("hauteur critique " + Yc); this.Sn.HautNormale = this.Sn.Calc("Yn"); this.debug("hauteur normale " + this.Sn.HautNormale); // Calcul des courbes de remous - // $aC = array(); // deux items (Flu et Tor) composé d'un vecteur avec key=X et value=Y let crbFlu: { [key: number]: number; } = undefined; let crbTor: { [key: number]: number; } = undefined; //this.debug("HautCritique ", this.Sn.HautCritique); // Calcul depuis l'aval - // if ($this ->oSn ->rHautCritique <= $rYaval) { if (this.Sn.HautCritique <= this.prmCR.Yaval.v) { - // $this ->oLog ->Add(_T('hydraulic:calcul_fluvial')); + this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + this.debug("Condition limite aval (" + this.prmCR.Yaval.v + ") >= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie fluviale à partir de l'aval"); - // $oCRF = new cCourbeRemous($this ->oLog, $this ->oP, $this ->oSn, $rDx); - // $aC['Flu'] = $oCRF ->calcul($rYaval, $rLong, $Methode); this.Dx = this.prmSect.Dx.v; crbFlu = this.calcul(this.prmCR.Yaval.v); } else { - // $this ->oLog ->Add(_T('hydraulic:pas_calcul_depuis_aval'), true); this.debug("Condition limite aval (" + this.prmCR.Yaval.v + ") < Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'aval"); + this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); } this.debug("flu "); this.logObject(crbFlu); // Calcul depuis l'amont - // if ($this ->oSn ->rHautCritique >= $rYamont) { if (this.Sn.HautCritique >= this.prmCR.Yamont.v) { - // $this ->oLog ->Add(_T('hydraulic:calcul_torrentiel')); + this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + this.debug("Condition limite amont (" + this.prmCR.Yamont.v + ") <= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie torrentielle à partir de l'amont"); - // $oCRT = new cCourbeRemous($this ->oLog, $this ->oP, $this ->oSn, -$rDx); - // $aC['Tor'] = $oCRT ->calcul($rYamont, $rLong, $Methode); this.Dx = -this.prmSect.Dx.v; crbTor = this.calcul(this.prmCR.Yamont.v); } else { - // $this ->oLog ->Add(_T('hydraulic:pas_calcul_depuis_amont'), true); + this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); this.debug("Condition limite amont (" + this.prmCR.Yamont.v + ") > Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'amont"); } - // spip_log($aC, 'hydraulic', _LOG_DEBUG); this.debug("tor"); this.logObject(crbTor); @@ -444,11 +408,7 @@ export class CourbeRemous extends Nub { // Détection du ressaut hydraulique let nFlu: number = this.size(crbFlu); let nTor: number = this.size(crbTor); - // $bDetectRessaut = true; - // if ($bDetectRessaut && isset($aC['Flu']) && isset($aC['Tor'])) { - // if (crbFlu != undefined && crbTor != undefined) { if (nFlu != 0 && nTor != 0) { - // if (count($aC['Flu']) > count($aC['Tor']) || (count($aC['Flu']) == count($aC['Tor']) && $this ->oSn ->Calc('Imp', end($aC['Flu'])) > $this ->oSn ->Calc('Imp', end($aC['Tor'])))) { let xMaxFlu = crbFlu[0]; let xMaxTor = this.last(crbTor); // this.debug("end flu " + xMaxFlu); @@ -460,12 +420,9 @@ export class CourbeRemous extends Nub { // if (nFlu > nTor || (nFlu == nTor && this.Sn.Calc('Imp', this.last(crbFlu)) > this.Sn.Calc('Imp', this.last(crbTor)))) { if (nFlu > nTor || (nFlu == nTor && this.Sn.Calc('Imp', xMaxFlu) > this.Sn.Calc('Imp', xMaxTor))) { // La courbe fluviale va jusqu'au bout - // $sCC = 'Flu'; var crbComplete = crbFlu; // courbe calculée sur tout le bief - // $sCN = 'Tor'; var crbPartielle = crbTor; // courbe calculée sur une partie seulement du bief var iSens = 1; // On cherche l'aval du ressaut - //$sSens = _T('hydraulic:amont'); var sSens = "amont"; this.debug("complete=flu, partielle=tor"); // this.debug("complete(flu)"); @@ -474,12 +431,9 @@ export class CourbeRemous extends Nub { // this.debug(crbPartielle); } else { // La courbe torrentielle va jusqu'au bout - // $sCC = 'Tor'; crbComplete = crbTor; - // $sCN = 'Flu'; crbPartielle = crbFlu; iSens = -1; // On cherche l'amont du ressaut - // $sSens = _T('hydraulic:aval'); sSens = "aval"; this.debug("complete=tor, partielle=flu"); // this.debug("complete(tor)"); @@ -488,7 +442,7 @@ export class CourbeRemous extends Nub { // this.debug(crbPartielle); } - // $trX = array_reverse(array_keys($aC[$sCN])); // Parcours des sections de la ligne d'eau la plus courte + // Parcours des sections de la ligne d'eau la plus courte let trX: string[] = Object.keys(crbPartielle); if (iSens == -1) trX.sort((a, b) => { @@ -511,66 +465,51 @@ export class CourbeRemous extends Nub { let bRessaut = false; let Dx = this.prmSect.Dx.v; - // foreach($trX as $rX) { - // for (let irX in trX) { - // for (let irX = 0; irX < trX.length - 1; irX++) { for (let irX = 0; irX < trX.length; irX++) { let rX: number = +trX[irX]; // this.debug("irX=" + irX); // this.debug("rX=" + rX); // this.debug("partielle[" + rX + "]=" + crbPartielle[rX]); + // Calcul de l'abscisse de la section dans l'autre régime - // $Yco = $this ->oSn ->Calc('Yco', $aC[$sCN][$rX]); // Y conjugué let Yco = this.Sn.Calc('Yco', crbPartielle[rX]); // Y conjugué this.debug("rX=" + rX + " Yco(Ypartiel=" + crbPartielle[rX] + ")=" + Yco); - // $rLongRst = 5 * abs($aC[$sCN][$rX] - $Yco); // Longueur du ressaut let rLongRst = 5 * Math.abs(crbPartielle[rX] - Yco); // Longueur du ressaut this.debug("longueur ressaut=" + rLongRst); - // $xRst = $rX + round($iSens * $rLongRst / $rDx) * $rDx; // Abscisse où comparer Yconj et Y let xRst = rX + Math.round(iSens * rLongRst / Dx) * Dx; // Abscisse où comparer Yconj et Y + this.debug("xRst=" + xRst); //let rxRst = rX + iSens * rLongRst; // Abscisse réelle du ressaut //this.debug("xRst reel=" + (rX + iSens * rLongRst)); - // $xRst = sprintf('%1.'.round($this ->oP ->iPrec).'f', $xRst); xRst = round(xRst, this.prmSect.iPrec.v); + this.debug("xRst (arr)=" + xRst); - this.debug("xRst=" + xRst); - - //spip_log("\nrX=$rX xRst=$xRst Yco=$Yco",'hydraulic',_LOG_DEBUG); - // if (isset($aC[$sCC][$xRst])) { if (crbComplete[xRst] != undefined) { // Hauteur décalée de la longueur du ressaut (il faut gérer la pente du fond) - // $Ydec = $aC[$sCC][$xRst] + $rLongRst * $this ->oP ->rIf * $iSens; let Ydec: number = crbComplete[xRst] + rLongRst * this.prmSect.If.v * iSens; this.debug("Ydec=" + Ydec); this.debug("imp(Ycomplet[xRst=" + xRst + "]=" + crbComplete[xRst] + ")=" + this.Sn.Calc('Imp', crbComplete[xRst])); this.debug("imp(Ypartiel[rX=" + rX + "]=" + crbPartielle[rX] + ")=" + this.Sn.Calc('Imp', crbPartielle[rX])); - // spip_log("\nrX=$rX xRst=$xRst Yco=$Yco Ydec=$Ydec", 'hydraulic', _LOG_DEBUG); - // if (($Yco - $Ydec) > 0) { // if (iSens == 1 ? Yco > Ydec : Yco < Ydec) { if (Yco > Ydec) { - // $this ->oLog ->Add(_T('hydraulic:ressaut_hydrau', array('Xmin'=>min($rX, $xRst), 'Xmax'=>max($rX, $xRst)))); this.debug("Ressaut hydraulique détecté entre les abscisses " + Math.min(rX, xRst) + " et " + Math.max(rX, xRst)); - // spip_log("rX=$rX xRst=$xRst", 'hydraulic', _LOG_DEBUG); + m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m.extraVar["xmin"] = Math.min(rX, xRst); + m.extraVar["xmax"] = Math.max(rX, xRst); + this._log.add(m); // this.debug("rX=" + rX + " xRst=" + xRst); + // Modification de la ligne d'eau CC - // foreach(array_keys($aC[$sCN]) as $rXCC) { - // for (let pi in crbPartielle) { - // for (let pi in trXr) { for (let pi of trXr) { let rXCC: number = +pi; // this.debug("rXCC=" + rXCC); - // if ($iSens * ($rXCC - $rX) < 0) { if (iSens * (rXCC - rX) < 0) { - // unset($aC[$sCC][$rXCC]); delete crbComplete[rXCC]; this.debug("Modification de la ligne d'eau complète : suppression de la valeur à rX=" + rXCC); - // } elseif($rXCC == $rX) { } else if (rXCC == rX) { - // $aC[$sCC][$rXCC] = $aC[$sCN][$rXCC]; this.debug("Modification de la ligne d'eau complète : valeur " + crbComplete[rXCC] + " remplacée par " + crbPartielle[rXCC] + " à rX=" + rXCC); crbComplete[rXCC] = crbPartielle[rXCC]; this.debug("Fin de la modification de la ligne d'eau complète"); @@ -579,18 +518,13 @@ export class CourbeRemous extends Nub { } // Modification de la ligne d'eau CN - // foreach($trX as $rXCN) { for (let xcn of trX) { let rXCN = +xcn; // this.debug("rXCN=" + rXCN); - // if ($iSens * ($rXCN - $xRst) > 0) { if (iSens * (rXCN - xRst) > 0) { - // unset($aC[$sCN][$rXCN]); this.debug("Modification de la ligne d'eau partielle : suppression de la valeur à rX=" + rXCN); delete crbPartielle[rXCN]; - // } elseif($rXCN == $xRst) { } else if (rXCN == xRst) { - // $aC[$sCN][$rXCN] = $aC[$sCC][$rXCN]; this.debug("Modification de la ligne d'eau partielle : valeur " + crbPartielle[rXCN] + " remplacée par " + crbComplete[rXCN] + " à rX=" + rXCN); crbPartielle[rXCN] = crbComplete[rXCN]; this.debug("Fin de la modification de la ligne d'eau partielle"); @@ -604,14 +538,17 @@ export class CourbeRemous extends Nub { } if (!bRessaut) { // Le ressaut est en dehors du canal - // $this ->oLog ->Add(_T('hydraulic:ressaut_dehors', array('Sens' => $sSens, 'X' => end($trX)))); + let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m.extraVar["sens"] = sSens; + m.extraVar["x"] = +this.last(trX); + this._log.add(m); + this.debug("Ressaut hydraulique détecté à l'" + sSens + " de l'abscisse " + this.last(trX)); - // $aC[$sCN] = array(); if (iSens == 1) crbTor = {}; else crbFlu = {}; - crbPartielle = {}; // pour le log uniquement, à virer + //crbPartielle = {}; // pour le log uniquement, à virer } } @@ -621,22 +558,15 @@ export class CourbeRemous extends Nub { this.logObject(crbPartielle); // Définition des abscisses - // $trX = array(); let trX: string[] = []; - // if (isset($aC['Flu'])) $trX = array_merge($trX, array_keys($aC['Flu'])); - // if (crbFlu != undefined) if (nFlu != 0) trX = Object.keys(crbFlu); - // if (isset($aC['Tor'])) $trX = array_merge($trX, array_keys($aC['Tor'])); - // if (crbTor != undefined) if (nTor != 0) trX = trX.concat(Object.keys(crbTor)); // this.debug("trX=" + trX); - // $trX = array_unique($trX, SORT_NUMERIC); - // sort($trX, SORT_NUMERIC); trX.sort((a, b) => { if (+a > +b) return 1; if (+a < +b) return -1; @@ -651,53 +581,24 @@ export class CourbeRemous extends Nub { // this.debug("trX unique=" + trX); // Calcul de la variable à calculer - // $this ->data['ValCal'] = $val_a_cal; - // $tRes = array(); let tRes: number[] = []; - // if ($val_a_cal != 'none') { - // if (val_a_cal != undefined && crbFlu != undefined && crbTor != undefined) { if (val_a_cal != undefined && nFlu != 0 && nTor != 0) { - // foreach($trX as $rX) { for (let rX of trX) { - // $rY = false; let rY = undefined; - // if (isset($aC['Flu'][$rX]) && !isset($aC['Tor'][$rX])) { if (crbFlu[+rX] != undefined && crbTor[+rX] == undefined) { - // $rY = $aC['Flu'][$rX]; rY = crbFlu[+rX]; } - // if (isset($aC['Tor'][$rX])) { if (crbTor[+rX] != undefined) { - // if (!isset($aC['Flu'][$rX]) || (isset($aC['Flu'][$rX]) && $aC['Flu'][$rX] == $aC['Tor'][$rX])) { if (crbFlu[+rX] == undefined || (crbFlu[+rX] != undefined && crbFlu[+rX] == crbTor[+rX])) { - // $rY = $aC['Tor'][$rX]; rY = crbTor[+rX]; } - // if ($rY !== false) { if (rY != undefined) - // if (!in_array($val_a_cal, array('Yn', 'Yc', 'Hsc'))) { - // $tRes[$rX] = $this ->oSn ->Calc($val_a_cal, $rY); - // } - // else { - // $tRes[$rX] = $this ->oSn ->CalcGeo($val_a_cal, $rY); - // } - // } tRes[+rX] = this.Sn.Calc(val_a_cal, rY); } } - - /* - return array_merge( - $aC, - array( - 'trX' => $trX, - 'tRes' => $tRes - ) - ); - /* */ } return { "flu": crbFlu, "tor": crbTor, "trX": trX, "tRes": tRes }; diff --git a/src/section/hauteur.ts b/src/section/hauteur.ts index 49e048d9dc6c060754f9b2caf749d6c27dbb61d6..63d181c1dd7b170645fbee4bc5a8a73bafb2af3b 100644 --- a/src/section/hauteur.ts +++ b/src/section/hauteur.ts @@ -1,7 +1,6 @@ import { Debug } from "../base" import { acSection, cParamsCanal } from "./section_type"; import { acNewton } from "./newton"; -import { cLog } from "./log"; /** * Calcul de la hauteur critique diff --git a/src/section/log.ts b/src/section/log.ts deleted file mode 100644 index abaf9c7fece0f6b0504af135f5df751a37e01e85..0000000000000000000000000000000000000000 --- a/src/section/log.ts +++ /dev/null @@ -1,23 +0,0 @@ - -export class cLog { - - public txt: string; - - constructor() { - this.txt = ''; - } - - Add(sTxt: string, bErr = false) { - // peut on mettre des balises ? - this.txt += '<li'; - if (bErr) { this.txt += ' class="hyd_erreur"'; } - this.txt += '>' + sTxt + '</li>'; - } - Result() { - if (this.txt != '') { - return this.txt; - } else { - return ''; - } - } -} \ No newline at end of file diff --git a/src/section/newton.ts b/src/section/newton.ts index 7ae0e1349e928652abc4fa3f55d1cbee35ebc40b..fd1d0813fa987e3a574850afef5dfde872fa5ecd 100644 --- a/src/section/newton.ts +++ b/src/section/newton.ts @@ -1,6 +1,5 @@ import { XOR, Debug } from "../base" import { cParamsCanal } from "./section_type" -import { cLog } from "./log"; export abstract class acNewton extends Debug { protected rTol: number; diff --git a/src/section/section_circulaire.ts b/src/section/section_circulaire.ts index f3ca8dba3603d5c4bd163c04d51233ec439ef3c9..908e5bbb254a9b6116487a41182c971886f9a578 100644 --- a/src/section/section_circulaire.ts +++ b/src/section/section_circulaire.ts @@ -1,6 +1,6 @@ import { ComputeNodeType, ParamDefinition, ParamDomainValue, ParamCalculability } from "../param"; import { acSection, ParamsSection } from "./section_type"; -import { cLog } from "./log"; +import { cLog } from "../util/log"; import { ErrorMessage, ErrorCode } from '../util/error'; export class ParamsSectionCirc extends ParamsSection { diff --git a/src/section/section_puissance.ts b/src/section/section_puissance.ts index 5c8cf3dc52cad8f2bea0bcdb3dec591dab56ea1a..2398aac1a243f82f137676af0090d6892aa5f55d 100644 --- a/src/section/section_puissance.ts +++ b/src/section/section_puissance.ts @@ -1,6 +1,6 @@ import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability } from "../param"; import { acSection, ParamsSection } from "./section_type"; -import { cLog } from "./log"; +import { cLog } from "../util/log"; /** * Paramètres de la section parabolique ou "puissance" diff --git a/src/section/section_rectang.ts b/src/section/section_rectang.ts index e77aa31e2aedf7e7f5aaf586396aec51c101ebb1..683c0cc19220401abb06c4be247105226f6507c8 100644 --- a/src/section/section_rectang.ts +++ b/src/section/section_rectang.ts @@ -1,6 +1,6 @@ import { acSection, ParamsSection } from "./section_type"; import { ComputeNodeType } from "../param"; -import { cLog } from "./log"; +import { cLog } from "../util/log"; export class ParamsSectionRectang extends ParamsSection { constructor(rY: number, rLargeurFond: number, rKs: number, rQ: number, rIf: number, rPrec: number, rYB: number, diff --git a/src/section/section_trapez.ts b/src/section/section_trapez.ts index 04a4b6d176189185fd669a9f16bfb3a7ab29d086..3335a7056cfc5eec9e15afe33838be36573bf327 100644 --- a/src/section/section_trapez.ts +++ b/src/section/section_trapez.ts @@ -1,6 +1,6 @@ import { ComputeNodeType, ParamDefinition, ParamDomainValue, ParamCalculability } from "../param"; import { acSection, ParamsSection } from "./section_type"; -import { cLog } from "./log"; +import { cLog } from "../util/log"; export class ParamsSectionTrapez extends ParamsSection { diff --git a/src/section/section_type.ts b/src/section/section_type.ts index d71bdc7b43dc47ef6e0049aabf041a7e13e8105b..313002f8b22ef954348039b9522ab79e79a70c91 100644 --- a/src/section/section_type.ts +++ b/src/section/section_type.ts @@ -1,5 +1,5 @@ import { XOR } from "../base"; -import { cLog } from "./log"; +import { cLog } from "../util/log"; import { ComputeNodeType, ComputeNode, ParamDefinition, ParamDomainValue, ParamCalculability, IParamsEquation } from "../param"; import { cHautCritique, cHautNormale, cHautCorrespondante, cHautConjuguee } from "./hauteur"; diff --git a/src/util/error.ts b/src/util/error.ts index 4ef9c2fdd1e1d31535b51eefe0cd2690284a919d..04dc132a35821b7bcfbcdb36af269ca95be3a023 100644 --- a/src/util/error.ts +++ b/src/util/error.ts @@ -104,9 +104,59 @@ export enum ErrorCode { ERROR_LANG_UNSUPPORTED = -400, /** - * courbes de remous : arret du calcul car hauteur critique atteinte + * courbes de remous : Arrêt du calcul : hauteur critique atteinte à l'abscisse x */ ERROR_REMOUS_ARRET_CRITIQUE = -500, + + /** + * courbe de remous : Condition limite aval >= Hauteur critique : calcul de la partie fluviale à partir de l'aval + */ + ERROR_REMOUS_CALCUL_FLUVIAL = -501, + + /** + * courbe de remous : Condition limite amont <= Hauteur critique : calcul de la partie torrentielle à partir de l'amont + */ + ERROR_REMOUS_CALCUL_TORRENTIEL = -502, + + /** + * courbe de remous : ressaut hydraulique détecté à l'amont/aval de l'abscisse x + */ + ERROR_REMOUS_RESSAUT_DEHORS = -503, + + /** + * courbe de remous : Largeur au niveau des berges + */ + ERROR_REMOUS_LARGEUR_BERGE = -504, + + /** + * courbe de remous : Tirant d'eau critique + */ + ERROR_REMOUS_H_CRITIQUE = -505, + + /** + * courbe de remous : Tirant d'eau normal + */ + ERROR_REMOUS_H_NORMALE = -506, + + /** + * courbe de remous : Ressaut hydraulique détecté entre les abscisses Xmin et Xmax m + */ + ERROR_REMOUS_RESSAUT_HYDRO = -507, + + /** + * courbe de remous : La pente de la ligne d'eau est trop forte à l'abscisse x m + */ + ERROR_REMOUS_PENTE_FORTE = -508, + + /** + * courbe de remous : Condition limite aval < Hauteur critique : pas de calcul possible depuis l'aval + */ + ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL = -509, + + /** + * courbe de remous : Condition limite amont > Hauteur critique : pas de calcul possible depuis l'amont + */ + ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT = -510, } /** diff --git a/src/util/log.ts b/src/util/log.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6b22b6b358e1440255a751e53ef3732342cdb63 --- /dev/null +++ b/src/util/log.ts @@ -0,0 +1,13 @@ +import { ErrorMessage } from "./error"; + +export class cLog { + private _messages: ErrorMessage[] = []; + + public add(m: ErrorMessage) { + this._messages.push(m); + } + + public get messages() { + return this._messages; + } +} \ No newline at end of file