diff --git a/spec/nubtest.ts b/spec/nubtest.ts index bb097e4a1f06d8c6496d8f397ee418eab38ff5e8..a66ab943daeab33810c4261c361128223e0ec8b1 100644 --- a/spec/nubtest.ts +++ b/spec/nubtest.ts @@ -69,11 +69,57 @@ export function equalEpsilon(val1: number, val2: number, epsilon: number = precD return Math.abs(val1 - val2) < epsilon; } +/** + * compare 2 objets + * @param s message + * @param objTest objet à tester + * @param objValid objet de référence + * @param epsilon tolérance pour les comparaisons de nombres + */ +export function compareObject(s: string, objTest: { [key: number]: number }, objValid: { [key: number]: number }, epsilon: number) { + let n1 = Object.keys(objTest).length; + let n2 = Object.keys(objValid).length; + let b: boolean = n1 == n2; + expect(b).toBeTruthy(s + ": longueur incorrecte " + n1 + ", devrait etre " + n2); + if (!b) return; + + for (let i = 0; i < n1; i++) { + let v1: number = objTest[+Object.keys(objTest)[i]]; + let v2: number = objValid[+Object.keys(objValid)[i]]; + b = equalEpsilon(v1, v2, epsilon); + expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2); + if (!b) return; + } +} + +/** + * compare 2 tableaux + * @param s message + * @param arrTest tableau à tester + * @param arrValid tableau de référence + */ +export function compareArray(s: string, arrTest: string[], arrValid: number[]) { + let n1 = arrTest.length; + let n2 = arrValid.length; + let b: boolean = n1 == n2; + expect(b).toBeTruthy(s + ": longueur incorrecte " + n1 + ", devrait etre " + n2); + if (!b) return; + + for (let i = 0; i < arrTest.length; i++) { + let v1: number = +arrTest[i]; + let v2: number = arrValid[i]; + b = equalEpsilon(v1, v2); + expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2); + if (!b) return; + } +} + /** * compare 2 journaux */ export function compareLog(logTest: cLog, logValid: cLog) { //console.log(JSON.stringify(logTest)); + // console.log("journal :\n" + logTest.toString()); // taille diff --git a/spec/remous_rect.spec.ts b/spec/remous_rect.spec.ts deleted file mode 100644 index 3a616e8c80db0a40fccd7191e398bd6147c6a5fc..0000000000000000000000000000000000000000 --- a/spec/remous_rect.spec.ts +++ /dev/null @@ -1,1187 +0,0 @@ -import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; -import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; -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 - * @param s message - * @param objTest objet à tester - * @param objValid objet de référence - * @param epsilon tolérance pour les comparaisons de nombres - */ -function compObject(s: string, objTest: { [key: number]: number }, objValid: { [key: number]: number }, epsilon: number) { - let n1 = Object.keys(objTest).length; - let n2 = Object.keys(objValid).length; - let b: boolean = n1 == n2; - expect(b).toBeTruthy(s + ": longueur incorrecte " + n1 + ", devrait etre " + n2); - if (!b) return; - - for (let i = 0; i < n1; i++) { - let v1: number = objTest[+Object.keys(objTest)[i]]; - let v2: number = objValid[+Object.keys(objValid)[i]]; - b = equalEpsilon(v1, v2, epsilon); - expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2); - if (!b) return; - } -} - -/** - * compare 2 tableaux - * @param s message - * @param arrTest tableau à tester - * @param arrValid tableau de référence - */ -function compArray(s: string, arrTest: string[], arrValid: number[]) { - let n1 = arrTest.length; - let n2 = arrValid.length; - let b: boolean = n1 == n2; - expect(b).toBeTruthy(s + ": longueur incorrecte " + n1 + ", devrait etre " + n2); - if (!b) return; - - for (let i = 0; i < arrTest.length; i++) { - let v1: number = +arrTest[i]; - let v2: number = arrValid[i]; - b = equalEpsilon(v1, v2); - expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2); - if (!b) return; - } -} - -describe('Class Remous / section rectangulaire :', () => { - describe('méthode trapèzes :', () => { - it("forte pente, ressaut avant l'amont", () => { - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 6, // Yaval = tirant aval - MethodeResolution.Trapezes - ); - - 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 trapèzes - - let f = { 100.000: 6, 95.000: 5.75, 90.000: 5.5, 85.000: 5.25, 80.000: 4.999, 75.000: 4.749, 70.000: 4.499, 65.000: 4.249, 60.000: 3.998, 55.000: 3.748, 50.000: 3.498, 45.000: 3.248, 40.000: 2.997, 35.000: 2.747, 30.000: 2.497, 25.000: 2.246, 20.000: 1.995, 15.000: 1.744, 10.000: 1.491, 5.000: 1.237, 0.000: 0.977 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = {}; - 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("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", () => { - // TODO algo à reprendre - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 0.45, // Yaval = tirant aval - MethodeResolution.Trapezes - ); - - 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 trapèzes - - let f = {}; - compObject("Yfluvial", res["flu"], f, 0.03); - - // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 }; - let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 }; - 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("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", () => { - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 1, // Yaval = tirant aval - MethodeResolution.Trapezes - ); - - 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 trapèzes - - let f = { 100.000: 1, 95.000: 0.729 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.729 }; - 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("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", () => { - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 0.25, // Dx=Pas d'espace - 5.5 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 1, // Yaval = tirant aval - MethodeResolution.Trapezes - ); - - 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 trapèzes - - let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.933, 4.000: 0.92, 3.750: 0.906, 3.500: 0.893, 3.250: 0.88, 3.000: 0.866, 2.750: 0.853, 2.500: 0.839, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.784, 1.250: 0.77, 1.000: 0.756, 0.750: 0.742, 0.500: 0.727, 0.250: 0.712, 0.000: 0.15 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.15, 0.250: 0.153, 0.500: 0.156, 0.750: 0.158, 1.000: 0.161, 1.250: 0.163, 1.500: 0.166, 1.750: 0.168, 2.000: 0.17, 2.250: 0.173, 2.500: 0.175, 2.750: 0.177, 3.000: 0.18, 3.250: 0.182, 3.500: 0.184, 3.750: 0.906 }; - 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("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", () => { - 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 - 5, // Dx=Pas d'espace - 100 // 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.Trapezes - ); - - 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 trapèzes - - let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75, 0.000: 0.755 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = {}; - 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("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", () => { - 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 - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 0.403, // Yaval = tirant aval - MethodeResolution.Trapezes - ); - - 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 trapèzes - - let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75, 0.000: 0.15 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.15, 5.000: 0.75 }; - 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("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)", () => { - 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.25, // 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.Trapezes - ); - - 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 trapèzes - - // //dx = 0.05 - // let f = { 5.000: 0.403, 4.950: 0.414, 4.900: 0.419, 4.850: 0.423, 4.800: 0.426, 4.750: 0.429, 4.700: 0.432, 4.650: 0.434, 4.600: 0.436, 4.550: 0.438, 4.500: 0.439, 4.450: 0.441, 4.400: 0.443, 4.350: 0.445, 4.300: 0.446, 4.250: 0.447, 4.200: 0.449, 4.150: 0.45, 4.100: 0.451, 4.050: 0.452, 4.000: 0.454, 3.950: 0.455, 3.900: 0.456, 3.850: 0.457, 3.800: 0.458, 3.750: 0.46, 3.700: 0.461, 3.650: 0.462, 3.600: 0.463, 3.550: 0.465, 3.500: 0.466, 3.450: 0.467, 3.400: 0.468, 3.350: 0.469, 3.300: 0.469, 3.250: 0.47, 3.200: 0.471, 3.150: 0.471, 3.100: 0.472, 3.050: 0.472, 3.000: 0.473, 2.950: 0.474, 2.900: 0.474, 2.850: 0.475, 2.800: 0.476, 2.750: 0.476, 2.700: 0.477, 2.650: 0.477, 2.600: 0.478, 2.550: 0.479, 2.500: 0.479, 2.450: 0.48, 2.400: 0.48, 2.350: 0.481, 2.300: 0.482, 2.250: 0.482, 2.200: 0.483, 2.150: 0.483, 2.100: 0.484, 2.050: 0.485, 2.000: 0.485, 1.950: 0.486, 1.900: 0.486, 1.850: 0.487, 1.800: 0.488, 1.750: 0.488, 1.700: 0.489, 1.650: 0.49, 1.600: 0.49, 1.550: 0.491, 1.500: 0.491, 1.450: 0.492, 1.400: 0.493, 1.350: 0.493, 1.300: 0.494, 1.250: 0.494, 1.200: 0.495, 1.150: 0.496, 1.100: 0.496, 1.050: 0.497, 1.000: 0.497, 0.950: 0.498, 0.900: 0.499, 0.850: 0.499, 0.800: 0.5, 0.750: 0.501, 0.700: 0.501, 0.650: 0.502, 0.600: 0.502, 0.550: 0.503, 0.500: 0.504, 0.450: 0.504, 0.400: 0.505, 0.350: 0.505, 0.300: 0.506, 0.250: 0.507, 0.200: 0.507, 0.150: 0.508, 0.100: 0.508, 0.050: 0.509, 0.000: 0.01 }; - // compObject("Yfluvial", res["flu"], f, 0.03); - - // //let t = { 0.000: 0.01, 0.050: 0.011, 0.100: 0.013, 0.150: 0.015, 0.200: 0.016, 0.250: 0.018, 0.300: 0.019, 0.350: 0.02, 0.400: 0.021, 0.450: 0.022, 0.500: 0.022, 0.550: 0.023, 0.600: 0.024, 0.650: 0.025, 0.700: 0.026, 0.750: 0.026, 0.800: 0.027, 0.850: 0.028, 0.900: 0.031750000000000014, 0.95: 0.5042500000000006 }; // ok - // let t = { 0.000: 0.01, 0.050: 0.011, 0.100: 0.013, 0.150: 0.015, 0.200: 0.016, 0.250: 0.018, 0.300: 0.019, 0.350: 0.02, 0.400: 0.021, 0.450: 0.022, 0.500: 0.022, 0.550: 0.023, 0.600: 0.024, 0.650: 0.025, 0.700: 0.026, 0.750: 0.026, 0.800: 0.027, 0.850: 0.028, 0.900: 0.499 }; - // 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("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 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.01, 0.250: 0.022, 0.500: 0.027, 0.750: 0.033, 1.000: 0.501 }; - 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("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)", () => { - 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 - 0.0001, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 0.05, // 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.Trapezes - ); - - 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 trapèzes - - let f = { 5.0000: 0.403, 4.9500: 0.415, 4.9000: 0.42, 4.8500: 0.423, 4.8000: 0.426, 4.7500: 0.429, 4.7000: 0.432, 4.6500: 0.434, 4.6000: 0.436, 4.5500: 0.438, 4.5000: 0.44, 4.4500: 0.441, 4.4000: 0.443, 4.3500: 0.445, 4.3000: 0.446, 4.2500: 0.448, 4.2000: 0.449, 4.1500: 0.45, 4.1000: 0.452, 4.0500: 0.453, 4.0000: 0.454, 3.9500: 0.455, 3.9000: 0.457, 3.8500: 0.458, 3.8000: 0.459, 3.7500: 0.46, 3.7000: 0.461, 3.6500: 0.462, 3.6000: 0.463, 3.5500: 0.464, 3.5000: 0.465, 3.4500: 0.466, 3.4000: 0.467, 3.3500: 0.468, 3.3000: 0.469, 3.2500: 0.47, 3.2000: 0.471, 3.1500: 0.471, 3.1000: 0.472, 3.0500: 0.473, 3.0000: 0.474, 2.9500: 0.475, 2.9000: 0.476, 2.8500: 0.476, 2.8000: 0.477, 2.7500: 0.478, 2.7000: 0.479, 2.6500: 0.479, 2.6000: 0.48, 2.5500: 0.481, 2.5000: 0.482, 2.4500: 0.482, 2.4000: 0.483, 2.3500: 0.484, 2.3000: 0.484, 2.2500: 0.485, 2.2000: 0.486, 2.1500: 0.487, 2.1000: 0.487, 2.0500: 0.488, 2.0000: 0.489, 1.9500: 0.489, 1.9000: 0.49, 1.8500: 0.49, 1.8000: 0.491, 1.7500: 0.492, 1.7000: 0.492, 1.6500: 0.493, 1.6000: 0.494, 1.5500: 0.494, 1.5000: 0.495, 1.4500: 0.495, 1.4000: 0.496, 1.3500: 0.497, 1.3000: 0.497, 1.2500: 0.498, 1.2000: 0.498, 1.1500: 0.499, 1.1000: 0.499, 1.0500: 0.5, 1.0000: 0.5, 0.9500: 0.501, 0.9000: 0.502, 0.8500: 0.502, 0.8000: 0.503, 0.7500: 0.503, 0.7000: 0.504, 0.6500: 0.504, 0.6000: 0.505, 0.5500: 0.505, 0.5000: 0.506, 0.4500: 0.506, 0.4000: 0.507, 0.3500: 0.507, 0.3000: 0.508, 0.2500: 0.508, 0.2000: 0.509, 0.1500: 0.509, 0.1000: 0.51, 0.0500: 0.51, 0.0000: 0.01 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.0000: 0.01, 0.0500: 0.011, 0.1000: 0.013, 0.1500: 0.014, 0.2000: 0.015, 0.2500: 0.017, 0.3000: 0.018, 0.3500: 0.019, 0.4000: 0.02, 0.4500: 0.021, 0.5000: 0.022, 0.5500: 0.024, 0.6000: 0.025, 0.6500: 0.026, 0.7000: 0.027, 0.7500: 0.028, 0.8000: 0.029, 0.8500: 0.03, 0.9000: 0.502 }; - 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("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); - }); - }); - - 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 - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 6, // 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 = { 100.000: 6, 95.000: 5.75, 90.000: 5.5, 85.000: 5.25, 80.000: 5, 75.000: 4.75, 70.000: 4.5, 65.000: 4.25, 60.000: 4, 55.000: 3.749, 50.000: 3.499, 45.000: 3.249, 40.000: 2.999, 35.000: 2.749, 30.000: 2.498, 25.000: 2.247, 20.000: 1.996, 15.000: 1.745, 10.000: 1.493, 5.000: 1.24, 0.000: 0.983 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = {}; - 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("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", () => { - // TODO algo à reprendre - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 0.45, // 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 = {}; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.241, 15.000: 0.252, 20.000: 0.253, 25.000: 0.253, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 }; - 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("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", () => { - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 1, // 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 = { 100.000: 1, 95.000: 0.737, 90.000: 0.451 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.241, 15.000: 0.252, 20.000: 0.253, 25.000: 0.253, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.451 }; - 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("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", () => { - let prms = new ParamsSectionRectang(undefined, // tirant d'eau - 2.5, // largeur de fond - 40, // Ks=Strickler - 2, // Q=Débit - 0.05, // If=pente du fond - precDist, // précision - 1, // YB=hauteur de berge - undefined,// YCL=Condition limite en cote à l'amont ou à l'aval - 0.25, // Dx=Pas d'espace - 5.5 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont - 1, // 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.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.934, 4.000: 0.921, 3.750: 0.907, 3.500: 0.894, 3.250: 0.881, 3.000: 0.867, 2.750: 0.854, 2.500: 0.84, 2.250: 0.826, 2.000: 0.813, 1.750: 0.799, 1.500: 0.785, 1.250: 0.771, 1.000: 0.757, 0.750: 0.743, 0.500: 0.729, 0.250: 0.714, 0.000: 0.15 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = { 0.000: 0.15, 0.250: 0.153, 0.500: 0.156, 0.750: 0.158, 1.000: 0.161, 1.250: 0.164, 1.500: 0.166, 1.750: 0.169, 2.000: 0.172, 2.250: 0.174, 2.500: 0.177, 2.750: 0.179, 3.000: 0.181, 3.250: 0.184, 3.500: 0.186, 3.750: 0.907 }; - 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("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 (1)", () => { - 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 - 5, // Dx=Pas d'espace - 100 // 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 = { 100.000: 0.403, 95.000: 17.456, 90.000: 17.451, 85.000: 17.446, 80.000: 17.441, 75.000: 17.436, 70.000: 17.431, 65.000: 17.426, 60.000: 17.421, 55.000: 17.416, 50.000: 17.411, 45.000: 17.406, 40.000: 17.401, 35.000: 17.396, 30.000: 17.391, 25.000: 17.386, 20.000: 17.381, 15.000: 17.376, 10.000: 17.371, 5.000: 17.366, 0.000: 17.361 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = {}; - 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("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 - 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 - 5, // Dx=Pas d'espace - 100 // Long= Longueur du bief - ); - - let sect = new cSnRectang(undefined, prms); - - let prem = new CourbeRemousParams(0.15, // 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 = { 100.000: 0.403, 95.000: 17.456, 90.000: 17.451, 85.000: 17.446, 80.000: 17.441, 75.000: 17.436, 70.000: 17.431, 65.000: 17.426, 60.000: 17.421, 55.000: 17.416, 50.000: 17.411, 45.000: 17.406, 40.000: 17.401, 35.000: 17.396, 30.000: 17.391, 25.000: 17.386, 20.000: 17.381, 15.000: 17.376, 10.000: 17.371, 5.000: 17.366, 0.000: 17.361 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = {}; - 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("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 (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 - 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.25, // 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.750: 1.256, 4.500: 1.256, 4.250: 1.255, 4.000: 1.255, 3.750: 1.255, 3.500: 1.255, 3.250: 1.255, 3.000: 1.255, 2.750: 1.255, 2.500: 1.254, 2.250: 1.254, 2.000: 1.254, 1.750: 1.254, 1.500: 1.254, 1.250: 1.254, 1.000: 1.254, 0.750: 1.253, 0.500: 1.253, 0.250: 1.253, 0.000: 1.253 }; - compObject("Yfluvial", res["flu"], f, 0.03); - - let t = {}; - 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("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_rect_euler_pentefaible.spec.ts b/spec/remous_rect_euler_pentefaible.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..95cd2763b49efdc551e065b2a885e2dbfe68bf21 --- /dev/null +++ b/spec/remous_rect_euler_pentefaible.spec.ts @@ -0,0 +1,325 @@ +import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; +import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; +import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest"; +import { round } from "../src/base"; +import { cLog } from "../src/util/log"; +import { ErrorMessage, ErrorCode } from "../src/util/error"; + +describe('Class Remous / section rectangulaire :', () => { + describe('méthode Euler explicite :', () => { + // it("faible pente, ressaut avant l'amont (1)", () => { + // // cas non reproductible (fluvial =~ 17 sur toute la longueur du canal) + // 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 + // 5, // Dx=Pas d'espace + // 100 // 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 Typescript (Oct 2017) méthode des trapèzes + + // let f = { "0": 0.7554999999999994, "5": 0.7497499999999995, "10": 0.7439999999999996, "15": 0.7377499999999996, "20": 0.7314999999999996, "25": 0.7247499999999997, "30": 0.7174999999999997, "35": 0.7097499999999998, "40": 0.7014999999999998, "45": 0.6927499999999999, "50": 0.6834999999999999, "55": 0.6732499999999999, "60": 0.6619999999999999, "65": 0.6497499999999999, "70": 0.6365, "75": 0.62125, "80": 0.604, "85": 0.58325, "90": 0.558, "95": 0.52375, "100": 0.403 }; + // compareObject("Yfluvial", res["flu"], f, 0.03); + + // let t = {}; + // compareObject("Ytorrentiel", res["tor"], t, 0.03); + + // let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; + // compareArray("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", () => { + // // cas non reproductible (fluvial =~ 17 sur toute la longueur du canal) + + // 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 + // 5, // Dx=Pas d'espace + // 100 // Long= Longueur du bief + // ); + + // let sect = new cSnRectang(undefined, prms); + + // let prem = new CourbeRemousParams(0.15, // 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 Typescript (Oct 2017) méthode des trapèzes + + // let f = { "0": 0.15, "5": 0.7497499999999995, "10": 0.7439999999999996, "15": 0.7377499999999996, "20": 0.7314999999999996, "25": 0.7247499999999997, "30": 0.7174999999999997, "35": 0.7097499999999998, "40": 0.7014999999999998, "45": 0.6927499999999999, "50": 0.6834999999999999, "55": 0.6732499999999999, "60": 0.6619999999999999, "65": 0.6497499999999999, "70": 0.6365, "75": 0.62125, "80": 0.604, "85": 0.58325, "90": 0.558, "95": 0.52375, "100": 0.403 }; + // compareObject("Yfluvial", res["flu"], f, 0.03); + + // let t = { "0": 0.15, "5": 0.7497499999999995 }; + // compareObject("Ytorrentiel", res["tor"], t, 0.03); + + // let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; + // compareArray("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 (1)", () => { + // 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.05, // 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 Typescript (Oct 2017) méthode des trapèzes + + // let f = { "0": 0.01, "1": 0.5005000000000004, "2": 0.4885000000000004, "3": 0.47393750000000023, "4": 0.45418750000000013, "5": 0.403, "4.95": 0.41471875, "4.9": 0.41956250000000006, "4.85": 0.42328125000000005, "4.8": 0.42637500000000006, "4.75": 0.42909375000000005, "4.7": 0.43156250000000007, "4.65": 0.43378125000000006, "4.6": 0.43587500000000007, "4.55": 0.4378437500000001, "4.5": 0.4396875000000001, "4.45": 0.4414062500000001, "4.4": 0.44306250000000014, "4.35": 0.44465625000000014, "4.3": 0.4461875000000001, "4.25": 0.44765625000000014, "4.2": 0.44906250000000014, "4.15": 0.4504062500000001, "4.1": 0.45168750000000013, "4.05": 0.45296875000000014, "3.95": 0.4554062500000001, "3.9": 0.4565625000000001, "3.85": 0.45771875000000006, "3.8": 0.45881250000000007, "3.75": 0.45990625000000007, "3.7": 0.4610000000000001, "3.65": 0.46203125000000006, "3.6": 0.46306250000000004, "3.55": 0.46403125000000006, "3.5": 0.4650000000000001, "3.45": 0.4659687500000001, "3.4": 0.4669375000000001, "3.35": 0.4678437500000001, "3.3": 0.4687500000000001, "3.25": 0.4696562500000001, "3.2": 0.4705625000000001, "3.15": 0.47140625000000014, "3.1": 0.47225000000000017, "3.05": 0.4730937500000002, "2.95": 0.47478125000000027, "2.9": 0.4755625000000003, "2.85": 0.4763437500000003, "2.8": 0.4771250000000003, "2.75": 0.4779062500000003, "2.7": 0.4786875000000003, "2.65": 0.47946875000000033, "2.6": 0.4801875000000003, "2.55": 0.4809062500000003, "2.5": 0.4816250000000003, "2.45": 0.4823437500000003, "2.4": 0.4830625000000003, "2.35": 0.4837812500000003, "2.3": 0.48450000000000026, "2.25": 0.48521875000000025, "2.2": 0.4858750000000003, "2.15": 0.4865312500000003, "2.1": 0.48718750000000033, "2.05": 0.48784375000000035, "1.95": 0.4891562500000004, "1.9": 0.48981250000000043, "1.85": 0.49046875000000045, "1.8": 0.4911250000000005, "1.75": 0.4917812500000005, "1.7": 0.4923750000000005, "1.65": 0.4929687500000005, "1.6": 0.4935625000000005, "1.55": 0.4941562500000005, "1.5": 0.4947500000000005, "1.45": 0.4953437500000005, "1.4": 0.49593750000000053, "1.35": 0.49653125000000053, "1.3": 0.49712500000000054, "1.25": 0.49771875000000054, "1.2": 0.49831250000000055, "1.15": 0.49890625000000055, "1.1": 0.49943750000000053, "1.05": 0.4999687500000005, "0.95": 0.5010312500000003, "0.9": 0.5015625000000001, "0.85": 0.50209375, "0.8": 0.5026249999999999, "0.75": 0.5031562499999997, "0.7": 0.5036874999999996, "0.65": 0.5042187499999995, "0.6": 0.5047499999999994, "0.55": 0.5052812499999992, "0.5": 0.5058124999999991, "0.45": 0.506343749999999, "0.4": 0.5068749999999989, "0.35": 0.5074062499999987, "0.3": 0.5079374999999986, "0.25": 0.5084062499999986, "0.2": 0.5088749999999986, "0.15": 0.5093437499999987, "0.1": 0.5098124999999987, "0.05": 0.5102812499999987 }; + // compareObject("Yfluvial", res["flu"], f, 0.03); + + // let t = { "0": 0.01, "0.05": 0.01146875, "0.1": 0.012812500000000001, "0.15": 0.014156250000000002, "0.2": 0.015437500000000003, "0.25": 0.01665625, "0.3": 0.017875, "0.35": 0.019093749999999996, "0.4": 0.020249999999999994, "0.45": 0.02140624999999999, "0.5": 0.02249999999999999, "0.55": 0.023593749999999986, "0.6": 0.024687499999999984, "0.65": 0.02578124999999998, "0.7": 0.02681249999999998, "0.75": 0.027843749999999976, "0.8": 0.028874999999999974, "0.85": 0.02990624999999997, "0.9": 0.5015625000000001 }; + // compareObject("Ytorrentiel", res["tor"], t, 0.03); + + // let x = [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65, 3.7, 3.75, 3.8, 3.85, 3.9, 3.95, 4, 4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35, 4.4, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.75, 4.8, 4.85, 4.9, 4.95, 5]; + // compareArray("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, pas de ressaut, Yamont > Yc, Yaval > Yn", () => { + 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 + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.5, // Yamont = tirant amont + 1, // 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 Typescript (Oct 2017) méthode des trapèzes + + let f = { "0": 0.9872500000000014, "5": 0.9872500000000014, "10": 0.9872500000000014, "15": 0.9872500000000014, "20": 0.9880000000000013, "25": 0.9887500000000012, "30": 0.9895000000000012, "35": 0.9902500000000011, "40": 0.991000000000001, "45": 0.9917500000000009, "50": 0.9925000000000008, "55": 0.9932500000000007, "60": 0.9940000000000007, "65": 0.9947500000000006, "70": 0.9955000000000005, "75": 0.9962500000000004, "80": 0.9970000000000003, "85": 0.9977500000000002, "90": 0.9985000000000002, "95": 0.9992500000000001, "100": 1 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur"); + + let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; + compareArray("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_PAS_CALCUL_DEPUIS_AMONT)); + + compareLog(log, expLog); + }); + + it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => { + 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 + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.5, // Yamont = tirant amont + 0.7, // 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 Typescript (Oct 2017) méthode trapèzes + + let f = { "0": 0.805499999999999, "5": 0.802249999999999, "10": 0.7984999999999991, "15": 0.7947499999999992, "20": 0.7909999999999993, "25": 0.7867499999999993, "30": 0.7824999999999993, "35": 0.7782499999999993, "40": 0.7739999999999994, "45": 0.7692499999999994, "50": 0.7644999999999995, "55": 0.7592499999999995, "60": 0.7539999999999996, "65": 0.7482499999999996, "70": 0.7424999999999997, "75": 0.7362499999999997, "80": 0.7299999999999998, "85": 0.7232499999999998, "90": 0.7159999999999999, "95": 0.7082499999999999, "100": 0.7 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur"); + + let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; + compareArray("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_PAS_CALCUL_DEPUIS_AMONT)); + + compareLog(log, expLog); + }); + }); +}); diff --git a/spec/remous_rect_euler_penteforte.spec.ts b/spec/remous_rect_euler_penteforte.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b86fb6ac67b033c7a7c1e2c0bc8227d124f1925f --- /dev/null +++ b/spec/remous_rect_euler_penteforte.spec.ts @@ -0,0 +1,376 @@ +import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; +import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; +import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest"; +import { round } from "../src/base"; +import { cLog } from "../src/util/log"; +import { ErrorMessage, ErrorCode } from "../src/util/error"; + +describe('Class Remous / section rectangulaire :', () => { + describe('méthode Euler explicite :', () => { + it("forte pente, ressaut avant l'amont", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 6, // 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 Typescript (Oct 2017) méthode des trapèzes + + let f = { "0": 0.9767500000000044, "5": 1.2360000000000044, "10": 1.4910000000000045, "15": 1.7437500000000046, "20": 1.9955000000000045, "25": 2.2465000000000046, "30": 2.497500000000005, "35": 2.7485000000000053, "40": 2.9985000000000053, "45": 3.2485000000000053, "50": 3.4985000000000053, "55": 3.7485000000000053, "60": 3.9985000000000053, "65": 4.248500000000004, "70": 4.498750000000004, "75": 4.749000000000003, "80": 4.999250000000003, "85": 5.249500000000002, "90": 5.4997500000000015, "95": 5.750000000000001, "100": 6 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = {}; + compareObject("Ytorrentiel", res["tor"], t, 0.03); + + let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; + compareArray("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", () => { + // TODO algo à reprendre + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 0.45, // 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 Typescript (Oct 2017) méthode des trapèzes + + let f = {}; + compareObject("Yfluvial", res["flu"], f, 0.03); + + // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.241, 15.000: 0.252, 20.000: 0.253, 25.000: 0.253, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 }; + let t = { "0": 0.15, "5": 0.20725000000000002, "10": 0.23500000000000001, "15": 0.24675000000000002, "20": 0.251, "25": 0.25225, "30": 0.25249999999999995, "35": 0.2527499999999999, "40": 0.2529999999999999, "45": 0.2527499999999999, "50": 0.2529999999999999, "55": 0.2527499999999999, "60": 0.2529999999999999, "65": 0.2527499999999999, "70": 0.2529999999999999, "75": 0.2527499999999999, "80": 0.2529999999999999, "85": 0.2527499999999999, "90": 0.2529999999999999, "95": 0.2527499999999999, "100": 0.45 }; + compareObject("Ytorrentiel", res["tor"], t, 0.03); + + let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; + compareArray("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", () => { + // // cas non complètement reproductible car la méthode des trapèzes ne donne pas le même nombre de points + // let prms = new ParamsSectionRectang(undefined, // tirant d'eau + // 2.5, // largeur de fond + // 40, // Ks=Strickler + // 2, // Q=Débit + // 0.05, // If=pente du fond + // precDist, // précision + // 1, // YB=hauteur de berge + // undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + // 5, // Dx=Pas d'espace + // 100 // Long= Longueur du bief + // ); + + // let sect = new cSnRectang(undefined, prms); + + // let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + // 1, // 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 Typescript (Oct 2017) méthode des trapèzes + + // // let f = { 100.000: 1, 95.000: 0.737, 90.000: 0.451 }; + // let f = { "95": 0.72875, "100": 1 }; + // compareObject("Yfluvial", res["flu"], f, 0.03); + + // // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.241, 15.000: 0.252, 20.000: 0.253, 25.000: 0.253, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.451 }; + // let t = { "0": 0.15, "5": 0.20725000000000002, "10": 0.23500000000000001, "15": 0.24675000000000002, "20": 0.251, "25": 0.25225, "30": 0.25249999999999995, "35": 0.2527499999999999, "40": 0.2529999999999999, "45": 0.2527499999999999, "50": 0.2529999999999999, "55": 0.2527499999999999, "60": 0.2529999999999999, "65": 0.2527499999999999, "70": 0.2529999999999999, "75": 0.2527499999999999, "80": 0.2529999999999999, "85": 0.2527499999999999, "90": 0.2529999999999999, "95": 0.72875 }; + // compareObject("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]; + // compareArray("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_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", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 0.25, // Dx=Pas d'espace + 5.5 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 1, // 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 Typescript (Oct 2017) méthode des trapèzes + + let f = { "0": 0.15, "1": 0.7560000000000007, "2": 0.8120000000000005, "3": 0.8670000000000002, "4": 0.9205000000000001, "5": 0.9735, "5.5": 1, "5.25": 0.98675, "4.75": 0.96025, "4.5": 0.9470000000000001, "4.25": 0.9337500000000001, "3.75": 0.9072500000000001, "3.5": 0.8940000000000001, "3.25": 0.8807500000000001, "2.75": 0.8532500000000003, "2.5": 0.8395000000000004, "2.25": 0.8257500000000004, "1.75": 0.7982500000000006, "1.5": 0.7845000000000006, "1.25": 0.7702500000000007, "0.75": 0.7417500000000007, "0.5": 0.7275000000000007, "0.25": 0.7132500000000007 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { "0": 0.15, "1": 0.161, "2": 0.17200000000000001, "3": 0.18100000000000002, "0.25": 0.15275, "0.5": 0.1555, "0.75": 0.15825, "1.25": 0.16375, "1.5": 0.1665, "1.75": 0.16925, "2.25": 0.17425000000000002, "2.5": 0.17650000000000002, "2.75": 0.17875000000000002, "3.25": 0.18325000000000002, "3.5": 0.18550000000000003, "3.75": 0.9072500000000001 }; + compareObject("Ytorrentiel", res["tor"], t, 0.03); + + let x = [0, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5, 5.25, 5.5]; + compareArray("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("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 1, // Dx=Pas d'espace + 30 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.1, // Yamont = tirant amont + 0.3, // 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 Typescript (Oct 2017) méthode trapèzes + + expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); + + let t = { "0": 0.1, "1": 0.11425000000000002, "2": 0.12750000000000003, "3": 0.14025000000000004, "4": 0.15200000000000005, "5": 0.16325000000000006, "6": 0.17350000000000007, "7": 0.18325000000000008, "8": 0.1920000000000001, "9": 0.1997500000000001, "10": 0.2070000000000001, "11": 0.2137500000000001, "12": 0.2195000000000001, "13": 0.22475000000000012, "14": 0.22900000000000012, "15": 0.23275000000000012, "16": 0.23600000000000013, "17": 0.23875000000000013, "18": 0.24100000000000013, "19": 0.24325000000000013, "20": 0.24500000000000013, "21": 0.24625000000000014, "22": 0.24750000000000014, "23": 0.2485000000000001, "24": 0.2492500000000001, "25": 0.2502500000000001, "26": 0.25050000000000006, "27": 0.25075000000000003, "28": 0.251, "29": 0.25125, "30": 0.25149999999999995 }; + compareObject("Ytorrentiel", res["tor"], t, 0.01); + + let x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]; + compareArray("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_PAS_CALCUL_DEPUIS_AVAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + compareLog(log, expLog); + }); + + it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 1, // Dx=Pas d'espace + 30 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.35, // Yamont = tirant amont + 0.3, // 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 trapèzes + + expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); + + let t = { "0": 0.35, "1": 0.31425000000000003, "2": 0.29700000000000004, "3": 0.28625, "4": 0.27849999999999997, "5": 0.27274999999999994, "6": 0.26849999999999996, "7": 0.26525, "8": 0.263, "9": 0.26125, "10": 0.25949999999999995, "11": 0.25825, "12": 0.257, "13": 0.25625, "14": 0.25549999999999995, "15": 0.25525, "16": 0.255, "17": 0.25475000000000003, "18": 0.25450000000000006, "19": 0.2542500000000001, "20": 0.2540000000000001, "21": 0.25375000000000014, "22": 0.25350000000000017, "23": 0.2532500000000002, "24": 0.2530000000000002, "25": 0.25275000000000025, "26": 0.2530000000000002, "27": 0.25275000000000025, "28": 0.2530000000000002, "29": 0.25275000000000025, "30": 0.2530000000000002 }; + compareObject("Ytorrentiel", res["tor"], t, 0.03); + + let x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]; + compareArray("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_PAS_CALCUL_DEPUIS_AVAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + compareLog(log, expLog); + }); + }); +}); diff --git a/spec/remous_rect_trapezes_pentefaible.spec.ts b/spec/remous_rect_trapezes_pentefaible.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e3357b76d07631754978f264613a65a902b43786 --- /dev/null +++ b/spec/remous_rect_trapezes_pentefaible.spec.ts @@ -0,0 +1,386 @@ +import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; +import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; +import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest"; +import { round } from "../src/base"; +import { cLog } from "../src/util/log"; +import { ErrorMessage, ErrorCode } from "../src/util/error"; + + +describe('Class Remous / section rectangulaire :', () => { + describe('méthode trapèzes :', () => { + it("faible pente, ressaut avant l'amont", () => { + 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 + 5, // Dx=Pas d'espace + 100 // 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.Trapezes + ); + + 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 trapèzes + + let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75, 0.000: 0.755 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = {}; + compareObject("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]; + compareArray("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", () => { + 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 + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 0.403, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = { 100.000: 0.403, 95.000: 0.524, 90.000: 0.558, 85.000: 0.584, 80.000: 0.604, 75.000: 0.621, 70.000: 0.637, 65.000: 0.65, 60.000: 0.662, 55.000: 0.673, 50.000: 0.684, 45.000: 0.693, 40.000: 0.701, 35.000: 0.709, 30.000: 0.717, 25.000: 0.725, 20.000: 0.731, 15.000: 0.738, 10.000: 0.744, 5.000: 0.75, 0.000: 0.15 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.15, 5.000: 0.75 }; + compareObject("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]; + compareArray("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)", () => { + 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.25, // 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.Trapezes + ); + + 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 trapèzes + + // //dx = 0.05 + // let f = { 5.000: 0.403, 4.950: 0.414, 4.900: 0.419, 4.850: 0.423, 4.800: 0.426, 4.750: 0.429, 4.700: 0.432, 4.650: 0.434, 4.600: 0.436, 4.550: 0.438, 4.500: 0.439, 4.450: 0.441, 4.400: 0.443, 4.350: 0.445, 4.300: 0.446, 4.250: 0.447, 4.200: 0.449, 4.150: 0.45, 4.100: 0.451, 4.050: 0.452, 4.000: 0.454, 3.950: 0.455, 3.900: 0.456, 3.850: 0.457, 3.800: 0.458, 3.750: 0.46, 3.700: 0.461, 3.650: 0.462, 3.600: 0.463, 3.550: 0.465, 3.500: 0.466, 3.450: 0.467, 3.400: 0.468, 3.350: 0.469, 3.300: 0.469, 3.250: 0.47, 3.200: 0.471, 3.150: 0.471, 3.100: 0.472, 3.050: 0.472, 3.000: 0.473, 2.950: 0.474, 2.900: 0.474, 2.850: 0.475, 2.800: 0.476, 2.750: 0.476, 2.700: 0.477, 2.650: 0.477, 2.600: 0.478, 2.550: 0.479, 2.500: 0.479, 2.450: 0.48, 2.400: 0.48, 2.350: 0.481, 2.300: 0.482, 2.250: 0.482, 2.200: 0.483, 2.150: 0.483, 2.100: 0.484, 2.050: 0.485, 2.000: 0.485, 1.950: 0.486, 1.900: 0.486, 1.850: 0.487, 1.800: 0.488, 1.750: 0.488, 1.700: 0.489, 1.650: 0.49, 1.600: 0.49, 1.550: 0.491, 1.500: 0.491, 1.450: 0.492, 1.400: 0.493, 1.350: 0.493, 1.300: 0.494, 1.250: 0.494, 1.200: 0.495, 1.150: 0.496, 1.100: 0.496, 1.050: 0.497, 1.000: 0.497, 0.950: 0.498, 0.900: 0.499, 0.850: 0.499, 0.800: 0.5, 0.750: 0.501, 0.700: 0.501, 0.650: 0.502, 0.600: 0.502, 0.550: 0.503, 0.500: 0.504, 0.450: 0.504, 0.400: 0.505, 0.350: 0.505, 0.300: 0.506, 0.250: 0.507, 0.200: 0.507, 0.150: 0.508, 0.100: 0.508, 0.050: 0.509, 0.000: 0.01 }; + // compareObject("Yfluvial", res["flu"], f, 0.03); + + // //let t = { 0.000: 0.01, 0.050: 0.011, 0.100: 0.013, 0.150: 0.015, 0.200: 0.016, 0.250: 0.018, 0.300: 0.019, 0.350: 0.02, 0.400: 0.021, 0.450: 0.022, 0.500: 0.022, 0.550: 0.023, 0.600: 0.024, 0.650: 0.025, 0.700: 0.026, 0.750: 0.026, 0.800: 0.027, 0.850: 0.028, 0.900: 0.031750000000000014, 0.95: 0.5042500000000006 }; // ok + // let t = { 0.000: 0.01, 0.050: 0.011, 0.100: 0.013, 0.150: 0.015, 0.200: 0.016, 0.250: 0.018, 0.300: 0.019, 0.350: 0.02, 0.400: 0.021, 0.450: 0.022, 0.500: 0.022, 0.550: 0.023, 0.600: 0.024, 0.650: 0.025, 0.700: 0.026, 0.750: 0.026, 0.800: 0.027, 0.850: 0.028, 0.900: 0.499 }; + // compareObject("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]; + // compareArray("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 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.01, 0.250: 0.022, 0.500: 0.027, 0.750: 0.033, 1.000: 0.501 }; + compareObject("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]; + compareArray("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)", () => { + 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 + 0.0001, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 0.05, // 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.Trapezes + ); + + 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 trapèzes + + let f = { 5.0000: 0.403, 4.9500: 0.415, 4.9000: 0.42, 4.8500: 0.423, 4.8000: 0.426, 4.7500: 0.429, 4.7000: 0.432, 4.6500: 0.434, 4.6000: 0.436, 4.5500: 0.438, 4.5000: 0.44, 4.4500: 0.441, 4.4000: 0.443, 4.3500: 0.445, 4.3000: 0.446, 4.2500: 0.448, 4.2000: 0.449, 4.1500: 0.45, 4.1000: 0.452, 4.0500: 0.453, 4.0000: 0.454, 3.9500: 0.455, 3.9000: 0.457, 3.8500: 0.458, 3.8000: 0.459, 3.7500: 0.46, 3.7000: 0.461, 3.6500: 0.462, 3.6000: 0.463, 3.5500: 0.464, 3.5000: 0.465, 3.4500: 0.466, 3.4000: 0.467, 3.3500: 0.468, 3.3000: 0.469, 3.2500: 0.47, 3.2000: 0.471, 3.1500: 0.471, 3.1000: 0.472, 3.0500: 0.473, 3.0000: 0.474, 2.9500: 0.475, 2.9000: 0.476, 2.8500: 0.476, 2.8000: 0.477, 2.7500: 0.478, 2.7000: 0.479, 2.6500: 0.479, 2.6000: 0.48, 2.5500: 0.481, 2.5000: 0.482, 2.4500: 0.482, 2.4000: 0.483, 2.3500: 0.484, 2.3000: 0.484, 2.2500: 0.485, 2.2000: 0.486, 2.1500: 0.487, 2.1000: 0.487, 2.0500: 0.488, 2.0000: 0.489, 1.9500: 0.489, 1.9000: 0.49, 1.8500: 0.49, 1.8000: 0.491, 1.7500: 0.492, 1.7000: 0.492, 1.6500: 0.493, 1.6000: 0.494, 1.5500: 0.494, 1.5000: 0.495, 1.4500: 0.495, 1.4000: 0.496, 1.3500: 0.497, 1.3000: 0.497, 1.2500: 0.498, 1.2000: 0.498, 1.1500: 0.499, 1.1000: 0.499, 1.0500: 0.5, 1.0000: 0.5, 0.9500: 0.501, 0.9000: 0.502, 0.8500: 0.502, 0.8000: 0.503, 0.7500: 0.503, 0.7000: 0.504, 0.6500: 0.504, 0.6000: 0.505, 0.5500: 0.505, 0.5000: 0.506, 0.4500: 0.506, 0.4000: 0.507, 0.3500: 0.507, 0.3000: 0.508, 0.2500: 0.508, 0.2000: 0.509, 0.1500: 0.509, 0.1000: 0.51, 0.0500: 0.51, 0.0000: 0.01 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.0000: 0.01, 0.0500: 0.011, 0.1000: 0.013, 0.1500: 0.014, 0.2000: 0.015, 0.2500: 0.017, 0.3000: 0.018, 0.3500: 0.019, 0.4000: 0.02, 0.4500: 0.021, 0.5000: 0.022, 0.5500: 0.024, 0.6000: 0.025, 0.6500: 0.026, 0.7000: 0.027, 0.7500: 0.028, 0.8000: 0.029, 0.8500: 0.03, 0.9000: 0.502 }; + compareObject("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]; + compareArray("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); + }); + }); + + it("faible pente, pas de ressaut, Yamont > Yc, Yaval > Yn", () => { + 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 + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.5, // Yamont = tirant amont + 1, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = { 100.000: 1, 95.000: 0.999, 90.000: 0.999, 85.000: 0.998, 80.000: 0.997, 75.000: 0.997, 70.000: 0.996, 65.000: 0.996, 60.000: 0.995, 55.000: 0.994, 50.000: 0.994, 45.000: 0.993, 40.000: 0.992, 35.000: 0.992, 30.000: 0.991, 25.000: 0.991, 20.000: 0.99, 15.000: 0.989, 10.000: 0.989, 5.000: 0.988, 0.000: 0.988 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur"); + + 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]; + compareArray("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_PAS_CALCUL_DEPUIS_AMONT)); + + compareLog(log, expLog); + }); + + it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => { + 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 + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.5, // Yamont = tirant amont + 0.7, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = { 100.000: 0.7, 95.000: 0.708, 90.000: 0.716, 85.000: 0.723, 80.000: 0.73, 75.000: 0.737, 70.000: 0.743, 65.000: 0.749, 60.000: 0.754, 55.000: 0.76, 50.000: 0.765, 45.000: 0.77, 40.000: 0.775, 35.000: 0.779, 30.000: 0.783, 25.000: 0.787, 20.000: 0.792, 15.000: 0.795, 10.000: 0.799, 5.000: 0.803, 0.000: 0.806 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + expect(res["tor"] == undefined).toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur"); + + 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]; + compareArray("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_PAS_CALCUL_DEPUIS_AMONT)); + + compareLog(log, expLog); + }); +}); diff --git a/spec/remous_rect_trapezes_penteforte.spec.ts b/spec/remous_rect_trapezes_penteforte.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b9d5f69d91d8eec295c21f12a4f200364e1b1f38 --- /dev/null +++ b/spec/remous_rect_trapezes_penteforte.spec.ts @@ -0,0 +1,373 @@ +import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; +import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remous"; +import { precDigits, precDist, equalEpsilon, compareArray, compareObject, compareLog } from "./nubtest"; +import { round } from "../src/base"; +import { cLog } from "../src/util/log"; +import { ErrorMessage, ErrorCode } from "../src/util/error"; + +describe('Class Remous / section rectangulaire :', () => { + describe('méthode trapèzes :', () => { + it("forte pente, ressaut avant l'amont", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 6, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = { 100.000: 6, 95.000: 5.75, 90.000: 5.5, 85.000: 5.25, 80.000: 4.999, 75.000: 4.749, 70.000: 4.499, 65.000: 4.249, 60.000: 3.998, 55.000: 3.748, 50.000: 3.498, 45.000: 3.248, 40.000: 2.997, 35.000: 2.747, 30.000: 2.497, 25.000: 2.246, 20.000: 1.995, 15.000: 1.744, 10.000: 1.491, 5.000: 1.237, 0.000: 0.977 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = {}; + compareObject("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]; + compareArray("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", () => { + // TODO algo à reprendre + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 0.45, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = {}; + compareObject("Yfluvial", res["flu"], f, 0.03); + + // let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 }; + let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.45 }; + compareObject("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]; + compareArray("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", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 1, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = { 100.000: 1, 95.000: 0.729 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.15, 5.000: 0.207, 10.000: 0.235, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.729 }; + compareObject("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]; + compareArray("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", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 0.25, // Dx=Pas d'espace + 5.5 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.15, // Yamont = tirant amont + 1, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + let f = { 5.500: 1, 5.250: 0.987, 5.000: 0.974, 4.750: 0.96, 4.500: 0.947, 4.250: 0.933, 4.000: 0.92, 3.750: 0.906, 3.500: 0.893, 3.250: 0.88, 3.000: 0.866, 2.750: 0.853, 2.500: 0.839, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.784, 1.250: 0.77, 1.000: 0.756, 0.750: 0.742, 0.500: 0.727, 0.250: 0.712, 0.000: 0.15 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.15, 0.250: 0.153, 0.500: 0.156, 0.750: 0.158, 1.000: 0.161, 1.250: 0.163, 1.500: 0.166, 1.750: 0.168, 2.000: 0.17, 2.250: 0.173, 2.500: 0.175, 2.750: 0.177, 3.000: 0.18, 3.250: 0.182, 3.500: 0.184, 3.750: 0.906 }; + compareObject("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]; + compareArray("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("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 5, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.1, // Yamont = tirant amont + 0.3, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); + + let t = { 0.000: 0.1, 5.000: 0.205, 10.000: 0.234, 15.000: 0.246, 20.000: 0.25, 25.000: 0.252, 30.000: 0.253, 35.000: 0.253, 40.000: 0.253, 45.000: 0.253, 50.000: 0.253, 55.000: 0.253, 60.000: 0.253, 65.000: 0.253, 70.000: 0.253, 75.000: 0.253, 80.000: 0.253, 85.000: 0.253, 90.000: 0.253, 95.000: 0.253, 100.000: 0.253 }; + compareObject("Ytorrentiel", res["tor"], t, 0.01); + + 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]; + compareArray("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_PAS_CALCUL_DEPUIS_AVAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + compareLog(log, expLog); + }); + + it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => { + let prms = new ParamsSectionRectang(undefined, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + precDist, // précision + 1, // YB=hauteur de berge + undefined,// YCL=Condition limite en cote à l'amont ou à l'aval + 4, // Dx=Pas d'espace + 100 // Long= Longueur du bief + ); + + let sect = new cSnRectang(undefined, prms); + + let prem = new CourbeRemousParams(0.35, // Yamont = tirant amont + 0.3, // Yaval = tirant aval + MethodeResolution.Trapezes + ); + + 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 trapèzes + + expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); + + let t = { 0.000: 0.35, 4.000: 0.276, 8.000: 0.261, 12.000: 0.257, 16.000: 0.254, 20.000: 0.254, 24.000: 0.254, 28.000: 0.254, 32.000: 0.254, 36.000: 0.254, 40.000: 0.254, 44.000: 0.254, 48.000: 0.254, 52.000: 0.254, 56.000: 0.254, 60.000: 0.254, 64.000: 0.254, 68.000: 0.254, 72.000: 0.254, 76.000: 0.254, 80.000: 0.254, 84.000: 0.254, 88.000: 0.254, 92.000: 0.254, 96.000: 0.254, 100.000: 0.254 }; + compareObject("Ytorrentiel", res["tor"], t, 0.01); + + let x = [0.000, 4.000, 8.000, 12.000, 16.000, 20.000, 24.000, 28.000, 32.000, 36.000, 40.000, 44.000, 48.000, 52.000, 56.000, 60.000, 64.000, 68.000, 72.000, 76.000, 80.000, 84.000, 88.000, 92.000, 96.000, 100.000]; + compareArray("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_PAS_CALCUL_DEPUIS_AVAL)); + + expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + compareLog(log, expLog); + }); + }); +}); diff --git a/src/remous.ts b/src/remous.ts index 904edd0e41d4bcc159a9bcaf344325b23ae431c2..2f4baa144d35ccac6e14b7a3af977cb764582f44 100644 --- a/src/remous.ts +++ b/src/remous.ts @@ -294,13 +294,13 @@ export class CourbeRemous extends Nub { // Boucle de calcul de la courbe de remous for (let x = Deb + dx; (dx > 0 && x <= Fin) || (dx < 0 && x >= Fin); x += dx) { - 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.code == ErrorCode.ERROR_OK) { // on vérifie qu'on ne traverse pas la hauteur normale (à la précision de calcul près) @@ -328,15 +328,32 @@ export class CourbeRemous extends Nub { return trY; } + private logArray(a: string[]) { + let s = "["; + let first = true; + for (let e of a) { + if (!first) + s += ","; + s += +e; + first = false; + } + s += "]"; + this.debug(s); + } + private logObject(o: { [key: number]: number }) { - let ks: string[] = Object.keys(o); - ks.sort((a, b) => { - if (+a > +b) return 1; - if (+a < +b) return -1; - return 0; - }); - for (let k of ks) - this.debug("[" + (+k).toFixed(3) + "]=" + o[+k]); + if (o == undefined) + this.debug("<undefined>"); + else { + let ks: string[] = Object.keys(o); + ks.sort((a, b) => { + if (+a > +b) return 1; + if (+a < +b) return -1; + return 0; + }); + for (let k of ks) + this.debug("[" + (+k).toFixed(3) + "]=" + o[+k]); + } } /** @@ -387,7 +404,8 @@ export class CourbeRemous extends Nub { } this.debug("flu "); - this.logObject(crbFlu); + // this.logObject(crbFlu); + this.debug(JSON.stringify(crbFlu)); // Calcul depuis l'amont if (this.Sn.HautCritique >= this.prmCR.Yamont.v) { @@ -403,7 +421,8 @@ export class CourbeRemous extends Nub { } this.debug("tor"); - this.logObject(crbTor); + // this.logObject(crbTor); + this.debug(JSON.stringify(crbTor)); // Détection du ressaut hydraulique let nFlu: number = this.size(crbFlu); @@ -473,25 +492,25 @@ export class CourbeRemous extends Nub { // Calcul de l'abscisse de la section dans l'autre régime let Yco = this.Sn.Calc('Yco', crbPartielle[rX]); // Y conjugué - this.debug("rX=" + rX + " Yco(Ypartiel=" + crbPartielle[rX] + ")=" + Yco); + // this.debug("rX=" + rX + " Yco(Ypartiel=" + crbPartielle[rX] + ")=" + Yco); let rLongRst = 5 * Math.abs(crbPartielle[rX] - Yco); // Longueur du ressaut - this.debug("longueur ressaut=" + rLongRst); + // this.debug("longueur ressaut=" + rLongRst); let xRst = rX + Math.round(iSens * rLongRst / Dx) * Dx; // Abscisse où comparer Yconj et Y - this.debug("xRst=" + xRst); + // this.debug("xRst=" + xRst); //let rxRst = rX + iSens * rLongRst; // Abscisse réelle du ressaut //this.debug("xRst reel=" + (rX + iSens * rLongRst)); xRst = round(xRst, this.prmSect.iPrec.v); - this.debug("xRst (arr)=" + xRst); + // this.debug("xRst (arr)=" + xRst); if (crbComplete[xRst] != undefined) { // Hauteur décalée de la longueur du ressaut (il faut gérer la pente du fond) 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])); + // 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])); // if (iSens == 1 ? Yco > Ydec : Yco < Ydec) { if (Yco > Ydec) { @@ -548,14 +567,16 @@ export class CourbeRemous extends Nub { crbTor = {}; else crbFlu = {}; - //crbPartielle = {}; // pour le log uniquement, à virer + crbPartielle = {}; // pour le log uniquement, à virer } } this.debug("complete (" + (iSens == 1 ? "flu" : "tor") + ") modifiée"); - this.logObject(crbComplete); + // this.logObject(crbComplete); + this.debug(JSON.stringify(crbComplete)); this.debug("partielle (" + (iSens == 1 ? "tor" : "flu") + ") modifiée"); - this.logObject(crbPartielle); + // this.logObject(crbPartielle); + this.debug(JSON.stringify(crbPartielle)); // Définition des abscisses let trX: string[] = []; @@ -580,6 +601,9 @@ export class CourbeRemous extends Nub { }); // this.debug("trX unique=" + trX); + this.debug("abscisses "); + this.logArray(trX); + // Calcul de la variable à calculer let tRes: number[] = []; diff --git a/src/util/error.ts b/src/util/error.ts index 04dc132a35821b7bcfbcdb36af269ca95be3a023..79d568bda4b88a829f7982fc697b1b08afc3a671 100644 --- a/src/util/error.ts +++ b/src/util/error.ts @@ -178,4 +178,8 @@ export class ErrorMessage { }; get code() { return this._code; } + + public toString(): string { + return ErrorCode[this._code] + " " + JSON.stringify(this.extraVar); + } } diff --git a/src/util/log.ts b/src/util/log.ts index c6b22b6b358e1440255a751e53ef3732342cdb63..25001043d6c2385eab6f92659144679882cdb0f4 100644 --- a/src/util/log.ts +++ b/src/util/log.ts @@ -10,4 +10,14 @@ export class cLog { public get messages() { return this._messages; } + + public toString(): string { + let res = ""; + for (let m of this._messages) { + if (res != "") + res += "\n"; + res += m.toString(); + } + return res; + } } \ No newline at end of file