diff --git a/package.json b/package.json index 971bacb9a1a9f4fde888e6e7302fc8ba98fd46d8..9229f68da75cd18d2c752b5ca0a40b0cd64c6032 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "scripts": { "build": "./node_modules/typescript/bin/tsc --p src/tsconfig.app.json", "buildspec": "./node_modules/typescript/bin/tsc --p spec/tsconfig.spec.json", + "runtestremous": "./node_modules/typescript/bin/tsc --p spec/tsconfig-remous-fenetre.spec.json && node ./build/spec/test-remous-fenetre.js", "jasmine": "npm run buildspec && ./node_modules/.bin/jasmine", "karma": "./node_modules/typescript/bin/tsc --p spec/tsconfig.spec.json && ./node_modules/karma/bin/karma start", "lint": "./node_modules/tslint/bin/tslint", diff --git a/spec/base.spec.ts b/spec/base.spec.ts index e06d92379a8bc8815805aaf6cf408089cc64fd4b..17f37c3f7852080e6a30b7de0ca487dd5792a37b 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -2,6 +2,7 @@ import { Result } from "../src/base"; import { nub, precDigits } from "./nubtest"; +import { Message, MessageCode, MessageSeverity } from "../src/util/message"; describe('Class Nub: ', () => { @@ -17,3 +18,12 @@ describe('Class Nub: ', () => { }); }); }); + +describe('classe Message: ', () => { + describe('getSeverity(): ', () => { + it('criticité MessageCode.ERROR_DICHO_CONVERGE == MessageSeverity.ERROR', () => { + let m: Message = new Message(MessageCode.ERROR_DICHO_CONVERGE); + expect(m.getSeverity()).toEqual(MessageSeverity.ERROR); + }); + }); +}); diff --git a/spec/nubtest.ts b/spec/nubtest.ts index dc29daae30a78beae01673fab23025030bc2ce2e..f52ff13b99714ece1830698b17dbcbffc2c9273f 100644 --- a/spec/nubtest.ts +++ b/spec/nubtest.ts @@ -2,7 +2,7 @@ import { Result } from "../src/base"; import { Nub } from "../src/nub"; import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability, ParamsEquation } from "../src/param"; import { cLog } from "../src/util/log"; -import { ErrorMessage, ErrorCode } from "../src/util/error"; +import { Message, MessageCode } from "../src/util/message"; class NubTestParams extends ParamsEquation { private _A: ParamDefinition; @@ -137,19 +137,19 @@ export function compareLog(logTest: cLog, logValid: cLog) { // codes for (let i = 0; i < n1; i++) { - let m1: ErrorMessage = logTest.messages[i]; - let m2: ErrorMessage = logValid.messages[i]; + let m1: Message = logTest.messages[i]; + let m2: Message = logValid.messages[i]; b = m1.code == m2.code; - expect(b).toBeTruthy("journal : message n°" + i + ", code " + ErrorCode[m1.code] + " incorrect, devrait être " + ErrorCode[m2.code]); + expect(b).toBeTruthy("journal : message n°" + i + ", code " + MessageCode[m1.code] + " incorrect, devrait être " + MessageCode[m2.code]); if (!b) return; } // données for (let i = 0; i < n1; i++) { - let m1: ErrorMessage = logTest.messages[i]; - let m2: ErrorMessage = logValid.messages[i]; - let code1 = ErrorCode[m1.code]; + let m1: Message = logTest.messages[i]; + let m2: Message = logValid.messages[i]; + let code1 = MessageCode[m1.code]; // taille des données diff --git a/spec/regime_uniforme_circ.spec.ts b/spec/regime_uniforme_circ.spec.ts index 93a964725b83cc68aed88e308b4c37b297cda8a3..0136d78bd1d23f17b30d3689c714821656752242 100644 --- a/spec/regime_uniforme_circ.spec.ts +++ b/spec/regime_uniforme_circ.spec.ts @@ -21,7 +21,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSect); + let sect = new cSnCirc(paramSect); let ru = new RegimeUniforme(sect); check(ru.Calc("D", 1e-8), 6.001); @@ -37,7 +37,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("Ks", 1e-8), 40.003); @@ -53,7 +53,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("If"), 0.001); @@ -68,7 +68,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 1.2); @@ -83,7 +83,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("Y"), 0.6613); @@ -100,7 +100,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSect); + let sect = new cSnCirc(paramSect); let ru = new RegimeUniforme(sect); check(ru.Calc("D", 1e-8), 2); @@ -116,7 +116,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("Ks", 1e-8), 13.551); @@ -132,7 +132,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("If"), 0.001); @@ -147,7 +147,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 1.2); @@ -162,7 +162,7 @@ describe('Class RegimeUniforme / section circulaire :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnCirc(undefined, paramSection); + let sect = new cSnCirc(paramSection); let ru = new RegimeUniforme(sect); check(ru.Calc("Y"), 2); diff --git a/spec/regime_uniforme_puissance.spec.ts b/spec/regime_uniforme_puissance.spec.ts index cf13a8baa5ab1ccf95ba3b935efec40214806c2d..4f770d59cc1b7719bd66ad562c854ced6047a402 100644 --- a/spec/regime_uniforme_puissance.spec.ts +++ b/spec/regime_uniforme_puissance.spec.ts @@ -1,7 +1,7 @@ /// <reference path="../node_modules/@types/jasmine/index.d.ts" /> import { Result } from "../src/base"; -import { ErrorCode } from "../src/util/error"; +import { MessageCode } from "../src/util/message"; import { RegimeUniforme } from "../src/regime_uniforme"; import { ParamsSectionPuiss, cSnPuiss } from "../src/section/section_puissance"; import { precDist, equalEpsilon } from "./nubtest"; @@ -22,7 +22,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("k"), 0.635); @@ -38,7 +38,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("LargeurBerge"), 3.473); @@ -54,7 +54,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("Ks", 1e-8), 33.774); @@ -70,7 +70,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("If", 0, 0.00001), 0.00071, 0.00001); @@ -86,7 +86,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("Q"), 1.421); @@ -102,7 +102,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, paramCnl); + let sect = new cSnPuiss(paramCnl); let ru = new RegimeUniforme(sect, false); check(ru.Calc("Y"), 0.742); @@ -120,12 +120,12 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); let res: Result = ru.Calc("k"); expect(res.vCalc).toBeUndefined(); - expect(res.code).toBe(ErrorCode.ERROR_DICHO_INIT_DOMAIN); + expect(res.code).toBe(MessageCode.ERROR_DICHO_INIT_DOMAIN); }); it('k should be 0.635', () => { @@ -138,7 +138,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("k"), 0.933); @@ -154,7 +154,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("LargeurBerge"), 0.721); @@ -170,7 +170,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("Ks", 1e-8), 4.367); @@ -186,13 +186,13 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect); ru.dichoStartIntervalMaxSteps = 3; let res: Result = ru.Calc("Ks", 5000000); expect(res.vCalc).toBeUndefined(); - expect(res.code).toBe(ErrorCode.ERROR_DICHO_INITVALUE_HIGH); + expect(res.code).toBe(MessageCode.ERROR_DICHO_INITVALUE_HIGH); }); it('Ks should be undefined', () => { @@ -205,13 +205,13 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect); ru.dichoStartIntervalMaxSteps = 1; let res: Result = ru.Calc("Ks", 1e-8); expect(res.vCalc).toBeUndefined(); - expect(res.code).toBe(ErrorCode.ERROR_DICHO_INITVALUE_LOW); + expect(res.code).toBe(MessageCode.ERROR_DICHO_INITVALUE_LOW); }); it('If should be 0.001', () => { @@ -224,7 +224,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("If"), 0.001); @@ -240,7 +240,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, prms); + let sect = new cSnPuiss(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("Q"), 10.993); @@ -256,7 +256,7 @@ describe('Class RegimeUniforme / section puissance :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnPuiss(undefined, paramCnl); + let sect = new cSnPuiss(paramCnl); let ru = new RegimeUniforme(sect, false); check(ru.Calc("Y"), 0.742); diff --git a/spec/regime_uniforme_rect.spec.ts b/spec/regime_uniforme_rect.spec.ts index 3dd28219ec4234f1435f86ce213ef33575348042..1c7d9aad1b4808fd7078fd0f75fbd94909b82dc3 100644 --- a/spec/regime_uniforme_rect.spec.ts +++ b/spec/regime_uniforme_rect.spec.ts @@ -23,7 +23,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { precDist, // précision 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms, false); + let sect = new cSnRectang(prms, false); let ru = new RegimeUniforme(sect, false); check(ru.Calc("LargeurBerge"), 2.5); @@ -39,7 +39,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Ks", 1e-8), 30.619); @@ -55,7 +55,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect, false); // nom variable à calculer, valeur de Ks @@ -72,7 +72,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 1.568); @@ -88,7 +88,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1.2 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 0.731); @@ -104,7 +104,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); // nom variable à calculer, valeur de Ks @@ -126,7 +126,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms, false); + let sect = new cSnRectang(prms, false); let ru = new RegimeUniforme(sect, false); check(ru.Calc("LargeurBerge"), 2.5); @@ -142,7 +142,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Ks", 1e-8), 9.041); @@ -158,7 +158,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect, false); // nom variable à calculer, valeur de Ks @@ -175,7 +175,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 5.31); @@ -191,7 +191,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 1.2 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 1.624); @@ -207,7 +207,7 @@ describe('Class RegimeUniforme / section rectangulaire :', () => { 0.1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let ru = new RegimeUniforme(sect); // nom variable à calculer, valeur de Ks diff --git a/spec/regime_uniforme_trapeze.spec.ts b/spec/regime_uniforme_trapeze.spec.ts index 9639e8ad7697eb6ad0847afac8b0805bf485a818..4a08d1de55b31a214de8113e8b1efb0e90df9575 100644 --- a/spec/regime_uniforme_trapeze.spec.ts +++ b/spec/regime_uniforme_trapeze.spec.ts @@ -23,7 +23,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect, false); @@ -41,7 +41,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Fruit"), 0.56); @@ -58,7 +58,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Ks", 1e-8), 24.14); @@ -75,7 +75,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("If"), 0.001); @@ -92,7 +92,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 1.2); @@ -109,7 +109,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Y"), 0.587); @@ -127,7 +127,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect, false); check(ru.Calc("LargeurFond", 0, precDist), 0.03); @@ -144,7 +144,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Fruit"), 0.56); @@ -160,7 +160,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Ks", 1e-8), 5.744); @@ -176,7 +176,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { precDist, // précision 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("If"), 0.001); @@ -193,7 +193,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Q"), 8.356); @@ -210,7 +210,7 @@ describe('Class RegimeUniforme / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let ru = new RegimeUniforme(sect); check(ru.Calc("Y"), 0.587); diff --git a/spec/remous_rect_euler_pentefaible.spec.ts b/spec/remous_rect_euler_pentefaible.spec.ts index cb6b713caecd142b673601814f5cd00ca8e559c1..0a0446abd56e211da570a16c6520533699cf82d4 100644 --- a/spec/remous_rect_euler_pentefaible.spec.ts +++ b/spec/remous_rect_euler_pentefaible.spec.ts @@ -3,7 +3,7 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo 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"; +import { Message, MessageCode } from "../src/util/message"; describe('Class Remous / section rectangulaire :', () => { describe('méthode Euler explicite :', () => { @@ -218,7 +218,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -227,8 +227,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -237,29 +236,29 @@ describe('Class Remous / section rectangulaire :', () => { 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"); + expect(Object.keys(res["tor"]).length == 0).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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => { @@ -272,7 +271,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont 0.7, // Yaval = tirant aval @@ -281,8 +280,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -291,29 +289,29 @@ describe('Class Remous / section rectangulaire :', () => { 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"); + expect(Object.keys(res["tor"]).length == 0).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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); }); diff --git a/spec/remous_rect_euler_penteforte.spec.ts b/spec/remous_rect_euler_penteforte.spec.ts index 3ddc543a54a06935af934d5352b9afc3603f8b98..9c518f6411c15387b6e07254647d0a05e9d54bbd 100644 --- a/spec/remous_rect_euler_penteforte.spec.ts +++ b/spec/remous_rect_euler_penteforte.spec.ts @@ -3,7 +3,14 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo 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"; +import { Message, MessageCode } from "../src/util/message"; + +/* + Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale + pour la représentation graphique du ressaut (mais fausse car torrentielle). + Idem pour la réciproque fluvial/torrentiel. + Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes. + */ describe('Class Remous / section rectangulaire :', () => { describe('méthode Euler explicite :', () => { @@ -17,7 +24,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 6, // Yaval = tirant aval @@ -26,8 +33,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -43,27 +49,27 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "amont"; m.extraVar["x"] = 0; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut après l'aval", () => { @@ -77,7 +83,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 0.45, // Yaval = tirant aval @@ -86,8 +92,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -96,40 +101,40 @@ describe('Class Remous / section rectangulaire :', () => { 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 }; + // 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 }; + 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.253 }; // dernière valeur modifiée pour la raison en tête de fichier 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 95; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "aval"; m.extraVar["x"] = 100; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); // it("forte pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -171,27 +176,27 @@ describe('Class Remous / section rectangulaire :', () => { // compareArray("abscisses", res["trX"], x); // let expLog = new cLog(); - // let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + // let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); // m.extraVar["B"] = 2.5; // expLog.add(m); - // m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + // m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); // m.extraVar["Yc"] = 0.403; // expLog.add(m); - // m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + // m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); // m.extraVar["Yn"] = 0.253; // expLog.add(m); - // expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + // expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - // m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + // m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) // m.extraVar["x"] = 85; // expLog.add(m); - // expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + // expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - // m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + // m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); // m.extraVar["xmin"] = 90; // m.extraVar["xmax"] = 90; // expLog.add(m); @@ -209,7 +214,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -218,14 +223,14 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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 }; + // 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 }; + let f = { "0": 0.698, "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 }; // première valeur modifiée pour la raison en tête de fichier 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 }; @@ -235,28 +240,28 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 3.75; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => { @@ -269,7 +274,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.1, // Yamont = tirant amont 0.3, // Yaval = tirant aval @@ -278,14 +283,13 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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"); + expect(Object.keys(res["flu"]).length == 0).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); @@ -294,23 +298,23 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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 Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => { @@ -323,7 +327,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.35, // Yamont = tirant amont 0.3, // Yaval = tirant aval @@ -332,14 +336,13 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.EulerExplicite ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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"); + expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); let t = { 0.000: 0.35, 0.100: 0.345, 0.200: 0.34, 0.300: 0.336, 0.400: 0.332, 0.500: 0.329, 0.600: 0.326, 0.700: 0.323, 0.800: 0.32, 0.900: 0.318, 1.000: 0.316, 1.100: 0.313, 1.200: 0.311, 1.300: 0.309, 1.400: 0.308, 1.500: 0.306, 1.600: 0.305, 1.700: 0.303, 1.800: 0.302, 1.900: 0.3, 2.000: 0.298, 2.100: 0.297, 2.200: 0.295, 2.300: 0.294, 2.400: 0.293, 2.500: 0.292, 2.600: 0.291, 2.700: 0.291, 2.800: 0.29, 2.900: 0.289, 3.000: 0.288, 3.100: 0.287, 3.200: 0.287, 3.300: 0.286, 3.400: 0.285, 3.500: 0.284, 3.600: 0.283, 3.700: 0.283, 3.800: 0.282, 3.900: 0.281, 4.000: 0.28, 4.100: 0.28, 4.200: 0.279, 4.300: 0.278, 4.400: 0.277, 4.500: 0.276, 4.600: 0.276, 4.700: 0.275, 4.800: 0.274, 4.900: 0.273, 5.000: 0.272, 5.100: 0.272, 5.200: 0.271, 5.300: 0.27, 5.400: 0.269, 5.500: 0.269, 5.600: 0.269, 5.700: 0.269, 5.800: 0.269, 5.900: 0.269, 6.000: 0.269, 6.100: 0.269, 6.200: 0.269, 6.300: 0.269, 6.400: 0.269, 6.500: 0.269, 6.600: 0.269, 6.700: 0.269, 6.800: 0.269, 6.900: 0.269, 7.000: 0.269, 7.100: 0.269, 7.200: 0.269, 7.300: 0.269, 7.400: 0.269, 7.500: 0.269, 7.600: 0.269, 7.700: 0.269, 7.800: 0.269, 7.900: 0.269, 8.000: 0.269, 8.100: 0.269, 8.200: 0.269, 8.300: 0.269, 8.400: 0.269, 8.500: 0.269, 8.600: 0.269, 8.700: 0.269, 8.800: 0.269, 8.900: 0.269, 9.000: 0.269, 9.100: 0.269, 9.200: 0.269, 9.300: 0.269, 9.400: 0.269, 9.500: 0.269, 9.600: 0.269, 9.700: 0.269, 9.800: 0.269, 9.900: 0.269, 10.000: 0.269 }; compareObject("Ytorrentiel", res["tor"], t, 0.03); @@ -348,23 +351,23 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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 Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); }); diff --git a/spec/remous_rect_rk4_pentefaible.spec.ts b/spec/remous_rect_rk4_pentefaible.spec.ts index 38b260156046b1cff9719eaa2acc0472fda402ec..58828299a11da8b6a5b84d478175ee4c4e50e076 100644 --- a/spec/remous_rect_rk4_pentefaible.spec.ts +++ b/spec/remous_rect_rk4_pentefaible.spec.ts @@ -3,8 +3,14 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo 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"; +import { Message, MessageCode } from "../src/util/message"; +/* + Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus + ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0) + lign d'eau partielle : if (iSens * (rXCN - xRst) > 0) remplacé par if (iSens * (rXCN - xRst) >= 0) + Les données de validation ont été modifiées en conséquence +*/ describe('Class Remous / section rectangulaire :', () => { describe('méthode Runge-Kutta ordre 4 :', () => { @@ -18,7 +24,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.3, // Yamont = tirant amont 0.41, // Yaval = tirant aval @@ -27,8 +33,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -44,32 +49,32 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "amont"; m.extraVar["x"] = 0; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -82,7 +87,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 0.42, // Yaval = tirant aval @@ -91,49 +96,50 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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 }; + // 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 }; + 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 }; // dernière valeur supprimée pour la raison en tête de fichier compareObject("Yfluvial", res["flu"], f, 0.03); - let t = { 0.000: 0.15, 5.000: 0.76 }; + // let t = { 0.000: 0.15, 5.000: 0.76 }; + let t = { 0.000: 0.15 }; // dernière valeur supprimée pour la raison en tête de fichier 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 15; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 5; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, ressaut (plusieurs points) à l'intérieur du bief", () => { @@ -146,7 +152,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.01, // Yamont = tirant amont 0.42, // Yaval = tirant aval @@ -155,8 +161,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -172,28 +177,28 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 1; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, pas de ressaut, Yamont > Yc, Yaval > Yn", () => { @@ -206,7 +211,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -215,8 +220,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -225,29 +229,29 @@ describe('Class Remous / section rectangulaire :', () => { 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"); + expect(Object.keys(res["tor"]).length == 0).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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => { @@ -260,7 +264,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont 0.7, // Yaval = tirant aval @@ -269,8 +273,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -279,29 +282,29 @@ describe('Class Remous / section rectangulaire :', () => { 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"); + expect(Object.keys(res["tor"]).length == 0).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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); }); diff --git a/spec/remous_rect_rk4_penteforte.spec.ts b/spec/remous_rect_rk4_penteforte.spec.ts index fc91619a88ba6165877508c0f37504837d602f8e..d816edb15947d1a0b8d0c4d0289f60393ec5eef9 100644 --- a/spec/remous_rect_rk4_penteforte.spec.ts +++ b/spec/remous_rect_rk4_penteforte.spec.ts @@ -3,7 +3,23 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo 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"; +import { Message, MessageCode } from "../src/util/message"; + +/* + cas 1 : + Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale + pour la représentation graphique du ressaut (mais fausse car torrentielle). + Idem pour la réciproque fluvial/torrentiel. + Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes. + */ + +/* + cas 2 : + Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus + ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0) + lign d'eau partielle : if (iSens * (rXCN - xRst) > 0) remplacé par if (iSens * (rXCN - xRst) >= 0) + Les données de validation ont été modifiées en conséquence +*/ describe('Class Remous / section rectangulaire :', () => { describe('méthode Runge-Kutta ordre 4 :', () => { @@ -17,7 +33,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 6, // Yaval = tirant aval @@ -26,8 +42,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -43,27 +58,27 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "amont"; m.extraVar["x"] = 0; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut après l'aval", () => { @@ -77,7 +92,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 0.45, // Yaval = tirant aval @@ -86,8 +101,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -96,39 +110,40 @@ describe('Class Remous / section rectangulaire :', () => { 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 }; + // 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 }; + 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.253 }; // dernière valeur remplacée pour la raison 1 en tête de fichier 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 95; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "aval"; m.extraVar["x"] = 100; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -141,7 +156,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -150,49 +165,50 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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 }; + // let f = { 100.000: 1, 95.000: 0.728, 90.000: 0.521 }; + let f = { 100.000: 1, 95.000: 0.728 }; // dernière valeur supprimée pour la raison 2 en tête de fichier 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 }; + // 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 }; + 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 }; // dernière valeur remplacée pour la raison 1 en tête de fichier 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 85; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 90; m.extraVar["xmax"] = 90; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => { @@ -205,7 +221,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -214,14 +230,14 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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 }; + // 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 }; + 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.699 }; // dernière valeur remplacée pour la raison 1 en tête de fichier 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 }; @@ -231,28 +247,28 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 3.75; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => { @@ -265,7 +281,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.1, // Yamont = tirant amont 0.3, // Yaval = tirant aval @@ -274,14 +290,13 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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"); + expect(Object.keys(res["flu"]).length == 0).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); @@ -290,23 +305,23 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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 Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => { @@ -319,7 +334,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.35, // Yamont = tirant amont 0.3, // Yaval = tirant aval @@ -328,14 +343,13 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.RungeKutta4 ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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"); + expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); let t = { 0.000: 0.35, 0.100: 0.344, 0.200: 0.34, 0.300: 0.335, 0.400: 0.332, 0.500: 0.328, 0.600: 0.325, 0.700: 0.322, 0.800: 0.32, 0.900: 0.317, 1.000: 0.315, 1.100: 0.313, 1.200: 0.31, 1.300: 0.309, 1.400: 0.307, 1.500: 0.305, 1.600: 0.303, 1.700: 0.302, 1.800: 0.3, 1.900: 0.299, 2.000: 0.297, 2.100: 0.296, 2.200: 0.295, 2.300: 0.294, 2.400: 0.293, 2.500: 0.291, 2.600: 0.29, 2.700: 0.289, 2.800: 0.288, 2.900: 0.287, 3.000: 0.287, 3.100: 0.286, 3.200: 0.285, 3.300: 0.284, 3.400: 0.283, 3.500: 0.282, 3.600: 0.282, 3.700: 0.281, 3.800: 0.28, 3.900: 0.279, 4.000: 0.279, 4.100: 0.278, 4.200: 0.278, 4.300: 0.277, 4.400: 0.276, 4.500: 0.276, 4.600: 0.275, 4.700: 0.275, 4.800: 0.274, 4.900: 0.274, 5.000: 0.273, 5.100: 0.273, 5.200: 0.272, 5.300: 0.272, 5.400: 0.271, 5.500: 0.271, 5.600: 0.271, 5.700: 0.27, 5.800: 0.27, 5.900: 0.269, 6.000: 0.269, 6.100: 0.269, 6.200: 0.268, 6.300: 0.268, 6.400: 0.268, 6.500: 0.267, 6.600: 0.267, 6.700: 0.267, 6.800: 0.266, 6.900: 0.266, 7.000: 0.266, 7.100: 0.265, 7.200: 0.265, 7.300: 0.265, 7.400: 0.265, 7.500: 0.264, 7.600: 0.264, 7.700: 0.264, 7.800: 0.264, 7.900: 0.263, 8.000: 0.263, 8.100: 0.263, 8.200: 0.263, 8.300: 0.263, 8.400: 0.262, 8.500: 0.262, 8.600: 0.262, 8.700: 0.262, 8.800: 0.262, 8.900: 0.261, 9.000: 0.261, 9.100: 0.261, 9.200: 0.261, 9.300: 0.261, 9.400: 0.26, 9.500: 0.26, 9.600: 0.26, 9.700: 0.26, 9.800: 0.26, 9.900: 0.26, 10.000: 0.26 }; compareObject("Ytorrentiel", res["tor"], t, 0.01); @@ -344,23 +358,23 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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 Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); }); diff --git a/spec/remous_rect_trapezes_pentefaible.spec.ts b/spec/remous_rect_trapezes_pentefaible.spec.ts index d54663466ccf2712720ebbc1bd96576a36dcfe93..10c56dbe511c519513292feea26ab686a382ccf4 100644 --- a/spec/remous_rect_trapezes_pentefaible.spec.ts +++ b/spec/remous_rect_trapezes_pentefaible.spec.ts @@ -3,8 +3,14 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo 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"; +import { Message, MessageCode } from "../src/util/message"; +/* + Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus + ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0) + lign d'eau partielle : if (iSens * (rXCN - xRst) > 0) remplacé par if (iSens * (rXCN - xRst) >= 0) + Les données de validation ont été modifiées en conséquence +*/ describe('Class Remous / section rectangulaire :', () => { describe('méthode trapèzes :', () => { @@ -18,7 +24,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.3, // Yamont = tirant amont 0.403, // Yaval = tirant aval @@ -27,8 +33,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -44,32 +49,32 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "amont"; m.extraVar["x"] = 0; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -82,7 +87,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 0.403, // Yaval = tirant aval @@ -91,49 +96,50 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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 }; + // 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 }; + 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 }; // dernière valeur supprimée pour la raison en tête de fichier compareObject("Yfluvial", res["flu"], f, 0.03); - let t = { 0.000: 0.15, 5.000: 0.75 }; + // let t = { 0.000: 0.15, 5.000: 0.75 }; + let t = { 0.000: 0.15 }; // dernière valeur supprimée pour la raison en tête de fichier 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 15; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 5; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (1)", () => { @@ -146,7 +152,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.01, // Yamont = tirant amont 0.403, // Yaval = tirant aval @@ -155,8 +161,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -184,28 +189,28 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 1; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, ressaut (plusieurs points) à l'intérieur du bief (2)", () => { @@ -218,7 +223,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.01, // Yamont = tirant amont 0.403, // Yaval = tirant aval @@ -227,8 +232,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -244,28 +248,28 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 0.9; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); @@ -279,7 +283,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -288,8 +292,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -298,29 +301,29 @@ describe('Class Remous / section rectangulaire :', () => { 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"); + expect(Object.keys(res["tor"]).length == 0).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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => { @@ -333,7 +336,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.5, // Yamont = tirant amont 0.7, // Yaval = tirant aval @@ -342,8 +345,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -352,28 +354,28 @@ describe('Class Remous / section rectangulaire :', () => { 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"); + expect(Object.keys(res["tor"]).length == 0).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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.953; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); diff --git a/spec/remous_rect_trapezes_penteforte.spec.ts b/spec/remous_rect_trapezes_penteforte.spec.ts index 7107c0e13a933676d48914e91b666fea5e865bca..4b8a237fe158a51a395e175a557b6789a35993d1 100644 --- a/spec/remous_rect_trapezes_penteforte.spec.ts +++ b/spec/remous_rect_trapezes_penteforte.spec.ts @@ -3,7 +3,23 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo 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"; +import { Message, MessageCode } from "../src/util/message"; + +/* + cas 1 : + Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale + pour la représentation graphique du ressaut (mais fausse car torrentielle). + Idem pour la réciproque fluvial/torrentiel. + Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes. + */ + +/* + cas 2 : + Le code de modification des lignes fluviale et torrentielle a été modifié, on enlève un point de plus + ligne d'eau complète : if (iSens * (rXCC - rX) < 0) remplacé par if (iSens * (rXCC - rX) <= 0) + lign d'eau partielle : if (iSens * (rXCN - xRst) > 0) remplacé par if (iSens * (rXCN - xRst) >= 0) + Les données de validation ont été modifiées en conséquence +*/ describe('Class Remous / section rectangulaire :', () => { describe('méthode trapèzes :', () => { @@ -17,7 +33,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 6, // Yaval = tirant aval @@ -26,8 +42,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -43,27 +58,27 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "amont"; m.extraVar["x"] = 0; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut après l'aval", () => { @@ -77,7 +92,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 0.45, // Yaval = tirant aval @@ -86,8 +101,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -97,39 +111,40 @@ describe('Class Remous / section rectangulaire :', () => { 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 }; + // 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 }; // dernière valeur modifiée pour la raison 1 en tête de fichier + 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 }; 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 95; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = "aval"; m.extraVar["x"] = 100; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut (1 point) à l'intérieur du bief", () => { @@ -142,7 +157,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -151,8 +166,7 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); @@ -161,39 +175,40 @@ describe('Class Remous / section rectangulaire :', () => { 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 }; + // 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 }; + 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 }; // dernière valeur supprimée pour la raison 2 en tête de fichier 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); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE) + m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE) m.extraVar["x"] = 90; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 90; m.extraVar["xmax"] = 95; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, ressaut (plusieurs points) à l'intérieur du bief", () => { @@ -206,7 +221,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 1, // Yaval = tirant aval @@ -215,14 +230,14 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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 }; + // 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 }; + 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.699 }; // dernière valeur modifiée pour la raison 1 en tête de fichier 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 }; @@ -232,28 +247,28 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); m.extraVar["Yn"] = 0.253; expLog.add(m); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = 0; m.extraVar["xmax"] = 3.75; expLog.add(m); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, pas de ressaut, Yaval < Yc, Yamont < Yn", () => { @@ -266,7 +281,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.1, // Yamont = tirant amont 0.3, // Yaval = tirant aval @@ -275,14 +290,13 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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"); + expect(Object.keys(res["flu"]).length == 0).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); @@ -291,23 +305,23 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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 Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); it("forte pente, pas de ressaut, Yaval < Yc, Yn < Yamont < Yc", () => { @@ -320,7 +334,7 @@ describe('Class Remous / section rectangulaire :', () => { 1 // YB=hauteur de berge ); - let sect = new cSnRectang(undefined, prms); + let sect = new cSnRectang(prms); let prem = new CourbeRemousParams(sect, 0.35, // Yamont = tirant amont 0.3, // Yaval = tirant aval @@ -329,14 +343,13 @@ describe('Class Remous / section rectangulaire :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); 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"); + expect(Object.keys(res["flu"]).length == 0).toBeTruthy("la ligne d'eau fluviale ne devrait comporter aucune valeur"); let t = { 0.000: 0.35, 0.100: 0.345, 0.200: 0.34, 0.300: 0.336, 0.400: 0.332, 0.500: 0.329, 0.600: 0.326, 0.700: 0.323, 0.800: 0.32, 0.900: 0.318, 1.000: 0.316, 1.100: 0.313, 1.200: 0.311, 1.300: 0.309, 1.400: 0.308, 1.500: 0.306, 1.600: 0.305, 1.700: 0.303, 1.800: 0.302, 1.900: 0.3, 2.000: 0.298, 2.100: 0.297, 2.200: 0.295, 2.300: 0.294, 2.400: 0.293, 2.500: 0.292, 2.600: 0.291, 2.700: 0.291, 2.800: 0.29, 2.900: 0.289, 3.000: 0.288, 3.100: 0.287, 3.200: 0.287, 3.300: 0.286, 3.400: 0.285, 3.500: 0.284, 3.600: 0.283, 3.700: 0.283, 3.800: 0.282, 3.900: 0.281, 4.000: 0.28, 4.100: 0.28, 4.200: 0.279, 4.300: 0.278, 4.400: 0.277, 4.500: 0.276, 4.600: 0.276, 4.700: 0.275, 4.800: 0.274, 4.900: 0.273, 5.000: 0.272, 5.100: 0.272, 5.200: 0.271, 5.300: 0.27, 5.400: 0.269, 5.500: 0.269, 5.600: 0.269, 5.700: 0.269, 5.800: 0.269, 5.900: 0.269, 6.000: 0.269, 6.100: 0.269, 6.200: 0.269, 6.300: 0.269, 6.400: 0.269, 6.500: 0.269, 6.600: 0.269, 6.700: 0.269, 6.800: 0.269, 6.900: 0.269, 7.000: 0.269, 7.100: 0.269, 7.200: 0.269, 7.300: 0.269, 7.400: 0.269, 7.500: 0.269, 7.600: 0.269, 7.700: 0.269, 7.800: 0.269, 7.900: 0.269, 8.000: 0.269, 8.100: 0.269, 8.200: 0.269, 8.300: 0.269, 8.400: 0.269, 8.500: 0.269, 8.600: 0.269, 8.700: 0.269, 8.800: 0.269, 8.900: 0.269, 9.000: 0.269, 9.100: 0.269, 9.200: 0.269, 9.300: 0.269, 9.400: 0.269, 9.500: 0.269, 9.600: 0.269, 9.700: 0.269, 9.800: 0.269, 9.900: 0.269, 10.000: 0.269 }; compareObject("Ytorrentiel", res["tor"], t, 0.01); @@ -345,23 +358,23 @@ describe('Class Remous / section rectangulaire :', () => { compareArray("abscisses", res["trX"], x); let expLog = new cLog(); - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); + let m = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); m.extraVar["B"] = 2.5; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = 0.403; expLog.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); + m = new Message(MessageCode.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 Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - expLog.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + expLog.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - compareLog(log, expLog); + compareLog(rem.log, expLog); }); }); }); diff --git a/spec/remous_trapez.spec.ts b/spec/remous_trapez.spec.ts index 9010db27e1399a1a82e285fad12fc50f5ce70ba5..350b68760a656d37f4459ce54f7bc62921aab6c1 100644 --- a/spec/remous_trapez.spec.ts +++ b/spec/remous_trapez.spec.ts @@ -3,32 +3,18 @@ import { CourbeRemousParams, MethodeResolution, CourbeRemous } from "../src/remo import { precDigits, precDist, equalEpsilon } from "./nubtest"; import { round } from "../src/base"; import { cLog } from "../src/util/log"; +import { compareObject, compareArray } from "./nubtest"; -function compObject(s: string, arr1: { [key: number]: number }, arr2: { [key: number]: number }) { - expect(Object.keys(arr1).length).toEqual(Object.keys(arr2).length, s + ": longueur incorrecte"); - - let arrVals: number[] = []; - for (let i in arr1) { - let v1: number = arr1[i]; - let v2: number = arr2[i]; - expect(equalEpsilon(v1, v2)).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + " " + v2); - } -} - -function compArray(s: string, arr1: string[], arr2: number[]) { - expect(arr1.length).toEqual(arr2.length); - - let arrVals: number[] = []; - for (let i = 0; i < arr1.length; i++) { - let v1: number = +arr1[i]; - let v2: number = arr2[i]; - expect(equalEpsilon(v1, v2)).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + " " + v2); - } -} - -xdescribe('Class Remous / section trapèze :', () => { +/* + Certaines valeurs de ligne d'eau torrentielle étaient auparavant remplacées par une valeur fluviale + pour la représentation graphique du ressaut (mais fausse car torrentielle). + Idem pour la réciproque fluvial/torrentiel. + Le code ne faisant plus ça, les valeurs de validation ont été remplacée par les bonnes. + */ + +describe('Class Remous / section trapèze :', () => { describe('méthode trapèzes :', () => { - it('test 1', () => { + it('pente faible, ressaut dans le bief sur plusieurs points', () => { let prms = new ParamsSectionTrapez(2.5, // largeur de fond 0.56, // fruit undefined, // tirant d'eau @@ -39,7 +25,7 @@ xdescribe('Class Remous / section trapèze :', () => { 1 // YB= hauteur de berge ); - let sect = new cSnTrapez(undefined, prms); + let sect = new cSnTrapez(prms); let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont 0.4, // Yaval = tirant aval @@ -48,19 +34,117 @@ xdescribe('Class Remous / section trapèze :', () => { MethodeResolution.Trapezes ); - let log = new cLog(); - let rem = new CourbeRemous(prem, log); + let rem = new CourbeRemous(prem); let res = rem.calculRemous(undefined); let f = { 9: 0.278, 10: 0.4 }; - compObject("Yfluvial", res["flu"], f); + compareObject("Yfluvial", res["flu"], f, 0.002); - let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.4 }; - compObject("Ytorrentiel", res["tor"], t); + // let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.4 }; + let t = { 0.000: 0.15, 1.000: 0.16369914454109, 2.000: 0.17743613485223, 3.000: 0.19117312516337, 4.000: 0.20491011547451, 5.000: 0.21864710578565, 6.000: 0.23238409609679, 7.000: 0.24688425253633, 8.000: 0.26214757510426, 9.000: 0.27817406380059, 10.000: 0.293 }; // dernière valeur modifiée pour la raison en tête de fichier + compareObject("Ytorrentiel", res["tor"], t, 0.002); let x = [0.000, 1.000, 2.000, 3.000, 4.000, 5.000, 6.000, 7.000, 8.000, 9.000, 10.000]; - compArray("abcisses", res["trX"], x); + compareArray("abcisses", res["trX"], x); + }); + + // it('pente forte, ressaut dans le bief sur plusieurs points', () => { + // let prms = new ParamsSectionTrapez(2.5, // largeur de fond + // 0.56, // fruit + // undefined, // tirant d'eau + // 40, // Ks=Strickler + // 2, // Q=Débit + // 0.05, // If=pente du fond + // precDist, // précision + // 1 // YB= hauteur de berge + // ); + + // let sect = new cSnTrapez(prms); + + // let prem = new CourbeRemousParams(sect, + // 0.15, // Yamont = tirant amont + // 1, // Yaval = tirant aval + // 8, // Long= Longueur du bief + // 0.1, // Dx=Pas d'espace + // MethodeResolution.Trapezes + // ); + + // let rem = new CourbeRemous(prem); + + // let res = rem.calculRemous(undefined); + + // let f = { 8.000: 1, 7.900: 0.995, 7.800: 0.989, 7.700: 0.984, 7.600: 0.978, 7.500: 0.973, 7.400: 0.967, 7.300: 0.962, 7.200: 0.956, 7.100: 0.951, 7.000: 0.945, 6.900: 0.94, 6.800: 0.934, 6.700: 0.929, 6.600: 0.923, 6.500: 0.918, 6.400: 0.912, 6.300: 0.907, 6.200: 0.901, 6.100: 0.896, 6.000: 0.89, 5.900: 0.885, 5.800: 0.879, 5.700: 0.874, 5.600: 0.868, 5.500: 0.863, 5.400: 0.857, 5.300: 0.852, 5.200: 0.846, 5.100: 0.841, 5.000: 0.835, 4.900: 0.83, 4.800: 0.824, 4.700: 0.819, 4.600: 0.813, 4.500: 0.808, 4.400: 0.802, 4.300: 0.797, 4.200: 0.791, 4.100: 0.786, 4.000: 0.78, 3.900: 0.775, 3.800: 0.769, 3.700: 0.764, 3.600: 0.758, 3.500: 0.753, 3.400: 0.747, 3.300: 0.742, 3.200: 0.737, 3.100: 0.731, 3.000: 0.726, 2.900: 0.72, 2.800: 0.715, 2.700: 0.709, 2.600: 0.704, 2.500: 0.698, 2.400: 0.693, 2.300: 0.686, 2.200: 0.68, 2.100: 0.674, 2.000: 0.668, 1.900: 0.662, 1.800: 0.656, 1.700: 0.65, 1.600: 0.644, 1.500: 0.638, 1.400: 0.632, 1.300: 0.625, 1.200: 0.619, 1.100: 0.613, 1.000: 0.607, 0.900: 0.601, 0.800: 0.594, 0.700: 0.588, 0.600: 0.581, 0.500: 0.574, 0.400: 0.567, 0.300: 0.561, 0.200: 0.554, 0.100: 0.547, 0.000: 0.15 }; + // compareObject("Yfluvial", res["flu"], f, 0.011); + + // let t = { 0.000: 0.15, 0.100: 0.151, 0.200: 0.151, 0.300: 0.152, 0.400: 0.153, 0.500: 0.154, 0.600: 0.155, 0.700: 0.155, 0.800: 0.156, 0.900: 0.157, 1.000: 0.158, 1.100: 0.158, 1.200: 0.159, 1.300: 0.16, 1.400: 0.161, 1.500: 0.161, 1.600: 0.162, 1.700: 0.163, 1.800: 0.164, 1.900: 0.164, 2.000: 0.165, 2.100: 0.166, 2.200: 0.167, 2.300: 0.168, 2.400: 0.168, 2.500: 0.698, 2.6: 0.709500000000002 }; + // compareObject("Ytorrentiel", res["tor"], t, 0.004); + + // 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, 5.100, 5.200, 5.300, 5.400, 5.500, 5.600, 5.700, 5.800, 5.900, 6.000, 6.100, 6.200, 6.300, 6.400, 6.500, 6.600, 6.700, 6.800, 6.900, 7.000, 7.100, 7.200, 7.300, 7.400, 7.500, 7.600, 7.700, 7.800, 7.900, 8.000]; + // compareArray("abcisses", res["trX"], x); + // }); + }); + + describe('paramètre à calculer :', () => { + it('Hs (test 1)', () => { + let prms = new ParamsSectionTrapez( + 2.5, // largeur de fond + 0.56, // fruit + undefined, // tirant d'eau + 40, // Ks=Strickler + 2, // Q=Débit + 0.001, // If=pente du fond + 0.001, // précision + 1 // YB=hauteur de berge + ); + + let sect = new cSnTrapez(prms); + + let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont + 0.4, // Yaval = tirant aval + 100, // Long= Longueur du bief + 5, // Dx=Pas d'espace + MethodeResolution.Trapezes + ); + + let rem = new CourbeRemous(prem); + + let res = rem.calculRemous("Hs"); + + // données de validation : version PHP (oct 2017) + let hs = { 0.000: 1.507, 5.000: 0.735, 10.000: 0.731, 15.000: 0.727, 20.000: 0.723, 25.000: 0.719, 30.000: 0.715, 35.000: 0.71, 40.000: 0.704, 45.000: 0.699, 50.000: 0.693, 55.000: 0.687, 60.000: 0.68, 65.000: 0.673, 70.000: 0.665, 75.000: 0.656, 80.000: 0.646, 85.000: 0.634, 90.000: 0.62, 95.000: 0.603, 100.000: 0.572 }; + compareObject("Hs", res["tRes"], hs, 0.002); + }); + + it('Hs (test 2)', () => { + let prms = new ParamsSectionTrapez( + 2.5, // largeur de fond + 0.56, // fruit + undefined, // tirant d'eau + 40, // Ks=Strickler + 2, // Q=Débit + 0.05, // If=pente du fond + 0.001, // précision + 1 // YB=hauteur de berge + ); + + let sect = new cSnTrapez(prms); + + let prem = new CourbeRemousParams(sect, 0.15, // Yamont = tirant amont + 1, // Yaval = tirant aval + 8, // Long= Longueur du bief + 0.1, // Dx=Pas d'espace + MethodeResolution.Trapezes + ); + + let rem = new CourbeRemous(prem); + + let res = rem.calculRemous("Hs"); + + // données de validation : version PHP (oct 2017) + // ici j'ai supprimé un point (x=2.5) + let hs = { 0.000: 1.507, 2.600: 0.753, 2.700: 0.757, 2.800: 0.762, 2.900: 0.767, 3.000: 0.771, 3.100: 0.776, 3.200: 0.781, 3.300: 0.786, 3.400: 0.79, 3.500: 0.795, 3.600: 0.8, 3.700: 0.805, 3.800: 0.81, 3.900: 0.814, 4.000: 0.819, 4.100: 0.824, 4.200: 0.829, 4.300: 0.834, 4.400: 0.839, 4.500: 0.844, 4.600: 0.849, 4.700: 0.854, 4.800: 0.859, 4.900: 0.864, 5.000: 0.869, 5.100: 0.874, 5.200: 0.879, 5.300: 0.884, 5.400: 0.889, 5.500: 0.894, 5.600: 0.899, 5.700: 0.904, 5.800: 0.909, 5.900: 0.914, 6.000: 0.919, 6.100: 0.924, 6.200: 0.929, 6.300: 0.934, 6.400: 0.939, 6.500: 0.944, 6.600: 0.95, 6.700: 0.955, 6.800: 0.96, 6.900: 0.965, 7.000: 0.97, 7.100: 0.975, 7.200: 0.98, 7.300: 0.986, 7.400: 0.991, 7.500: 0.996, 7.600: 1.001, 7.700: 1.006, 7.800: 1.012, 7.900: 1.017, 8.000: 1.022 }; + compareObject("Hs", res["tRes"], hs, 0.009); }); }); }); diff --git a/spec/section_param_circ_fluvial.spec.ts b/spec/section_param_circ_fluvial.spec.ts index ba76e792e6c1b263bae46f5e24944f7768fe0197..a03a99faebb2399043f3c163d19583ceeb05da8b 100644 --- a/spec/section_param_circ_fluvial.spec.ts +++ b/spec/section_param_circ_fluvial.spec.ts @@ -17,7 +17,7 @@ function createSection(prec: number): cSnCirc { 1 // YB= hauteur de berge ); - return new cSnCirc(undefined, paramSection); + return new cSnCirc(paramSection); } function createSectionDebordement(prec: number): cSnCirc { @@ -30,7 +30,7 @@ function createSectionDebordement(prec: number): cSnCirc { 1 // YB= hauteur de berge ); - return new cSnCirc(undefined, paramSection); + return new cSnCirc(paramSection); } function check(val1: number, val2: number) { diff --git a/spec/section_param_circ_torrentiel.spec.ts b/spec/section_param_circ_torrentiel.spec.ts index ebb27a9ebf503b9675a2a5e036cb406a71c881c4..3b26bd609934e20fed40af8064bde04951c823dc 100644 --- a/spec/section_param_circ_torrentiel.spec.ts +++ b/spec/section_param_circ_torrentiel.spec.ts @@ -17,7 +17,7 @@ function createSection(prec: number): cSnCirc { 1 // YB= hauteur de berge ); - return new cSnCirc(undefined, paramSection); + return new cSnCirc(paramSection); } function check(val1: number, val2: number) { diff --git a/spec/section_param_puiss_fluvial.spec.ts b/spec/section_param_puiss_fluvial.spec.ts index e4070f596001287d12481d0ffb62685d2f6f45ee..6adea424c71bf903e45eaee91784fa9bb646488c 100644 --- a/spec/section_param_puiss_fluvial.spec.ts +++ b/spec/section_param_puiss_fluvial.spec.ts @@ -18,7 +18,7 @@ function createSection(prec: number): cSnPuiss { 1 // YB= hauteur de berge ); - return new cSnPuiss(undefined, paramSection); + return new cSnPuiss(paramSection); } function createSectionDebordement(prec: number): cSnPuiss { @@ -32,7 +32,7 @@ function createSectionDebordement(prec: number): cSnPuiss { 1 // YB= hauteur de berge ); - return new cSnPuiss(undefined, paramSection); + return new cSnPuiss(paramSection); } function check(val1: number, val2: number) { diff --git a/spec/section_param_puiss_torrentiel.spec.ts b/spec/section_param_puiss_torrentiel.spec.ts index 045271fab5b96d0b03b4cb0e513846a1567eba8c..e412bc1dcc32519a7f8bff06b1679244d6934470 100644 --- a/spec/section_param_puiss_torrentiel.spec.ts +++ b/spec/section_param_puiss_torrentiel.spec.ts @@ -18,7 +18,7 @@ function createSection(prec: number): cSnPuiss { 1 // YB= hauteur de berge ); - return new cSnPuiss(undefined, paramSection); + return new cSnPuiss(paramSection); } function check(val1: number, val2: number) { diff --git a/spec/section_param_rect_conv_newton.spec.ts b/spec/section_param_rect_conv_newton.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..83d7e90acfe6c7137cd76615c83efd4114bde1b0 --- /dev/null +++ b/spec/section_param_rect_conv_newton.spec.ts @@ -0,0 +1,99 @@ +/// <reference path="../node_modules/@types/jasmine/index.d.ts" /> + +import { Result } from "../src/base"; +import { precDist, equalEpsilon } from "./nubtest"; +import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; +import { MessageCode } from "../src/util/message"; + +let paramSection: ParamsSectionRectang; +let sect: cSnRectang; + +function check(val1: number, val2: number) { + expect(equalEpsilon(val1, val2)).toBeTruthy("expected " + val2 + ", got " + val1); +} + +describe('Section paramétrée rectangulaire : ', () => { + beforeEach(() => { + paramSection = new ParamsSectionRectang(0.8, // tirant d'eau + 2.5, // largeur de fond + 40, // Ks=Strickler + 10, // Q=Débit + 0.001, // If=pente du fond + 1e-10, // précision + 1 // YB= hauteur de berge + ); + + sect = new cSnRectang(paramSection); + sect.newtonMaxIter = 5; + }); + + describe('non convergence de la méthode de Newton :', () => { + it('hauteur critique', () => { + sect.Calc("Yc"); + expect(sect.log.messages.length).toEqual(1); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + }); + + it('hauteur normale', () => { + sect.Calc("Yn"); + expect(sect.log.messages.length).toEqual(2); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE); + }); + + it('hauteur normale, pente négative', () => { + sect.prms.If.v = -0.001; + sect.Calc("Yn"); + expect(sect.log.messages.length).toEqual(1); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF); + }); + + it('hauteur fluviale, Y < Yc', () => { + sect.Calc("Yf"); + expect(sect.log.messages.length).toEqual(3); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU); + }); + + it('hauteur fluviale, Y > Yc', () => { + sect.prms.Y.v = 2; + sect.Calc("Yf"); + expect(sect.log.messages.length).toEqual(1); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + }); + + it('hauteur torrentielle, Y < Yc', () => { + sect.Calc("Yt"); + expect(sect.log.messages.length).toEqual(1); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + }); + + it('hauteur torrentielle, Y > Yc', () => { + sect.prms.Y.v = 2; + sect.Calc("Yt"); + expect(sect.log.messages.length).toEqual(2); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR); + }); + + it('hauteur conjuguée, Froude < 1', () => { + sect.prms.Y.v = 2; + sect.Calc("Yco"); + console.log(sect.log.toString()); + expect(sect.log.messages.length).toEqual(3); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR); + expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG); + }); + + it('hauteur conjuguée, Froude > 1', () => { + sect.Calc("Yco"); + expect(sect.log.messages.length).toEqual(4); + expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU); + expect(sect.log.messages[3].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG); + }); + }); +}); diff --git a/spec/section_param_rect_fluvial.spec.ts b/spec/section_param_rect_fluvial.spec.ts index 38ebd5dd3ff7dd8146b8b9c43e8bede5d25ef933..be5be98ca25add9c50fe16c826a2f7a62c6a2c7b 100644 --- a/spec/section_param_rect_fluvial.spec.ts +++ b/spec/section_param_rect_fluvial.spec.ts @@ -17,7 +17,7 @@ function createSection(prec: number): cSnRectang { 1 // YB= hauteur de berge ); - return new cSnRectang(undefined, paramSection); + return new cSnRectang(paramSection); } function createSectionDebordement(prec: number): cSnRectang { @@ -30,7 +30,7 @@ function createSectionDebordement(prec: number): cSnRectang { 1 // YB= hauteur de berge ); - return new cSnRectang(undefined, paramSection); + return new cSnRectang(paramSection); } function check(val1: number, val2: number) { diff --git a/spec/section_param_rect_torrentiel.spec.ts b/spec/section_param_rect_torrentiel.spec.ts index ddf25e29b7e248bbcb26dbc828add475812fdc24..456ea6207dc9df2d306ecfd3ab66356494d0b3de 100644 --- a/spec/section_param_rect_torrentiel.spec.ts +++ b/spec/section_param_rect_torrentiel.spec.ts @@ -22,7 +22,7 @@ describe('Section paramétrée rectangulaire : ', () => { 1 // YB= hauteur de berge ); - sect = new cSnRectang(undefined, paramSection); + sect = new cSnRectang(paramSection); }); describe('torrentiel :', () => { diff --git a/spec/section_param_trapez_fluvial.spec.ts b/spec/section_param_trapez_fluvial.spec.ts index 13a1f1f5f69709df6b31f49739ae08519327f7cf..7443a4d372ed36b7d041cc8e82900695c85a621f 100644 --- a/spec/section_param_trapez_fluvial.spec.ts +++ b/spec/section_param_trapez_fluvial.spec.ts @@ -18,7 +18,7 @@ function createSection(prec: number): cSnTrapez { 1 // YB= hauteur de berge ); - return new cSnTrapez(undefined, paramSection); + return new cSnTrapez(paramSection); } function createSectionDebordement(prec: number): cSnTrapez { @@ -32,7 +32,7 @@ function createSectionDebordement(prec: number): cSnTrapez { 1 // YB= hauteur de berge ); - return new cSnTrapez(undefined, paramSection); + return new cSnTrapez(paramSection); } function check(val1: number, val2: number) { diff --git a/spec/section_param_trapez_torrentiel.spec.ts b/spec/section_param_trapez_torrentiel.spec.ts index 13730e0b2945a85cdd2589e2bea633a4033a425f..7526c24db9037e7b157d2f0ef243d72b9177e488 100644 --- a/spec/section_param_trapez_torrentiel.spec.ts +++ b/spec/section_param_trapez_torrentiel.spec.ts @@ -23,7 +23,7 @@ describe('Section paramétrée trapèze :', () => { 1 // YB= hauteur de berge ); - sect = new cSnTrapez(undefined, paramCnl); + sect = new cSnTrapez(paramCnl); }); describe('torrentiel :', () => { diff --git a/spec/test-remous-fenetre.ts b/spec/test-remous-fenetre.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc4c7fded58e89fdb249ae42f366af12a9f71db1 --- /dev/null +++ b/spec/test-remous-fenetre.ts @@ -0,0 +1,360 @@ +import { Message, MessageCode, MessageSeverity } from "../src/util/message"; +import { CourbeRemous, CourbeRemousParams, MethodeResolution } from "../src/remous"; +import { cLog } from "../src/util/log"; + +//import { ParamsSectionTrapez, cSnTrapez } from "../src/section/section_trapez"; +import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang"; +import { nub, precDist, equalEpsilon } from "../spec/nubtest"; + +/* + Tentative de validation automatique du calcul des courbes de remous. + Le principe : + - calculer d'abord les remous sur un bief (avec par exemple un ressaut au milieu) qui servira de référence + - déplacer dans ce bief une fenêtre dans laquelle on calcule les courbes de remous + - comparer les courbes obtenus dans la fenêtre avec celles se trouvant au même endroit dans le bief de référence + + Ce code de validation n'est pas sous la forme d'un test unitaire, il doit être lancé à la main : + $ npm run runtestremous + */ + +class Expect { + constructor(private b: boolean) { + + } + public toBeTruthy(m: string) { + if (!this.b) + console.log(m); + } +} + +function expect(b: boolean): Expect { + return new Expect(b); +} + +export function compareObject(s: string, objTest: { [key: number]: number }, objValid: { [key: number]: number }, epsilon: number): boolean { + 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 false; + + let kTest = Object.keys(objTest); + kTest.sort((a, b) => { + if (+a > +b) return 1; + if (+a < +b) return -1; + return 0; + }); + + let kValid = Object.keys(objValid); + kValid.sort((a, b) => { + if (+a > +b) return 1; + if (+a < +b) return -1; + return 0; + }); + + for (let i = 0; i < n1; i++) { + // let v1: number = objTest[+Object.keys(objTest)[i]]; + let v1: number = objTest[+kTest[i]]; + // let v2: number = objValid[+Object.keys(objValid)[i]]; + let v2: number = objValid[+kValid[i]]; + b = equalEpsilon(v1, v2, epsilon); + expect(b).toBeTruthy(s + " : " + i + "ieme valeur incorrecte " + v1 + ", devrait etre " + v2); + if (!b) return false; + } + + return true; +} + +export function compareArray(s: string, arrTest: string[], arrValid: string[]): boolean { + 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 false; + + 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 false; + } + + return true; +} + +function logObject(obj: {}, m?: string) { + // évite le message "Value below was evaluated just now" dans le debugger de Chrome + if (m == undefined) + console.log(JSON.stringify(obj)); + else + console.log(m + " " + JSON.stringify(obj)); +} + +function logArray(m: string, arr: { [key: string]: number }) { + console.log(m); + + let keys = Object.keys(arr); + keys.sort((a, b) => { + if (+a > +b) return 1; + if (+a < +b) return -1; + return 0; + }); + + for (let k of keys) + console.log("[" + (+k).toFixed(3) + "]=" + arr[k]); +} + +// function computeFenetreTrapez(yAmont: number, yAval: number, longBief: number, dxBief: number, prec: number) { +// let prms = new ParamsSectionTrapez( +// 2.5, // largeur de fond +// 0.56, // fruit +// undefined, // tirant d'eau +// 40, // Ks=Strickler +// 2.5, // Q=Débit +// 0.05, // If=pente du fond +// prec, // précision +// 1 // YB=hauteur de berge +// ); + +// let sect = new cSnTrapez(prms); + +// let prem = new CourbeRemousParams(sect, +// yAmont, // Yamont = tirant amont +// yAval, // Yaval = tirant aval +// longBief, // Long = Longueur du bief +// dxBief, // Dx = Pas d'espace +// MethodeResolution.Trapezes +// ); + +// // console.log("computeFenetre longBief=" + longBief + " y am/av=" + yAmont + " " + yAval); +// console.log("computeFenetre y am/av=" + yAmont + " " + yAval); + +// let rem = new CourbeRemous(prem); +// return rem.calculRemous(undefined); +// } + +function saveCSV(res) { + const fs = require('fs'); + + let csvFlu = "x;flu;tor"; + for (let x of res.trX) { + if (res.flu[x] == undefined) + var flu = ""; + else + flu = String(res.flu[x]).replace(".", ","); + + if (res.tor[x] == undefined) + var tor = ""; + else + tor = String(res.tor[x]).replace(".", ","); + + csvFlu += "\n" + x.replace(".", ",") + ";" + flu + ";" + tor; + } + + fs.writeFile("/tmp/flu.csv", csvFlu, function (err) { + if (err) { + return console.log(err); + } + + console.log("The file was saved!"); + }); +} + +function createSectionRect(prec: number, dbg: boolean = false): cSnRectang { + let prms = new ParamsSectionRectang( + undefined, // tirant d'eau + 2, // largeur de fond + 40, // Ks=Strickler + 2.5, // Q=Débit + 0.001, // If=pente du fond + prec, // précision + 1 // YB=hauteur de berge + ); + + return new cSnRectang(prms, dbg); +} + +function computeFenetreRect(yAmont: number, yAval: number, longBief: number, dbg: boolean = false) { + // let prms = new ParamsSectionRectang( + // undefined, // tirant d'eau + // 2, // largeur de fond + // 40, // Ks=Strickler + // 2.5, // Q=Débit + // 0.001, // If=pente du fond + // prec, // précision + // 1 // YB=hauteur de berge + // ); + // let sect = new cSnRectang(prms); + let sect = createSectionRect(prec); + + let prem = new CourbeRemousParams(sect, + yAmont, // Yamont = tirant amont + yAval, // Yaval = tirant aval + longBief, // Long = Longueur du bief + dxBief, // Dx = Pas d'espace + MethodeResolution.Trapezes + ); + + let rem = new CourbeRemous(prem, dbg); + return { "remous": rem, "res": rem.calculRemous(undefined) }; +} + +// ressaut entre x=8 et x=12.5 +const prec = 1e-3; // précision de calcul +const longBief = 20; // longueur totale du bief +const Yaval = 1.1; // tirant aval +const Yamont = 0.1; // tirant amont +const dxBief = 0.25; // pas de discrétisation + +function testFenetre() { + console.log("CALCUL DU BIEF\n\n"); + + // calcul du bief + + let r = computeFenetreRect(Yamont, Yaval, longBief, false); + let res: { + "flu": { [key: number]: number; }, + "tor": { [key: number]: number; }, + "trX": string[], + "tRes": { [key: number]: number } + } = r["res"]; + + let remous = r["remous"]; + + // ligne fluviale totale, utilisée pour les conditions initiales + let ligneFluviale: { [key: number]: number; } = remous.calculFluvial(); + + // ligne torrentielle totale, utilisée pour les conditions initiales + let ligneTorrentielle: { [key: number]: number; } = remous.calculTorrentiel(); + + console.log(remous.log.toString()); + // let ms = r["remous"].log.messages; + + // saveCSV(res); + + console.log("X") + logObject(res.trX); + logArray("flu", res.flu); + logArray("tor", res.tor); + + // mouvement de la fenêtre + + console.log("\n\nMOUVEMENT DE LA FENETRE\n\n"); + + let sizeFenetre = Math.round(res.trX.length / 3.5); + console.log("taille de la fenetre (points) " + sizeFenetre); + if (sizeFenetre < 3) + throw "pas de discrétisation trop grand !"; + + let nFlu = Object.keys(res.flu).length; + if (nFlu < sizeFenetre * 2) + throw "pb de calcul de la ligne fluviale : nb de points (" + nFlu + ") < fenetre * 2"; + + let nTor = Object.keys(res.tor).length; + if (nTor < sizeFenetre * 2) + throw "pb de calcul de la ligne torrentielle : nb de points (" + nTor + ") < fenetre * 2"; + + + let nX = res.trX.length; + console.log("taille du bief (points)=" + nX); + + let ni = 13; + for (let i1 = 0; i1 <= nX - sizeFenetre; i1++) { + console.log(); + console.log("i1", i1); + + let i2 = i1 + sizeFenetre - 1; + let xBief1: string = res.trX[i1]; + let xBief2: string = res.trX[i2]; + console.log("test fenetre xBief=[" + xBief1 + "," + xBief2 + "]"); + console.log("longueur fenetre " + (+xBief2 - +xBief1)); + + // let yAmont: number = res.tor[xBief1]; + let yAmont: number = ligneTorrentielle[xBief1]; + if (yAmont == undefined) { + // yAmont = res.flu[xBief1]; + yAmont = ligneFluviale[xBief1]; + // console.log("yAmont (flu)=" + yAmont); + } + // else + // console.log("yAmont (tor)=" + yAmont); + + // let yAval = res.flu[xBief2]; + let yAval = ligneFluviale[xBief2]; + if (yAval == undefined) { + // yAval = res.tor[xBief2]; + yAval = ligneTorrentielle[xBief2]; + // console.log("yAval (tor)=" + yAval); + } + // else + // console.log("yAval (flu)=" + yAval ); + + if (yAmont == undefined || yAval == undefined) + throw "pb ! yAmont == undefined || yAval == undefined"; + + // console.log("computeFenetre longBief=" + longBief + " y am/av=" + yAmont + " " + yAval); + console.log("computeFenetre y am/av=" + yAmont + " " + yAval); + + let r = computeFenetreRect(yAmont, yAval, +xBief2 - +xBief1, i1 == ni); + let resFenetre = r["res"]; + + // validation du tableau d'abscisses + + let validX: string[] = []; + for (let i = i1; i <= i2; i++) + validX.push(String(+res.trX[i] - dxBief * i1)); + if (!compareArray("X", resFenetre.trX, validX)) { + console.log("X valid") + logObject(validX); + console.log("X fenetre") + logObject(resFenetre.trX); + break; + } + /**/ + + // if (xBief1 == "3.1") + // console.log(); + + // validation de la courbe fluviale + + let validFlu: { [key: number]: number; } = {}; + for (let i = i1; i <= i2; i++) { + let x: number = +res.trX[i]; + let y: number = res.flu[x]; + if (y != undefined) + validFlu[(i - i1) * dxBief] = y; + // validFlu[x] = y; + } + if (Object.keys(validFlu).length > 0) + if (!compareObject("Flu", resFenetre.flu, validFlu, prec)) { + console.log("flu valid") + logObject(validFlu); + console.log("flu fenetre") + logObject(resFenetre.flu); + // break; + } + /**/ + + // validation de la courbe torrentielle + + let validTor: { [key: number]: number; } = {}; + for (let i = i1; i <= i2; i++) { + let x: number = +res.trX[i]; + let y: number = res.tor[x]; + if (y != undefined) + validTor[(i - i1) * dxBief] = y; + // validTor[x] = y; + } + if (Object.keys(validTor).length > 0) + if (!compareObject("Tor", resFenetre.tor, validTor, prec)) { + console.log("tor valid") + logObject(validTor); + console.log("tor fenetre") + logObject(resFenetre.tor); + // break; + } + } +} + +testFenetre() diff --git a/spec/tsconfig-remous-fenetre.spec.json b/spec/tsconfig-remous-fenetre.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..dc5c20a03c3babd16acd097165b9f3fde6c49fd8 --- /dev/null +++ b/spec/tsconfig-remous-fenetre.spec.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "noImplicitAny": false + }, + "extends": "../tsconfig.json", + "include": [ + "../src/remous.ts", + "../spec/test-remous-fenetre.ts" + ] +} \ No newline at end of file diff --git a/spec/tsconfig.spec.json b/spec/tsconfig.spec.json index 5ce23c667a28850cbef329d45012843197183b51..86e4fca2e4fc36961b7a48563ddcb38ce153c982 100644 --- a/spec/tsconfig.spec.json +++ b/spec/tsconfig.spec.json @@ -3,5 +3,8 @@ "include": [ "../src/**/*.ts", "../spec/**/*.ts" + ], + "exclude": [ + "../spec/test-remous-fenetre.ts" ] } diff --git a/src/base.ts b/src/base.ts index 3006c6d1e398ddb27b1bce759be08c3a95b06945..9e7c06fed8ec509d9ed578c3282cb0e94c6f1e2d 100644 --- a/src/base.ts +++ b/src/base.ts @@ -1,60 +1,4 @@ -import { ErrorMessage, ErrorCode } from "./util/error"; - -// export enum ResultCode { -// OK = 0, - -// /** -// * la dichotomie n'a pas pu trouver automatiquement d'intervalle de départ -// * car la valeur initiale de la variable est trop haute -// */ -// ERROR_DICHO_INITVALUE_HIGH = -1, - -// /** -// * la dichotomie n'a pas pu trouver automatiquement d'intervalle de départ -// * car la valeur initiale de la variable est trop basse -// */ -// ERROR_DICHO_INITVALUE_LOW = -2, - -// /** -// * la dichotomie n'a pas pu trouver automatiquement d'intervalle de départ -// * car la valeur cible de la fonction n'existe pas pour des valeurs de la -// * variable dans son domaine de définition, cad il n'existe pas de solution -// */ -// ERROR_DICHO_INIT_DOMAIN = -3, - -// /** -// * la dichotomie n'a pas pu converger -// */ -// ERROR_DICHO_CONVERGE = -4, -// } - -// /** -// * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...) -// */ -// export class Result { -// /** Valeur calculée */ -// private _vCalc: number; - -// /** -// * code d'erreur -// */ -// private _code: ResultCode; - -// /** Variables intermédiaires, flags d'erreur */ -// // public extraVar: {}; -// public extraVar: { [key: string]: any }; - -// constructor(v: number, c: ResultCode = ResultCode.OK) { -// this._vCalc = v -// this._code = c; -// this.extraVar = {} -// }; - -// get vCalc() { return this._vCalc; } - -// get code() { return this._code; } -// } - +import { Message, MessageCode } from "./util/message"; /** * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...) @@ -63,22 +7,22 @@ export class Result { /** Valeur calculée */ private _vCalc: number; - private _errorMessage: ErrorMessage; + private _message: Message; - constructor(v: number, e: ErrorMessage = undefined) { + constructor(v: number, e: Message = undefined) { this._vCalc = v; - this._errorMessage = e; + this._message = e; }; get vCalc() { return this._vCalc; } get code() { - if (this._errorMessage == undefined) - return ErrorCode.ERROR_OK; - return this._errorMessage.code; + if (this._message == undefined) + return MessageCode.ERROR_OK; + return this._message.code; } - get errorMessage() { return this._errorMessage; } + get Message() { return this._message; } } /** diff --git a/src/dichotomie.ts b/src/dichotomie.ts index f25f9f67a9127b4678081fec5085594ea42e80d2..9485690c41128933c5a53034e6b579464b2aad21 100644 --- a/src/dichotomie.ts +++ b/src/dichotomie.ts @@ -1,6 +1,6 @@ // import { XOR, BoolIdentity, Debug, Result, ResultCode, UndefinedError } from "./base"; import { XOR, BoolIdentity, Debug, Result } from "./base"; -import { ErrorMessage, ErrorCode } from "./util/error"; +import { Message, MessageCode } from "./util/message"; import { Nub } from "./nub"; import { ParamDefinition, ParamDomain, ParamDomainValue } from "./param" @@ -60,12 +60,12 @@ class Interval extends Pair { checkValue(v: number) { if (v == undefined) { - let e = new ErrorMessage(ErrorCode.ERROR_INTERVAL_UNDEF); + let e = new Message(MessageCode.ERROR_INTERVAL_UNDEF); throw e; } if (!this.intervalHasValue(v)) { - let e = new ErrorMessage(ErrorCode.ERROR_INTERVAL_OUTSIDE); + let e = new Message(MessageCode.ERROR_INTERVAL_OUTSIDE); e.extraVar["value"] = v; e.extraVar["interval"] = this.toString(); throw e; @@ -101,7 +101,7 @@ class SearchInterval extends Interval { constructor(d: Dichotomie, min: number, max: number, s: number) { super(min, max); if (s == 0) { - let e = new ErrorMessage(ErrorCode.ERROR_DICHO_NULL_STEP); + let e = new Message(MessageCode.ERROR_DICHO_NULL_STEP); throw e; } this._step = s; @@ -114,7 +114,7 @@ class SearchInterval extends Interval { growStep(k: number) { if (k == 0) { - let e = new ErrorMessage(ErrorCode.ERROR_DICHO_INVALID_STEP_GROWTH); + let e = new Message(MessageCode.ERROR_DICHO_INVALID_STEP_GROWTH); throw e; } this._step *= k; @@ -363,7 +363,7 @@ export class Dichotomie extends Debug { // la valeur cible de la fonction est elle trouvable ? let m; - let res: ErrorMessage; + let res: Message; let errDomain = false; switch (prmDom.domain) { case ParamDomainValue.INTERVAL: @@ -385,7 +385,7 @@ export class Dichotomie extends Debug { } if (errDomain) { - res = new ErrorMessage(ErrorCode.ERROR_DICHO_INIT_DOMAIN); + res = new Message(MessageCode.ERROR_DICHO_INIT_DOMAIN); res.extraVar["targetSymbol"] = this.analyticalSymbol; // symbole de la variable calculée par la fonction res.extraVar["targetValue"] = rTarget; // valeur cible pour la fonction res.extraVar["variableInterval"] = intMax.toString(); // intervalle de valeurs pour la variable d'entrée de la fonction @@ -394,9 +394,9 @@ export class Dichotomie extends Debug { else { // if (intSearch.step < 0) if (BoolIdentity(initTarget > rTarget, inc)) - res = new ErrorMessage(ErrorCode.ERROR_DICHO_INITVALUE_HIGH); + res = new Message(MessageCode.ERROR_DICHO_INITVALUE_HIGH); else - res = new ErrorMessage(ErrorCode.ERROR_DICHO_INITVALUE_LOW); + res = new Message(MessageCode.ERROR_DICHO_INITVALUE_LOW); res.extraVar["variableSymbol"] = this._paramX.symbol; // symbole de la variable de la fonction res.extraVar["variableInitValue"] = rInit; // valeur initiale de la variable diff --git a/src/error_messages.en.json b/src/error_messages.en.json deleted file mode 100644 index e5306844dce4077bf5bc8d366694e59c4959704c..0000000000000000000000000000000000000000 --- a/src/error_messages.en.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "ERROR_DICHO_INIT_DOMAIN": "Dichotomy : target %targetSymbol%=%targetValue% does not exist for variable %variableSymbol% valued in interval %variableInterval%", - "ERROR_DICHO_INITVALUE_LOW": "Dichotomy : initial value %variableSymbol%=%variableInitValue% is too low (target is %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)", - "ERROR_DICHO_INITVALUE_HIGH": "Dichotomy : initial value %variableSymbol%=%variableInitValue% is too high (target is %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)", - "ERROR_DICHO_NULL_STEP": "Dichotomy (initial interval search) : invalid null step", - "ERROR_DICHO_INVALID_STEP_GROWTH": "Dichotomy (initial interval search) : invalid null step growth", - "ERROR_DICHO_FUNCTION_VARIATION": "unable to determinate function direction of variation", - "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "invalid %minValue%/%maxValue% min/max boundaries for 'interval' parameter definition domain", - "ERROR_PARAMDEF_CALC_UNDEFINED": "calculability of '%symbol%' parameter is undefined", - "ERROR_PARAMDEF_VALUE_UNDEFINED": "value of '%symbol%' parameter is undefined", - "ERROR_PARAMDEF_VALUE_FIXED": "value of '%symbol%' parameter cannot be changed", - "ERROR_PARAMDEF_VALUE_POS": "value %value% of '%symbol%' parameter is invalid (cannot be <=0)", - "ERROR_PARAMDEF_VALUE_POSNULL": "value %value% of '%symbol%' parameter is invalid (cannot be <0)", - "ERROR_PARAMDEF_VALUE_NULL": "value of '%symbol%' parameter cannot be 0", - "ERROR_PARAMDEF_VALUE_INTERVAL": "parameter '%symbol%' : value %value% is out of [%minValue%, %maxValue%] interval", - "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%' : non supported '%domain%' definition domain", - "ERROR_INTERVAL_UNDEF": "Interval : invalid 'undefined' value", - "ERROR_INTERVAL_OUTSIDE": "Interval : value %value% is outside of %interval", - "ERROR_LANG_UNSUPPORTED": "internationalisation : unsupported '%locale%' locale", - "ERROR_REMOUS_ARRET_CRITIQUE": "Calculation stopped: critical elevation reached at abscissa %x%", - "ERROR_REMOUS_CALCUL_FLUVIAL": "Downstream boundary condition >= Critical elevation : calculation of subcritical part from downstream", - "ERROR_REMOUS_CALCUL_TORRENTIEL": "Uptream boundary condition <= Critical elevation : calculation of supercritical part from upstream", - "ERROR_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m", - "ERROR_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m", - "ERROR_REMOUS_H_CRITIQUE": "Width at embankment level = %Yc% m", - "ERROR_REMOUS_H_NORMALE": "Normal water level = %Yn% m", - "ERROR_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin and %xmax m", - "ERROR_REMOUS_PENTE_FORTE": "The water line slope is too steep at abscissa %x m (the discretisation step should be reduced)", - "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Downstream boundary condition < Critical elevation : no possible calculation from downstream", - "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Upstream boundary condition < Critical elevation : no possible calculation from upstream" -} \ No newline at end of file diff --git a/src/error_messages.fr.json b/src/error_messages.fr.json deleted file mode 100644 index f1f6878f3d0590389e707d1ea799e25c163c0897..0000000000000000000000000000000000000000 --- a/src/error_messages.fr.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "ERROR_DICHO_INIT_DOMAIN": "Dichotomie : la valeur cible %targetSymbol%=%targetValue% n'existe pas pour la variable %variableSymbol% prise dans l'intervalle %variableInterval%", - "ERROR_DICHO_INITVALUE_LOW": "Dichotomie : la valeur initiale %variableSymbol%=%variableInitValue% est trop petite (la valeur cible est %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)", - "ERROR_DICHO_INITVALUE_HIGH": "Dichotomie : la valeur initiale %variableSymbol%=%variableInitValue% est trop grande (la valeur cible est %targetSymbol%=%targetValue%, %targetSymbol%(%variableSymbol%=%variableInitValue%)=%initTarget%)", - "ERROR_DICHO_NULL_STEP": "Dichotomie : le pas pour la recherche de l'intervalle de départ ne devrait pas être nul", - "ERROR_DICHO_INVALID_STEP_GROWTH": "Dichotomie : l'augmentation du pas pour la recherche de l'intervalle de départ est incorrecte (=0)", - "ERROR_DICHO_FUNCTION_VARIATION": "Dichotomie : impossible de determiner le sens de variation de la fonction", - "ERROR_PARAMDOMAIN_INTERVAL_BOUNDS": "Les bornes (%minValue%/%maxValue%) de l'intervalle sont incorrectes", - "ERROR_PARAMDEF_CALC_UNDEFINED": "La calculabilité du paramètre %symbol% n'est pas définie", - "ERROR_PARAMDEF_VALUE_UNDEFINED": "La valeur du paramètre %symbol% n'est pas définie", - "ERROR_PARAMDEF_VALUE_FIXED": "La valeur du paramètre %symbol% ne peut pas être changée", - "ERROR_PARAMDEF_VALUE_POS": "La valeur %value% du paramètre '%symbol%' est incorrecte (<=0)", - "ERROR_PARAMDEF_VALUE_POSNULL": "La valeur %value% du paramètre '%symbol%' est incorrecte (<0)", - "ERROR_PARAMDEF_VALUE_NULL": "La valeur du paramètre '%symbol%' ne peut pas être nulle", - "ERROR_PARAMDEF_VALUE_INTERVAL": "Paramètre '%symbol%' : la valeur %value% est en dehors de l'intervalle [%minValue%, %maxValue%]", - "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%' : le domaine de définition '%domain%' est incorrect", - "ERROR_INTERVAL_UNDEF": "Interval : valeur 'undefined' incorrecte", - "ERROR_INTERVAL_OUTSIDE": "Interval : la valeur %value% est hors de l'intervalle %interval", - "ERROR_LANG_UNSUPPORTED": "Internationalisation : locale '%locale%' non prise en charge", - "ERROR_REMOUS_ARRET_CRITIQUE": "Arrêt du calcul : hauteur critique atteinte à l'abscisse %x%", - "ERROR_REMOUS_CALCUL_FLUVIAL": "Condition limite aval >= Hauteur critique: calcul de la partie fluviale à partir de l'aval", - "ERROR_REMOUS_CALCUL_TORRENTIEL": "Condition limite amont <= Hauteur critique: calcul de la partie torrentielle à partir de l'amont", - "ERROR_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m", - "ERROR_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m", - "ERROR_REMOUS_H_CRITIQUE": "Tirant d'eau critique = %Yc% m", - "ERROR_REMOUS_H_NORMALE": "Tirant d'eau normal = %Yn% m", - "ERROR_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin et %xmax m", - "ERROR_REMOUS_PENTE_FORTE": "La pente de la ligne d'eau est trop forte à l'abscisse %x m (il faudrait réduire le pas de discrétisation)", - "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Condition limite aval < Hauteur critique: pas de calcul possible depuis l'aval", - "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Condition limite amont > Hauteur critique : pas de calcul possible depuis l'amont" -} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index fd917ff2d315cffe99e5f530646912e3d65b7860..71662d2b6467c27d3c37b42adce992a27dbe0aae 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,5 +14,5 @@ export * from './section/section_circulaire'; export * from './section/section_puissance'; export * from './util/definedvalue'; export * from './util/numericalstring'; -export * from './util/error'; +export * from './util/message'; export * from './util/log'; diff --git a/src/param.ts b/src/param.ts index 1da96e1594d9eb83cf8e7936e1b321afd03b61b6..4fbf6b9715f111d8d62dfff331c1f824147a598c 100644 --- a/src/param.ts +++ b/src/param.ts @@ -1,7 +1,7 @@ // import { Debug, UndefinedError } from './base'; import { Debug } from './base'; import { DefinedNumber } from './util/definedvalue'; -import { ErrorMessage, ErrorCode } from './util/error'; +import { Message, MessageCode } from "./util/message"; /** * domaine de définition du paramètre @@ -53,7 +53,7 @@ export class ParamDomain { case ParamDomainValue.INTERVAL: if (min == undefined || max == undefined || min > max) { // throw "invalid " + min + "/" + max + " min/max boundaries for 'interval' parameter definition domain" - let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS); + let e: Message = new Message(MessageCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS); e.extraVar["minValue"] = min; e.extraVar["maxValue"] = max; throw e; @@ -63,7 +63,7 @@ export class ParamDomain { default: // en dehors du cas INTERVAL, on ne doit pas fournir de valeur if (min != undefined || max != undefined) { - let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS); + let e: Message = new Message(MessageCode.ERROR_PARAMDOMAIN_INTERVAL_BOUNDS); e.extraVar["minValue"] = min; e.extraVar["maxValue"] = max; throw e; @@ -87,7 +87,7 @@ export class ParamDomain { public static getDefaultBounds(d: ParamDomainValue): { min: number, max: number } { switch (d) { case ParamDomainValue.INTERVAL: - let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INVALID); + let e: Message = new Message(MessageCode.ERROR_PARAMDOMAIN_INVALID); throw e; case ParamDomainValue.ANY: @@ -229,7 +229,7 @@ export class ParamDefinition extends DefinedNumber { get calculability(): ParamCalculability { if (this._calc == undefined) { // throw "value of parameter '" + this._symbol + "' calculability is not defined"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_CALC_UNDEFINED); + let e = new Message(MessageCode.ERROR_PARAMDEF_CALC_UNDEFINED); e.extraVar["symbol"] = this.symbol; throw e; } @@ -248,7 +248,7 @@ export class ParamDefinition extends DefinedNumber { // if (this._value == undefined) if (!this.isDefined) { // throw new UndefinedError("value of '" + this._symbol + "' parameter is not defined"); - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_UNDEFINED); + let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_UNDEFINED); e.extraVar["symbol"] = this.symbol; throw e; } @@ -262,7 +262,7 @@ export class ParamDefinition extends DefinedNumber { if (this.calculability == ParamCalculability.NONE) { // throw "value of '" + this._symbol + "' parameter cannot be changed"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_FIXED); + let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_FIXED); e.extraVar["symbol"] = this.symbol; throw e; } @@ -287,7 +287,7 @@ export class ParamDefinition extends DefinedNumber { case ParamDomainValue.POS: if (v <= 0) { // throw "parameter '" + this._symbol + "' : invalid " + v + " value (cannot be <=0)"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_POS); + let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_POS); e.extraVar["symbol"] = this.symbol; e.extraVar["value"] = v; throw e; @@ -297,7 +297,7 @@ export class ParamDefinition extends DefinedNumber { case ParamDomainValue.POS_NULL: if (v < 0) { // throw "parameter '" + this._symbol + "' : invalid " + v + " value (cannot be <0)"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_POSNULL); + let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_POSNULL); e.extraVar["symbol"] = this.symbol; e.extraVar["value"] = v; throw e; @@ -307,7 +307,7 @@ export class ParamDefinition extends DefinedNumber { case ParamDomainValue.NOT_NULL: if (v == 0) { // throw "parameter '" + this._symbol + "' : value cannot be 0"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_NULL); + let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_NULL); e.extraVar["symbol"] = this.symbol; throw e; } @@ -318,7 +318,7 @@ export class ParamDefinition extends DefinedNumber { let max = this._domain.maxValue; if (v < min || v > max) { // throw "parameter '" + this._symbol + "' : value " + v + " is out of [" + min + ", " + max + "] interval"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_INTERVAL); + let e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_INTERVAL); e.extraVar["symbol"] = this.symbol; e.extraVar["value"] = v; e.extraVar["minValue"] = min; @@ -329,7 +329,7 @@ export class ParamDefinition extends DefinedNumber { default: //throw "parameter '" + this._symbol + "' : non supported '" + sDomain + "' definition domain"; - let e = new ErrorMessage(ErrorCode.ERROR_PARAMDOMAIN_INVALID); + let e = new Message(MessageCode.ERROR_PARAMDOMAIN_INVALID); e.extraVar["symbol"] = this.symbol; e.extraVar["domain"] = sDomain; throw e; diff --git a/src/parameters.ts b/src/parameters.ts index 7406cd4f039c81f99f96d5fd0d7f4349e5216cb4..6ac00df8d2d92e77a4bba31d5ff2c13bf7ad0499 100644 --- a/src/parameters.ts +++ b/src/parameters.ts @@ -40,7 +40,7 @@ export class ComputeNodeParameters { { let cn = new ParamsSectionTrapez(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined); - let n = new cSnTrapez(undefined, cn); // pour initialiser la calculabilité des paramètres + let n = new cSnTrapez(cn); // pour initialiser la calculabilité des paramètres return cn; } @@ -48,7 +48,7 @@ export class ComputeNodeParameters { { let cn = new ParamsSectionRectang(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined); - let n = new cSnRectang(undefined, cn); // pour initialiser la calculabilité des paramètres + let n = new cSnRectang(cn); // pour initialiser la calculabilité des paramètres return cn; } @@ -56,7 +56,7 @@ export class ComputeNodeParameters { { let cn = new ParamsSectionCirc(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined); - let n = new cSnCirc(undefined, cn); // pour initialiser la calculabilité des paramètres + let n = new cSnCirc(cn); // pour initialiser la calculabilité des paramètres return cn; } @@ -64,7 +64,7 @@ export class ComputeNodeParameters { { let cn = new ParamsSectionPuiss(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined); - let n = new cSnPuiss(undefined, cn); // pour initialiser la calculabilité des paramètres + let n = new cSnPuiss(cn); // pour initialiser la calculabilité des paramètres return cn; } @@ -74,7 +74,7 @@ export class ComputeNodeParameters { undefined, undefined, undefined, undefined, undefined, ComputeNodeType.RegimeUniformeTrapeze, ComputeNodeType.RegimeUniforme); - let n = new cSnTrapez(undefined, cn); + let n = new cSnTrapez(cn); let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres return cn; } @@ -84,7 +84,7 @@ export class ComputeNodeParameters { let cn = new ParamsSectionRectang(undefined, undefined, undefined, undefined, undefined, undefined, undefined, ComputeNodeType.RegimeUniforme); - let n = new cSnRectang(undefined, cn); + let n = new cSnRectang(cn); let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres return cn; } @@ -95,7 +95,7 @@ export class ComputeNodeParameters { undefined, undefined, undefined, undefined, ComputeNodeType.RegimeUniformeCercle, ComputeNodeType.RegimeUniforme); - let n = new cSnCirc(undefined, cn); + let n = new cSnCirc(cn); let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres return cn; } @@ -106,7 +106,7 @@ export class ComputeNodeParameters { undefined, undefined, undefined, undefined, undefined, ComputeNodeType.RegimeUniformePuissance, ComputeNodeType.RegimeUniforme); - let n = new cSnPuiss(undefined, cn); + let n = new cSnPuiss(cn); let ru = new RegimeUniforme(n); // pour initialiser la calculabilité des paramètres return cn; } @@ -117,9 +117,9 @@ export class ComputeNodeParameters { 0.001, 1, ComputeNodeType.CourbeRemousCercle, ComputeNodeType.CourbeRemous); - let n = new cSnCirc(undefined, cn); + let n = new cSnCirc(cn); let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined); - let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres + let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres return crp } @@ -129,9 +129,9 @@ export class ComputeNodeParameters { undefined, 0.001, 1, ComputeNodeType.CourbeRemousPuissance, ComputeNodeType.CourbeRemous); - let n = new cSnPuiss(undefined, cn); + let n = new cSnPuiss(cn); let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined); - let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres + let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres return crp; } @@ -140,9 +140,9 @@ export class ComputeNodeParameters { let cn = new ParamsSectionRectang(undefined, 1, undefined, 1, undefined, 0.001, 1, ComputeNodeType.CourbeRemous); - let n = new cSnRectang(undefined, cn); + let n = new cSnRectang(cn); let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined); - let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres + let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres return crp; } @@ -152,9 +152,9 @@ export class ComputeNodeParameters { undefined, 0.001, 1, ComputeNodeType.CourbeRemousTrapeze, ComputeNodeType.CourbeRemous); - let n = new cSnTrapez(undefined, cn); + let n = new cSnTrapez(cn); let crp = new CourbeRemousParams(n, undefined, undefined, undefined, undefined, undefined); - let ru = new CourbeRemous(crp, undefined); // pour initialiser la calculabilité des paramètres + let ru = new CourbeRemous(crp); // pour initialiser la calculabilité des paramètres return crp; } diff --git a/src/remous.ts b/src/remous.ts index bf6210e49e07fcaca95155717925d077b8dc2a6f..3df80f2727b25f2d226e9d153f6cf0aeeff36252 100644 --- a/src/remous.ts +++ b/src/remous.ts @@ -3,7 +3,7 @@ import { XOR, Result, round } from "./base"; import { ParamsEquation, ParamDefinition, ParamCalculability, ComputeNodeType, ParamDomainValue } from "./param"; import { Dichotomie } from "./dichotomie"; import { Nub } from "./nub"; -import { ErrorCode, ErrorMessage } from "./util/error"; +import { Message, MessageCode } from "./util/message"; import { cLog } from "./util/log"; export enum MethodeResolution { @@ -100,8 +100,6 @@ export class CourbeRemous extends Nub { private _debugDicho: boolean = false; - private static DBG: boolean = false; /// Pour loguer les messages de debug de cette classe - /** * Journal de calcul */ @@ -114,13 +112,17 @@ export class CourbeRemous extends Nub { */ private Dx: number; - constructor(crp: CourbeRemousParams, log: cLog) { - super(crp, CourbeRemous.DBG); - this._log = log; + constructor(crp: CourbeRemousParams, dbg: boolean = false) { + super(crp, dbg); + this._log = crp.Sn.log; this.prmSect = crp.Sn.prms; this.Sn.Calc("Yc"); } + public get log() { + return this._log; + } + private get Sn(): acSection { return this.prms.Sn; } @@ -167,7 +169,7 @@ export class CourbeRemous extends Nub { // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau let Y2 = Y + this.Dx * this.Calc_dYdX(Y); if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique))) - return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); + return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)); return new Result(Y2); } @@ -188,21 +190,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 new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); + return new Result(undefined, new Message(MessageCode.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 new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); + return new Result(undefined, new Message(MessageCode.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 new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); + return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)); //$rk4 = $this ->Calc_dYdX($Y + $rDx * $rk3); let k4 = this.Calc_dYdX(Y + Dx * k3); @@ -212,7 +214,7 @@ export class CourbeRemous extends Nub { //if ($this ->rDx > 0 xor !($Yout < $this ->oSect ->rHautCritique)) { return false; } if (XOR(Dx > 0, !(Yout < hc))) - return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); + return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)); return new Result(Yout); } @@ -252,13 +254,13 @@ export class CourbeRemous extends Nub { let r: Result = Dicho.Dichotomie(Trapez_Fn, this.prmSect.Prec.v, Y); // if ($flag < 0) { - if (r.code != ErrorCode.ERROR_OK) + if (r.code != MessageCode.ERROR_OK) return r; let Y2 = r.vCalc; // } elseif($this ->rDx > 0 xor !($Y2 < $this ->oSect ->rHautCritique)) { if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique))) - return new Result(undefined, new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE)); + return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE)); return new Result(Y2); } @@ -335,7 +337,7 @@ export class CourbeRemous extends Nub { // this.debug("end trY " + this.last(trY)); // this.debug("Yn " + this.Sn.HautNormale); - if (rY.code == ErrorCode.ERROR_OK) { + if (rY.code == MessageCode.ERROR_OK) { // on vérifie qu'on ne traverse pas la hauteur normale (à la précision de calcul près) let prec: number = this.prms.map.Prec.v; let b1: boolean = lastY - this.Sn.HautNormale > prec; @@ -343,14 +345,14 @@ export class CourbeRemous extends Nub { if (XOR(b1, b2)) { this.debug("La pente de la ligne d'eau est trop forte à l'abscisse " + x + " m (Il faudrait réduire le pas de discrétisation)"); - let m: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_REMOUS_PENTE_FORTE); + let m: Message = new Message(MessageCode.ERROR_REMOUS_PENTE_FORTE); m.extraVar["x"] = x; this._log.add(m); } trY[round(x, this.prmSect.iPrec.v)] = rY.vCalc; } else { - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_ARRET_CRITIQUE); + let m = new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE); m.extraVar["x"] = x; this._log.add(m); this.debug("Arrêt du calcul : Hauteur critique atteinte à l'abscisse " + x + " m"); @@ -390,6 +392,50 @@ export class CourbeRemous extends Nub { } } + /** + * calcul de la ligne fluviale depuis l'aval (si possible) + */ + public calculFluvial() { + let res: { [key: number]: number; } = {}; + + // Calcul depuis l'aval + if (this.Sn.HautCritique <= this.prms.Yaval.v) { + this._log.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_FLUVIAL)); + + this.debug("Condition limite aval (" + this.prms.Yaval.v + ") >= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie fluviale à partir de l'aval"); + this.Dx = this.prms.Dx.v; + res = this.calcul(this.prms.Yaval.v); + } + else { + this.debug("Condition limite aval (" + this.prms.Yaval.v + ") < Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'aval"); + this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); + } + + return res; + } + + /** + * calcul de la ligne torrentielle depuis l'amont (si possible) + */ + public calculTorrentiel() { + let res: { [key: number]: number; } = {}; + + // Calcul depuis l'amont + if (this.Sn.HautCritique >= this.prms.Yamont.v) { + this._log.add(new Message(MessageCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); + + this.debug("Condition limite amont (" + this.prms.Yamont.v + ") <= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie torrentielle à partir de l'amont"); + this.Dx = -this.prms.Dx.v; + res = this.calcul(this.prms.Yamont.v); + } + else { + this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); + this.debug("Condition limite amont (" + this.prms.Yamont.v + ") > Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'amont"); + } + + return res; + } + /** * @param val_a_cal nom de la variable à calculer */ @@ -397,20 +443,21 @@ export class CourbeRemous extends Nub { "flu": { [key: number]: number; }, "tor": { [key: number]: number; }, "trX": string[], - "tRes": number[] + "tRes": { [key: number]: number } } { let Yc: number = this.Sn.Calc("Yc"); - let m: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_REMOUS_LARGEUR_BERGE); - m.extraVar["B"] = this.Sn.Calc("B"); + let m: Message = new Message(MessageCode.ERROR_REMOUS_LARGEUR_BERGE); + m.extraVar["B"] = this.Sn.Calc("B", this.Sn.prms.YB.v); this._log.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_CRITIQUE); + m = new Message(MessageCode.ERROR_REMOUS_H_CRITIQUE); m.extraVar["Yc"] = Yc; this._log.add(m); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_H_NORMALE); - m.extraVar["Yn"] = this.Sn.Calc("Yn"); + let Yn = this.Sn.Calc("Yn"); + m = new Message(MessageCode.ERROR_REMOUS_H_NORMALE); + m.extraVar["Yn"] = Yn; this._log.add(m); this.debug("largeur berge " + this.Sn.Calc("B")); @@ -419,59 +466,43 @@ export class CourbeRemous extends Nub { this.debug("hauteur normale " + this.Sn.HautNormale); // Calcul des courbes de remous - let crbFlu: { [key: number]: number; } = undefined; - let crbTor: { [key: number]: number; } = undefined; + let crbFlu: { [key: number]: number; } = this.calculFluvial(); + let crbTor: { [key: number]: number; } = this.calculTorrentiel(); //this.debug("HautCritique ", this.Sn.HautCritique); - // Calcul depuis l'aval - if (this.Sn.HautCritique <= this.prms.Yaval.v) { - this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_FLUVIAL)); - - this.debug("Condition limite aval (" + this.prms.Yaval.v + ") >= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie fluviale à partir de l'aval"); - this.Dx = this.prms.Dx.v; - crbFlu = this.calcul(this.prms.Yaval.v); - } - else { - this.debug("Condition limite aval (" + this.prms.Yaval.v + ") < Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'aval"); - this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL)); - } - this.debug("flu "); // this.logObject(crbFlu); this.debug(JSON.stringify(crbFlu)); - // Calcul depuis l'amont - if (this.Sn.HautCritique >= this.prms.Yamont.v) { - this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_CALCUL_TORRENTIEL)); - - this.debug("Condition limite amont (" + this.prms.Yamont.v + ") <= Hauteur critique (" + this.Sn.HautCritique + ") : calcul de la partie torrentielle à partir de l'amont"); - this.Dx = -this.prms.Dx.v; - crbTor = this.calcul(this.prms.Yamont.v); - } - else { - this._log.add(new ErrorMessage(ErrorCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); - this.debug("Condition limite amont (" + this.prms.Yamont.v + ") > Hauteur critique (" + this.Sn.HautCritique + ") : pas de calcul possible depuis l'amont"); - } - this.debug("tor"); // this.logObject(crbTor); this.debug(JSON.stringify(crbTor)); + for (let xflu in crbFlu) { + let yflu = crbFlu[xflu]; + this.debug("imp x " + xflu + " flu " + this.Sn.Calc('Imp', yflu)); + } + + for (let xtor in crbTor) { + let ytor = crbTor[xtor]; + this.debug("imp x " + xtor + " tor " + this.Sn.Calc('Imp', ytor)); + } + // Détection du ressaut hydraulique let nFlu: number = this.size(crbFlu); let nTor: number = this.size(crbTor); if (nFlu != 0 && nTor != 0) { - let xMaxFlu = crbFlu[0]; - let xMaxTor = this.last(crbTor); - // this.debug("end flu " + xMaxFlu); - // this.debug("end tor " + xMaxTor); + let firstYFlu = crbFlu[0]; + let lastYTor = this.last(crbTor); + // this.debug("end flu " + firstYFlu); + // this.debug("end tor " + lastYTor); // this.debug("nFlu " + nFlu); // this.debug("nTor " + nTor); - // this.debug("Imp flu " + this.Sn.Calc('Imp', xMaxFlu)); - // this.debug("Imp tor " + this.Sn.Calc('Imp', xMaxTor)); - // if (nFlu > nTor || (nFlu == nTor && this.Sn.Calc('Imp', this.last(crbFlu)) > this.Sn.Calc('Imp', this.last(crbTor)))) { - if (nFlu > nTor || (nFlu == nTor && this.Sn.Calc('Imp', xMaxFlu) > this.Sn.Calc('Imp', xMaxTor))) { + // this.debug("Imp flu " + this.Sn.Calc('Imp', firstYFlu)); + // this.debug("Imp tor " + this.Sn.Calc('Imp', lastYTor)); + + if (nFlu > nTor || (nFlu == nTor && Yn < Yc)) { // La courbe fluviale va jusqu'au bout var crbComplete = crbFlu; // courbe calculée sur tout le bief var crbPartielle = crbTor; // courbe calculée sur une partie seulement du bief @@ -497,13 +528,13 @@ export class CourbeRemous extends Nub { // Parcours des sections de la ligne d'eau la plus courte let trX: string[] = Object.keys(crbPartielle); - if (iSens == -1) + if (iSens == -1) // tri dans l'ordre croissant trX.sort((a, b) => { if (+a > +b) return 1; if (+a < +b) return -1; return 0; }); - else + else // tri dans l'ordre décroissant trX.sort((a, b) => { if (+a > +b) return -1; if (+a < +b) return 1; @@ -539,49 +570,41 @@ export class CourbeRemous extends Nub { xRst = round(xRst, this.prmSect.iPrec.v); // this.debug("xRst (arr)=" + xRst); + let impYpartielle = this.Sn.Calc('Imp', crbPartielle[rX]); + // this.debug("imp(Ypartiel[rX=" + rX + "]=" + crbPartielle[rX] + ")=" + impYpartielle); + 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])); + let impYcomplete = this.Sn.Calc('Imp', crbComplete[xRst]); + // this.debug("imp(Ycomplet[xRst=" + xRst + "]=" + crbComplete[xRst] + ")=" + impYcomplete); - // if (iSens == 1 ? Yco > Ydec : Yco < Ydec) { - if (Yco > Ydec) { + if (impYpartielle > impYcomplete) { this.debug("Ressaut hydraulique détecté entre les abscisses " + Math.min(rX, xRst) + " et " + Math.max(rX, xRst)); - m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_HYDRO); + m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_HYDRO); m.extraVar["xmin"] = Math.min(rX, xRst); m.extraVar["xmax"] = Math.max(rX, xRst); this._log.add(m); // this.debug("rX=" + rX + " xRst=" + xRst); - // Modification de la ligne d'eau CC + // Modification de la ligne d'eau complète for (let pi of trXr) { let rXCC: number = +pi; // this.debug("rXCC=" + rXCC); - if (iSens * (rXCC - rX) < 0) { + if (iSens * (rXCC - rX) <= 0) { delete crbComplete[rXCC]; - this.debug("Modification de la ligne d'eau complète : suppression de la valeur à rX=" + rXCC); - } else if (rXCC == rX) { - this.debug("Modification de la ligne d'eau complète : valeur " + crbComplete[rXCC] + " remplacée par " + crbPartielle[rXCC] + " à rX=" + rXCC); - crbComplete[rXCC] = crbPartielle[rXCC]; - this.debug("Fin de la modification de la ligne d'eau complète"); - break; + this.debug("Modification de la ligne d'eau complète : suppression de la valeur à rXCC=" + rXCC + ", rX=" + rX + ", iSens*(rXCC-rX)=" + (iSens * (rXCC - rX))); } } - // Modification de la ligne d'eau CN + // Modification de la ligne d'eau partielle for (let xcn of trX) { let rXCN = +xcn; // this.debug("rXCN=" + rXCN); - if (iSens * (rXCN - xRst) > 0) { + if (iSens * (rXCN - xRst) >= 0) { this.debug("Modification de la ligne d'eau partielle : suppression de la valeur à rX=" + rXCN); delete crbPartielle[rXCN]; - } else if (rXCN == xRst) { - this.debug("Modification de la ligne d'eau partielle : valeur " + crbPartielle[rXCN] + " remplacée par " + crbComplete[rXCN] + " à rX=" + rXCN); - crbPartielle[rXCN] = crbComplete[rXCN]; - this.debug("Fin de la modification de la ligne d'eau partielle"); - break; } } bRessaut = true; @@ -591,7 +614,7 @@ export class CourbeRemous extends Nub { } if (!bRessaut) { // Le ressaut est en dehors du canal - let m = new ErrorMessage(ErrorCode.ERROR_REMOUS_RESSAUT_DEHORS); + let m = new Message(MessageCode.ERROR_REMOUS_RESSAUT_DEHORS); m.extraVar["sens"] = sSens; m.extraVar["x"] = +this.last(trX); this._log.add(m); @@ -640,23 +663,28 @@ export class CourbeRemous extends Nub { // Calcul de la variable à calculer - let tRes: number[] = []; + let tRes: { [key: number]: number } = {}; if (val_a_cal != undefined && nFlu != 0 && nTor != 0) { for (let rX of trX) { let rY = undefined; + let hasFlu: boolean = crbFlu[+rX] != undefined; + let hasTor: boolean = crbTor[+rX] != undefined; - if (crbFlu[+rX] != undefined && crbTor[+rX] == undefined) { + if (hasFlu && !hasTor) rY = crbFlu[+rX]; - } - if (crbTor[+rX] != undefined) { - if (crbFlu[+rX] == undefined || (crbFlu[+rX] != undefined && crbFlu[+rX] == crbTor[+rX])) { + + if (hasTor) + if (!hasFlu || (hasFlu && crbFlu[+rX] == crbTor[+rX])) rY = crbTor[+rX]; - } - if (rY != undefined) - tRes[+rX] = this.Sn.Calc(val_a_cal, rY); + if (rY != undefined) { + tRes[+rX] = this.Sn.Calc(val_a_cal, rY); + this.debug('X=' + rX + ' Calc(' + val_a_cal + ', Y=' + rY + ')=' + tRes[+rX]); } } + + this.debug("extra param " + val_a_cal); + this.logObject(tRes); } return { "flu": crbFlu, "tor": crbTor, "trX": trX, "tRes": tRes }; diff --git a/src/section/hauteur.ts b/src/section/hauteur.ts index 63d181c1dd7b170645fbee4bc5a8a73bafb2af3b..9a3faa0eac9f8eb35aa251a768a78a89d12a0f85 100644 --- a/src/section/hauteur.ts +++ b/src/section/hauteur.ts @@ -15,8 +15,8 @@ export class cHautCritique extends acNewton { * Constructeur de la classe * @param Sn Section sur laquelle on fait le calcul */ - constructor(Sn: acSection, dbg: boolean = false) { - super(Sn.prms, dbg); + constructor(Sn: acSection, maxIter: number, dbg: boolean = false) { + super(Sn.prms, maxIter, dbg); this.Sn = Sn.clone(); } @@ -77,8 +77,8 @@ export class cHautNormale extends acNewton { * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul */ - constructor(Sn: acSection, dbg: boolean = false) { - super(Sn.prms, dbg); + constructor(Sn: acSection, maxIter: number, dbg: boolean = false) { + super(Sn.prms, maxIter, dbg); this.Sn = Sn; this.Q = Sn.prms.Q.v; this.Ks = Sn.prms.Ks.v; @@ -135,8 +135,8 @@ export class cHautCorrespondante extends acNewton { * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul */ - constructor(Sn: acSection, dbg: boolean = false) { - super(Sn.prms, dbg); + constructor(Sn: acSection, maxIter: number, dbg: boolean = false) { + super(Sn.prms, maxIter, dbg); this.Y = Sn.prms.Y.v; this.rS2 = Math.pow(Sn.Calc("S"), -2); this.Sn = Sn; @@ -186,8 +186,8 @@ export class cHautConjuguee extends acNewton { * Constructeur de la classe * @param oSn Section sur laquelle on fait le calcul */ - constructor(oSn: acSection, dbg: boolean = false) { - super(oSn.prms, dbg); + constructor(oSn: acSection, maxIter: number, dbg: boolean = false) { + super(oSn.prms, maxIter, dbg); this.rQ2 = Math.pow(oSn.prms.Q.v, 2); this.Sn = oSn; this.rS = oSn.Calc("S"); diff --git a/src/section/newton.ts b/src/section/newton.ts index fd1d0813fa987e3a574850afef5dfde872fa5ecd..f3b76d66cac86dd9b5af65076b95d3497f23d211 100644 --- a/src/section/newton.ts +++ b/src/section/newton.ts @@ -4,8 +4,8 @@ import { cParamsCanal } from "./section_type" export abstract class acNewton extends Debug { protected rTol: number; protected Dx: number; - private iCpt = 0; - private readonly iCptMax = 50; + private iCpt: number = 0; + private iCptMax: number; private rRelax = 1; /// Coefficient de relaxation private rFnPrec = 0; /// Mémorisation du Fn précédent pour détecter le changement de signe private iOscil = 0; /// Nombre de changement de signe de Delta @@ -14,10 +14,11 @@ export abstract class acNewton extends Debug { * Constructeur de la classe * @param prms Paramètres supplémentaires (Débit, précision...) */ - constructor(prms: cParamsCanal, dbg: boolean = false) { + constructor(prms: cParamsCanal, maxIter: number, dbg: boolean = false) { super(dbg); this.rTol = prms.Prec.v; this.Dx = prms.Prec.v / 10; + this.iCptMax = maxIter; } /** @@ -92,4 +93,12 @@ export abstract class acNewton extends Debug { // Echec de la résolution return undefined; } + + /** + * Pour savoir si le Newton a convergé + * @return true si oui, false sinon + */ + public hasConverged(): boolean { + return this.iCpt < this.iCptMax; + } } \ No newline at end of file diff --git a/src/section/section_circulaire.ts b/src/section/section_circulaire.ts index d469a9be84bb727f5e1825bcae6e75dc31d7b294..a9814d6d64abd5ad3a15f3dad804523791786223 100644 --- a/src/section/section_circulaire.ts +++ b/src/section/section_circulaire.ts @@ -1,7 +1,7 @@ import { ComputeNodeType, ParamDefinition, ParamDomainValue, ParamCalculability } from "../param"; import { acSection, ParamsSection } from "./section_type"; import { cLog } from "../util/log"; -import { ErrorMessage, ErrorCode } from '../util/error'; +import { Message, MessageCode } from "../util/message"; export class ParamsSectionCirc extends ParamsSection { private _D: ParamDefinition; // Diamètre du cercle @@ -30,8 +30,8 @@ export class ParamsSectionCirc extends ParamsSection { export class cSnCirc extends acSection { protected nbDessinPoints = 50; - constructor(oLog: cLog, prms: ParamsSectionCirc, dbg: boolean = false) { - super(oLog, prms, dbg); + constructor(prms: ParamsSectionCirc, dbg: boolean = false) { + super(prms, dbg); // commenté car si D est la variable à déterminer, il peut valoir n'importe quoi... if (prms.YB.v > D) { prms.YB.v = D; } // On place la berge au sommet du cercle // if (this.prms.D.isDefined() && this.prms.YB.isDefined()) @@ -144,7 +144,7 @@ export class cSnCirc extends acSection { return res; } - let e: ErrorMessage = new ErrorMessage(ErrorCode.ERROR_PARAMDEF_VALUE_UNDEFINED); + let e: Message = new Message(MessageCode.ERROR_PARAMDEF_VALUE_UNDEFINED); e.extraVar["diameterValue"] = this.prms.D.isDefined ? String(this.prms.D.v) : "undefined"; e.extraVar["yValue"] = this.prms.Y.isDefined ? String(this.prms.Y.v) : "undefined"; throw e; diff --git a/src/section/section_puissance.ts b/src/section/section_puissance.ts index 9d734043444a5cc507509f1d5c6b2bb7218f8b7b..8105e14f5fe185e205e0ad743d768e62a6ce4e2c 100644 --- a/src/section/section_puissance.ts +++ b/src/section/section_puissance.ts @@ -1,6 +1,5 @@ import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability } from "../param"; import { acSection, ParamsSection } from "./section_type"; -import { cLog } from "../util/log"; /** * Paramètres de la section parabolique ou "puissance" @@ -31,8 +30,8 @@ export class ParamsSectionPuiss extends ParamsSection { export class cSnPuiss extends acSection { protected nbDessinPoints = 50; - constructor(oLog: cLog, prms: ParamsSectionPuiss, dbg: boolean = false) { - super(oLog, prms, dbg); + constructor(prms: ParamsSectionPuiss, dbg: boolean = false) { + super(prms, dbg); } protected setParametersCalculability() { diff --git a/src/section/section_rectang.ts b/src/section/section_rectang.ts index 94e8194c45a6f48ccb07de6b4a0f1c8d513a2c8d..67299a61ad8b4aa6d34a3e7a5212fe3e488a99a0 100644 --- a/src/section/section_rectang.ts +++ b/src/section/section_rectang.ts @@ -15,8 +15,8 @@ export class ParamsSectionRectang extends ParamsSection { * Calculs de la section rectangulaire */ export class cSnRectang extends acSection { - constructor(oLog: cLog, prms: ParamsSectionRectang, dbg: boolean = false) { - super(oLog, prms, dbg); + constructor(prms: ParamsSectionRectang, dbg: boolean = false) { + super(prms, dbg); } get prms(): ParamsSectionRectang { diff --git a/src/section/section_trapez.ts b/src/section/section_trapez.ts index cbe149dcdb42dfd8d855639cd801223580d671d3..4bf29e2ad2a460edbb987d954fefa481fa9f6da7 100644 --- a/src/section/section_trapez.ts +++ b/src/section/section_trapez.ts @@ -38,8 +38,8 @@ export class ParamsSectionTrapez extends ParamsSection { * Calculs de la section trapézoïdale */ export class cSnTrapez extends acSection { - constructor(oLog: cLog, prms: ParamsSectionTrapez, dbg: boolean = false) { - super(oLog, prms, dbg); + constructor(prms: ParamsSectionTrapez, dbg: boolean = false) { + super(prms, dbg); } protected setParametersCalculability() { diff --git a/src/section/section_type.ts b/src/section/section_type.ts index c898f5d8fd84bc0ff0a085a7170b39e391630b75..5a6a944f57db7700d756031c07652654db30298b 100644 --- a/src/section/section_type.ts +++ b/src/section/section_type.ts @@ -1,5 +1,6 @@ import { XOR } from "../base"; import { cLog } from "../util/log"; +import { MessageCode, Message } from "../util/message"; import { ComputeNodeType, ComputeNode, ParamDefinition, ParamDomainValue, ParamCalculability, ParamsEquation } from "../param"; import { cHautCritique, cHautNormale, cHautCorrespondante, cHautConjuguee } from "./hauteur"; @@ -149,18 +150,17 @@ export abstract class acSection extends ComputeNode { private Calc_old = {}; /// Mémorisation des données hydrauliques pour calcul intermédiaire /** - * Nombre de points nécessaires pour le dessin de la section (hors point de berge) - * Valeur de 1 par défaut pour les sections rectangulaires et trapézoïdales + * itérations max pour Newton */ - protected nbDessinPoints = 1; + private _newtonMaxIter: number = 50; /** * Construction de la classe. * Calcul des hauteurs normale et critique */ - constructor(oLog: cLog, prms: ParamsSection, dbg: boolean = false) { + constructor(prms: ParamsSection, dbg: boolean = false) { super(prms, dbg); - this.oLog = oLog; + this.oLog = new cLog(); // this._v = oP.v; // copie la référence au tableau // this.prms.Y.v = 0; @@ -188,6 +188,14 @@ export abstract class acSection extends ComputeNode { return Object.create(this); } + public set newtonMaxIter(n: number) { + this._newtonMaxIter = n; + } + + public get log(): cLog { + return this.oLog; + } + /** * Efface toutes les données calculées pour forcer le recalcul * @param bGeo Réinitialise les données de géométrie aussi @@ -500,8 +508,12 @@ export abstract class acSection extends ComputeNode { * @return tirant d'eau critique */ private Calc_Yc(): number { - var hautCritique = new cHautCritique(this, this.DBG); + let hautCritique = new cHautCritique(this, this._newtonMaxIter, this.DBG); this.HautCritique = hautCritique.Newton(this.prms.YB.v); + if (this.HautCritique == undefined || !hautCritique.hasConverged()) { + let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE); + this.oLog.add(m); + } return this.HautCritique; } @@ -511,11 +523,20 @@ export abstract class acSection extends ComputeNode { */ private Calc_Yn(): number { this.debug("in calc_Yn"); - if (this.prms.If.v <= 0) + if (this.prms.If.v <= 0) { + let m = new Message(MessageCode.ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF); + this.oLog.add(m); return undefined; + } + + let oHautNormale = new cHautNormale(this, this._newtonMaxIter, this.DBG); + let res = oHautNormale.Newton(this.CalcGeo("Yc")); + if (res == undefined || !oHautNormale.hasConverged()) { + let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE); + this.oLog.add(m); + } - var oHautNormale = new cHautNormale(this, this.DBG); - return oHautNormale.Newton(this.CalcGeo("Yc")); + return res; } /** @@ -526,8 +547,14 @@ export abstract class acSection extends ComputeNode { if (this.prms.Y.v > this.CalcGeo("Yc")) return this.prms.Y.v; - var oHautCorrespondante = new cHautCorrespondante(this, this.DBG); - return oHautCorrespondante.Newton(this.Calc("Yc") * 2); + var oHautCorrespondante = new cHautCorrespondante(this, this._newtonMaxIter, this.DBG); + let res = oHautCorrespondante.Newton(this.Calc("Yc") * 2); + if (res == undefined || !oHautCorrespondante.hasConverged()) { + let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU); + this.oLog.add(m); + } + + return res; } /** @@ -538,8 +565,14 @@ export abstract class acSection extends ComputeNode { if (this.prms.Y.v < this.CalcGeo("Yc")) return this.prms.Y.v; - var oHautCorrespondante = new cHautCorrespondante(this, this.DBG); - return oHautCorrespondante.Newton(this.CalcGeo("Yc") / 2); + var oHautCorrespondante = new cHautCorrespondante(this, this._newtonMaxIter, this.DBG); + let res = oHautCorrespondante.Newton(this.CalcGeo("Yc") / 2); + if (res == undefined || !oHautCorrespondante.hasConverged()) { + let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR); + this.oLog.add(m); + } + + return res; } /** @@ -548,7 +581,7 @@ export abstract class acSection extends ComputeNode { */ private Calc_Yco(): number { this.Swap(true); - var oHautConj = new cHautConjuguee(this, this.DBG); + var oHautConj = new cHautConjuguee(this, this._newtonMaxIter, this.DBG); // Choisir une valeur initiale du bon côté de la courbe if (this.Calc("Fr") < 1) { // Ecoulement fluvial, on cherche la conjuguée à partir du tirant d'eau torrentiel @@ -559,6 +592,11 @@ export abstract class acSection extends ComputeNode { Y0 = this.Calc("Yf"); } let Yco = oHautConj.Newton(Y0); + if (Yco == undefined || !oHautConj.hasConverged()) { + let m = new Message(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG); + this.oLog.add(m); + } + this.Swap(false); return Yco; } diff --git a/src/util/log.ts b/src/util/log.ts index 25001043d6c2385eab6f92659144679882cdb0f4..401fbc9c9dbcdfe364ee600a4994eab1e1cbce0e 100644 --- a/src/util/log.ts +++ b/src/util/log.ts @@ -1,9 +1,9 @@ -import { ErrorMessage } from "./error"; +import { Message, MessageCode } from "./message"; export class cLog { - private _messages: ErrorMessage[] = []; + private _messages: Message[] = []; - public add(m: ErrorMessage) { + public add(m: Message) { this._messages.push(m); } diff --git a/src/util/error.ts b/src/util/message.ts similarity index 71% rename from src/util/error.ts rename to src/util/message.ts index 79d568bda4b88a829f7982fc697b1b08afc3a671..a4ee532a837b1b54450f50e938a7ec690bd44021 100644 --- a/src/util/error.ts +++ b/src/util/message.ts @@ -1,4 +1,4 @@ -export enum ErrorCode { +export enum MessageCode { /** * pas de pb ! */ @@ -157,29 +157,77 @@ export enum ErrorCode { * courbe de remous : Condition limite amont > Hauteur critique : pas de calcul possible depuis l'amont */ ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT = -510, + + /** + * section : Non convergence du calcul de la hauteur critique (Méthode de Newton) + */ + ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE = -600, + + /** + * section : Non convergence du calcul de la hauteur normale (Méthode de Newton) + */ + ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE = -601, + + /** + * section : Non convergence du calcul de la hauteur conjuguée (Méthode de Newton) + */ + ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG = -602, + + /** + * section : Non convergence du calcul de la hauteur correspondante (Méthode de Newton) pour le calcul de la hauteur fluviale + */ + ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU = -603, + + /** + * section : Non convergence du calcul de la hauteur correspondante (Méthode de Newton) pour le calcul de la hauteur torrentielle + */ + ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR = -604, + + /** + * section : La pente est négative ou nulle, la hauteur normale est infinie + */ + ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF = -605, +} + +/** + * niveau de criticité du message + */ +export enum MessageSeverity { + ERROR, WARNING, INFO } /** * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...) */ -export class ErrorMessage { +export class Message { /** - * code d'erreur + * code du message */ - private _code: ErrorCode; + private _code: MessageCode; /** Variables intermédiaires, flags d'erreur */ - // public extraVar: {}; public extraVar: { [key: string]: any }; - constructor(c: ErrorCode) { + constructor(c: MessageCode) { this._code = c; this.extraVar = {} }; get code() { return this._code; } + /** + * retourne le niveau de criticité (erreur, warning, info) du message + */ + public getSeverity(): MessageSeverity { + let m: string = MessageCode[this._code]; + let prefix: string = m.split("_")[0]; + for (let s in MessageSeverity) // pas nécessaire, mais permet d'avoir un contrôle de validité + if (MessageSeverity[s] == prefix) + return eval("MessageSeverity." + prefix); + throw "Message.getSeverity() : valeur de code '" + this._code + "' invalide"; + } + public toString(): string { - return ErrorCode[this._code] + " " + JSON.stringify(this.extraVar); + return MessageCode[this._code] + " " + JSON.stringify(this.extraVar); } }