remous_rect_rk4_pentefaible.spec.ts 16.5 KB
Newer Older
1
import { MethodeResolution } from "../../src/remous/methode-resolution";
2
3
4
5
import { CourbeRemous } from "../../src/remous/remous";
import { CourbeRemousParams } from "../../src/remous/remous_params";
import { cSnRectang } from "../../src/section/section_rectang";
import { ParamsSectionRectang } from "../../src/section/section_rectang_params";
6
import { SessionSettings } from "../../src/session_settings";
7
8
import { cLog } from "../../src/util/log";
import { Message, MessageCode } from "../../src/util/message";
9
import { precDist } from "../test_config";
10
import { compareExtraResult, compareLog, extraResultLength } from "../test_func";
11

12
13
14
15
16
17
/*
  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
*/
18

19
20
describe("Class Remous / section rectangulaire :", () => {
    describe("méthode Runge-Kutta ordre 4 :", () => {
21
        it("faible pente, ressaut avant l'amont", () => {
22
            const prms = new ParamsSectionRectang(undefined, // tirant d'eau
23
24
25
26
                2.5, // largeur de fond
                40, //  Ks=Strickler
                2, // Q=Débit
                0.001, // If=pente du fond
27
                1, // YB=hauteur de berge
28
            );
29
            SessionSettings.precision = precDist;
30

31
            const sect = new cSnRectang(prms);
32

33
            const prem = new CourbeRemousParams(100.4, 100.41, 100.1, 100,
34
35
                100,  // Long= Longueur du bief
                5,  // Dx=Pas d'espace
36
37
            );

38
            const rem = new CourbeRemous(sect, prem, MethodeResolution.RungeKutta4);
39

40
            const res = rem.calculRemous(undefined);
41
42
43

            // données de validation : version PHP (Oct 2017) méthode RungeKutta4

44
            const f: any = {
45
46
47
                100.000: 0.41, 95.000: 0.876, 90.000: 0.877, 85.000: 0.879, 80.000: 0.88, 75.000: 0.881,
                70.000: 0.883, 65.000: 0.884, 60.000: 0.885, 55.000: 0.886, 50.000: 0.888, 45.000: 0.889,
                40.000: 0.89, 35.000: 0.891, 30.000: 0.892, 25.000: 0.893, 20.000: 0.894, 15.000: 0.895,
48
49
                10.000: 0.896, 5.000: 0.897, 0.000: 0.898
            };
50
51
52
53
            // màj pour jalhyd#146 : ajout de la cote de fond aux valeurs attendues
            for (const fk of Object.keys(f)) {
                f[fk] = f[fk] + rem.getCoteFond(Number(fk));
            }
54
            // compareObject("Yfluvial", res.getValue("flu"), f, 0.03);
55
            compareExtraResult("Yfluvial", res, "flu", f, 0.03);
56

57
            const t = {};
58
            // compareObject("Ytorrentiel", res.getValue("tor"), t, 0.03);
59
            compareExtraResult("Ytorrentiel", res, "tor", t, 0.03);
60

61
62
            // const 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];
63
            // compareArray("abscisses", res.getValue("trX"), x);
64

65
            const expLog = new cLog();
66

67
            let m = new Message(MessageCode.INFO_REMOUS_H_CRITIQUE);
68
            m.extraVar.Yc = 0.403;
69
70
            expLog.add(m);

71
            m = new Message(MessageCode.INFO_REMOUS_H_NORMALE);
72
            m.extraVar.Yn = 0.953;
73
74
            expLog.add(m);

75
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
76

77
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
78

79
            m = new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE);
80
            m.extraVar.x = 5;
81
82
            expLog.add(m);

83
            m = new Message(MessageCode.INFO_REMOUS_RESSAUT_DEHORS);
84
85
            m.extraVar.sens = "amont";
            m.extraVar.x = 0;
86
87
            expLog.add(m);

88
            compareLog(res.globalLog, expLog);
89
90
        });

91
92
        // désactivé suite au changement de format de résultat
        xit("faible pente, ressaut (1 point) à l'intérieur du bief", () => {
93
            const prms = new ParamsSectionRectang(undefined, // tirant d'eau
94
95
96
97
                2.5, // largeur de fond
                40, //  Ks=Strickler
                2, // Q=Débit
                0.001, // If=pente du fond
98
                1, // YB=hauteur de berge
99
            );
100
            SessionSettings.precision = precDist;
101

102
            const sect = new cSnRectang(prms);
103

104
            const prem = new CourbeRemousParams(100.25, 100.42, 100.1, 100,
105
106
                100,  // Long= Longueur du bief
                5,  // Dx=Pas d'espace
107
108
            );

109
            const rem = new CourbeRemous(sect, prem, MethodeResolution.RungeKutta4);
110

111
            const res = rem.calculRemous(undefined);
112
113
114

            // données de validation : version PHP (Oct 2017) méthode RungeKutta4

Mathias Chouet's avatar
Mathias Chouet committed
115
            // tslint:disable-next-line:max-line-length
116
            // 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 };
117
            const f: any = {
Mathias Chouet's avatar
Mathias Chouet committed
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
                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
139
140
141
142
            // màj pour jalhyd#146 : ajout de la cote de fond aux valeurs attendues
            for (const fk of Object.keys(f)) {
                f[fk] = f[fk] + rem.getCoteFond(Number(fk));
            }
143
            // compareObject("Yfluvial", res.getValue("flu"), f, 0.03);
144
            compareExtraResult("Yfluvial", res, "flu", f, 0.03);
145

146
            // let t = { 0.000: 0.15, 5.000: 0.76 };
147
            const t = { 0.000: 0.15 }; // dernière valeur supprimée pour la raison en tête de fichier
148
            // compareObject("Ytorrentiel", res.getValue("tor"), t, 0.03);
149
            compareExtraResult("Ytorrentiel", res, "tor", t, 0.03);
150

Mathias Chouet's avatar
Mathias Chouet committed
151
            // tslint:disable-next-line:max-line-length
152
            // const 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];
153
            // compareArray("abscisses", res.getValue("trX"), x);
154

155
            const expLog = new cLog();
156

157
            let m = new Message(MessageCode.INFO_REMOUS_H_CRITIQUE);
158
            m.extraVar.Yc = 0.403;
159
160
            expLog.add(m);

161
            m = new Message(MessageCode.INFO_REMOUS_H_NORMALE);
162
            m.extraVar.Yn = 0.953;
163
164
            expLog.add(m);

165
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
166

167
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
168

169
            m = new Message(MessageCode.WARNING_REMOUS_ARRET_CRITIQUE);
170
            m.extraVar.x = 15;
171
172
            expLog.add(m);

173
            m = new Message(MessageCode.INFO_REMOUS_RESSAUT_HYDRO);
174
175
            m.extraVar.xmin = 0;
            m.extraVar.xmax = 5;
176
177
            expLog.add(m);

178
            compareLog(res.globalLog, expLog);
179
180
        });

Mathias Chouet's avatar
Mathias Chouet committed
181
182
        xit("faible pente, ressaut (plusieurs points) à l'intérieur du bief", () => {
            // désactivé car échoue depuis les modifs apportées depuis la version PHP (calcul du ressaut hydraulique)
183
            const prms = new ParamsSectionRectang(undefined, // tirant d'eau
184
185
186
187
                2.5, // largeur de fond
                40, //  Ks=Strickler
                2, // Q=Débit
                0.001, // If=pente du fond
188
                1, // YB=hauteur de berge
189
            );
190
            SessionSettings.precision = precDist;
191

192
            const sect = new cSnRectang(prms);
193

194
            const prem = new CourbeRemousParams(100.015, 100.42, 100.005, 100,
195
196
                5,  // Long= Longueur du bief
                0.25,  // Dx=Pas d'espace
197
198
            );

199
            const rem = new CourbeRemous(sect, prem, MethodeResolution.RungeKutta4);
200

201
            const res = rem.calculRemous(undefined);
202
203
204

            // données de validation : version PHP (Oct 2017) méthode RungeKutta4

205
            const f: any = {
Mathias Chouet's avatar
Mathias Chouet committed
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
                5.000: 0.42,
                4.750: 0.434,
                4.500: 0.443,
                4.250: 0.45,
                4.000: 0.457,
                3.750: 0.462,
                3.500: 0.467,
                3.250: 0.471,
                3.000: 0.476,
                2.750: 0.48,
                2.500: 0.483,
                2.250: 0.487,
                2.000: 0.49,
                1.750: 0.493,
                1.500: 0.496,
                1.250: 0.499,
                1.000: 0.502,
                0.750: 0.504,
                0.500: 0.507,
                0.250: 0.509,
                0.000: 0.01
            };
228
229
230
231
            // màj pour jalhyd#146 : ajout de la cote de fond aux valeurs attendues
            for (const fk of Object.keys(f)) {
                f[fk] = f[fk] + rem.getCoteFond(Number(fk));
            }
232
            // compareObject("Yfluvial", res.getValue("flu"), f, 0.03);
233
            compareExtraResult("Yfluvial", res, "flu", f, 0.03);
234

235
            const t = { 0.000: 0.01, 0.250: 0.017, 0.500: 0.022, 0.750: 0.028, 1.000: 0.502 };
236
            // compareObject("Ytorrentiel", res.getValue("tor"), t, 0.03);
237
            compareExtraResult("Ytorrentiel", res, "tor", t, 0.03);
238

Mathias Chouet's avatar
Mathias Chouet committed
239
            // tslint:disable-next-line:max-line-length
240
            // const x = [0.000, 0.250, 0.500, 0.750, 1.000, 1.250, 1.500, 1.750, 2.000, 2.250, 2.500, 2.750, 3.000, 3.250, 3.500, 3.750, 4.000, 4.250, 4.500, 4.750, 5.000];
241
            // compareArray("abscisses", res.getValue("trX"), x);
242

243
            const expLog = new cLog();
244

245
            let m = new Message(MessageCode.INFO_REMOUS_H_CRITIQUE);
246
            m.extraVar.Yc = 0.403;
247
248
            expLog.add(m);

249
            m = new Message(MessageCode.INFO_REMOUS_H_NORMALE);
250
            m.extraVar.Yn = 0.953;
251
252
            expLog.add(m);

253
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
254

255
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
256

257
            m = new Message(MessageCode.INFO_REMOUS_RESSAUT_HYDRO);
258
259
            m.extraVar.xmin = 0;
            m.extraVar.xmax = 1;
260
261
            expLog.add(m);

262
            compareLog(res.globalLog, expLog);
263
264
265
        });

        it("faible pente, pas de ressaut, Yamont > Yc, Yaval > Yn", () => {
266
            const prms = new ParamsSectionRectang(undefined, // tirant d'eau
267
268
269
270
                2.5, // largeur de fond
                40, //  Ks=Strickler
                2, // Q=Débit
                0.001, // If=pente du fond
271
                1, // YB=hauteur de berge
272
            );
273
            SessionSettings.precision = precDist;
274

275
            const sect = new cSnRectang(prms);
276

277
            const prem = new CourbeRemousParams(100.6, 101, 100.1, 100,
278
279
                100,  // Long= Longueur du bief
                5,  // Dx=Pas d'espace
280
281
            );

282
            const rem = new CourbeRemous(sect, prem, MethodeResolution.RungeKutta4);
283

284
            const res = rem.calculRemous(undefined);
285
286
287

            // données de validation : version PHP (Oct 2017) méthode RungeKutta4

288
            const f: any = {
Mathias Chouet's avatar
Mathias Chouet committed
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
                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
            };
311
312
313
314
            // màj pour jalhyd#146 : ajout de la cote de fond aux valeurs attendues
            for (const fk of Object.keys(f)) {
                f[fk] = f[fk] + rem.getCoteFond(Number(fk));
            }
315
            // compareObject("Yfluvial", res.getValue("flu"), f, 0.03);
316
            compareExtraResult("Yfluvial", res, "flu", f, 0.03);
317

318
            expect(extraResultLength(res, "tor") === 0)
Mathias Chouet's avatar
Mathias Chouet committed
319
                .toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
320

Mathias Chouet's avatar
Mathias Chouet committed
321
            // tslint:disable-next-line:max-line-length
322
            // const 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];
323
            // compareArray("abscisses", res.getValue("trX"), x);
324

325
            const expLog = new cLog();
326

327
            let m = new Message(MessageCode.INFO_REMOUS_H_CRITIQUE);
328
            m.extraVar.Yc = 0.403;
329
330
            expLog.add(m);

331
            m = new Message(MessageCode.INFO_REMOUS_H_NORMALE);
332
            m.extraVar.Yn = 0.953;
333
334
            expLog.add(m);

Mathias Chouet's avatar
Mathias Chouet committed
335
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
336

337
338
            expLog.add(new Message(MessageCode.WARNING_REMOUS_PAS_CALCUL_DEPUIS_AMONT));

339
            compareLog(res.globalLog, expLog);
340
341
342
        });

        it("faible pente, pas de ressaut, Yamont > Yc, Yc < Yaval < Yn", () => {
343
            const prms = new ParamsSectionRectang(undefined, // tirant d'eau
344
345
346
347
                2.5, // largeur de fond
                40, //  Ks=Strickler
                2, // Q=Débit
                0.001, // If=pente du fond
348
                1, // YB=hauteur de berge
349
            );
350
            SessionSettings.precision = precDist;
351

352
            const sect = new cSnRectang(prms);
353

354
            const prem = new CourbeRemousParams(100.6, 100.7, 100.1, 100,
355
356
                100,  // Long= Longueur du bief
                5,  // Dx=Pas d'espace
357
358
            );

359
            const rem = new CourbeRemous(sect, prem, MethodeResolution.RungeKutta4);
360

361
            const res = rem.calculRemous(undefined);
362
363
364

            // données de validation : version PHP (Oct 2017) méthode RungeKutta4

365
            const f: any = {
Mathias Chouet's avatar
Mathias Chouet committed
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
                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
            };
388
389
390
391
            // màj pour jalhyd#146 : ajout de la cote de fond aux valeurs attendues
            for (const fk of Object.keys(f)) {
                f[fk] = f[fk] + rem.getCoteFond(Number(fk));
            }
392
            // compareObject("Yfluvial", res.getValue("flu"), f, 0.03);
393
            compareExtraResult("Yfluvial", res, "flu", f, 0.03);
394

395
            expect(extraResultLength(res, "tor") === 0)
Mathias Chouet's avatar
Mathias Chouet committed
396
                .toBeTruthy("la ligne d'eau torrentielle ne devrait comporter aucune valeur");
397

Mathias Chouet's avatar
Mathias Chouet committed
398
            // tslint:disable-next-line:max-line-length
399
            // const 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];
400
            // compareArray("abscisses", res.getValue("trX"), x);
401

402
            const expLog = new cLog();
403

404
            let m = new Message(MessageCode.INFO_REMOUS_H_CRITIQUE);
405
            m.extraVar.Yc = 0.403;
406
407
            expLog.add(m);

408
            m = new Message(MessageCode.INFO_REMOUS_H_NORMALE);
409
            m.extraVar.Yn = 0.953;
410
411
            expLog.add(m);

Mathias Chouet's avatar
Mathias Chouet committed
412
            expLog.add(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
413

414
415
            expLog.add(new Message(MessageCode.WARNING_REMOUS_PAS_CALCUL_DEPUIS_AMONT));

416
            compareLog(res.globalLog, expLog);
417
418
419
        });
    });
});