diff --git a/spec/remous_rect_rk4_pentefaible.spec.ts b/spec/remous_rect_rk4_pentefaible.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..6eccf7892f9d65af4a88f555cf246f3c3a984a70 --- /dev/null +++ b/spec/remous_rect_rk4_pentefaible.spec.ts @@ -0,0 +1,313 @@ +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 Runge-Kutta ordre 4 :', () => { + 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.41, // Yaval = tirant aval + MethodeResolution.RungeKutta4 + ); + + 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 RungeKutta4 + + let f = { 100.000: 0.41, 95.000: 0.876, 90.000: 0.877, 85.000: 0.879, 80.000: 0.88, 75.000: 0.881, 70.000: 0.883, 65.000: 0.884, 60.000: 0.885, 55.000: 0.886, 50.000: 0.888, 45.000: 0.889, 40.000: 0.89, 35.000: 0.891, 30.000: 0.892, 25.000: 0.893, 20.000: 0.894, 15.000: 0.895, 10.000: 0.896, 5.000: 0.897, 0.000: 0.898 }; + 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.42, // Yaval = tirant aval + MethodeResolution.RungeKutta4 + ); + + 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 RungeKutta4 + + let f = { 100.000: 0.42, 95.000: 0.583, 90.000: 0.604, 85.000: 0.621, 80.000: 0.636, 75.000: 0.65, 70.000: 0.662, 65.000: 0.673, 60.000: 0.683, 55.000: 0.692, 50.000: 0.701, 45.000: 0.709, 40.000: 0.717, 35.000: 0.724, 30.000: 0.731, 25.000: 0.737, 20.000: 0.743, 15.000: 0.749, 10.000: 0.755, 5.000: 0.76, 0.000: 0.15 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.15, 5.000: 0.76 }; + 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", () => { + 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.42, // Yaval = tirant aval + MethodeResolution.RungeKutta4 + ); + + 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 RungeKutta4 + + let f = { 5.000: 0.42, 4.750: 0.434, 4.500: 0.443, 4.250: 0.45, 4.000: 0.457, 3.750: 0.462, 3.500: 0.467, 3.250: 0.471, 3.000: 0.476, 2.750: 0.48, 2.500: 0.483, 2.250: 0.487, 2.000: 0.49, 1.750: 0.493, 1.500: 0.496, 1.250: 0.499, 1.000: 0.502, 0.750: 0.504, 0.500: 0.507, 0.250: 0.509, 0.000: 0.01 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.01, 0.250: 0.017, 0.500: 0.022, 0.750: 0.028, 1.000: 0.502 }; + 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, 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.RungeKutta4 + ); + + 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 RungeKutta4 + + 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.993, 35.000: 0.992, 30.000: 0.991, 25.000: 0.991, 20.000: 0.99, 15.000: 0.99, 10.000: 0.989, 5.000: 0.989, 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.RungeKutta4 + ); + + 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 RungeKutta4 + + 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.759, 50.000: 0.764, 45.000: 0.769, 40.000: 0.774, 35.000: 0.779, 30.000: 0.783, 25.000: 0.787, 20.000: 0.791, 15.000: 0.795, 10.000: 0.799, 5.000: 0.802, 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_rk4_penteforte.spec.ts b/spec/remous_rect_rk4_penteforte.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..928405827493be2b94633ad67aca6560b1fd50a0 --- /dev/null +++ b/spec/remous_rect_rk4_penteforte.spec.ts @@ -0,0 +1,372 @@ +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 Runge-Kutta ordre 4 :', () => { + 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.RungeKutta4 + ); + + 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 RungeKutta4 + + 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.748, 30.000: 2.498, 25.000: 2.247, 20.000: 1.996, 15.000: 1.744, 10.000: 1.491, 5.000: 1.237, 0.000: 0.977 }; + compareObject("Yfluvial", res["flu"], f, 0.01); + + 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.RungeKutta4 + ); + + 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 RungeKutta4 + + let f = {}; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 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.RungeKutta4 + ); + + 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 RungeKutta4 + + let f = { 100.000: 1, 95.000: 0.728, 90.000: 0.521 }; + compareObject("Yfluvial", res["flu"], f, 0.03); + + let t = { 0.000: 0.15, 5.000: 0.198, 10.000: 0.228, 15.000: 0.243, 20.000: 0.249, 25.000: 0.251, 30.000: 0.252, 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.521 }; + 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.RungeKutta4 + ); + + 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 RungeKutta4 + + 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.88, 3.000: 0.867, 2.750: 0.853, 2.500: 0.84, 2.250: 0.826, 2.000: 0.812, 1.750: 0.798, 1.500: 0.785, 1.250: 0.771, 1.000: 0.756, 0.750: 0.742, 0.500: 0.728, 0.250: 0.713, 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.164, 1.500: 0.166, 1.750: 0.169, 2.000: 0.171, 2.250: 0.174, 2.500: 0.176, 2.750: 0.179, 3.000: 0.181, 3.250: 0.183, 3.500: 0.186, 3.750: 0.907 }; + 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.RungeKutta4 + ); + + 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 RungeKutta4 + + expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); + + let t = { 0.000: 0.1, 5.000: 0.162, 10.000: 0.206, 15.000: 0.232, 20.000: 0.244, 25.000: 0.25, 30.000: 0.252, 35.000: 0.252, 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 + 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.RungeKutta4 + ); + + 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 RungeKutta4 + + expect(res["flu"] == undefined).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); + + let t = { 0.000: 0.35, 1.000: 0.314, 2.000: 0.297, 3.000: 0.286, 4.000: 0.279, 5.000: 0.273, 6.000: 0.269, 7.000: 0.266, 8.000: 0.263, 9.000: 0.261, 10.000: 0.26, 11.000: 0.258, 12.000: 0.257, 13.000: 0.256, 14.000: 0.256, 15.000: 0.255, 16.000: 0.255, 17.000: 0.254, 18.000: 0.254, 19.000: 0.254, 20.000: 0.254, 21.000: 0.254, 22.000: 0.253, 23.000: 0.253, 24.000: 0.253, 25.000: 0.253, 26.000: 0.253, 27.000: 0.253, 28.000: 0.253, 29.000: 0.253, 30.000: 0.253 }; + compareObject("Ytorrentiel", res["tor"], t, 0.01); + + let x = [0.000, 1.000, 2.000, 3.000, 4.000, 5.000, 6.000, 7.000, 8.000, 9.000, 10.000, 11.000, 12.000, 13.000, 14.000, 15.000, 16.000, 17.000, 18.000, 19.000, 20.000, 21.000, 22.000, 23.000, 24.000, 25.000, 26.000, 27.000, 28.000, 29.000, 30.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 2f4baa144d35ccac6e14b7a3af977cb764582f44..d64275bb8f4933ce114fa141c3e338d9c1eac283 100644 --- a/src/remous.ts +++ b/src/remous.ts @@ -155,21 +155,21 @@ export class CourbeRemous extends Nub { //if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk1 < $this ->oSect ->rHautCritique)) { return false; } if (XOR(Dx > 0, !(Y + Dx / 2 * k1 < hc))) - return undefined; + return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); //$rk2 = $this ->Calc_dYdX($Y + $rDx / 2 * $rk1); let k2 = this.Calc_dYdX(Y + Dx / 2 * k1); //if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk2 < $this ->oSect ->rHautCritique)) { return false; } if (XOR(Dx > 0, !(Y + Dx / 2 * k2 < hc))) - return undefined; + return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); //$rk3 = $this ->Calc_dYdX($Y + $rDx / 2 * $rk2); let k3 = this.Calc_dYdX(Y + Dx / 2 * k2); //if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk3 < $this ->oSect ->rHautCritique)) { return false; } if (XOR(Dx > 0, !(Y + Dx / 2 * k3 < hc))) - return undefined; + return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); //$rk4 = $this ->Calc_dYdX($Y + $rDx * $rk3); let k4 = this.Calc_dYdX(Y + Dx * k3);