diff --git a/.gitignore b/.gitignore index e957dd03255068521198d944df74866755a8d008..fb6f0325c8f607a79fff5c252cadeaeabba552fd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ # Program outputs /compteur /*.TXT +/FiniFini +/*Optim diff --git a/README.md b/README.md index cb328b2e935ddf70df0302eee2a7777af1835b37..053ae3d0a16395fed5250dc8e0d5a162701d63b0 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,15 @@ At the root folder of this repository type the following command line (Adapt the ``` C:\FPC\bin\i386-win32\fpc.exe src\VGEST.PAS && move /Y src\VGEST.exe . +C:\FPC\bin\i386-win32\fpc.exe src\ENDE.PAS && move /Y src\ENDE.exe . +C:\FPC\bin\i386-win32\fpc.exe src\REGLAGE.PAS && move /Y src\REGLAGE.exe . ``` ## Get started with the example The `example` directory contains all the configuration for calculating statistics about respecting a maximum flow of 110 m<sup>3</sup>/s at Paris. These statistics are calculated from the Seine River Basin naturalised flow database between 1993/01/01 and 2009/12/31 [^Hydratec2011]. -Copy the files contained in the `example` directory to the root directory and run `VGEST.exe`. +Copy the files contained in the `example` directory to the root directory and run `SURVGEST.bat`. ## Known issues diff --git a/SUIVOPTI/.gitignore b/SUIVOPTI/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5e7d2734cfc60289debf74293817c0a8f572ff32 --- /dev/null +++ b/SUIVOPTI/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/SURVGEST.bat b/SURVGEST.bat new file mode 100644 index 0000000000000000000000000000000000000000..7f8fb73d9a36313120ede92b93212bc8c1f35799 --- /dev/null +++ b/SURVGEST.bat @@ -0,0 +1,22 @@ +if exist FiniFini del FiniFini +echo off +if exist PasOptim del PasOptim +if exist FinOptim del FinOptim +if exist PARAMETR\reglage.txt del PARAMETR\reglage.txt +if exist PARAMETR\OUITRI.TXT del PARAMETR\OUITRI.TXT +if exist Temporai.re\etape del Temporai.re\etape +if exist Temporai.re\result0 del Temporai.re\result0; +if exist Suivopti\suivi del Suivopti\suivi +if exist Temporai.re\dichot1 del Temporai.re\dichot1 +if exist Temporai.re\dichot2 del Temporai.re\dichot2 +if exist Temporai.re\dichot3 del Temporai.re\dichot3 +if exist Temporai.re\dichot4 del Temporai.re\dichot4 +:NouveauCalcul +REGLAGE +if exist PasOptim goto FindesCalculs +VGEST +if exist FinOptim goto FinDesCalculs +goto NouveauCalcul +:FinDesCalculs +del PARAMETR\reglage.txt +ENDE \ No newline at end of file diff --git a/example/CHOIX.TXT b/example/CHOIX.TXT deleted file mode 100644 index 2c673932a4b57ec2bd932ccca20dc8c3ec280d65..0000000000000000000000000000000000000000 --- a/example/CHOIX.TXT +++ /dev/null @@ -1,6 +0,0 @@ -PARIS_05 -Q_OBS_OBS.txt -BATCH -1 -01/01/1994 -31/12/2009 diff --git a/example/MODE.TXT b/example/MODE.TXT deleted file mode 100644 index d00491fd7e5bb6fa28c517a0bb32b8b506539d4d..0000000000000000000000000000000000000000 --- a/example/MODE.TXT +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/example/PARAMETR/AUBE.1 b/example/PARAMETR/AUBE.1 deleted file mode 100644 index a6b33613880d974379034293d1cc0b5af6ccdb70..0000000000000000000000000000000000000000 --- a/example/PARAMETR/AUBE.1 +++ /dev/null @@ -1,45 +0,0 @@ -paramètres des contraintes et consignes du réservoir Aube (scénario : réalité d'après rapport Florine Dehay, ENGEES 2012) -AUBE -0 Qemin (m3/s) -1.35E+02 Qemax (m3/s) -0 Qsmin (m3/s) -35 Qsmax (m3/s) -181.2 Vtot (million de m3) -0 3 QMres -1 91 305 -1 2 1 -1 -1 2 -3 8 2 6 3 4 4 -0 3 QVres -1 91 305 -1 2 1 -1 -1 2 -3 8 2 6 3 4 4 -0 1 QMref -1 -1 -1 -1 130 -0 1 QVref -1 -1 -1 -1 130 - -FORMAT DU FICHIER : -ligne 0 : en-tête obligatoire -ligne 1 : nom du réservoir (chaîne de 8 caractères) -lignes 2 à 6 : Qemin, Qemax, Qsmin, Qsmax, V, -4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : - ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 - ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, inférieurs à 366) - ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q - lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat -notations : - Qemin et Qemax : débitance min et max du canal de prise - Qsmin et Qsmax : débitance min et max du canal de restitution - QMres et QMref : débit réservé et débit de référence, juste à l'aval de la prise - QVres et QVref : débit réservé et débit de référence juste à l'aval de la restitution - Vtot : volume total du réservoir - QMnat : débit observé juste à l'amont de la prise - QV : débit observé juste à l'aval de la restitution - - diff --git a/example/PARAMETR/BARRAGES/1/AUBE.1 b/example/PARAMETR/BARRAGES/1/AUBE.1 new file mode 100644 index 0000000000000000000000000000000000000000..ec86b0353345ff1d9577922f52b63a23dfe86eac --- /dev/null +++ b/example/PARAMETR/BARRAGES/1/AUBE.1 @@ -0,0 +1,49 @@ +contraintes et consignes du réservoir Aube (règles actuelles d'après F.Dehay, ENGEES 2012). Débits réservé et de référence considérés (chacun de façon identique) à la prise et à la restitution +AUBE +1 0 0 Qemin (m3/s) fonction de V (hm3) +1 0 1.35E+02 Qemax (m3/s) fonction de V (hm3) +1 0 0 Qsmin (m3/s) fonction de V (hm3) +1 0 35 Qsmax (m3/s) fonction de V (hm3) +181.2 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 3 QVres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 1 QMref +1 +1 +1 -1 130 +0 1 QVref +1 +1 +1 -1 130 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/1/MARNE.1 b/example/PARAMETR/BARRAGES/1/MARNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..4170e8c7f7f598f4b392f36b472640d3845d51e5 --- /dev/null +++ b/example/PARAMETR/BARRAGES/1/MARNE.1 @@ -0,0 +1,55 @@ +contraintes et consignes du réservoir Marne (règles actuelles d'après F.Dehay, ENGEES 2012). Débits réservé et de référence considérés (de façon identique pour le premier) à la prise et à la restitution +MARNE +1 0 0 Qemin (m3/s) fonction de V (hm3) +1 0 4.08E+02 Qemax (m3/s) fonction de V (hm3) +1 0 0 Qsmin (m3/s) fonction de V (hm3) +1 0 50 Qsmax (m3/s) fonction de V (hm3) +354.5 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 3 QVres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 6 QMref +1 91 121 182 274 305 +1 2 3 4 3 1 +1 -1 160 +1 -1 140 +1 -1 120 +1 -1 90 +0 5 QVref +1 182 274 289 305 +1 2 3 4 1 +1 -1 140 +1 -1 75 +1 -1 100 +1 -1 120 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/1/SEINE.1 b/example/PARAMETR/BARRAGES/1/SEINE.1 new file mode 100644 index 0000000000000000000000000000000000000000..011ce7fa9e121398442c97e8f1f9cd1ea9f8f4b2 --- /dev/null +++ b/example/PARAMETR/BARRAGES/1/SEINE.1 @@ -0,0 +1,53 @@ +contraintes et consignes du réservoir Seine (règles actuelles d'après F.Dehay, ENGEES 2012). Débits réservé et de référence considérés (chacun de façon identique) à la prise et à la restitution +SEINE +1 0 0 Qemin (m3/s) fonction de V (hm3) +1 0 2.00E+02 Qemax (m3/s) fonction de V (hm3) +1 0 0.8 Qsmin (m3/s) fonction de V (hm3) +1 0 35 Qsmax (m3/s) fonction de V (hm3) +212.9 Vtot (million de m3) +0 4 QMres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 4 QVres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 4 QMref +1 91 182 305 +1 2 3 1 +1 -1 120 +1 -1 90 +1 -1 40 +0 4 QVref +1 91 182 305 +1 2 3 1 +1 -1 120 +1 -1 90 +1 -1 40 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/1/YONNE.1 b/example/PARAMETR/BARRAGES/1/YONNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..f05288adbbd229f29527a3430fbc539546572cfb --- /dev/null +++ b/example/PARAMETR/BARRAGES/1/YONNE.1 @@ -0,0 +1,53 @@ +contraintes et consignes du réservoir Yonne (règles actuelles d'après F.Dehay, ENGEES 2012). Débits réservés et de référence considérés à la restitution et nuls à la prise. Qsmax=Qsmax1=16 réglementaire +YONNE +1 0 1.00E+20 Qemin (m3/s) fonction de V (hm3) +1 0 1.00E+20 Qemax (m3/s) fonction de V (hm3) +1 0 0 Qsmin (m3/s) fonction de V (hm3) +1 0 16 Qsmax (m3/s) fonction de V (hm3) +74 Vtot (million de m3) +0 1 QMres +1 +1 +1 -1 0 +1 10 2 QVres +1 60 91 121 152 182 244 274 305 335 +1 2 3 4 5 6 5 3 2 1 +1 -1 0.6 +1 -1 1.2 +1 -1 1.7 +1 -1 1.8 +1 -1 1.9 +1 -1 2 +0 1 QMref +1 +1 +1 -1 0 +2 3 2 QVref +1 91 305 +1 2 1 +1 -1 14 +1 -1 12 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/1/version.txt b/example/PARAMETR/BARRAGES/1/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..230264e04d55bd2e120504bf58dfcc4a57fa6749 --- /dev/null +++ b/example/PARAMETR/BARRAGES/1/version.txt @@ -0,0 +1 @@ +2012, Qres et Qref prise et restit, QSmax(Yonne)=QSmax1 \ No newline at end of file diff --git a/example/PARAMETR/BARRAGES/2/AUBE.1 b/example/PARAMETR/BARRAGES/2/AUBE.1 new file mode 100644 index 0000000000000000000000000000000000000000..141ef27728814eb1eedcfc30276129b5ace23615 --- /dev/null +++ b/example/PARAMETR/BARRAGES/2/AUBE.1 @@ -0,0 +1,49 @@ +Contraintes et consignes du réservoir Aube (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré (de façon identique) à la prise et à la restitution. Débit de référence non considéré. +AUBE +1 0 0 Qemin (m3/s) fonction de V (hm3) +1 0 1.35E+02 Qemax (m3/s) fonction de V (hm3) +1 0 0 Qsmin (m3/s) fonction de V (hm3) +1 0 35 Qsmax (m3/s) fonction de V (hm3) +181.2 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 3 QVres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/2/MARNE.1 b/example/PARAMETR/BARRAGES/2/MARNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..e159b96cf825139dbf878f5f3249bf2206c66864 --- /dev/null +++ b/example/PARAMETR/BARRAGES/2/MARNE.1 @@ -0,0 +1,49 @@ +Contraintes et consignes du réservoir Marne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré (de façon identique) à la prise et à la restitution. Débit de référence non considéré. +MARNE +1 0 0 Qemin (m3/s) fonction de V (hm3) +1 0 4.08E+02 Qemax (m3/s) fonction de V (hm3) +1 0 0 Qsmin (m3/s) fonction de V (hm3) +1 0 50 Qsmax (m3/s) fonction de V (hm3) +354.5 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 3 QVres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/2/SEINE.1 b/example/PARAMETR/BARRAGES/2/SEINE.1 new file mode 100644 index 0000000000000000000000000000000000000000..b9e9494b7da0b89877eb75dc0cb2f8d824846e66 --- /dev/null +++ b/example/PARAMETR/BARRAGES/2/SEINE.1 @@ -0,0 +1,49 @@ +Contraintes et consignes du réservoir Seine (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré (de façon identique) à la prise et à la restitution. Débit de référence non considéré. +SEINE +1 0 0 Qemin (m3/s) fonction de V (hm3) +1 0 2.00E+02 Qemax (m3/s) fonction de V (hm3) +1 0 0.8 Qsmin (m3/s) fonction de V (hm3) +1 0 35 Qsmax (m3/s) fonction de V (hm3) +212.9 Vtot (million de m3) +0 4 QMres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 4 QVres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/2/YONNE.1 b/example/PARAMETR/BARRAGES/2/YONNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..9d9333e1ef05bf63249ec1d2041be8ad301f1105 --- /dev/null +++ b/example/PARAMETR/BARRAGES/2/YONNE.1 @@ -0,0 +1,52 @@ +Contraintes et consignes du réservoir Yonne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré à la restitution et nul à la prise. Débit de référence non considéré à la restitution et nul à la prise. Qsmax=Qsmax1=16 réglementaire +YONNE +1 0 1.00E+20 Qemin (m3/s) fonction de V (hm3) +1 0 1.00E+20 Qemax (m3/s) fonction de V (hm3) +1 0 0 Qsmin (m3/s) fonction de V (hm3) +1 0 16 Qsmax (m3/s) fonction de V (hm3) +74 Vtot (million de m3) +0 1 QMres +1 +1 +1 -1 0 +1 10 2 QVres +1 60 91 121 152 182 244 274 305 335 +1 2 3 4 5 6 5 3 2 1 +1 -1 0.6 +1 -1 1.2 +1 -1 1.7 +1 -1 1.8 +1 -1 1.9 +1 -1 2 +0 1 QMref +1 +1 +1 -1 0 +2 1 2 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/2/version.txt b/example/PARAMETR/BARRAGES/2/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..95ca4e07606fd0028b60b59f6fe4d0a1a8a561dd --- /dev/null +++ b/example/PARAMETR/BARRAGES/2/version.txt @@ -0,0 +1 @@ +2012, Qres prise et restit, pas de Qref, QSmax(Yonne)=QSmax1 \ No newline at end of file diff --git a/example/PARAMETR/BARRAGES/3/AUBE.1 b/example/PARAMETR/BARRAGES/3/AUBE.1 new file mode 100644 index 0000000000000000000000000000000000000000..6e3fd010c114d39aea890882c341829eb587a38f --- /dev/null +++ b/example/PARAMETR/BARRAGES/3/AUBE.1 @@ -0,0 +1,48 @@ +contraintes et consignes du réservoir Aube (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence considéré de façon identique à la prise et à la restitution. +AUBE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 1.35E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 35 Qsmax (m3/s) en fonction de V (hm3) +181.2 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 130 +0 1 QVref +1 +1 +1 -1 130 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/3/MARNE.1 b/example/PARAMETR/BARRAGES/3/MARNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..f9d271c068d534236e7d887fabdae417f53ada5a --- /dev/null +++ b/example/PARAMETR/BARRAGES/3/MARNE.1 @@ -0,0 +1,54 @@ +contraintes et consignes du réservoir Marne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence considéré à la prise et à la restitution. +MARNE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 4.08E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 50 Qsmax (m3/s) en fonction de V (hm3) +354.5 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 1 QVres +1 +1 +1 -1 0 +0 6 QMref +1 91 121 182 274 305 +1 2 3 4 3 1 +1 -1 160 +1 -1 140 +1 -1 120 +1 -1 90 +0 5 QVref +1 182 274 289 305 +1 2 3 4 1 +1 -1 140 +1 -1 75 +1 -1 100 +1 -1 120 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/3/SEINE.1 b/example/PARAMETR/BARRAGES/3/SEINE.1 new file mode 100644 index 0000000000000000000000000000000000000000..8b9a0fafecff7fb058755742607503c8f32435fc --- /dev/null +++ b/example/PARAMETR/BARRAGES/3/SEINE.1 @@ -0,0 +1,52 @@ +contraintes et consignes du réservoir Seine (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence considéré de façon identique à la prise et à la restitution. +SEINE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 2.00E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0.8 Qsmin (m3/s) en fonction de V (hm3) +1 0 35 Qsmax (m3/s) en fonction de V (hm3) +212.9 Vtot (million de m3) +0 4 QMres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 1 QVres +1 +1 +1 -1 0 +0 4 QMref +1 91 182 305 +1 2 3 1 +1 -1 120 +1 -1 90 +1 -1 40 +0 4 QVref +1 91 182 305 +1 2 3 1 +1 -1 120 +1 -1 90 +1 -1 40 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/3/YONNE.1 b/example/PARAMETR/BARRAGES/3/YONNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..7f91dc7fbe93eb62fb541ec99d17d74af2dd2055 --- /dev/null +++ b/example/PARAMETR/BARRAGES/3/YONNE.1 @@ -0,0 +1,53 @@ +Contraintes et consignes du réservoir Yonne (règles actuelles d'après F.Dehay, ENGEES 2012). Débits réservés et de référence considérés à la restitution et nuls à la prise. Qsmax=Qsmax1=16 réglementaire +YONNE +1 0 1.00E+20 Qemin (m3/s) en fonction de V (hm3) +1 0 1.00E+20 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 16 Qsmax (m3/s) en fonction de V (hm3) +74 Vtot (million de m3) +0 1 QMres +1 +1 +1 -1 0 +1 10 2 QVres +1 60 91 121 152 182 244 274 305 335 +1 2 3 4 5 6 5 3 2 1 +1 -1 0.6 +1 -1 1.2 +1 -1 1.7 +1 -1 1.8 +1 -1 1.9 +1 -1 2 +0 1 QMref +1 +1 +1 -1 0 +2 3 2 QVref +1 91 305 +1 2 1 +1 -1 14 +1 -1 12 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/3/version.txt b/example/PARAMETR/BARRAGES/3/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..67387a349e1b712529022aac34af73f0109108bb --- /dev/null +++ b/example/PARAMETR/BARRAGES/3/version.txt @@ -0,0 +1 @@ +2012, Qres prise (+ restit Yonne), Qref prise et restit, QSmax(Yonne)=QSmax1 \ No newline at end of file diff --git a/example/PARAMETR/BARRAGES/4/AUBE.1 b/example/PARAMETR/BARRAGES/4/AUBE.1 new file mode 100644 index 0000000000000000000000000000000000000000..44cb4f8a9a9e739b2044db7c5a834e977452c3b8 --- /dev/null +++ b/example/PARAMETR/BARRAGES/4/AUBE.1 @@ -0,0 +1,48 @@ +Contraintes et consignes du réservoir Aube (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence non considéré. +AUBE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 1.35E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 35 Qsmax (m3/s) en fonction de V (hm3) +181.2 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/4/MARNE.1 b/example/PARAMETR/BARRAGES/4/MARNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..06986a0b75d3d354ecca4f012f20cd99d7e9ad02 --- /dev/null +++ b/example/PARAMETR/BARRAGES/4/MARNE.1 @@ -0,0 +1,48 @@ +Contraintes et consignes du réservoir Marne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence non considéré. +MARNE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 4.08E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 50 Qsmax (m3/s) en fonction de V (hm3) +354.5 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/4/SEINE.1 b/example/PARAMETR/BARRAGES/4/SEINE.1 new file mode 100644 index 0000000000000000000000000000000000000000..3c3c89dd629f7c2a0a12e1642d57cae72ee591fe --- /dev/null +++ b/example/PARAMETR/BARRAGES/4/SEINE.1 @@ -0,0 +1,48 @@ +Contraintes et consignes du réservoir Seine (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence non considéré. +SEINE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 2.00E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0.8 Qsmin (m3/s) en fonction de V (hm3) +1 0 35 Qsmax (m3/s) en fonction de V (hm3) +212.9 Vtot (million de m3) +0 4 QMres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/4/YONNE.1 b/example/PARAMETR/BARRAGES/4/YONNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..40a7e579db116ec0c28ee273ae30e4488e177100 --- /dev/null +++ b/example/PARAMETR/BARRAGES/4/YONNE.1 @@ -0,0 +1,52 @@ +contraintes et consignes du réservoir Yonne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré à la restitution et nul à la prise. Débits de référence non considéré à la restitution et nul à la prise. QSmax=Qsmax1=16 réglementaire +YONNE +1 0 1.00E+20 Qemin (m3/s) en fonction de V (hm3) +1 0 1.00E+20 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 16 Qsmax (m3/s) en fonction de V (hm3) +74 Vtot (million de m3) +0 1 QMres +1 +1 +1 -1 0 +1 10 2 QVres +1 60 91 121 152 182 244 274 305 335 +1 2 3 4 5 6 5 3 2 1 +1 -1 0.6 +1 -1 1.2 +1 -1 1.7 +1 -1 1.8 +1 -1 1.9 +1 -1 2 +0 1 QMref +1 +1 +1 -1 0 +2 1 2 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/4/version.txt b/example/PARAMETR/BARRAGES/4/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..8321e3682188b04c40a552cd4c9347debc1f7b06 --- /dev/null +++ b/example/PARAMETR/BARRAGES/4/version.txt @@ -0,0 +1 @@ +2012, Qres prises (+ restit Yonne), pas de Qref, QSmax(Yonne)=QSmax1 \ No newline at end of file diff --git a/example/PARAMETR/BARRAGES/5/AUBE.1 b/example/PARAMETR/BARRAGES/5/AUBE.1 new file mode 100644 index 0000000000000000000000000000000000000000..44cb4f8a9a9e739b2044db7c5a834e977452c3b8 --- /dev/null +++ b/example/PARAMETR/BARRAGES/5/AUBE.1 @@ -0,0 +1,48 @@ +Contraintes et consignes du réservoir Aube (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence non considéré. +AUBE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 1.35E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 35 Qsmax (m3/s) en fonction de V (hm3) +181.2 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 2 +3 8 2 6 3 4 4 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/5/MARNE.1 b/example/PARAMETR/BARRAGES/5/MARNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..06986a0b75d3d354ecca4f012f20cd99d7e9ad02 --- /dev/null +++ b/example/PARAMETR/BARRAGES/5/MARNE.1 @@ -0,0 +1,48 @@ +Contraintes et consignes du réservoir Marne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence non considéré. +MARNE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 4.08E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +1 0 50 Qsmax (m3/s) en fonction de V (hm3) +354.5 Vtot (million de m3) +0 3 QMres +1 91 305 +1 2 1 +1 -1 7 +1 -1 11 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/5/SEINE.1 b/example/PARAMETR/BARRAGES/5/SEINE.1 new file mode 100644 index 0000000000000000000000000000000000000000..3c3c89dd629f7c2a0a12e1642d57cae72ee591fe --- /dev/null +++ b/example/PARAMETR/BARRAGES/5/SEINE.1 @@ -0,0 +1,48 @@ +Contraintes et consignes du réservoir Seine (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré seulement à la prise et débit de référence non considéré. +SEINE +1 0 0 Qemin (m3/s) en fonction de V (hm3) +1 0 2.00E+02 Qemax (m3/s) en fonction de V (hm3) +1 0 0.8 Qsmin (m3/s) en fonction de V (hm3) +1 0 35 Qsmax (m3/s) en fonction de V (hm3) +212.9 Vtot (million de m3) +0 4 QMres +1 91 274 335 +1 2 1 2 +1 -1 3 +3 10 3 8 4 6 5 +0 1 QVres +1 +1 +1 -1 0 +0 1 QMref +1 +1 +1 -1 9999 +0 1 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/5/YONNE.1 b/example/PARAMETR/BARRAGES/5/YONNE.1 new file mode 100644 index 0000000000000000000000000000000000000000..725b9b9aece13912835facc8acf7f55c26a6efbf --- /dev/null +++ b/example/PARAMETR/BARRAGES/5/YONNE.1 @@ -0,0 +1,52 @@ +contraintes et consignes du réservoir Yonne (règles actuelles d'après F.Dehay, ENGEES 2012). Débit réservé considéré à la restitution et nul à la prise; débit de référence non considérés; QSmax = QSmax0 physique +YONNE +1 0 1.00E+20 Qemin (m3/s) en fonction de V (hm3) +1 0 1.00E+20 Qemax (m3/s) en fonction de V (hm3) +1 0 0 Qsmin (m3/s) en fonction de V (hm3) +6 0 2.2 21.5 55.7 57.07 74 45.88 47.62 55.48 61.74 61.91 284 Qsmax (m3/s) en fonction de V (hm3) +74 Vtot (million de m3) +0 1 QMres +1 +1 +1 -1 0 +1 10 2 14 QVres +1 60 91 121 152 182 244 274 305 335 +1 2 3 4 5 6 5 3 2 1 +1 -1 0.6 +1 -1 1.2 +1 -1 1.7 +1 -1 1.8 +1 -1 1.9 +1 -1 2 +0 1 QMref +1 +1 +1 -1 0 +2 1 2 QVref +1 +1 +1 -1 9999 + +FORMAT DU FICHIER : +ligne 1 : en-tête obligatoire (version) +ligne 2 : nom du réservoir +ligne 3 : barème V-> Qemin (effectif (entre 1 et 10), valeurs de V (hm3) croissantes, valeurs de Qemin (m3/s)) +ligne 4 : barème V-> Qemax (effectif, valeurs de V (hm3) croissantes, valeurs de Qemax (m3/s)) +ligne 5 : barème V-> Qsmin (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmin (m3/s)) +ligne 6 : barème V-> Qsmax (effectif, valeurs de V (hm3) croissantes, valeurs de Qsmax (m3/s)) +ligne 7 : volume Vtot (hm3, valeur max possible de V) +4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : + ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 + ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, compris entre 1 et 365) + ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q + lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat +NOTATIONS : + V : volume d'eau exploitable présent dans le réservoir + Qemin et Qemax : débitance min et max de la prise (limites physiques) + Qsmin et Qsmax : débitance min et max de la restitution (limites physiques) + QMres et QMref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la prise + QVres et QVref : débit réservé (valeur qu'on souhaite voir dépassée) et débit de référence (valeur qu'on souhaite ne pas voir dépassée) dans le cours d'eau à l'aval immédiat de la restitution + Vtot : volume exploitable total du réservoir, compris entre le sommet de la tranche morte (ou le sommet du volume de garde) et le niveau maximal de sécurité + QMnat : débit du cours d'eau à l'amont immédiat de la prise + QV : débit du cours d'eau à l'aval immédiat de la restitution + diff --git a/example/PARAMETR/BARRAGES/5/version.txt b/example/PARAMETR/BARRAGES/5/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..603a504886a5deab1d98ab8d6258e1702fad8371 --- /dev/null +++ b/example/PARAMETR/BARRAGES/5/version.txt @@ -0,0 +1 @@ +2012, Qres prises (+ restit Yonne), pas de Qref, QSmax(Yonne)=QSmax0 \ No newline at end of file diff --git a/example/PARAMETR/CHOIX.TXT b/example/PARAMETR/CHOIX.TXT new file mode 100644 index 0000000000000000000000000000000000000000..4d3fa51661781e4397b7222f569d38032aa18972 --- /dev/null +++ b/example/PARAMETR/CHOIX.TXT @@ -0,0 +1,33 @@ +PARIS_05 +4 +1 +Q_OBS_OBS.txt +BATCH +1 +01/01/1994 +31/12/2009 +1 +4 +1 + + + + +ligne 1 : nom de la station où l'objectif de débit est localisé +ligne 2 : rang du jeu de paramètres décrivant les réservoirs et leurs règles de gestion (contraintes et consignes locales) +ligne 3 : rang du jeu de paramètres décrivant le réseau +ligne 4 : nom du fichier de données de débit (régime sans les réservoirs) +ligne 5 : nom du fichier décrivant l'hydrogramme objectif annuel visé à la station aval du système +ligne 6 : type d'objectif : 0 pour soutien de débit, 1 pour laminage de débit +ligne 7 : début de période de calcul +ligne 8 : fin de période de calcul +ligne 9 : code pour format d'édition des résultats de volume : 1 pour valeurs absolues en m3, 2 pour valeurs relatives par rapport à Vtot ou somme(Vtot) +ligne 10 : code indiquant le mode de répartition du débit à stocker entre les réservoirs: + 1=figée; + 2=fonction des volumes présents et des temps de reconstitution de volume utilisable maximal à partir du début de pas de temps; + 3=visant à équilibrer en fin de pas de temps les taux de remplissage; + 4=visant à équilibrer en fin de pas de temps les durées Tpot d'évolution de réservoir vers état extrême (voir ligne 11) avec apports moyens + 5=visant à équilibrer en fin de pas de temps les durées Tpot d'évolution de réservoir vers état extrême (voir ligne 11) avec quantile donné des apports de chaque quantième +ligne 11 (utilisée seulement si 4 ou 5 en ligne 10) : code indiquant la nature de Tpot : + 1 : Tpot est la durée potentielle minimale Tpot1 de reconstitution du volume utilisable maximal (obtention de V=Vtot ou V=0, selon la nature de l'objectif (soutien ou laminage) et le sens des calculs) + 2 : Tpot est la durée potentielle minimale Tpot2 d'épuisement du volume utilisable (obtention de V=Vtot ou V=0, selon la nature de l'objectif (soutien ou laminage) et le sens des calculs) \ No newline at end of file diff --git a/example/PARAMETR/FREQNDEP.txt b/example/PARAMETR/FREQNDEP.txt new file mode 100644 index 0000000000000000000000000000000000000000..8f4c273a6699a9430a8130187a4a14c34832509a --- /dev/null +++ b/example/PARAMETR/FREQNDEP.txt @@ -0,0 +1,5 @@ +0.5 + + +fréquence de non dépassement des écoulements naturels, utilisée uniquement pour le mode de répartition 5 +Par défaut, Vgest utilise 0.5 (valeur conseillée) diff --git a/example/PARAMETR/MARNE.1 b/example/PARAMETR/MARNE.1 deleted file mode 100644 index 29f64a817fc79ee010c4ed64fba9ca8e22328439..0000000000000000000000000000000000000000 --- a/example/PARAMETR/MARNE.1 +++ /dev/null @@ -1,50 +0,0 @@ -paramètres des contraintes et consignes du réservoir Marne (scénario : réalité d'après rapport Florine Dehay, ENGEES 2012) -MARNE -0 Qemin (m3/s) -4.08E+02 Qemax (m3/s) -0 Qsmin (m3/s) -50 Qsmax (m3/s) -354.5 Vtot (million de m3) -0 3 QMres -1 91 305 -1 2 1 -1 -1 7 -1 -1 11 -0 3 QVres -1 91 305 -1 2 1 -1 -1 7 -1 -1 11 -0 6 QMref -1 91 121 182 274 305 -1 2 3 4 3 1 -1 -1 160 -1 -1 140 -1 -1 120 -1 -1 90 -0 5 QVref -1 182 274 289 305 -1 2 3 4 1 -1 -1 140 -1 -1 75 -1 -1 100 -1 -1 120 - -FORMAT DU FICHIER : -ligne 0 : en-tête obligatoire -ligne 1 : nom du réservoir (chaîne de 8 caractères) -lignes 2 à 6 : Qemin, Qemax, Qsmin, Qsmax, V, -4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : - ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 - ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, inférieurs à 366) - ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q - lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat -notations : - Qemin et Qemax : débitance min et max du canal de prise - Qsmin et Qsmax : débitance min et max du canal de restitution - QMres et QMref : débit réservé et débit de référence, juste à l'aval de la prise - QVres et QVref : débit réservé et débit de référence juste à l'aval de la restitution - Vtot : volume total du réservoir - QMnat : débit observé juste à l'amont de la prise - QV : débit observé juste à l'aval de la restitution - diff --git a/example/PARAMETR/MODE.TXT b/example/PARAMETR/MODE.TXT new file mode 100644 index 0000000000000000000000000000000000000000..d20ecbb51317ee207e87f5816ab6b23876c2be68 --- /dev/null +++ b/example/PARAMETR/MODE.TXT @@ -0,0 +1,8 @@ +1 + + + +la première ligne doit contenir un entier : + +0 : le paramétrage de Vgest est fait par saisie clavier +1 : le paramétrage de VGEST est fait à partir du contenu du fichier CHOIX.TXT \ No newline at end of file diff --git a/example/PARAMETR/PAROPT.txt b/example/PARAMETR/PAROPT.txt new file mode 100644 index 0000000000000000000000000000000000000000..b5b70842fb5ed420ae38b17554b5864d5ef79f8a --- /dev/null +++ b/example/PARAMETR/PAROPT.txt @@ -0,0 +1,11 @@ +0.5 +1 +0.001 +1 +3 + +1ere ligne : valeur de Teil (imposée entre 0.1 et 0.9 par le programme REGLAGE.EXE, et valant 0.5 par défaut) intervenant dans l'analyse de sensibilité. Plus Teil est grand, plus on élargit le domaine d'analyse de sensibilité autour de la répartition standard +2eme ligne : valeur de Rel (imposée supérieure ou égale à 1 par le programme REGLAGE.EXE, et valant 1 par défaut) intervenant dans l'optimisation de répartition par dichotomie. Plus Rel est grand, plus on contraint la recherche de nouvelles répartitions optimales à s'éloigner lentement de la répartion standard +3eme ligne : valeur de Seuil (imposée entre 0.000001 et 0.1 par le programme REGLAGE.EXE, et valant 0.001 par défaut), seuil de convergence dans l'optimisation de la part du réservoir courant rapportée à la part totale des réservoirs qui n'ont pas encore été traités +4eme ligne : valeur de Sens (entier entre 1 et 2 (1 par défaut)). Si 1, alors critère principal lié à défaillance Qdef et critère secondaire lié à taux de sollicitation ; Si 2 , c'est l'inverse +5eme ligne : valeur de QuelChron (entier entre 1 et 3 (3 par défaut)). Si 1, 2 ou 3, les critères utilisés correspondent aux résultats de calcul en sens chronologique inverse, en sens chronologique normal ou à la moyenne des deux) \ No newline at end of file diff --git a/example/PARAMETR/PUISS.txt b/example/PARAMETR/PUISS.txt new file mode 100644 index 0000000000000000000000000000000000000000..555d97b75171dc5d225f0b304ac5487f6be64cf5 --- /dev/null +++ b/example/PARAMETR/PUISS.txt @@ -0,0 +1,3 @@ +2 + +exposant utilisé pour le calcul des moyennes de Qdef0, Qdef1 et Qdef2 éditées dans BILAN.TXT (moyenne quadratique pour 2, arithmétique pour 1) \ No newline at end of file diff --git a/example/PARAMETR/AUBE.2 b/example/PARAMETR/RESEAUX/1/AUBE.2 similarity index 93% rename from example/PARAMETR/AUBE.2 rename to example/PARAMETR/RESEAUX/1/AUBE.2 index ba2257ee893c3ec857ebf6c87d515cab27d24d11..139438969fbb6afeb4c5a43f57ef0bc5c73b1c54 100644 --- a/example/PARAMETR/AUBE.2 +++ b/example/PARAMETR/RESEAUX/1/AUBE.2 @@ -1,4 +1,4 @@ -Paramètres décrivant le réseau local de stations hydrométriques du réservoir Aube (pour le calcul des débits naturels à la prise et à la restitution) +Paramètres décrivant le réseau local de stations hydrométriques du réservoir Aube (pour le calcul des débits naturels à la prise et à la restitution), version 2013 AUBE 1 1 Na et Ni ARCIS_24 identifiant aval diff --git a/example/PARAMETR/MARNE.2 b/example/PARAMETR/RESEAUX/1/MARNE.2 similarity index 94% rename from example/PARAMETR/MARNE.2 rename to example/PARAMETR/RESEAUX/1/MARNE.2 index 2f39049081e5eb8f0940998cc25b99f3d44c6047..81d76518d820abd20f0f885a6df6eb32ee7b3bbb 100644 --- a/example/PARAMETR/MARNE.2 +++ b/example/PARAMETR/RESEAUX/1/MARNE.2 @@ -1,4 +1,4 @@ -Paramètres décrivant le réseau local de stations hydrométriques du réservoir Marne (pour le calcul des débits naturels à la prise et à la restitution) +Paramètres décrivant le réseau local de stations hydrométriques du réservoir Marne (pour le calcul des débits naturels à la prise et à la restitution), version 2013 MARNE 2 1 Na et Ni CHALO_21 identifiant aval diff --git a/example/PARAMETR/SEINE.2 b/example/PARAMETR/RESEAUX/1/SEINE.2 similarity index 97% rename from example/PARAMETR/SEINE.2 rename to example/PARAMETR/RESEAUX/1/SEINE.2 index 4efeb07e1500feba3b8a5a8b946abb51af608a67..7058a51bd81b33ae16a7e713555a4bdea334a1e4 100644 --- a/example/PARAMETR/SEINE.2 +++ b/example/PARAMETR/RESEAUX/1/SEINE.2 @@ -1,4 +1,4 @@ -Paramètres décrivant le réseau local de stations hydrométriques du réservoir Seine (pour le calcul des débits naturels à la prise et à la restitution) +Paramètres décrivant le réseau local de stations hydrométriques du réservoir Seine (pour le calcul des débits naturels à la prise et à la restitution), version 2013 SEINE 1 0 Na et Ni MERY-_22 identifiant aval diff --git a/example/PARAMETR/YONNE.2 b/example/PARAMETR/RESEAUX/1/YONNE.2 similarity index 92% rename from example/PARAMETR/YONNE.2 rename to example/PARAMETR/RESEAUX/1/YONNE.2 index 72915e08c2be899e94104ad0f305d75f08b1528f..b088b29e5f1ef46765285f43f5468b7db6c63f69 100644 --- a/example/PARAMETR/YONNE.2 +++ b/example/PARAMETR/RESEAUX/1/YONNE.2 @@ -1,4 +1,4 @@ -Paramètres décrivant le réseau local de stations hydrométriques du réservoir Yonne (pour le calcul des débits naturels à la prise et à la restitution) +Paramètres décrivant le réseau local de stations hydrométriques du réservoir Yonne (pour le calcul des débits naturels à la prise et à la restitution), version 2013 YONNE 0 0 Na et Ni CHAUM_07 identifiant aval diff --git a/example/PARAMETR/RESEAUX/1/version.txt b/example/PARAMETR/RESEAUX/1/version.txt new file mode 100644 index 0000000000000000000000000000000000000000..a530f65318734961ce3ac8fef4e0c4f2e6a3404f --- /dev/null +++ b/example/PARAMETR/RESEAUX/1/version.txt @@ -0,0 +1 @@ +version de 2013 \ No newline at end of file diff --git a/example/PARAMETR/RETOUR.txt b/example/PARAMETR/RETOUR.txt index ef6e041323aaecf81b47007e598c8ebfe67c7808..701d2643891a6bcc4733d2b4e7f6aa43f5db8380 100644 --- a/example/PARAMETR/RETOUR.txt +++ b/example/PARAMETR/RETOUR.txt @@ -1,5 +1,5 @@ Valeurs de A et B utilisees pour le calcul de frequence : f = (n-A)/(N+B) -0.300000 0.400000 +0.500000 0 Temps de retour souhaites pour l'analyse statistique : 2.000000 @@ -12,4 +12,3 @@ Temps de retour souhaites pour l'analyse statistique : 25.000000 50.000000 100.000000 -150.000000 diff --git a/example/PARAMETR/SEINE.1 b/example/PARAMETR/SEINE.1 deleted file mode 100644 index d2e83e6a46273cd0d896c1a502c9a7684f1cec88..0000000000000000000000000000000000000000 --- a/example/PARAMETR/SEINE.1 +++ /dev/null @@ -1,48 +0,0 @@ -paramètres des contraintes et consignes du réservoir Seine (scénario : réalité d'après rapport Florine Dehay, ENGEES 2012) -SEINE -0 Qemin (m3/s) -2.00E+02 Qemax (m3/s) -0.8 Qsmin (m3/s) -35 Qsmax (m3/s) -212.9 Vtot (million de m3) -0 4 QMres -1 91 274 335 -1 2 1 2 -1 -1 3 -3 10 3 8 4 6 5 -0 4 QVres -1 91 274 335 -1 2 1 2 -1 -1 3 -3 10 3 8 4 6 5 -0 4 QMref -1 91 182 305 -1 2 3 1 -1 -1 120 -1 -1 90 -1 -1 40 -0 4 QVref -1 91 182 305 -1 2 3 1 -1 -1 120 -1 -1 90 -1 -1 40 - -FORMAT DU FICHIER : -ligne 0 : en-tête obligatoire -ligne 1 : nom du réservoir (chaîne de 8 caractères) -lignes 2 à 6 : Qemin, Qemax, Qsmin, Qsmax, V, -4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : - ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 - ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, inférieurs à 366) - ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q - lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat -notations : - Qemin et Qemax : débitance min et max du canal de prise - Qsmin et Qsmax : débitance min et max du canal de restitution - QMres et QMref : débit réservé et débit de référence, juste à l'aval de la prise - QVres et QVref : débit réservé et débit de référence juste à l'aval de la restitution - Vtot : volume total du réservoir - QMnat : débit observé juste à l'amont de la prise - QV : débit observé juste à l'aval de la restitution - diff --git a/example/PARAMETR/ALFOR_16 b/example/PARAMETR/STATIONS/ALFOR_16 similarity index 100% rename from example/PARAMETR/ALFOR_16 rename to example/PARAMETR/STATIONS/ALFOR_16 diff --git a/example/PARAMETR/ARCIS_24 b/example/PARAMETR/STATIONS/ARCIS_24 similarity index 100% rename from example/PARAMETR/ARCIS_24 rename to example/PARAMETR/STATIONS/ARCIS_24 diff --git a/example/PARAMETR/CHALO_21 b/example/PARAMETR/STATIONS/CHALO_21 similarity index 100% rename from example/PARAMETR/CHALO_21 rename to example/PARAMETR/STATIONS/CHALO_21 diff --git a/example/PARAMETR/COURL_23 b/example/PARAMETR/STATIONS/COURL_23 similarity index 100% rename from example/PARAMETR/COURL_23 rename to example/PARAMETR/STATIONS/COURL_23 diff --git a/example/PARAMETR/GURGY_02 b/example/PARAMETR/STATIONS/GURGY_02 similarity index 100% rename from example/PARAMETR/GURGY_02 rename to example/PARAMETR/STATIONS/GURGY_02 diff --git a/example/PARAMETR/MERY-_22 b/example/PARAMETR/STATIONS/MERY-_22 similarity index 100% rename from example/PARAMETR/MERY-_22 rename to example/PARAMETR/STATIONS/MERY-_22 diff --git a/example/PARAMETR/NOGEN_13 b/example/PARAMETR/STATIONS/NOGEN_13 similarity index 100% rename from example/PARAMETR/NOGEN_13 rename to example/PARAMETR/STATIONS/NOGEN_13 diff --git a/example/PARAMETR/NOISI_17 b/example/PARAMETR/STATIONS/NOISI_17 similarity index 100% rename from example/PARAMETR/NOISI_17 rename to example/PARAMETR/STATIONS/NOISI_17 diff --git a/example/PARAMETR/PARIS_05 b/example/PARAMETR/STATIONS/PARIS_05 similarity index 100% rename from example/PARAMETR/PARIS_05 rename to example/PARAMETR/STATIONS/PARIS_05 diff --git a/example/PARAMETR/STATIONS/R_AUB b/example/PARAMETR/STATIONS/R_AUB new file mode 100644 index 0000000000000000000000000000000000000000..706e35313259dc03842b7f66e36cd6fde8d7178e --- /dev/null +++ b/example/PARAMETR/STATIONS/R_AUB @@ -0,0 +1,13 @@ +Paramètres décrivant la station objectif, les réservoirs situés à l'amont et les temps de propagation +R_AUB +1 +AUBE +0 + +FORMAT DU FICHIER : +1ere ligne : en-tête obligatoire +2eme ligne : identifiant de station aval du système (chaîne de 8 caractères) +3eme ligne : nombre K de réservoirs +K noms de réservoir (1 par ligne) +K temps de propagation D entre restitution de réservoir et station aval (1 par ligne, en heure) + diff --git a/example/PARAMETR/STATIONS/R_MAR b/example/PARAMETR/STATIONS/R_MAR new file mode 100644 index 0000000000000000000000000000000000000000..2d08400e6b51f7e416c34c4d6cacf714bc7138ab --- /dev/null +++ b/example/PARAMETR/STATIONS/R_MAR @@ -0,0 +1,13 @@ +Paramètres décrivant la station objectif, les réservoirs situés à l'amont et les temps de propagation +R_MAR +1 +MARNE +0 + +FORMAT DU FICHIER : +1ere ligne : en-tête obligatoire +2eme ligne : identifiant de station aval du système (chaîne de 8 caractères) +3eme ligne : nombre K de réservoirs +K noms de réservoir (1 par ligne) +K temps de propagation D entre restitution de réservoir et station aval (1 par ligne, en heure) + diff --git a/example/PARAMETR/STATIONS/R_SEI b/example/PARAMETR/STATIONS/R_SEI new file mode 100644 index 0000000000000000000000000000000000000000..390066137e37ddeaf058e7799ca85e96eb36cfc5 --- /dev/null +++ b/example/PARAMETR/STATIONS/R_SEI @@ -0,0 +1,13 @@ +Paramètres décrivant la station objectif, les réservoirs situés à l'amont et les temps de propagation +R_SEI +1 +SEINE +0 + +FORMAT DU FICHIER : +1ere ligne : en-tête obligatoire +2eme ligne : identifiant de station aval du système (chaîne de 8 caractères) +3eme ligne : nombre K de réservoirs +K noms de réservoir (1 par ligne) +K temps de propagation D entre restitution de réservoir et station aval (1 par ligne, en heure) + diff --git a/example/PARAMETR/STATIONS/R_YON b/example/PARAMETR/STATIONS/R_YON new file mode 100644 index 0000000000000000000000000000000000000000..ff6e84d07286313ebb8eb99becfe905d0080145e --- /dev/null +++ b/example/PARAMETR/STATIONS/R_YON @@ -0,0 +1,13 @@ +Paramètres décrivant la station objectif, les réservoirs situés à l'amont et les temps de propagation +R_YON +1 +YONNE +0 + +FORMAT DU FICHIER : +1ere ligne : en-tête obligatoire +2eme ligne : identifiant de station aval du système (chaîne de 8 caractères) +3eme ligne : nombre K de réservoirs +K noms de réservoir (1 par ligne) +K temps de propagation D entre restitution de réservoir et station aval (1 par ligne, en heure) + diff --git a/example/PARAMETR/YONNE.1 b/example/PARAMETR/YONNE.1 deleted file mode 100644 index 0f6a7a4acde1d02f52596a0345d38cc961e4e83a..0000000000000000000000000000000000000000 --- a/example/PARAMETR/YONNE.1 +++ /dev/null @@ -1,48 +0,0 @@ -paramètres des contraintes et consignes du réservoir Yonne (scénario : réalité d'après rapport Florine Dehay, ENGEES 2012) -YONNE -0 Qemin (m3/s) -1.00E+20 Qemax (m3/s) -0 Qsmin (m3/s) -16 Qsmax (m3/s) -74.37 Vtot (million de m3) -0 1 QMres -1 -1 -1 -1 0 -1 10 2 QVres -1 60 91 121 152 182 244 274 305 335 -1 2 3 4 5 6 5 3 2 1 -1 -1 0.6 -1 -1 1.2 -1 -1 1.7 -1 -1 1.8 -1 -1 1.9 -1 -1 2 -0 1 QMref -1 -1 -1 -1 0 -2 3 2 QVref -1 91 305 -1 2 1 -1 -1 14 -1 -1 12 - -FORMAT DU FICHIER : -ligne 0 : en-tête obligatoire -ligne 1 : nom du réservoir (chaîne de 8 caractères) -lignes 2 à 6 : Qemin, Qemax, Qsmin, Qsmax, V, -4 groupes de lignes (pour QMres, QVres, QMref et QVref respectivement) composé chacun de : - ligne 1 : Type (entre 0 et 2), Nombre N de dates pivot (entre 1 et 10) et Borne (si Type <>0). Le débit vaut alors Q défini dans les lignes suivantes si Type=0, max(Q,QV(t-1)-borne) si Type=1 et min(Q,QV(t-1)+borne) si Type = 2 - ligne 2 : N dates pivot entières croissantes (quantièmes de changement de valeurs de Q, inférieurs à 366) - ligne 3 : N valeurs entières comprises entre 1 et M(<=N), correspondant aux catégories de valeurs de Q - lignes 4 à 3+M : nombre X (entier entre 1 et 5), puis X couples de valeurs Ai (décroissant),Bi interprétés comme suit : si QMnat>A1 alors Q=B1, sinon, si QMnat>A2 alors Q=B2, sinon…,si QMnat>Ax alors Q=Bx, sinon Q=QMnat -notations : - Qemin et Qemax : débitance min et max du canal de prise - Qsmin et Qsmax : débitance min et max du canal de restitution - QMres et QMref : débit réservé et débit de référence, juste à l'aval de la prise - QVres et QVref : débit réservé et débit de référence juste à l'aval de la restitution - Vtot : volume total du réservoir - QMnat : débit observé juste à l'amont de la prise - QV : débit observé juste à l'aval de la restitution - diff --git a/example/PARAMETR/readme.txt b/example/PARAMETR/readme.txt deleted file mode 100644 index f6ba816cd8d55d32bcc0f72d11d3014ef2402c6a..0000000000000000000000000000000000000000 --- a/example/PARAMETR/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Règles de gestion actuelle avec les consignes locales (débits de référence aux prises et restitutions). \ No newline at end of file diff --git a/src/CALCULS1.PAS b/src/CALCULS1.PAS index 690297dcefb2d47520e921903d72eb8a5937132c..2b6194f8d6e9063750fa399fe8e06906f8676e2c 100644 --- a/src/CALCULS1.PAS +++ b/src/CALCULS1.PAS @@ -1,29 +1,337 @@ UNIT CALCULS1; -{--JC Bader, Janvier 2013--} +{--JC Bader, nov 2016--} INTERFACE -uses Crt,Interfas,Utilit,DECLARA,PARAM; +uses Crt,Utilit,Interfas,DECLARA,PARAM; -procedure LectureObjectif; -function Qinter(ZRangStat:integer; ZT:double):double; -procedure CalculeQPriseQrestitution; -procedure LectureQavalPriseRestit(ZRang:integer); -Procedure QRefRes(ZType,ZRangLac:integer; ZDateEnJour:longint; ZQMnat,ZQVVeille:double; +Procedure C1_EcritureEnteteResultDetail(ZChrono:boolean); +procedure C1_LectureObjectif; +function C1_Qinter(ZRangStat:integer; ZT:double):double; +procedure C1_CalculeQPriseQrestitution; +procedure C1_LectureQavalPriseRestit(ZRang:integer); +Procedure C1_QRefRes(ZChrono : boolean;ZType,ZRangLac:integer; ZDateEnJour:longint; ZQMnat,ZQVVeille:double; var ZChaiDate:YChai10 ;var ZQRef,ZQRes:double); -Procedure Repartition (ZQSobj: double; ZQNV,ZQM,ZQRV,ZQFV,ZQRM,ZQFM : YTab1; - ZTypeObjectif : integer; - var ZSucces : integer; - var ZCodeStock,ZCodeAval,ZCodePrise,ZCodeRestit : YTabInt1; - var ZQS0,ZDefaillQ : double; - var ZQOV,ZQe,ZQs,ZQST,ZQSTmin,ZQSTmax : YTab1; - var ZNIter,ZTest : integer); +Procedure C1_Repartition (ZDat: longint; ZOption, ZTypeObjectif : integer; + Zchrono: boolean; + ZQXsous: double; + ZVol:Ytab1; + ZQVnat,ZQMnat : YTab1; + ZQVRes,ZQVRef,ZQMRes,ZQMRef:YTab1; + var ZSuccesRepart : integer; + var ZCodeRepart,ZCodeAval,ZCodePrise,ZCodeRestit,ZCodeSigne: YTabInt1; + var ZQST0,ZQSTt0,ZQSTt1,ZVRobj,ZVobj : double; + var ZTPot,ZPart,ZQV,ZQE,ZQS,ZQST,ZQSTmin3,ZQSTmax3 : YTab1; + var ZQEinf,ZQEsup,ZQSTmin1,ZQSTmax1,ZQSTmin2,ZQSTmax2 : YTab1; + var ZQEmin,ZQEmax,ZQSmin,ZQSmax : YTab1; + var ZQXdef : YTab3; + var ZQSTpot,ZVpot : YTab1; + var ZNIter,ZTest,ZNIterTps : integer); + IMPLEMENTATION -{============================================================================} -procedure LectureObjectif; +{===============================================================} +{--Ecriture d'en-tˆte du fichier texte des r‚sultats d‚taill‚s--} +{===============================================================} + +Procedure C1_EcritureEnteteResultDetail(ZChrono:boolean); + + var + Xtype : string; + XQST0 : string; + + begin + if ZChrono then + assign(YFicResult2,YRepR+YNomFicResChr1) + else + assign(YFicResult2,YRepR+YNomFicResChr2); + rewrite(YFicResult2); + writeln(YFicResult2,'Rang du calcul : ',YCompteur,' ; ',YResume); + B_Datation(YFicResult2); + writeln(YFicResult2); + if ZChrono then + writeln(YFicResult2,'Detail des resultats obtenus en simulant en SENS CHRONOLOGIQUE une gestion produisant un debit le plus proche possible de l''objectif a la station aval ', + '(calcul du volume d''eau Vges present dans chaque reservoir)') + else + writeln(YFicResult2,'Detail des resultats obtenus en simulant en SENS CHRONOLOGIQUE INVERSE une gestion produisant un debit le plus proche possible de l''objectif a la station aval ', + '(calcul du volume d''eau Vobj present dans chaque reservoir)'); + writeln(YFicResult2,'Les valeurs donnees en haut des colonnes de dates sont les parties ', + 'fractionnaires de celles-ci (exprimees en jour).'); + write(YFicResult2,'Les dates editees (correspondant au milieu de pas de temps) concernent les valeurs de debit, par', + ' rapport auxquelles les valeurs de volume de debut de pas de temps sont decalees de '); + if ZChrono then + writeln(YFicResult2,'- 12h.') + else + writeln(YFicResult2,'+ 12h.'); + writeln(YFicResult2); + write(YFicResult2,'Variables editees (debits en m3/s ; volumes en '); + if YAbsRel=1 then + writeln(YFicResult2,'m3) :') + else + writeln(YFicResult2,'valeurs relatives par rapport aux capacites) :'); + writeln(YFicResult2); + writeln(YFicResult2,'# date aval : date T de l''objectif de debit a la station situee a l''aval du systeme (lieu de l''objectif)'); + writeln(YFicResult2,'# QXsous : objectif de stockage de debit defini a la station aval, a 12h (date aval)'); + writeln(YFicResult2,'# date amont : date aval diminuee du temps de propagation entre le point de ', + 'restitution et la station aval du systeme (=T-D(i))'); + if ZChrono then + begin + write(YFicResult2,'# Vges : '); + if YTypeObjectif=0 then + writeln(YFicResult2,'plus grand volume d''eau pouvant etre present dans chaque reservoir (date amont - 12h), apres la meilleure satisfaction anterieure possible de l''objectif aval ', + '(un volume superieur a Vges, plus favorable a la satisfaction future, implique plus de defaillances anterieures)') + else + writeln(YFicResult2,'plus petit volume d''eau pouvant etre present dans chaque reservoir (date amont - 12h), apres la meilleure satisfaction anterieure possible de l''objectif aval ', + '(un volume inferieur a Vges, plus favorable a la satisfaction future, implique plus de defaillances anterieures)'); + end + else + begin + write(YFicResult2,'# Vobj : '); + if YTypeObjectif=0 then + writeln(YFicResult2,'plus petit volume d''eau present dans chaque reservoir (date amont + 12h), permettant la meilleure satisfaction posterieure possible de l''objectif aval ', + '(un volume superieur ou egal a Vobj permet cette meilleure satisfaction possible dans le futur, mais un volume plus petit implique plus de defaillances futures)') + else + writeln(YFicResult2,'plus grand volume d''eau present dans chaque reservoir (date amont + 12h), permettant la meilleure satisfaction posterieure possible de l''objectif aval ', + '(un volume inferieur ou egal a Vobj permet cette meilleure satisfaction possible dans le futur, mais un volume plus grand implique plus de defaillances futures)'); + end; + writeln(YFicResult2,'# QEmin : debitance minimale de la prise (date amont)'); + writeln(YFicResult2,'# QEmax : debitance maximale de la prise (date amont)'); + writeln(YFicResult2,'# QSmin : debitance minimale de la restitution (date amont)'); + writeln(YFicResult2,'# QSmax : debitance maximale de la restitution (date amont)'); + writeln(YFicResult2,'# QMnat : debit naturel au point de prise (date amont)'); + writeln(YFicResult2,'# QVnat : debit naturel au point de restitution (date amont)'); + writeln(YFicResult2,'# QMref : debit de reference dans le cours d''eau (qu''on souhaite ne pas voir depasse) a l''aval ', + 'immediat de la prise (date amont)'); + writeln(YFicResult2,'# QMres : debit reserve dans le cours d''eau (qu''on souhaite voir depasse) a l''aval ', + 'immediat de la prise (date amont)'); + writeln(YFicResult2,'# QVref : debit de reference dans le cours d''eau a l''aval immediat de la restitution (date amont)'); + writeln(YFicResult2,'# QVres : debit reserve dans le cours d''eau a l''aval immediat de la restitution (date amont)'); + writeln(YFicResult2,'# QEinf : limite minimale de debit pris dans le cours d''eau, imposee par les contraintes physiques et consignes a la prise (date amont)'); + writeln(YFicResult2,'# QEsup : limite maximale de debit pris dans le cours d''eau, imposee par les contraintes physiques et consignes a la prise (date amont)'); + writeln(YFicResult2,'# QSTmin1 : limite minimale de debit stocke net imposee par les contraintes physiques et consignes a la prise et a la restitution (date amont)'); + writeln(YFicResult2,'# QSTmax1 : limite maximale de debit stocke net imposee par les contraintes physiques et consignes a la prise et a la restitution (date amont)'); + writeln(YFicResult2,'# QSTmin2 : limite minimale de debit stocke net imposee par le volume d''eau present et la capacite de reservoir (date amont)'); + writeln(YFicResult2,'# QSTmax2 : limite maximale de debit stocke net imposee par le volume d''eau present et la capacite de reservoir (date amont)'); + writeln(YFicResult2,'# QSTmin3 : limite minimale de debit stocke net imposee par les contraintes physiques et consignes a la prise et a la restitution', + ' d''une part, et par le volume d''eau present et la capacite de reservoir d''autre part (date amont)'); + writeln(YFicResult2,'# QSTmax3 : limite maximale de debit stocke net imposee par les contraintes physiques et consignes a la prise et a la restitution', + ' d''une part, et par le volume d''eau present et la capacite de reservoir d''autre part (date amont)'); + case YOptionRepart of + 1..2: begin + write(YFicResult2,'# TPot : temps minimal de reconstitution du volume utilisable maximal, dans l''hypothese du debit moyen du cours d''eau a la prise '); + if YOptionRepart=1 then + writeln(YFicResult2,'(non gere)') + else + writeln(YFicResult2,'(date amont)'); + writeln(YFicResult2,'# Part : part de l''objectif de stockage de debit assignee au reservoir (date amont)'); + end; + 3 : begin + write(YFicResult2,'# VRobj : objectif commun de taux de remplissage des reservoirs en fin de pas de temps (date amont '); + if ZChrono then + writeln(YFicResult2,' + 12h)') + else + writeln(YFicResult2,' - 12h)'); + writeln(YFicResult2,'# QSTpot : objectif theorique de debit stocke permettant d''atteindre l''objectif VRobj de taux de remplissage (date amont)'); + end; + 4..5: begin + if YCodeTpot then + writeln(YFicResult2,'# Tpot1 : duree potentielle minimale de reconstitution de volume utilisable maximal, apres la fin de pas de temps (date amont)') + else + writeln(YFicResult2,'# Tpot2 : duree potentielle minimale d''epuisement du volume utilisable apres la fin de pas de temps (date amont)'); + write(YFicResult2,'# Vpot : objectif theorique de volume en fin de pas de temps, equilibrant les durees Tpot'); + if YCodeTpot then + write(YFicResult2,'1 (date amont ') + else + write(YFicResult2,'2 (date amont '); + if ZChrono then + writeln(YFicResult2,'+ 12h)') + else + writeln(YFicResult2,'- 12h)'); + writeln(YFicResult2,'# QSTpot : objectif theorique de debit stocke donnant le volume Vpot en fin de pas de temps (date amont)'); + end; + end; + writeln(YFicResult2,'# QST : debit stocke net dans le reservoir (date amont)'); + writeln(YFicResult2,'# QV : debit du cours d''eau influence par le reservoir, a l''aval immediat de la restitution (date amont)'); + writeln(YFicResult2,'# QE : debit pris par le reservoir dans le cours d''eau (date amont)'); + writeln(YFicResult2,'# QS : debit restitue par le reservoir dans le cours d''eau (date amont)'); + writeln(YFicResult2,'# A, B, C, D et E : codes definis dans le fichier ',YNomFicSortie); + if ZChrono then + begin + writeln(YFicResult2,'# VTges : somme (date aval - 12h) des volumes d''eau presents dans les reservoirs (dates amont - 12h)'); + writeln(YFicResult2,'# VTges0 : somme (date aval - 12h) des volumes d''eau presents dans les reservoirs (dates amont - 12h), supposes sans limites de capacite pouvant causer des defaillances'); + end + else + begin + writeln(YFicResult2,'# VTobj : somme (date aval + 12h) des volumes d''eau presents dans les reservoirs (dates amont + 12h)'); + writeln(YFicResult2,'# VTobj0 : somme (date aval + 12h) des volumes d''eau presents dans les reservoirs (dates amont + 12h), supposes sans limites de capacite pouvant causer des defaillances'); + end; + write(YFicResult2,'# Vdef : manque global (date aval '); + if ZChrono then + write(YFicResult2,'- 12h) de volume ') + else + write(YFicResult2,'+ 12h) de volume '); + if (ZChrono and (YTypeObjectif=1)) or ((not ZChrono) and (YTypeObjectif=0)) then + write(YFicResult2,'d''eau') + else + write(YFicResult2,'de vide'); + write(YFicResult2,' present en debut de pas de temps dans les reservoirs (dates amont '); + if ZChrono then + write(YFicResult2,'- 12h), responsable de defaillances QXdef2 ') + else + write(yFicResult2,'+ 12h), responsable de defaillances QXdef2 '); + if ZChrono then + writeln(YFicResult2,'anterieures') + else + writeln(YFicResult2,'posterieures'); + case YOptionrepart of + 1..2: begin + XQST0:='QST0a'; + writeln(YFicResult2,'# ',XQST0,' : norme du debit stocke reparti entre les reservoirs au meilleur ', + 'prorata possible de leurs parts assignees respectives (dates amont)'); + end; + 3..5: begin + XQST0:='QST0b'; + writeln(YFicResult2,'# ',XQST0,' : decalage applique a chaque debit stocke theorique QSTpot pour obtenir des debits QST respectant les limites locales QSTmin3 et QSTmax3 (dates amont)'); + end; + end; + if YTypeObjectif=0 then + XType:='manque' + else + XType:='exces'; + writeln(YFicResult2,'# QXdef0 : ',Xtype,' inevitable absolu de debit par rapport a l''objectif a la station aval du systeme, du seul fait des contraintes ', + 'physiques et des consignes aux prises et restitutions des reservoirs (date aval)'); + writeln(YFicResult2,'# QXdef1 : ',Xtype,' de debit par rapport a l''objectif a la station aval du systeme, du fait des contraintes ', + 'physiques et des consignes aux prises et restitutions des reservoirs, ainsi que des volumes presents et des ', + 'capacites des reservoirs (date aval)'); + writeln(YFicResult2,'# QXdef2 : ',Xtype,' de debit par rapport a l''objectif a la station aval du systeme, du seul fait des volumes presents', + ' et des capacites des reservoirs (date aval)'); + writeln(YFicResult2,'# Succes : code defini dans le fichier ',YNomFicSortie); + writeln(YFicResult2,'# Iter : nombre d''iterations effectuees pour calculer ',XQST0,' par encadrements successifs'); + writeln(YFicResult2,'# Test : egal a 1 si le debit total stocke croit comme il se doit avec ',XQST0,' dans le calcul ', + 'iteratif de ce dernier'); + if YOptionRepart=5 then + writeln(YFicResult2,'# IterTps : nombre d''iterations pour uniformiser les temps de remplissage potentiels en fin de pas de temps') + else + writeln(YFicResult2); + writeln(YFicResult2); + write(YFicResult2,' 0.50000 '); + for YRanglac:=1 to YNbLacs do + begin + write(YFicResult2,' ',YDecalDateQ[YRanglac]:8:5, + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' '); + if (YOptionRepart=4) or (YOptionRepart=5) then + write(YFicResult2,' '); + end; + writeln(YFicResult2); + write(YFicResult2,' date aval QXsous'); + for YRangLac:=1 to YNbLacs do + begin + write(YFicResult2,' date amont[',YRangLac,']'); + if ZChrono then + if YAbsRel=1 then + write(YFicResult2,' Vges[',YRanglac,']') + else + write(YFicResult2,' Vges[',YRanglac,']/Vtot[',YRangLac,']') + else + if YAbsRel=1 then + write(YFicResult2,' Vobj[',YRangLac,']') + else + write(YFicResult2,' Vobj[',YRangLac,']/Vtot[',YRangLac,']'); + write(YFicResult2,' QEmin[',YRanglac,']', + ' QEmax[',YRanglac,']', + ' QSmin[',YRanglac,']', + ' QSmax[',YRanglac,']', + ' QMnat[',YRanglac,']', + ' QVnat[',YRanglac,']', + ' QMref[',YRanglac,']', + ' QMres[',YRanglac,']', + ' QVref[',YRanglac,']', + ' QVres[',YRanglac,']', + ' QEinf[',YRanglac,']', + ' QEsup[',YRanglac,']', + ' QSTmin1[',YRanglac,']', + ' QSTmax1[',YRanglac,']', + ' QSTmin2[',YRanglac,']', + ' QSTmax2[',YRanglac,']', + ' QSTmin3[',YRanglac,']', + ' QSTmax3[',YRanglac,']'); + case YOptionRepart of + 1..2: write(YFicResult2,' TPot[',YRanglac,']', + ' Part[',YrangLac,']'); + 3 : write(YFicResult2,' VRobj', + ' QSTpot[',YrangLac,']'); + 4..5: begin + write(YFicResult2,' TPot'); + if YCodeTpot then + write(YFicResult2,'1') + else + write(YFicResult2,'2'); + write(YFicResult2,'[',YRanglac,']'); + if YAbsRel=1 then + write(YFicResult2,' Vpot[',YrangLac,']') + else + write(YFicResult2,' Vpot[',YrangLac,']/Vtot[',YRangLac,']'); + write(YficResult2,' QSTpot[',YrangLac,']') + end; + end; + write(YFicResult2,' QST[',YRangLac,']', + ' QV[',YRanglac,']', + ' QE[',YRanglac,']', + ' QS[',YRanglac,']', + ' A[',YRanglac,']',' B[',YRanglac,']', + ' C[',YRanglac,']',' D[',YRanglac,']', + ' E[',YRangLac,']'); + end; + if YAbsRel=1 then + begin + if ZChrono then + write(YFicResult2,' VTges', + ' VTges0') + else + write(YFicResult2,' VTobj', + ' VTobj0'); + write(YFicResult2, ' Vdef'); + end + else + begin + if ZChrono then + write(YFicResult2,' VTges/somme(Vtot)', + ' VTges0/somme(Vtot)') + else + write(YFicResult2,' VTobj/somme(Vtot)', + ' VTobj0/somme(Vtot)'); + write(YFicResult2, ' Vdef/somme(Vtot)'); + end; + write(YFicResult2,' ',XQST0); + write(YFicResult2,' QXdef0'); + write(YFicResult2,' QXdef1 QXdef2', + ' Succes Iter Test'); + if YOptionRepart=5 then + write(YFicResult2,' IterTps'); + writeln(YFicResult2); + + end; {fin de C1_EcritureEnteteResultDetail} + +{===================================================================} +{--Lecture de l'hydrogramme objectif annuel vis‚ … la station aval--} +{===================================================================} + +procedure C1_LectureObjectif; var XCode : integer; @@ -35,19 +343,20 @@ procedure LectureObjectif; XQ : double; XChai : string; XFitext : text; + Xi : integer; begin if YSaisie then begin writeln; - aquest; + a_quest; write('nom du fichier de d‚bit objectif (station aval) ? '); - Alecture_xy; + A_lecture_xy; end; - YNbQobj:=0; + YNbQXobj:=0; repeat if YSaisie then - AReponse(YNomFicObjectif,30); + A_Reponse(YNomFicObjectif,29); {$i-} assign(XFitext,YRepO+YNomFicObjectif); reset(XFiText); @@ -58,7 +367,7 @@ procedure LectureObjectif; begin YDateObj[0]:=0; - while not eof(XFitext) and (YDateObj[YNbQobj]<365) do + while not eof(XFitext) and (YDateObj[YNbQXobj]<365) do begin readln(XFitext,XChai); val(copy(XChai,1,2),XJour,Xcode); @@ -69,32 +378,32 @@ procedure LectureObjectif; begin val(copy(XChai,6,length(XChai)-5),XQ,XCode); if XCode=0 then - if (XMois>0) and (XMois<13) and (XJour>0) and (XJour<=AlongMois(2001,XMois)) and (XQ>=0) then + if (XMois>0) and (XMois<13) and (XJour>0) and (XJour<=B_longMois(2001,XMois)) and (XQ>=0) then begin - XNouvelleDate:= AQuantieme(XJour,XMois,2001); - if XNouvelleDate>YDateObj[YNbQobj] then + XNouvelleDate:= B_Quantieme(XJour,XMois,2001); + if XNouvelleDate>YDateObj[YNbQXobj] then begin - YNbQobj:=YNbQobj+1; - YDateObj[YNbQobj]:=XNouvelleDate; - YDebitObj[YNbQobj]:=XQ; + YNbQXobj:=YNbQXobj+1; + YDateObj[YNbQXobj]:=XNouvelleDate; + YDebitObj[YNbQXobj]:=XQ; end {fin du cas o— date croissante} end; {fin du cas o— date et d‚bits valides} end; {fin du cas o— mois bien lu} end; {fin du cas o— jour bien lu} end; {fin du cas o— fichier non entiŠrement lu et derniŠre date < 365} - if YNbQobj>0 then + if YNbQXobj>0 then begin YResume:=YResume+'objectif = '+YNomFicObjectif; - YDateObj[0]:=YDateObj[YNbQobj]-365; - YDebitObj[0]:=YDebitObj[YNbQobj]; - YNbQobj:=YNbQobj+1; - YDateObj[YNbQobj]:=365+YDateObj[1]; - YDebitObj[YNbQobj]:=YDebitObj[1]; + YDateObj[0]:=YDateObj[YNbQXobj]-365; + YDebitObj[0]:=YDebitObj[YNbQXobj]; + YNbQXobj:=YNbQXobj+1; + YDateObj[YNbQXobj]:=365+YDateObj[1]; + YDebitObj[YNbQXobj]:=YDebitObj[1]; XPivot:=1; for XQuantieme:=1 to 365 do begin - YQObj[XQuantieme]:=YDebitObj[XPivot-1]+(XQuantieme-YDateObj[Xpivot-1]) + YQXobj[XQuantieme]:=YDebitObj[XPivot-1]+(XQuantieme-YDateObj[Xpivot-1]) /(YDateObj[XPivot]-YDateObj[XPivot-1])*(YDebitObj[XPivot]-YDebitObj[XPivot-1]); if XQuantieme=YDateObj[Xpivot] then XPivot:=XPivot+1 @@ -103,12 +412,17 @@ procedure LectureObjectif; else if YSaisie then begin - AWindow(1,Ay+2,80,Ay+5); - ATexte; + A_Texte; + writeln; write('ATTENTION : ce fichier ne contient aucun triplet jour/mois d‚bit correct.'); - ATapez; - clrscr; - AWindow1; + A_Tapez; + Ay:=Ay+B_minIn(0,ALignemax-Ay-4); + for Xi:=2 to 5 do + begin + gotoxy(1,Ay+Xi); + clreol; + end; + A_Window1; end; close(XFiText); @@ -119,41 +433,47 @@ procedure LectureObjectif; begin if YSaisie then begin - AWindow(1,Ay+2,80,Ay+5); - ATexte; + A_Texte; + writeln; if YNomFicObjectif<>'' then begin write('ATTENTION : ce fichier est impossible a ouvrir.'); - ATapez; - clrscr; + A_Tapez; + Ay:=Ay+B_minIn(0,ALignemax-Ay-4); + for Xi:=2 to 5 do + begin + gotoxy(1,Ay+Xi); + clreol; + end; end else begin write('ABANDON du calcul'); - ATapez; + A_Tapez; end; - AWindow1 + A_Window1 end; end; {fin du cas o— : nom de fichier vide ou fichier imposssible … ouvrir} - until (YNbQobj>0) or (YNomFicObjectif='') or (not YSaisie); + until (YNbQXobj>0) or (YNomFicObjectif='') or (not YSaisie); - writeln(YFicSortie,'Nom du fichier decrivant l''hydrogramme objectif a la station aval du systeme : ',YNomFicObjectif); + writeln(YFicSortie,'Nom du fichier decrivant l''hydrogramme objectif a la station aval du systeme : ',YRepO,YNomFicObjectif); writeln(YFicSortie); if YnomFicObjectif='' then writeln(YFicSortie,'aucun nom de fichier saisi. Abandon du calcul.') else - if YNbQobj=0 then + if YNbQXobj=0 then writeln(YFicSortie,'aucun couple date/debit lu dans le fichier pour definir l''objectif. Abandon du calcul'); - end; + flush(YFicSortie); + end; {fin de C1_LectureObjectif} {==========================================================================} {--Calcul pour la station de rang ZRangStat du d‚bit au temps ZT, par --} {--interpolation lin‚aire … partir du tableau YQ --} {==========================================================================} -function Qinter(ZRangStat:integer; ZT:double):double; +function C1_Qinter(ZRangStat:integer; ZT:double):double; var X_Rangsup : integer; @@ -163,12 +483,12 @@ function Qinter(ZRangStat:integer; ZT:double):double; BEGIN if ZT>=0 then begin - X_RangInf:=AminIn(YDelaimax-1,trunc(ZT)); + X_RangInf:=B_minIn(YDelaimax-1,trunc(ZT)); X_RangSup:=X_RangInf+1; end else begin - X_RangSup:=AmaxIn(YDelaiMin+1,trunc(Zt)); + X_RangSup:=B_maxIn(YDelaiMin+1,trunc(Zt)); X_RangInf:=X_RangSup-1; end; if (YQ[ZRangStat,X_RangInf]>=0) and (YQ[ZRangStat,X_RangSup]>=0) then @@ -178,18 +498,17 @@ function Qinter(ZRangStat:integer; ZT:double):double; X_Interpopol:=YLacune; YLacuneDebit:=true; end; - Qinter:=X_Interpopol - END; - + C1_Qinter:=X_Interpopol + END; {fin de C1_Qinter} -{============================================================================} -{--Calcul des d‚bits naturels au droit des prises et restitutions, … partir--} -{--du fichier des d‚bits de base aux diff‚rentes stations. Les d‚bits --} -{--calcul‚s sont directement stock‚s sur le fichier (nom YNomFicResult1 --} -{--d‚fini en constante) --} -{============================================================================} +{========================================================================} +{--Calcul des d‚bits naturels au droit des prises et restitutions, … --} +{--partir du fichier des d‚bits de base aux diff‚rentes stations. Les --} +{--d‚bits calcul‚s sont directement stock‚s sur fichier texte --} +{--(YNomFicResult1 = 'Qobs-P-R.txt') --} +{========================================================================} -procedure CalculeQPriseQrestitution; +procedure C1_CalculeQPriseQrestitution; var XCode : integer; @@ -222,64 +541,66 @@ procedure CalculeQPriseQrestitution; XQM : array[1..2] of double; XQV : array[1..2] of double; -{----------------------------------------------------------------------------} -{--Calcul des rangs des stations n‚cessaires, dans le fichier des d‚bits de--} -{--base utilis‚s en entr‚e des calculs. --} -{----------------------------------------------------------------------------} - -procedure XCorrespondance(ZChai:YChai8; var ZRang,ZManqueStation:integer); - var - X_Rang : integer; - begin - ZRang:=0; - for X_Rang:=1 to XNbStat do - if ZChai=XNomStation[X_Rang] then ZRang:=X_Rang; - if ZRang=0 then - ZManqueStation:=ZManqueStation+1; - end; - -{---------------------------------------------------------------------------} -{--Lecture d'une ligne dans le fichier des d‚bits de base, et affectation --} -{--des valeurs … la ligne de rang ZRang dans les tableaux YDate et YQ --} -{---------------------------------------------------------------------------} - -procedure XLectureLigneDebit(ZRang:integer); - var - X_Rang : integer; - begin - read(YFiText,YDate[ZRang]); - XBienLu:=XBienLu and (ioresult=0); - for X_Rang:=1 to XNbStat do - begin - read(YFitext,YQ[X_Rang,ZRang]); - XBienLu:=XBienLu and (ioresult=0); - end; - readln(YFitext); - XInutile:=ioresult; - if YInterpolPermi then - if ZRang>YDelaimin+1 then - for X_Rang:=1 to XNbStat do - if YQ[X_Rang,ZRang-1]<0 then - if (YQ[X_Rang,ZRang-2]>=0) and (YQ[X_Rang,ZRang]>=0) then - YQ[X_Rang,ZRang-1]:=(YQ[X_Rang,ZRang-2]+YQ[X_Rang,ZRang])/2; - end; - -{---------------------------------------------------------------------------} -{--Teste si le rang ZT se situe bien entre les indices min et max du --} -{--tableau YQ --} -{---------------------------------------------------------------------------} - -procedure TesteDelai(ZT:double); - begin - if ZT>=YDelmaxKiFodra then - YdelmaxKiFodra:=ZT; - if ZT<=YDelminKifoDra then - YDelMinKiFodra:=ZT; - end; - -{---------------------------------------------------------------------------} - - BEGIN {d‚but de procedure CalculeQPriseQrestitution} + {--------------------------------------------------------------------------} + {--Calcul des rangs des stations n‚cessaires, dans le fichier des d‚bits --} + {--de base utilis‚s en entr‚e des calculs. --} + {--------------------------------------------------------------------------} + + procedure XCorrespondance(ZChai:YChai8; var ZRang,ZManqueStation:integer); + var + X_Rang : integer; + begin + ZRang:=0; + for X_Rang:=1 to XNbStat do + if ZChai=XNomStation[X_Rang] then ZRang:=X_Rang; + if ZRang=0 then + ZManqueStation:=ZManqueStation+1; + end; {fin de XCorrespondance} + + {---------------------------------------------------------------------------} + {--Lecture d'une ligne dans le fichier des d‚bits de base, et affectation --} + {--des valeurs … la ligne de rang ZRang dans les tableaux YDate et YQ --} + {---------------------------------------------------------------------------} + + procedure XLectureLigneDebit(ZRang:integer); + var + X_Rang : integer; + begin + read(YFiText,YDate[ZRang]); + XBienLu:=XBienLu and (ioresult=0); + for X_Rang:=1 to XNbStat do + begin + read(YFitext,YQ[X_Rang,ZRang]); + XBienLu:=XBienLu and (ioresult=0); + end; + readln(YFitext); + XInutile:=ioresult; + if YInterpolPermi then + if ZRang>YDelaimin+1 then + for X_Rang:=1 to XNbStat do + if YQ[X_Rang,ZRang-1]<0 then + if (YQ[X_Rang,ZRang-2]>=0) and (YQ[X_Rang,ZRang]>=0) then + YQ[X_Rang,ZRang-1]:=(YQ[X_Rang,ZRang-2]+YQ[X_Rang,ZRang])/2; + end; {fin de XLectureLigneDebit} + + {---------------------------------------------------------------------------} + {--Teste si le rang ZT se situe bien entre les indices min et max du --} + {--tableau YQ --} + {---------------------------------------------------------------------------} + + procedure XTesteDelai(ZT:double); + begin + if ZT>=YDelmaxKiFodra then + YdelmaxKiFodra:=ZT; + if ZT<=YDelminKifoDra then + YDelMinKiFodra:=ZT; + end; + + {-------------------------------------------------------------} + {--corps principal de la procedure CalculeQPriseQrestitution--} + {-------------------------------------------------------------} + + BEGIN {d‚but de C1_CalculeQPriseQrestitution} YGlopGlopDebit:=false; XNbNonLacune:=0; @@ -288,32 +609,37 @@ procedure TesteDelai(ZT:double); if YSaisie then begin writeln; - aquest; + a_quest; write('nom du fichier des d‚bits naturels ? '); - Alecture_xy; + A_lecture_xy; repeat - AReponse(YNomFicDebit,43); + A_Reponse(YNomFicDebit,42); assign(YFitext,YRepD+YNomFicDebit); reset(YFiText); XCode:=ioresult; if (XCode<>0) or (YNomFicDebit='') then begin - AWindow(1,Ay+2,80,Ay+5); - ATexte; + A_Texte; + writeln; if YNomFicDebit<>'' then begin write('ATTENTION : ce fichier est impossible a ouvrir.'); - ATapez; - clrscr; + A_Tapez; + Ay:=Ay+B_minIn(0,ALignemax-Ay-4); + for Xi:=2 to 5 do + begin + gotoxy(1,Ay+Xi); + clreol; + end; end else begin write('ABANDON du calcul'); - ATapez; + A_Tapez; end; - AWindow1 end; until (XCode=0) or (YNomFicDebit=''); + writeln; end else begin @@ -322,7 +648,7 @@ procedure TesteDelai(ZT:double); XCode:=ioresult; end; - writeln(YFicSortie,'Nom du fichier des debits journaliers aux stations : ',YNomFicDebit); + writeln(YFicSortie,'Nom du fichier des debits journaliers aux stations : ',YRepD,YNomFicDebit); writeln(YFicSortie); {--cas o— le fichier s'ouvre bien--} @@ -343,10 +669,10 @@ procedure TesteDelai(ZT:double); begin - YResume:=YResume+' regime des apports = '+YNomFicDebit+' ; '; + YResume:=YResume+' apports = '+YNomFicDebit+' ; '; if YSaisie then begin - ATitre; + A_Titre; write('calcul des d‚bits naturels aux prises et restitutions : en cours'); end; @@ -405,12 +731,12 @@ procedure TesteDelai(ZT:double); assign(YFicResult1,YRepR+YNomFicResult1); rewrite(YFicResult1); writeln(YFicResult1,'Rang du calcul : ',YCompteur,' ; ',YResume); - ADatation(YFicResult1); + B_Datation(YFicResult1); writeln(YFicResult1); writeln(YFicResult1,'Debits naturels a 12H, a la station aval du systeme ', - '(Qnat) et au droit des prises (QMnat) et restitutions (QVnat) :'); + '(QXnat) et au droit des prises (QMnat) et restitutions (QVnat) :'); writeln(YFicResult1); - write (YFicResult1,'Date ',' Qnat '); + write (YFicResult1,'Date ',' QXnat '); for YRanglac :=1 to YNblacs do write(YFicResult1,' QMnat(',YRangLac:2,') QVnat(',YRangLac:2,') '); writeln(YFicResult1); @@ -431,20 +757,20 @@ procedure TesteDelai(ZT:double); if YNam[YRangLac]>0 then for XRang:=1 to YNam[YRangLac] do begin - TesteDelai(YDM[YRangLac,XRang]); + XTesteDelai(YDm[YRangLac,XRang]); for Xi:=1 to YNam[YRangLac] do - TesteDelai(YDM[YRanglac,XRang]-YDam[YRangLac,Xi]); + XTesteDelai(YDm[YRanglac,XRang]-YDam[YRangLac,Xi]); if YNInt[YRanglac]>0 then - TesteDelai(YDM[YRangLac,XRang]-YDInt[YrangLac]); - TesteDelai(YDM[YrangLac,XRang]-YDam[YRangLac,XRang]); - TesteDelai(YDV[YRangLac,XRang]); + XTesteDelai(YDm[YRangLac,XRang]-YDInt[YrangLac]); + XTesteDelai(YDm[YrangLac,XRang]-YDam[YRangLac,XRang]); + XTesteDelai(YDv[YRangLac,XRang]); for Xi:=1 to YNam[YRangLac] do - TesteDelai(YDV[YRanglac,Xrang]-YDam[YRangLac,Xi]); + XTesteDelai(YDv[YRanglac,Xrang]-YDam[YRangLac,Xi]); if YNInt[YRanglac]>0 then - TesteDelai(YDV[YRangLac,XRang]-YDInt[YrangLac]); - TesteDelai(YDV[YrangLac,XRang]-YDam[YRangLac,XRang]); + XTesteDelai(YDv[YRangLac,XRang]-YDInt[YrangLac]); + XTesteDelai(YDv[YrangLac,XRang]-YDam[YRangLac,XRang]); end; - TesteDelai(-YD[YRangLac]); + XTesteDelai(-YD[YRangLac]); end; if (YDelMinKifodra<YDelaimin) or (YDelmaxKiFodra>Ydelaimax) then begin @@ -501,22 +827,22 @@ procedure TesteDelai(ZT:double); for XRang:=1 to YNam[YRangLac] do begin YLacuneDebit:=false; - XQM[XRang]:=Qinter(YRangStatAv[YRangLac],YDM[YRangLac,XRang]); + XQM[XRang]:=C1_Qinter(YRangStatAv[YRangLac],YDm[YRangLac,XRang]); for Xi:=1 to YNam[YRangLac] do - XQM[XRang]:=XQM[XRang]-Qinter(YRangStatAm[YRangLac,Xi],YDM[YRanglac,XRang]-YDam[YRangLac,Xi]); + XQM[XRang]:=XQM[XRang]-C1_Qinter(YRangStatAm[YRangLac,Xi],YDm[YRanglac,XRang]-YDam[YRangLac,Xi]); if YNInt[YRanglac]>0 then - XQM[XRang]:=XQM[XRang]-Qinter(YRangStatInt[YRangLac],YDM[YRangLac,XRang]-YDInt[YrangLac]); - XQM[XRang]:=XQM[XRang]*(YSM[YRangLac,XRang]-YSAm[YRangLac,Xrang])/XDenominateur - +Qinter(YRangStatAm[YRangLac,XRang],YDM[YrangLac,XRang]-YDam[YRangLac,XRang]); + XQM[XRang]:=XQM[XRang]-C1_Qinter(YRangStatInt[YRangLac],YDm[YRangLac,XRang]-YDInt[YrangLac]); + XQM[XRang]:=XQM[XRang]*(YSm[YRangLac,XRang]-YSAm[YRangLac,Xrang])/XDenominateur + +C1_Qinter(YRangStatAm[YRangLac,XRang],YDm[YrangLac,XRang]-YDam[YRangLac,XRang]); if YlacuneDebit then XLacunePrise:=true; YLacuneDebit:=false; - XQV[XRang]:=Qinter(YRangStatAv[YRangLac],YDV[YRangLac,XRang]); + XQV[XRang]:=C1_Qinter(YRangStatAv[YRangLac],YDv[YRangLac,XRang]); for Xi:=1 to YNam[YRangLac] do - XQV[XRang]:=XQV[XRang]-Qinter(YRangStatAm[YRangLac,Xi],YDV[YRanglac,Xrang]-YDam[YRangLac,Xi]); + XQV[XRang]:=XQV[XRang]-C1_Qinter(YRangStatAm[YRangLac,Xi],YDv[YRanglac,Xrang]-YDam[YRangLac,Xi]); if YNInt[YRanglac]>0 then - XQV[XRang]:=XQV[XRang]-Qinter(YRangStatInt[YRangLac],YDV[YRangLac,XRang]-YDInt[YrangLac]); - XQV[XRang]:=XQV[XRang]*(YSV[YRangLac,XRang]-YSAm[YRangLac,Xrang])/XDenominateur - +Qinter(YRangStatAm[YRangLac,XRang],YDV[YrangLac,XRang]-YDam[YRangLac,XRang]); + XQV[XRang]:=XQV[XRang]-C1_Qinter(YRangStatInt[YRangLac],YDv[YRangLac,XRang]-YDInt[YrangLac]); + XQV[XRang]:=XQV[XRang]*(YSv[YRangLac,XRang]-YSAm[YRangLac,Xrang])/XDenominateur + +C1_Qinter(YRangStatAm[YRangLac,XRang],YDv[YrangLac,XRang]-YDam[YRangLac,XRang]); if YLacuneDebit then XLacuneRestit:=true; end; {fin de boucle sur les stations amont} @@ -524,14 +850,14 @@ procedure TesteDelai(ZT:double); if not XlacunePrise then begin - XQPrise:=Amax(0,XQM[1]+XQM[2]); + XQPrise:=B_max(0,XQM[1]+XQM[2]); XNbNonLacune:=1; end else XQPrise:=YLacune; if not XLacuneRestit then begin - XQRestit:=Amax(0,XQV[1]+XQV[2]); + XQRestit:=B_max(0,XQV[1]+XQV[2]); XNbNonlacune:=1; end else @@ -574,12 +900,12 @@ procedure TesteDelai(ZT:double); writeln(YFicSortie,'Probleme detecte : le fichier ',YNomFicDebit,' est non conforme'); if YSaisie then begin - AWindow(1,Ay+2,80,Ay+5); + A_Window(1,Ay+2,80,Ay+5); clrscr; - ATexte; + A_Texte; write('fichier non conforme. ABANDON du calcul'); - ATapez; - AWindow1 + A_Tapez; + A_Window1 end; end; @@ -593,12 +919,12 @@ procedure TesteDelai(ZT:double); writeln(YFicSortie,'Probleme detecte : le fichier ',YNomFicDebit,' est vide. Abandon du calcul'); if YSaisie then begin - AWindow(1,Ay+2,80,Ay+5); + A_Window(1,Ay+2,80,Ay+5); clrscr; - ATexte; + A_Texte; write('fichier vide. ABANDON du calcul'); - ATapez; - AWindow1 + A_Tapez; + A_Window1 end; end; close(YFitext); @@ -610,6 +936,7 @@ procedure TesteDelai(ZT:double); writeln(YFicSortie); writeln(YFicSortie); + flush(YFicSortie); {$i+} @@ -622,7 +949,7 @@ procedure TesteDelai(ZT:double); {--dans les tableaux YDate et YQ --} {=============================================================================} -procedure LectureQavalPriseRestit(ZRang:integer); +procedure C1_LectureQavalPriseRestit(ZRang:integer); var XRang : integer; BEGIN @@ -632,24 +959,27 @@ procedure LectureQavalPriseRestit(ZRang:integer); read(YFicResult1,YQ[2*XRang-1,ZRang],YQ[2*XRang,ZRang]); end; readln(YFicResult1); - END; - + END; {fin de C1_LectureQavalPriseRestit} {===========================================================================} {--calcul des d‚bits r‚serv‚ et de r‚f‚rence dans un cours d'eau, juste … --} {--l'aval d'une prise ou d'une restitution --} +{--ZChrono : vrai si calcul dans le sens chronologique, faux sinon --} {--ZType : 1 pour calcul au droit de la prise, 2 au droit de restitution --} {--ZRangLac : rang du lac --} -{--ZDateEnJour : date compt‚e en jour depuis le 31/12/1899, … la restit. --} +{--ZDateEnJour : date compt‚e en jour depuis le 31/12/1599, … la restit. --} {--ZQMnat : d‚bit naturel au droit de la prise --} -{--ZQVVeille : d‚bit effectif de la veille juste … l'aval de restitution --} +{--ZQVVeille : d‚bit effectif de la veille (si ZChrono est vrai) ou du --} +{-- lendemain (si ZChrono est faux), juste … l'aval de la --} +{-- restitution --} {--ZChaiDate : date en clair --} {--ZQRef : d‚bit de r‚f‚rence --} {--ZQRes : d‚bit r‚serv‚ --} {===========================================================================} -Procedure QRefRes(ZType,ZRangLac:integer; ZDateEnJour:longint; ZQMnat,ZQVVeille:double; - var ZChaiDate:YChai10 ;var ZQRef,ZQRes:double); +Procedure C1_QRefRes(ZChrono : boolean; ZType,ZRangLac:integer; + ZDateEnJour:longint; ZQMnat,ZQVVeille:double; + var ZChaiDate:YChai10 ;var ZQRef,ZQRes:double); var XAn : integer; {ann‚e} XCode : integer; {sans int‚rˆt} @@ -660,14 +990,16 @@ Procedure QRefRes(ZType,ZRangLac:integer; ZDateEnJour:longint; ZQMnat,ZQVVeille: XQuantieme : integer; {date compt‚e en jour depuis le d‚but de l'ann‚e} XrangSeuil : integer; {rang de seuil dans formule de d‚bit r‚serv‚ ou de ref.} XType : integer; {-1 ou 1 si limite de gradient sur d‚bit juste … l'aval de restit, 0 sinon} - XQ : array[0..1] of double; {d‚bit r‚serv‚ et de r‚f‚rence} + XQ : array[0..1] of double; {d‚bit r‚serv‚ et de r‚f‚rence} BEGIN - ZChaiDate:=ADate(ZdateEnJour); + ZChaiDate:=B_Date(ZdateEnJour); val(copy(ZChaiDate,1,2),XJour,Xcode); val(copy(ZChaiDate,4,2),XMois,Xcode); val(copy(Zchaidate,7,4),XAn,XCode); - XQuantieme:=AQuantieme(XJour,XMois,2001); + XQuantieme:=B_Quantieme(XJour,XMois,2001); + if (XMois=2) and (XJour=29) then + Xquantieme:=XQuantieme-1; for Xi:=0 to 1 do begin XType:=ZType+2*Xi; @@ -685,312 +1017,1180 @@ Procedure QRefRes(ZType,ZRangLac:integer; ZDateEnJour:longint; ZQMnat,ZQVVeille: XQ[Xi]:=Ydebit[ZrangLac,XType,YRangFormule[ZRangLac,XType,XNPivot],XrangSeuil] else XQ[Xi]:=ZQMnat; + end; + for Xi:=0 to 1 do + begin + XType:=ZType+2*Xi; if (YTypeFormule[ZRangLac,XType]<>0) and (ZQVVeille<>YLacune) then - if YTypeFormule[ZRangLac,XType]=1 then - XQ[Xi]:=Amax(XQ[Xi],ZQVVeille-YBorneGradient[ZRanglac,XType]) + if ZChrono then + if YTypeFormule[ZRangLac,XType]=1 then + XQ[Xi]:=B_max(XQ[Xi],ZQVVeille-YBorneGradient[ZRanglac,XType]) + else + XQ[Xi]:=B_min(XQ[Xi],ZQVVeille+YBorneGradient[ZRanglac,XType]) else - XQ[Xi]:=Amin(XQ[Xi],ZQVVeille+YBorneGradient[ZRanglac,XType]); + if YTypeFormule[ZRangLac,XType]=1 then + XQ[1-Xi]:=B_min(XQ[1-Xi],ZQVVeille+YBorneGradient[ZRanglac,XType]) + else + XQ[1-Xi]:=B_max(XQ[1-Xi],ZQVVeille-YBorneGradient[ZRanglac,XType]) end; ZQRes:=XQ[0]; ZQRef:=XQ[1]; END; {fin de procedure QRefRes} {=============================================================================} -{--Calcul de la r‚partition entre r‚servoirs, du d‚bit … soutirer pour --} -{--atteindre un objectif de laminage … la station situ‚e … l'aval du systŠme--} -{--ZQSObj : objectif de d‚bit soutir‚ total --} -{--ZQNV, ZQM : d‚bit naturel au point de restitution et au point de prise --} -{--ZQRV, ZQFV: d‚bit au point de restitution (r‚serv‚, et de r‚f‚rence. --} -{--ZQNV, ZQRV, ZQFV: d‚bit au point de restitution (nat., r‚serv‚, r‚f‚r. --} -{--ZSuccess : si objectif stockage non atteignable : 2 ; non atteint : 1 ; --} -{--non converg‚ : -2 ; atteint : 0 ; d‚pass‚ : -1 --} -{--ZCodeStock : selon la position du d‚bit soutir‚, par rapport aux bornes --} -{--impos‚es par les contraintes et consignes locales : -1 si min (<max), 1 --} -{--si max (=min), 2 si max(>min), 0 entre min et max (>min), 3 si inf. … --} -{--min (anomalie) ou sup … max (anomalie) --} -{--ZCodePrise : selon d‚bit de canal de prise : -2 si Qemin, -1 si ZQM-ZQFM,--} -{--0 si ajust‚, 1 si ZQM-ZQRM, 2 si Qemax et 3 si ZQM --} -{--ZCoderestit : selon le d‚bit de canal de restit : -1 si Qsmax, --} -{--0 si ajust‚ et 1 si Qsmin --} -{--ZCodeAval : selon la position du d‚bit … l'aval de la restitution : 2 si --} -{--inf … QRV, 1 si QRV, 0 si ajust‚, -1 si QFV et -2 si sup … QFV --} -{--ZQS0 : norme des d‚bits … soutirer en proportion des volumes de r‚servoir--} -{--ZQOV : d‚bit id‚al au point de restitution pour atteindre objectif aval --} -{--ZQe : d‚bit du canal de prise --} -{--ZQs : d‚bit du canal de restitution --} +{--Calcul de la r‚partition d'un d‚bit stock‚ objectif entre r‚servoirs --} +{--ZDat : date de l'objectif … la station aval, … 12 h --} +{--ZOption : 1 si r‚partition fig‚e, fonction des valeurs de YVRtot --} +{-- 2 si r‚partition variable, fonction des valeurs de ZVol --} +{-- 3 si r‚partition variable, fonction de ZVol/Vtot --} +{--ZTypeObjectif : 0 ou autre 1 selon l'objectif (soutien ou laminage resp.)--} +{--ZChrono : vrai ou faux selon chronologie directe ou inverse --} +{--ZQXsous : objectif de d‚bit soutir‚ total --} +{--ZVol : volume d'eau pr‚sent dans chaque r‚servoir --} +{--ZQVnat, ZQMnat : d‚bit naturel aux points de restitution et de prise --} +{--ZQVRes, ZQVRef: d‚bit r‚serv‚ et de r‚f‚rence au point de restitution --} +{--ZQMRes, ZQMRef: d‚bit r‚serv‚ et de r‚f‚rence au point de prise --} +{--ZSuccessRepart : selon objectif de stockage : 2 si inatteignable, --} +{-- 1 si non atteint, -2 si non converg‚, 0 si atteint, --} +{-- -1 si d‚pass‚: --} +{--ZCodeRepart : selon la position du d‚bit soutir‚, par rapport aux bornes --} +{-- impos‚es par les contraintes et consignes locales : --} +{-- -1 si min (<max), 1 si max (=min), 2 si max(>min), --} +{-- 0 entre min et max (>min), --} +{-- 3 (anomalie) si inf. … min ou sup. … max --} +{--ZCodeAval : selon la position du d‚bit … l'aval de la restitution : --} +{-- 2 si inf … QRV, 1 si QRV, 0 si ajust‚, -1 si QFV et --} +{-- -2 si sup … QFV --} +{--ZCodePrise : selon d‚bit de canal de prise : -2 si QEmin, --} +{-- -1 si ZQMnat-ZQMRef,0 si ajust‚, 1 si ZQMnat-ZQMRes, --} +{-- 2 si QEmax et 3 si ZQMnat --} +{--ZCoderestit : selon le d‚bit de canal de restit : -1 si QSmax, --} +{-- 0 si ajust‚ et 1 si QSmin --} +{--ZCodeSigne : 0 ou 1 selon signe du d‚bit stock‚ (resp. = ou <> objectif) --} +{--ZQST0 : norme de d‚bit … soutirer, r‚parti en proportion des parts th‚or.--} +{-- (pour Zoption=1 ou 2) ou d‚calage des d‚bits soutir‚s par rapport--} +{-- aux valeurs th‚oriques (pour Zoption=3, 4 ou 5) --} +{--ZQXdef0: d‚faillance in‚vitable absolue de d‚bit % objectif … la station --} +{-- aval, due aux contraintes physiques (d‚bitance prises et restit.,--} +{-- d‚bit des cours d'eau aux prises) et aux consignes locales --} +{--ZQXdef1: d‚faillance de d‚bit % objectif … la station aval, due aux --} +{-- contraintes physiques et aux consignes locales, ainsi qu'aux --} +{-- volumes pr‚sents dans les r‚servoirs et aux capacit‚s de ceux-ci.--} +{--ZQXdef2: d‚faillance de d‚bit % objectif … la station aval, ajout‚e … --} +{-- ZQXdef0 du fait des volumes d''eau pr‚sents dans les r‚servoirs --} +{--ZQSTt0: d‚bit stock‚ sur l'ensemble des r‚servoirs, calcul‚ en fonction --} +{-- du d‚bit stock‚ objectif ZQXsous et des limites impos‚es par les --} +{-- contraintes physiques et rŠgles locales (sans limites de capacit‚--} +{-- des r‚servoirs --} +{--ZQSTt1: idem, mais calcul‚ en tenant compte en plus des limites impos‚es --} +{-- par les capacit‚s des r‚servoirs --} +{--ZVRobj: objectif de taux de remplissage --} +{--ZVobj: objectif de volume d'eau global en fin de pas de temps --} +{--ZTpot : temps minimal de reconstitution de volume utilisable maximal --} +{--ZPart : part de norme de d‚bit stock‚ ZQST0 attribu‚e … chaque r‚servoir --} +{--ZQV : d‚bit id‚al au point de restitution pour atteindre objectif aval --} +{--ZQE : d‚bit entrant dans le r‚servoir (pris dans le cours d'eau) --} +{--ZQS : d‚bit sortant du r‚servoir (restitu‚ dans le cours d'eau) --} {--ZQST : d‚bit soutir‚ net local --} -{--ZQSTmin : d‚bit soutir‚ net local min. impos‚ par contr. et cons. locale --} -{--ZQSTmax : d‚bit soutir‚ net local max. impos‚ par contr. et cons. locales--} +{--ZQSTmin3 : valeur min. de d‚bit stock‚ due aux contraintes physiques et --} +{-- consignes locales … la prise et … la restitution, ainsi qu'… --} +{-- la capacit‚ de r‚servoir et au volume pr‚sent. --} +{--ZQSTmax3 : idem pour valeur max --} +{--ZQEinf : d‚bit min du canal de prise d– … d‚bitances extrŠmes et consignes --} +{-- de d‚bit r‚serv‚ et de r‚f‚rence dans le cours d'eau … l'aval de --} +{-- la prise --} +{--ZQEsup : idem pour d‚bit max dans canal de prise --} +{--ZQSTmin1 : limite minimale de d‚bit stock‚ impos‚e par contraintes --} +{-- physiques et consignes locales … la prise et … la restitution --} +{--ZQSTmax1 : idem pour limite maximale --} +{--ZQSTmin2 : limite minimale de d‚bit stock‚ impos‚e par volume pr‚sent, --} +{-- et capacit‚ de r‚servoir --} +{--ZQSTmax2 : idem pour limite maximale --} +{--ZQSTpot : d‚bit stock‚ th‚orique ‚quilibrant les dur‚es minimales de --} +{-- reconstitution de volume utilisable maximal, … partir de la fin --} +{-- de pas de temps (pour Zoption = 4 ou 5 seulement) --} +{--ZVpot : objectif th‚orique de volume en fin de pas de temps, produit par --} +{-- le d‚bit ZQSTpot (pour Zoption = 4 ou 5 seulement) --} {--ZNIter : nombre d'it‚rations --} {--ZTest : 1 si XQSTt est bien croissant en fonction de XQSO, 0 sinon --} +{--ZNIterTps : nombre d'it‚rations pour calcul de ZVpot (pour Zoption =5) --} {=============================================================================} -Procedure Repartition (ZQSobj: double; ZQNV,ZQM,ZQRV,ZQFV,ZQRM,ZQFM : YTab1; - ZTypeObjectif : integer; - var ZSucces : integer; - var ZCodeStock,ZCodeAval,ZCodePrise,ZCodeRestit : YTabInt1; - var ZQS0,ZDefaillQ : double; - var ZQOV,ZQe,ZQs,ZQST,ZQSTmin,ZQSTmax : YTab1; - var ZNIter,ZTest : integer); - -const - XNItermax = 100; {nombre maximal d'it‚rations autoris‚} - {YSeuilConv= 1e-10;} {seuil de convergence} +Procedure + C1_Repartition (ZDat: longint; ZOption, ZTypeObjectif : integer; + Zchrono: boolean; + ZQXsous: double; + ZVol:Ytab1; + ZQVnat,ZQMnat : YTab1; + ZQVRes,ZQVRef,ZQMRes,ZQMRef:YTab1; + var ZSuccesRepart : integer; + var ZCodeRepart,ZCodeAval,ZCodePrise,ZCodeRestit,ZCodeSigne: YTabInt1; + var ZQST0,ZQSTt0,ZQSTt1,ZVRobj,ZVobj : double; + var ZTPot,ZPart,ZQV,ZQE,ZQS,ZQST,ZQSTmin3,ZQSTmax3 : YTab1; + var ZQEinf,ZQEsup,ZQSTmin1,ZQSTmax1,ZQSTmin2,ZQSTmax2 : YTab1; + var ZQEmin,ZQEmax,ZQSmin,ZQSmax : YTab1; + var ZQXdef : YTab3; + var ZQSTpot,ZVpot : YTab1; + var ZNIter,ZTest,ZNIterTps : integer); + + const + XChangeRel = 0.9; var - XCode : YTabInt1;{critŠre de position de XQS : -1 si QSmax; -1 si QSmin, 0 entre les deux, -2 ou 2 si anomalie} - XQe2 : YTab1; {d‚bit max du canal de prise li‚ … d‚bitances extrŠmes et consignes aval prise} - XQe1 : YTab1; {d‚bit max du canal de prise li‚ … d‚bitances extrŠmes et consignes aval prise} + XQSTmax : boolean; {vrai ou faux si ‚quilibrage des tps de reconst de volume utile max bas‚ sur valeur max ou min de stockage net} + XTest : boolean; {teste la croissance de XQST en fonction de XQS0} + XVopt : boolean; {vrai on cherche le d‚lai min obtenir V=Vtot, faux si on cherche le d‚lai min pour obtenir V=0} + XSollicit : boolean; {vrai si l'objectif sollicite la globalit‚ des r‚servoirs de fa‡on active} + + Xi : integer; + + XDifTpot : double; + XEcart : double; {‚cart entre d‚bit obtenu et d‚bit objectif atteignable … la station aval} + XmaxDuree : double; + XMeilDifTpot: double; + XminDuree : double; + XMoyDuree : double; + XQMcumul : double; {somme des d‚bits naturels aux prises} + + XQSTmax0Cum : double; {somme de XQSTmax0 sur les r‚servoirs} + XQSTmin0Cum : double; {somme de XQSTmin0 sur les r‚servoirs} + XQSTt : double; {d‚bit soutir‚ total associ‚ … XQS0} + XQSTtinf : double; {d‚bit soutir‚ total associ‚ … XQS0inf} + XQSTtmax1 : double; {limite maximale de d‚bit stock‚ total, impos‚e par seules contraintes et consignes aux prises et restitutions} + XQSTtmax3 : double; {limite maximale de d‚bit stock‚ total, impos‚e par volumes pr‚sents et par contraintes et consignes aux prises et restitutions} + XQSTtmax2 : double; {limite maximale de d‚bit stock‚ total, impos‚e par les volume pr‚sents} + XQSTtmin1 : double; {limite minimale de d‚bit stock‚ total, impos‚e par seules contraintes et consignes aux prises et restitutions} + XQSTtmin3 : double; {limite maximale de d‚bit stock‚ total, impos‚e par volumes pr‚sents et par contraintes et consignes aux prises et restitutions} + XQSTtmin2 : double; {limite minimale de d‚bit stock‚ total, impos‚e par les volume pr‚sents} + XQSTtsup : double; {d‚bit soutir‚ total associ‚ … XQS0sup} + XQST0inf : double; {valeur minimale de QST0 dans le processus d'encadrements successifs} + XQST0sup : double; {valeur maximale de QST0 dans le processus d'encadrements successifs} + XRel : double; + XSomme : double; + XVcumul : double; {somme des volumes pr‚sents dans les r‚servoirs en d‚but de pas de temps} + XTpotCumul : double; {somme des temps minimaux de remplissage des r‚servoirs (avec d‚bit moyen des cours d'eau aux prises)} + XVPotCumul : double; {Volume potentiel utilisable pour l'objectif, sur tous les r‚servoirs} + + XPartT : YTab1; + XPartV : YTab1; + XDuree : YTab1; + XVPot : YTab1; + XMeilVpot : YTab1; + XMeilTpot : YTab1; + XQSTmin0 : YTab1; {min de d‚bit stock‚ net impos‚ par contraintes (pas consigne) … la prise et … la restitution} + XQSTmax0 : YTab1; {max de d‚bit stock‚ net impos‚ par contraintes (pas consigne) … la prise et … la restitution} + + + {--------------------------------------------------------------------------} + {--Calcul pour chaque r‚servoir, du temps minimal n‚cessaire ZZDuree (… --} + {--partir du volume d'eau ZZVopt pr‚sent … la date courante ZZDate plus --} + {--un pas de temps) pour obtenir un volume d'eau ‚gal … Vtot (si ZZVopt --} + {--est vrai) ou ‚gal … 0 (si ZZVopt est faux). Selon que ZZQSTmax est --} + {--vrai ou faux, le calcul est fait en utilisant la valeur maximale ou --} + {--minimale de d‚bit stock‚ net permise par les contraintes … la prise et--} + {--… la restitution, dans l'hypothŠse d'un d‚bit du cours d'eau … la --} + {--prise conforme … l'hydrogramme annuel YQMNfreq, pr‚alablement calcul‚.--} + {--------------------------------------------------------------------------} + procedure XcalculTpsRempl(ZZQSTmax,ZZChrono,ZZVopt : boolean ; + ZZdate : longint; ZZV : YTab1; var ZZDuree : YTab1); + + {--ZZQSTmax : si vrai ou faux, calculs faits avec max (positif) ou min --} + {-- (n‚gatif) de d‚bit stock‚ net permis par contraintes prise--} + {-- et restitution --} + {--ZZChrono : si vrai ou faux, calculs faits en sens chronologique ou --} + {-- sens inverse --} + {--ZZVopt : si vrai, on cherche le d‚lai d'obtention de V=Vtot --} + {-- : si faux, on cherche le d‚lai d'obtention de V = 0) --} + {--ZZDate : date courante du calcul --} + {--ZZV : volume pr‚sent, un pas de temps aprŠs la date courante --} + {--ZZDur‚e : dur‚e d'obtention du volume souhait‚ (0 ou Vtot), … partir--} + {-- de ZZV --} + + var + Wi : integer; {rang de r‚servoir} + WNbRempli : integer; {nombre de r‚servoirs ayant atteint le volume utile maximal} + WDuree : integer; + WChaineDate : string; + WRempli : array[1..YNMaxLacs] of boolean; {vrai si volume utilisable max atteint} + WPas : integer; + WDate : longint; + WDateInit : longint; + WQuant : integer; + WVnouv : YTab1; + WVancien : YTab1; + + begin + + {--initialisations--} + if ZZChrono then + WPas:=1 + else + WPas:=-1; + WDateInit:=ZZDate+WPas; + WDate:=WDateInit; + WVancien:=ZZV; + WNbRempli:=0; + for Wi:=1 to YNbLacs do + begin + WRempli[Wi]:=false; + ZZDuree[Wi]:=0; + end; + + {--tant que l'‚tat de volume utilisable recherch‚ n'est pas atteint sur--} + {--tous les r‚servoirs, incr‚mentation des volumes d'eau au pas de --} + {--temps suivant et test --} + while (abs(WDate-WDateInit)<YTpotMaxiAdmis) and (WNbrempli<YNbLacs) do + begin - Xi : integer; + WQuant:=B_QuantiemeNonBiss(WDate); + WDate:=WDate+WPas; - XQMt : double; {somme des d‚bits naturels aux prises} - XQSTt : double; {d‚bit soutir‚ total associ‚ … XQS0} - XQSTtmax : double; {somme des maximums locaux de d‚bit soutir‚} - XQSTtmin : double; {somme des minimums locaux de d‚bit soutir‚} - XQSTtinf : double; {d‚bit soutir‚ total associ‚ … XQS0inf} - XQSTtsup : double; {d‚bit soutir‚ total associ‚ … XQS0sup} - XQS0inf : double; {valeur minimale de XQS0 dans le processus d'encadrements successifs} - XQS0sup : double; {valeur maximale de QS0 dans le processus d'encadrements successifs} - XVtotal : double; {somme des volumes des r‚servoirs} - XEcart : double; {‚cart entre d‚bit obtenu et d‚bit objectif atteignable … la station aval} + for Wi:=1 to YNbLacs do + begin - XTest : boolean; {teste la croissance de XQST en fonction de XQS0} + {--cas o— l'‚tat de volume utilisable recherch‚ n'est pas atteint--} + {-- sur le r‚servoir de rang Wi --} + if not WRempli[Wi] then + begin + {--calcul du volume aprŠs un pas de temps, en utilisant QSTmax0--} + {--si code ZZQSTmax vrai, ou QSTmin0 dans le cas contraire --} + if ZZQSTmax then + WVnouv[Wi]:=WVancien[Wi]+WPas*(B_min(YQMNfreq[Wi,WQuant],ZQEmax[Wi])-ZQSmin[Wi])*YdT + else + WVnouv[Wi]:=WVancien[Wi]+WPas*(B_min(YQMNfreq[Wi,WQuant],ZQEmin[Wi])-ZQSmax[Wi])*YdT; + + {--cas o— on cherche la dur‚e pour obtenir V>Vtot --} + if ZZVopt then + if (WVnouv[Wi]>=YVtot[Wi]) then + begin + WRempli[Wi]:=true; + WNbRempli:=WNbRempli+1; + ZZDuree[Wi]:=ZZDuree[Wi]+(YVtot[Wi]-WVancien[Wi])/(WVnouv[Wi]-WVancien[Wi]) + end + else + ZZDuree[Wi]:=ZZDuree[Wi]+1 + {--cas o— on cherche la dur‚e pour obtenir V<0 --} + else + if (WVnouv[Wi]<=0) then + begin + WRempli[Wi]:=true; + WNbRempli:=WNbRempli+1; + ZZDuree[Wi]:=ZZDuree[Wi]+WVancien[Wi]/(WVancien[Wi]-WVnouv[Wi]); + end + else + ZZDuree[Wi]:=ZZDuree[Wi]+1; - BEGIN + WVancien[Wi]:=WVnouv[Wi]; + + end; {fin du cas o— l'‚tat de volume utilisable recherch‚ n'est pas atteint pour le r‚servoir de rang Wi} + + end; {fin de boucle sur les lacs} + + end; {fin de la boucle ex‚cut‚e tant que l'‚tat de volume utile recherch‚ n'est pas atteint partout} + + end; {fin de XcalculTpsRempl} + + {-----------------------------------------------------} + + function XQSajuste(ZZQS:double;ZZi:integer):double; + begin + case ZOption of + 1..2: XQSAjuste:=ZZQS*ZPart[ZZi]; + 3..5: XQSAjuste:=ZZQS+ZQSTpot[ZZi]; + end; + end; + + {---------------------------------------------------------------------------} + {--calcule un d‚bit moyen … partir d'un barŠme ZZbareme (volume d‚bit), --} + {--pour un volume passant de ZZV … ZZfinal (valeurs donnant les d‚bits ZZQ--} + {--et ZZQfinal … partir du mˆme barŠme), par la m‚thode des trapŠzes --} + {---------------------------------------------------------------------------} + + function XQmoy(ZZV,ZZVfinal,ZZQ,ZZQfinal : double; ZZBareme : YBareme): double; + var + Wi,Wj,Wk : integer; + WV,WVfinal,WQ,WQfinal,WQV : double; + begin + with ZZBareme do + begin + {cas trivial de barŠme constitu‚ d'un seul point, ou de volumes inital et final identiques} + if (YEffectif= 1) or (ZZV=ZZVfinal) then + XQmoy:=ZZQ + {cas non trivial : barŠme constitu‚ de plusieurs points et volumes intial et final diff‚rents} + else + begin + {cas o— les volumes en argument sont d‚j… en ordre croissant} + if ZZVfinal>ZZV then + begin + WV:=ZZV; + WVfinal:=ZZVfinal; + WQ:=ZZQ; + WQfinal:=ZZQfinal; + end + {--cas o— les volumes en argument sont en prdre d‚croissant : on inverse --} + else + begin + WV:=ZZVfinal; + WVfinal:=ZZV; + WQ:=ZZQfinal; + WQfinal:=ZZQ; + end; + {--recherche du rang Wi du plus petit V de barŠme sup‚rieur … WV--} + Wi:=0; + repeat + Wi:=Wi+1 + until (Wi=YEffectif) or (YVolume[Wi]>ZZV); + {--cas o— aucun V de barŠme sup‚rieur … WV--} + if YVolume[Wi]<=WV then + XQmoy:=(WQ+WQfinal)/2 + {--cas o— existe un V de barŠme sup‚rieur … WV--} + else + begin + {--cas o— aucun V de barŠme entre WV et WVfinal--} + if YVolume[Wi]>= WVfinal then + XQmoy:=(WQ+WQfinal)/2 + {--cas o— au moins un V de barŠme entre WV et WVfinal--} + else + begin + {--recherche du rang Wj du plus grand V de barŠme inf‚rieur … WVfinal--} + Wj:=Wi; + while (Wj<YEffectif) and (YVolume[Wj+1]<WVfinal) do + Wj:=Wj+1; + {--int‚gration--} + WQV:=(YVolume[Wi]-WV)*(YDebit[Wi]+WQ)/2; + Wk:=Wi; + while Wk+1<=Wj do + begin + Wk:=Wk+1; + WQV:=WQV+(YVolume[Wk]-YVolume[Wk-1])*(YDebit[Wk]+Ydebit[Wk-1])/2; + end; + WQV:=WQV+(WVfinal-YVolume[Wk])*(WQfinal+YDebit[Wk])/2; + XQmoy:=WQ/(WVfinal-WV); + end; {fin du cas o— existe au moins un V de barŠme entre WV et WVfinal} + end; {fin du cas o— existe un V de barŠme sup‚rieur … WV} + end; {fin du cas non trivial} + end; {fin du with bareme} + end; {fin de fonction XQmoy} + {---------------------------------------------------------------------------} + BEGIN {d‚but de C1_Repartition} - {--initialisations (calcul des d‚bits stock‚s min et max, locaux et total)--} - ZDefaillQ:=0; - ZQS0:=ZQSobj; + {--Initialisations--} ZNiter :=0; XTest :=true; - XQSTtmin:=0; - XQSTtmax:=0; - for Xi :=1 to YNbLacs do + + {--CALCUL DES LIMITES MIN ET MAX DE DEBIT STOCKE PAR RESERVOIR, IMPOSEES --} + {--PAR CONTRAINTES PHYSIQUES ET CONSIGNES AUX PRISES ET RESTITUTIONS ET --} + {--ET PAR VOLUMES PRESENTS --} + + {--Calcul des limites min et max de d‚bit entrant et sortant, impos‚es --} + {--par les contraintes physiques aux prises et restitutions et fonction --} + {--du volume d'eau ZVol pr‚sent en d‚but de pas de temps --} + for Xi:=1 to YNbLacs do begin - XQe1[Xi]:=Amax(Amin(ZQM[Xi],YQemin[Xi]),Amin(Amin(ZQM[Xi],YQemax[Xi]),ZQM[Xi]-ZQFM[Xi])); - XQe2[Xi]:=Amin(Amin(ZQM[Xi],YQemax[Xi]),Amax(Amin(ZQM[Xi],YQemin[Xi]),ZQM[Xi]-ZQRM[Xi])); - ZQSTmin[Xi]:=Amax(XQe1[Xi]-YQsmax[Xi],Amin(ZQNV[Xi]-ZQFV[Xi],XQe2[Xi]-YQsmin[Xi])); - ZQSTmax[Xi]:=Amin(XQe2[Xi]-YQsmin[Xi],Amax(ZQNV[Xi]-ZQRV[Xi],XQe1[Xi]-YQsmax[Xi])); - if YVRtot[Xi]>0 then - begin - XQSTtmin:=XQSTtmin+ZQSTmin[Xi]; - XQSTtmax:=XQSTtmax+ZQSTmax[Xi]; - end; + ZQEmax[Xi]:=P_InterpolBareme(ZVol[Xi],YQVemax[Xi]); + ZQEmin[Xi]:=P_InterpolBareme(ZVol[Xi],YQVemin[Xi]); + ZQSmax[Xi]:=P_InterpolBareme(ZVol[Xi],YQVsmax[Xi]); + ZQSmin[Xi]:=P_InterpolBareme(ZVol[Xi],YQVsmin[Xi]); end; + {--Calcul des limites min et max de d‚bit stock‚ impos‚es par les seules --} + {--contraintes physiques et consignes locales aux prises et restitutions --} + {--(par r‚servoir : ZQSTmin1 et ZQSTmax1 ; sur l'ensemble des r‚servoirs:--} + {--XQSTtmin1 et XQSTtmax1). Ces limites d‚coulent de contraintes et --} + {--consignes de d‚bit qui sont d‚finies de fa‡on instantan‚e et sont --} + {--sens‚es ‚voluer sans sauts. Sur un pas de temps t … t+dt en sens --} + {--chrono ou t … t-dt en sens chrono inverse leurs valeurs diffŠrent donc--} + {--trŠs peu a priori entre le d‚but et la fin du pas de temps. On les --} + {--calcule donc syst‚matiquement … t, … la fois pour le sens chrono et le--} + {--sens inverse. --} + XQSTtmin1:=0; + XQSTtmax1:=0; + for Xi :=1 to YNbLacs do + begin + ZQEinf[Xi]:=B_max(B_min(ZQMnat[Xi],ZQEmin[Xi]),B_min(B_min(ZQMnat[Xi],ZQEmax[Xi]),ZQMnat[Xi]-ZQMRef[Xi])); + ZQEsup[Xi]:=B_min(B_min(ZQMnat[Xi],ZQEmax[Xi]),B_max(B_min(ZQMnat[Xi],ZQEmin[Xi]),ZQMnat[Xi]-ZQMRes[Xi])); + ZQSTmin1[Xi]:=B_max(ZQEinf[Xi]-ZQSmax[Xi],B_min(ZQVnat[Xi]-ZQVRef[Xi],ZQEsup[Xi]-ZQSmin[Xi])); + ZQSTmax1[Xi]:=B_min(ZQEsup[Xi]-ZQSmin[Xi],B_max(ZQVnat[Xi]-ZQVRes[Xi],ZQEinf[Xi]-ZQSmax[Xi])); + XQSTtmin1:=XQSTtmin1+ZQSTmin1[Xi]; + XQSTtmax1:=XQSTtmax1+ZQSTmax1[Xi]; + end; - {--initialisation des bornes de XQS0 --} - XQS0inf :=1E20 ; - XQS0sup :=-XQS0inf ; + {--Calcul des limites min et max de d‚bit stock‚ par r‚servoir, impos‚es --} + {--par les volumes pr‚sents au d‚but du pas de temps et par les capacit‚s--} + {--de r‚servoirs (par r‚servoir : ZQSTmin2 et ZQSTmax2 ; global: --} + {--XQSTtmin2 et XQSTtmax2). Ces limites diffŠrent, selon qu'elles --} + {--concernent le pas de temps T … T+dT en sens chrono, ou T … T-dT en --} + {--sens chrono inverse. --} + XQSTtmin2:=0; + XQSTtmax2:=0; for Xi :=1 to YNbLacs do begin - if YVRtot[Xi]>0 then + if ZChrono then + begin + ZQSTmin2[Xi]:=-ZVol[Xi]/YdT; + ZQSTmax2[Xi]:=(YVtot[Xi]-ZVol[Xi])/YdT; + end + else begin - XQS0inf:=Amin(XQS0inf,ZQSTmin[Xi]*YVtotCumul/YVRtot[Xi]); - XQS0sup:=Amax(XQS0sup,ZQSTmax[Xi]*YVtotCumul/YVRtot[Xi]); + ZQSTmin2[Xi]:=(ZVol[Xi]-YVtot[Xi])/YdT; + ZQSTmax2[Xi]:=ZVol[Xi]/YdT; end; - end ; - XQS0inf:=XQS0inf-YToucomnul; - XQS0sup:=XQS0sup+YToucomnul; + XQSTtmin2:=XQSTtmin2+ZQSTmin2[Xi]; + XQSTtmax2:=XQSTtmax2+ZQSTmax2[Xi]; + end; + + {--Calcul des limites min et max de d‚bit stock‚ par r‚servoir, impos‚es--} + {--en premier lieu par les volumes pr‚sents et en second lieu par les --} + {--contraintes et consignes locales (ZQSTmin3 et ZQSTmax3) --} + for Xi:=1 to Ynblacs do + begin + ZQSTmin3[Xi]:=B_max(ZQSTmin2[Xi],B_min(ZQSTmax2[Xi],ZQSTmin1[Xi])); + ZQSTmax3[Xi]:=B_min(ZQSTmax2[Xi],B_max(ZQSTmin2[Xi],ZQSTmax1[Xi])); + end; + {--CALCUL DE REPARTITION THEORIQUE DES TACHES ENTRE RESERVOIRS--} - {--cas o— la somme des soutirements minimaux locaux d‚passe l'objectif --} - {--de soutirement total aval. Le d‚bit alors obtenu … l'aval est --} - {--inf‚rieur au d‚bit objectif, malgr‚ des d‚bits ‚gaux, … l'aval de --} - {--chaque ouvrage, aux plus forts d‚bits compatibles avec les apports --} - {--de l'amont et les contraintes et consignes locales --} - if XQSTtmin>ZQSobj then + {--cas trivial : un seul r‚servoir, pas de pb de r‚partition--} + if YNbLacs=1 then begin - for Xi:=1 to YnbLacs do - begin - if YVRtot[Xi]>0 then - ZQST[Xi]:=ZQSTmin[Xi] - else - ZQST[Xi]:=0; - end; - ZQS0:=XQS0inf; - ZSucces:=-1; - if ZTypeObjectif=0 then - ZDefaillQ:=XQSTtmin-ZQSobj; + ZPart[1]:=1; + ZQSTpot[1]:=ZQXsous; + ZVpot[1]:=0; + ZTpot[1]:=0; + ZVRobj:=0; + end + + {--Cas o— il y a plus d'un r‚servoir --} + else + begin + + {--Selon ZOption, calcul de r‚partition th‚orique des tƒches entre --} + {--r‚servoirs, sous forme de parts (Zpart) de ZQXsous ou sous forme de--} + {--d‚bits stock‚s th‚oriques (ZQSTpot). --} + case ZOption of + + {--Cas des parts th‚oriques fig‚es, fonction de YVrtot--} + 1: begin + for Xi:=1 to YNbLacs do + begin + ZPart[Xi]:=YVrTot[Xi]/YVtotCumul; + end; + end; + + {--Cas des parts th‚oriques variables, fonction des volumes pr‚sents --} + {--utilisables Vut pour l'objectif (volume de vide ou d'eau selon les --} + {--cas) et des temps minimaux Tpot de retour … un volume utilisable --} + {--maximal pour l'objectif. Le principe consiste … exploiter en --} + {--priorit‚ les r‚servoirs pr‚sentant les plus forts volumes Vut et --} + {--ceux pouvant retrouver au plus vite une valeur maximale de Vut --} + {--grƒce … un stockage net ‚gal au min QSTmin0 ou au max QSTmax0 --} + {--permis par les contraintes physiques locales, dans l'hypothŠse d'un--} + {--d‚bit du cours d'eau … la prise ‚gal … la valeur moyenne --} + {--interannuelle. --} + 2: begin + XVPotCumul:=0; + XTpotCumul:=0; + for Xi:=1 to YNbLacs do + begin + XQSTmin0[Xi]:=B_min(YQMmoyen[Xi],ZQEmin[Xi])-ZQSmax[Xi]; + XQSTmax0[Xi]:=B_min(YQMmoyen[Xi],ZQEmax[Xi])-ZQSmin[Xi]; + if ZTypeObjectif=0 {ZQXsous<0} then + if ZChrono then + begin + XVpot[Xi]:=ZVol[Xi]; + ZTpot[Xi]:=(YVtot[Xi]-ZVol[Xi])/XQSTmax0[Xi]; + end + else + begin + XVpot[Xi]:=YVtot[Xi]-ZVol[Xi]; + ZTpot[Xi]:=ZVol[Xi]/XQSTmax0[Xi]; + end + else + if ZChrono then + begin + XVpot[Xi]:=YVtot[Xi]-ZVol[Xi]; + ZTpot[Xi]:=-ZVol[Xi]/XQSTmin0[Xi]; + end + else + begin + XVpot[Xi]:=ZVol[Xi]; + ZTpot[Xi]:=(ZVol[Xi]-YVtot[Xi])/XQSTmin0[Xi]; + end; + XVPotCumul:=XVPotCumul+XVPot[Xi]; + XTPotCumul:=XTPotCumul+ZTPot[Xi]; + end; + XSollicit:=((ZQXsous<0) and (ZTypeObjectif=0)) or ((ZQXsous>0) and (ZTypeObjectif<>0)); + for Xi:=1 to YNbLacs do + begin + if XSollicit then + begin + if XVPotCumul>(YSeuilRconv*YVtotCumul) then + XPartV[Xi]:=XVpot[Xi]/XVPotCumul + else + XPartV[Xi]:=1/YNbLacs; + if XTpotCumul>YSeuilconv then + XPartT[Xi]:=(XTPotCumul-ZTPot[Xi])/((YNbLacs-1)*XTPotCumul) + else + XPartT[Xi]:=1/YNbLacs; + end + else + begin + if XTpotCumul>YSeuilconv then + XPartT[Xi]:=ZTpot[Xi]/XTPotCumul + else + XPartT[Xi]:=1/YNbLacs; + if XVPotCumul>(YSeuilRconv*YVtotCumul) then + XPartV[Xi]:=(XVPotCumul-XVPot[Xi])/((YNbLacs-1)*XVPotCumul) + else + XPartV[Xi]:=1/YNbLacs; + end; + ZPart[Xi]:=(XPartV[Xi]+XpartT[Xi])/2; + end; + end; + + {--Cas des parts th‚oriques variables, fonction de ZVol/YVTot. Principe :--} + {--on tente d'‚quilibrer au maximum le taux de remplissage des diff‚rents--} + {--r‚servoirs, en attribuant … chacun un d‚bit stock‚ th‚orique qui --} + {--donnerait partout la mˆme valeur de ZVol/YVtot au pas de temps suivant--} + {--tout en permettant d'atteindre l'objectif aval. --} + 3: begin + XVcumul:=0; + for Xi:=1 to YNbLacs do + XVcumul:=XVcumul+ZVol[Xi]; + if ZChrono then + ZVRobj:=(XVcumul+ZQXsous*YdT)/YVTotCumul + else + ZVRobj:=(XVcumul-ZQXsous*YdT)/YVTotCumul; + for Xi:=1 to YNbLacs do + if ZChrono then + ZQSTpot[Xi]:=(ZVRobj*YVtot[Xi]-ZVol[Xi])/YdT + else + ZQSTpot[Xi]:=-(ZVRobj*YVtot[Xi]-ZVol[Xi])/YdT; + end; + + {--Cas des parts th‚oriques variables, fonction de Zvol et sc‚narioYQM.--} + {--Principe : on attribue … chaque r‚servoir un d‚bit stock‚ th‚orique --} + {--qui donnerait partout, … la fin du pas de temps, un volume utile --} + {--(d'eau pour soutien chrono et pour laminage pas chrono ; de vide --} + {--pour soutien pas chrono et pour laminage chrono) de mˆme dur‚e --} + {--potentielle minimale d'‚volution jusqu'au volume utilisable maximal --} + {--(si YCodeTpot vrai), ou jusqu'au volume utilisable nul (si YCodeTpot--} + {--est faux). Les temps sont calcul‚s en tenant compte des contraintes --} + {--aux prises et restitutions (mais pas des consignes locales ni de --} + {--l'objectif aval), dans l'hypothŠse d'un d‚bit du cours d'eau … la --} + {--prise soit constant et ‚gal … YQMmoyen (m‚thode 4), soit variable et--} + {--‚gal … un quantile pr‚choisi de YQM (m‚thode 5). --} + 4..5: begin + ZNIterTps:=0; + XVcumul:=0; + XQSTmin0Cum:=0; + XQSTmax0Cum:=0; + + for Xi:=1 to YNbLacs do + begin + case ZOption of + 4 : begin + XQSTmin0[Xi]:=B_min(YQMmoyen[Xi],ZQEmin[Xi])-ZQSmax[Xi]; + XQSTmax0[Xi]:=B_min(YQMmoyen[Xi],ZQEmax[Xi])-ZQSmin[Xi]; + end; + 5 : begin + XQSTmin0[Xi]:=B_min(YQMfreqMoy[Xi],ZQEmin[Xi])-ZQSmax[Xi]; + XQSTmax0[Xi]:=B_min(YQMfreqMoy[Xi],ZQEmax[Xi])-ZQSmin[Xi]; + end; + end; + XVcumul:=XVcumul+ZVol[Xi]; + XQSTmin0Cum:=XQSTmin0Cum+XQSTmin0[Xi]; + XQSTmax0Cum:=XQSTmax0Cum+XQSTmax0[Xi]; + end; + + {--calcul de l'objectif global ZVobj de volume d'eau en fin de--} + {--pas de temps, compris entre 0 et YVTotcumul --} + if ZChrono then + ZVobj:=B_min(YVtotCumul,B_max(0,XVcumul+ZQXsous*YdT)) + else + ZVobj:=B_min(YVtotCumul,B_max(0,XVcumul-ZQXsous*YdT)); + + {--Dans le cas o— l'objectif global de volume d'eau est ‚gal …--} + {--au max de volume d'eau global possible, alors il en est de --} + {--mˆme pour chaque r‚servoir --} + if ZVobj>(YVtotCumul-YSeuilConv) then + for Xi:=1 to YNbLacs do + begin + ZVpot[Xi]:=YVtot[Xi]; + ZTpot[Xi]:=0; + end + + {--cas o— ZVobj est inf‚rieur … YVtotcumul--} + else + + {--Dans le cas o— l'objectif global de volume d'eau est nul,--} + {--alors il en est de mˆme pour chaque r‚servoir --} + if ZVobj<YSeuilConv then + for Xi:=1 to YNbLacs do + begin + ZVpot[Xi]:=0; + ZTpot[Xi]:=0; + end + + {--Dans le cas o— 0 < ZVobj < YVtotcumul, calcul des objectifs--} + {--de volume d'eau ZVpot dans les diff‚rents r‚servoirs en fin --} + {--de pas de temps. Ces volumes sont calcul‚s (dans le respect--} + {--de YdT*ZQXsous=somme(ZVpot-ZVol)), de fa‡on … ‚quilibrer soit--} + {--la dur‚e minimale de reconstitution du volume utilisable --} + {--maximal (si YCodeTpot est vrai), soit la dur‚e minimale --} + {--d'‚puisement du volume utilisable (si YCodeTpot est false).--} + {--Pour commencer, le calcul est fait en supposant un d‚bit --} + {--moyen dans les cours d'eau … l'amont imm‚diat des prises. --} + else + + begin + + {--cas d'un objectif de soutien de d‚bit--} + if ZTypeObjectif=0 then + + {--cas de soutien de d‚bit en sens chrono (Vutile = V)--} + if ZChrono then + for Xi:=1 to YNbLacs do + begin + + {--si ‚quilibrage des tps de reconstitution de Vutile --} + {--max, ZVpot est inf‚rieur … YVtot et peut ˆtre n‚gatif--} + if YCodeTpot then + begin + ZVpot[Xi]:=YVtot[Xi]-(YVtotCumul-ZVobj)*XQSTmax0[Xi]/XQSTmax0cum; + ZTpot[Xi]:=(YVtot[Xi]-ZVpot[Xi])/XQSTmax0[Xi]; + end + + {--si ‚quilibrage des tps d'‚puisement de Vutile, ZVpot --} + {--est positif et peut ˆtre sup‚rieur … Vtot --} + else + begin + ZVpot[Xi]:=ZVobj*XQSTmin0[Xi]/XQSTmin0cum; + ZTpot[Xi]:=-ZVpot[Xi]/XQSTmin0[Xi]; + end; + + end {fin de boucle sur les r‚servoirs} + + {--cas de soutien de d‚bit en chrono inverse (Vutile = Vtot-V)--} + else + for Xi:=1 to YNbLacs do + begin + + {--si ‚quilibrage des tps de reconstitution de Vutile --} + {--max, ZVpot est positif et peut ˆtre sup‚rieur … YVtot--} + if YCodeTpot then + begin + ZVpot[Xi]:=ZVobj*XQSTmax0[Xi]/XQSTmax0cum; + ZTpot[Xi]:=ZVpot[Xi]/XQSTmax0[Xi]; + end + + {--si ‚quilibrage des tps d'‚puisement de Vutile, ZVpot --} + {--est inf‚rieur … YVtot et peut ˆtre n‚gatif --} + else + begin + ZVpot[Xi]:=YVtot[Xi]-(YVtotCumul-ZVobj)*XQSTmin0[Xi]/XQSTmin0cum; + ZTpot[Xi]:=(ZVpot[Xi]-YVtot[Xi])/XQSTmin0[Xi]; + end + + end {fin de boucle sur les r‚servoirs} + + {--cas d'un objectif de laminage de d‚bit--} + else + + {--cas de laminage en sens chrono (Vutile = Vtot-V) --} + if ZChrono then + for Xi:=1 to YNbLacs do + begin + + {--si ‚quilibrage des tps de reconstitution de Vutile --} + {--max, ZVpot est positif et peut ˆtre sup‚rieur … YVtot--} + if YCodeTpot then + begin + ZVpot[Xi]:=ZVobj*XQSTmin0[Xi]/XQSTmin0cum; + ZTpot[Xi]:=-ZVpot[Xi]/XQSTmin0[Xi]; + end + + {--si ‚quilibrage des tps d'‚puisement de Vutile, ZVpot --} + {--est inf‚rieur … Vtot et peut ˆtre n‚gatif --} + else + begin + ZVpot[Xi]:=YVtot[Xi]-(YVtotCumul-ZVobj)*XQSTmax0[Xi]/XQSTmax0cum; + ZTpot[Xi]:=(YVtot[Xi]-ZVpot[Xi])/XQSTmax0[Xi]; + end; + + end + + {--cas de laminage en sens chrono inverse (Vutile = V) --} + else + for Xi:=1 to YNbLacs do + begin + + {--si ‚quilibrage des tps de reconstitution de Vutile --} + {--max, ZVpot est inf‚rieur … YVtot et peut ˆtre n‚gatif--} + if YCodeTpot then + begin + ZVpot[Xi]:=YVtot[Xi]-(YVtotCumul-ZVobj)*XQSTmin0[Xi]/XQSTmin0Cum; + ZTpot[Xi]:=(ZVpot[Xi]-YVtot[Xi])/XQSTmin0[Xi]; + end + + {--si ‚quilibrage des tps d'‚puisement de Vutile, ZVpot --} + {--est positif et peut ˆtre sup‚rieur … YVtot --} + else + begin + ZVpot[Xi]:=ZVobj*XQSTmax0[Xi]/XQSTmax0cum; + ZTpot[Xi]:=ZVpot[Xi]/XQSTmax0[Xi]; + end; + + end; {fin de boucle sur les r‚servoirs} + + {--Si ZOption = 5, ZVpot est calcul‚ de fa‡on … ‚quilibrer --} + {--les dur‚es potentielles minimales d'obtention d'‚tat de --} + {--volume utilisable max (si YCodeTpot vrai) ou min (si --} + {--YCodeTpot faux) comme ci-dessus, mais cette fois ci en --} + {--consid‚rant pour les d‚bits dans les cours d'eau … --} + {--l'amont des prises, non plus des valeurs moyennes --} + {--constantes, mais des hydrogrammes iso-frequence de --} + {--fr‚quence pr‚-choisie. --} + if ZOption=5 then + begin + + {--le d‚bit … utiliser pour calculer la dur‚e est : --} + {--QSTmax0 pour Tpot1 (soutien) ou Tpot2 (laminage) --} + {--QSTmin0 pour Tpot2 (soutien) ou Tpot1 (laminage) --} + {--le code XQSTmax est vrai si on utilise QSTmax0 --} + XQSTmax:=(YCodeTpot and (ZTypeObjectif=0)) or ((not YCodeTpot) and (ZTypeObjectif<>0)); + + {--le volume utilisable pour r‚aliser l'objectif est : --} + {-- V, pour soutien chrono ou laminage pas chrono --} + {-- (Vtot-V) pour soutien pas chrono ou laminage chrono --} + {--Dans un premier temps, XVopt est vrai si Vut= V --} + XVopt:=((ZTypeObjectif=0) and ZChrono) or ((ZTypeObjectif<>0) and (not ZChrono)); + + {--Si Vut=V et ‚quilibrage vis‚ de tps min reconst Vut max, ou --} + {--si Vut=Vtot-V et ‚quilibrage vis‚ de tps min ‚puist Vut, --} + {--alors dur‚e correspond au passage du volume de V … Vtot, --} + {--sinon elle correspond au passage de V … 0. --} + {--XVopt est vrai si on cherche la dur‚e d'obtention de V>Vtot,--} + {--et faux si on cherche la dur‚e d'obtention de V<0 --} + XVopt:=(XVopt and YCodeTpot) or ((not XVopt) and (not YCodeTpot)); + + XMeilDifTpot:=1e20; + XRel:=YRelax; + repeat + + ZNIterTps:=ZNIterTps+1; + XcalculTpsRempl(XQSTmax,ZChrono,XVopt,Zdat,ZVpot,ZTpot); + XMinDuree:=1e20; + XMaxDuree:=0; + XMoyDuree:=0; + for Xi:=1 to YNbLacs do + begin + XMinduree:=B_min(XMinduree,ZTpot[Xi]); + XMaxDuree:=B_max(XMaxduree,ZTpot[Xi]); + XMoyDuree:=XMoyDuree+ZTpot[Xi]; + end; + XMoyDuree:=XMoyDuree/YNbLacs; + XDifTpot:=XMaxDuree-XMinDuree; + if XDifTpot<XMeilDifTpot then + begin + XmeilVpot:=ZVpot; + XmeilTpot:=ZTpot; + XMeilDifTpot:=XDifTpot; + end + else + XRel:=XRel*XChangeRel; + + {--cas o— la convergence n'est pas atteinte, car trop de --} + {--diff‚rence de dur‚e entre r‚servoirs. Alors on calcule--} + {--un nouveau jeu de ZVpot qui ‚quilibrerait les dur‚es, --} + {--pour des vitesses d'‚volution de volume utile --} + {--conformes aux valeurs moyennes d‚duites du pr‚c‚dant --} + {--jeu de ZVpot --} + if XDifTpot>B_max(YCritRelDuree*XmoyDuree,YCritAbsDuree) then + begin + XSomme:=0; + + {--Si on cherche la dur‚e d'obtention de V>Vtot, alors --} + {--le nouveau ZVpot est forc‚ment strictement inf --} + {--… Vtot pour chaque r‚servoir, ce qui induit des --} + {--dur‚es strictement positives … l'it‚ration suivante.--} + if XVopt then + begin + for Xi:=1 to YNbLacs do + XSomme:=XSomme+(YVtot[Xi]-ZVpot[Xi])/ZTpot[Xi]; + for Xi:=1 to YNbLacs do + ZVpot[Xi]:=(1-XRel)*XMeilVpot[Xi]+Xrel*((1-YRelax)*ZVpot[Xi] + +YRelax*(YVtot[Xi]-(YVtotCumul-ZVobj)*((YVtot[Xi]-ZVpot[Xi])/ZTpot[Xi])/XSomme)); + end + + {--Si on cherche la dur‚e d'obtention de V<0, alors --} + {--le nouveau ZVpot est forc‚ment strictement positif --} + {--pour chaque r‚servoir, ce qui induit des dur‚es --} + {--strictement positives … l'it‚ration suivante. --} + else + begin + for Xi:=1 to YNbLacs do + XSomme:=XSomme+ZVpot[Xi]/ZTpot[Xi]; + for Xi:=1 to YNbLacs do + ZVpot[Xi]:=(1-XRel)*XMeilVpot[Xi]+XRel*((1-YRelax)*ZVpot[Xi] + +YRelax*ZVobj*(ZVpot[Xi]/ZTpot[Xi])/XSomme); + end; + + end; {fin du cas o— convergence non atteinte} + + until (XDifTpot<=B_max(YCritRelDuree*XmoyDuree,YCritAbsDuree)) + or (ZNIterTps>YNbIterTpsmax); + + ZVpot:=XMeilVpot; + ZTpot:=XMeilTpot; + + end; {fin du cas o— ZOption=5} + + end; {fin du cas o— 0 < ZVobj < YVtotcumul} + + {--calcul des d‚bits stock‚s th‚oriques ZQSTpot en fonction des--} + {--volumes objectifs th‚oriques ZVpot en fin de pas de temps --} + for Xi:=1 to YNbLacs do + if ZChrono then + ZQSTpot[Xi]:=(ZVpot[Xi]-ZVol[Xi])/YdT + else + ZQSTpot[Xi]:=-(ZVpot[Xi]-ZVol[Xi])/YdT; + + end; {fin du cas o— ZOption vaut 4 ou 5} + + end; {fin du case sur ZOption pour calcul des parts th‚oriques} + + end; {fin du calcul de r‚partition, dans le cas de plusieurs r‚servoirs} + + {--CALCUL DES LIMITES ABSOLUES DE DEBIT STOCKE TOTAL POSSIBLE ET DES --} + {--DEFAILLANCES DE DEBIT PAR RAPPORT A L'OBJECTIF A LA STATION AVAL --} + + {--calcul des limites min et max de d‚bit stock‚ total, impos‚es … la --} + {--fois par les volumes pr‚sents et les capacit‚s des r‚servoirs et par --} + {--les contraintes physiques et consignes aux prises et restitutions --} + XQSTtmin3:=0; + XQSTtmax3:=0; + for Xi:=1 to YNbLacs do + case ZOption of + 1..2: if ZPart[Xi]>0 then + begin + XQSTtmin3:=XQSTtmin3+ZQSTmin3[Xi]; + XQSTtmax3:=XQSTtmax3+ZQSTmax3[Xi]; + end + else + begin + XQSTtmin3:=XQSTtmin3+B_min(B_max(0,ZQSTmin3[Xi]),ZQSTmax3[Xi]); + XQSTtmax3:=XQSTtmax3+B_min(B_max(0,ZQSTmin3[Xi]),ZQSTmax3[Xi]); + end; + 3..5: begin + XQSTtmin3:=XQSTtmin3+ZQSTmin3[Xi]; + XQSTtmax3:=XQSTtmax3+ZQSTmax3[Xi]; + end + end; + + {--CALCUL DES DEFAILLANCES DE DEBIT A LA STATION AVAL (ZQXdef0 : in‚vitable--} + {--absolue, due aux contraintes physiques et consignes locales ; ZQXdef2 : --} + {--ajout‚e … ZQXdef0 du fait des volumes pr‚sents dans les r‚servoirs ; --} + {--ZQXdef1 : due … toutes ces causes (ZQXdef1 = ZQXdef0 + ZQXdef2) --} + if ZTypeObjectif=0 then + begin + ZQXdef[1]:=B_max(0,XQSTtmin3-ZQXsous); + ZQXdef[0]:=B_max(0,XQSTtmin1-ZQXsous); end + else + begin + ZQXdef[1]:=B_max(0,ZQXsous-XQSTtmax3); + ZQXdef[0]:=B_max(0,ZQXsous-XQSTtmax1); + end; + ZQXdef[2]:=ZQXdef[1]-ZQXdef[0]; + + {--CALCUL DES DEBITS STOCKES DANS LES RESERVOIRS PERMETTANT D'ATTEINDRE--} + {--DU MIEUX POSSIBLE L'OBJECTIF AVAL, COMPTE TENU DES LIMITES ABSOLUES --} + {--ET DE LA CLE DE REPARTITION DES TACHES CALCULEES PLUS HAUT --} + + {--initialisation des bornes de XQSO--} + XQST0inf :=1E20 ; + XQST0sup :=-XQST0inf ; + for Xi:=1 to YNbLacs do + case ZOption of + 1..2: begin + if ZPart[Xi]>0 then + begin + XQST0inf:=B_min(XQST0inf,ZQSTmin3[Xi]/ZPart[Xi]); + XQST0sup:=B_max(XQST0sup,ZQSTmax3[Xi]/ZPart[Xi]); + end; + end; + 3..5: begin + XQST0inf:=B_min(XQST0inf,ZQSTmin3[Xi]-ZQSTpot[Xi]); + XQST0sup:=B_max(XQST0sup,ZQSTmax3[Xi]-ZQSTpot[Xi]); + end; + end; + XQST0inf:=XQST0inf-YToucomnul; + XQST0sup:=XQST0sup+YToucomnul; + + {--cas o— la somme des soutirements minimaux locaux (impos‚s par les --} + {--contraintes physiques et les consignes aux prises et restitutions, --} + {--ainsi que par les volumes pr‚sents et les capacit‚s des r‚servoirs) --} + {--d‚passe l'objectif de soutirement total aval. Le d‚bit alors obtenu …--} + {--l'aval est inf‚rieur au d‚bit objectif, malgr‚ la production du plus --} + {--fort d‚bit possible … l'aval de la restitution de chaque ouvrage. --} + if XQSTtmin3>ZQXsous then + begin + case ZOption of + 1..2: begin + for Xi:=1 to YnbLacs do + if ZPart[Xi]>0 then + ZQST[Xi]:=ZQSTmin3[Xi] + else + ZQST[Xi]:=B_min(B_max(0,ZQSTmin3[Xi]),ZQSTmax3[Xi]); + end; + 3..5: for Xi:=1 to YnbLacs do + ZQST[Xi]:=ZQSTmin3[Xi]; + end; + ZQST0:=XQST0inf; + if XQSTtmin1>ZQXsous then + ZSuccesRepart:=-3 + else + if XQSTtmin2>ZQXsous then + ZSuccesRepart:=-2 + else + ZSuccesRepart:=-1; + end {fin du cas o— les soutirements minimaux locaux d‚passent l'objectif de soutirement aval} - {--cas o— les soutirements minimaux ne suffisent pas--} + {--cas o— les soutirements minimaux ne suffisent pas pour atteindre l'objectif de soutirement aval--} else begin - {--cas o— la somme des soutirements maximaux locaux est inf‚rieure … --} - {--l'objectif de soutirement total aval. Le d‚bit alors obtenu … l'aval--} - {--est sup‚rieur au d‚bit objectif, malgr‚ des d‚bits ‚gaux, … l'aval --} - {--de chaque ouvrage, au plus petit d‚bit compatible avec les apports --} - {--de l'amont et les contraintes et consignes locales. Un sous-cas, --} - {--extrŠme, est celui o— un soutirement net ‚gal … la somme des d‚bits --} - {--naturels aux prises reste inf‚rieur au soutirement objectif. --} - if XQSTtmax<ZQSobj then + {--Cas o— la somme des soutirements maximaux locaux (impos‚s par les --} + {--contraintes physiques et les consignes aux prises et restitutions, --} + {--ainsi que par les volumes pr‚sents et les capacit‚s des r‚servoirs) --} + {--est inf‚rieure … l'objectif de soutirement total aval. Le d‚bit --} + {--alors obtenu … l'aval est sup‚rieur au d‚bit objectif, malgr‚ la --} + {--production du plus petit d‚bit possible … l'aval de la restitution --} + {--de chaque ouvrage. --} + if XQSTtmax3<ZQXsous then begin - XQMt:=0; - for Xi:=1 to YNbLacs do - begin - if YVRtot[Xi]>0 then - ZQST[Xi]:=ZQSTmax[Xi] - else - ZQST[Xi]:=0; - XQMt:=XQMt+ZQM[Xi]; + case ZOption of + 1..2: begin + for Xi:=1 to YNbLacs do + if ZPart[Xi]>0 then + ZQST[Xi]:=ZQSTmax3[Xi] + else + ZQST[Xi]:=B_min(B_max(0,ZQSTmin3[Xi]),ZQSTmax3[Xi]); + end; + 3..5: for Xi:=1 to YNbLacs do + ZQST[Xi]:=ZQSTmax3[Xi]; end; - ZQS0:=XQS0sup; - if XQMt<ZQSobj then - ZSucces:=2 + ZQST0:=XQST0sup; + XQMcumul:=0; + for Xi:=1 to YNblacs do + XQMcumul:=XQMcumul+ZQMnat[Xi]; + if XQMcumul<ZQXsous then + ZSuccesrepart:=4 else - ZSucces:=1; - if ZTypeObjectif=1 then - ZDefaillQ:=ZQSobj-XQSTtmax; - end + if XQSTtmax1<ZQXsous then + ZSuccesRepart:=3 + else + if XQSTtmax2<ZQXsous then + ZSuccesRepart:=2 + else + ZSuccesRepart:=1; + end {fin du cas o— les soutirements maximaux locaux ne suffisent pas pour atteindre l'objectif de soutirement aval} {--cas o— l'objectif de soutirement total aval peut ˆtre atteint pile --} - {--poil avec des soutirements locaux dont un au moins est inf‚rieur au --} - {--soutirement maximal et un au moins est sup‚rieur au soutirement --} - {--minimal --} + {--poil avec des soutirements locaux dont un au moins est situ‚ entre --} + {--soutirement minimal et soutirement maximal --} else begin - {--initialisation des bornes de XQSTt --} + {--initialisation des bornes de XQSTt : valeurs minimale XQSTtinf et --} + {--maximale XQSTtsup de d‚bit stock‚ total, obtenues respectivement --} + {--avec les valeurs minimale XQST0inf et maximale XQST0sup du d‚bit --} + {--stock‚ norm‚ QST0. L'intervalle obtenu doit contenir l'intervalle --} + {--des valeurs permises par les contraintes physiques et consignes --} + {--locales, sinon il y a un problŠme --} XQSTtinf:=0; XQSTtsup:=0; for Xi:=1 to YNbLacs do - if YVRtot[Xi]>0 then - begin - XQSTtinf:=XQSTtinf+Amin(Amax(XQS0inf*YVRtot[Xi]/YVTotCumul,ZQSTmin[Xi]),ZQSTmax[Xi]); - XQSTtsup:=XQSTtsup+Amin(Amax(XQS0sup*YVRtot[Xi]/YVTotCumul,ZQSTmin[Xi]),ZQSTmax[Xi]); - end; - if (XQSTtinf>XQSTtmin) or (XQSTtsup<XQSTtmax) then + begin + XQSTtinf:=XQSTtinf+B_min(B_max(XQSajuste(XQST0inf,Xi),ZQSTmin3[Xi]),ZQSTmax3[Xi]); + XQSTtsup:=XQSTtsup+B_min(B_max(XQSajuste(XQST0sup,Xi),ZQSTmin3[Xi]),ZQSTmax3[Xi]); + end; + if (XQSTtinf>XQSTtmin3) or (XQSTtsup<XQSTtmax3) then YNbPbBornes:=YNbPbBornes+1; - {--determination de QS0 par encadrements successifs--} - ZSucces :=-2; + {--initialisation de QST0--} + ZSuccesRepart :=-4; + case ZOption of + 1..2 : ZQST0:=ZQXsous; + 3..5 : ZQST0:=0 + {--Explication : XQST0inf et XQST0sup sont forc‚ment n‚gatifs et --} + {--positifs dans le cas pr‚sent, o— XQSTtmin3<=ZQXsous<=XQSTtmax3.--} + {--Il est donc possible d'initialiser ZQST0 … 0 (ce qui donne du --} + {--premier coup le bon r‚sultat dans le cas d'un seul r‚servoir --} + {--plut“t que d'initialiser … (XQST0inf+XQST0sup)/2. --} + end; + + {-determination de QST0 par encadrements successifs--} repeat + if ZNIter>0 then - ZQS0:=XQS0inf+(XQS0sup-XQS0inf)*(ZQSobj-XQSTtinf)/(XQSTtsup-XQSTtinf); + ZQST0:=(XQST0inf+XQST0sup)/2; XQSTt:=0; for Xi:=1 to YNblacs do begin - if YVRtot[Xi]>0 then - begin - ZQST[Xi]:=ZQS0*YVRtot[Xi]/YVTotCumul; - if ZQSTmin[Xi]>ZQST[Xi] then - ZQST[Xi]:=ZQSTmin[Xi]; - if ZQSTmax[Xi]<ZQST[Xi] then - ZQST[Xi]:=ZQSTmax[Xi]; - end - else - ZQST[Xi]:=0; + ZQST[Xi]:=B_min(B_max(XQSajuste(ZQST0,Xi),ZQSTmin3[Xi]),ZQSTmax3[Xi]); XQSTt:=XQSTt+ZQST[Xi] end; - if XQSTt<ZQSobj then + + if XQSTt<ZQXsous then begin XTest:=XTest and (XQSTt>=XQSTtinf); - XQS0inf:=ZQS0; + XQST0inf:=ZQST0; XQSTtinf:=XQSTt; end else begin XTest:=XTest and (XQSTt<=XQSTtsup); - XQS0sup:=ZQS0; + XQST0sup:=ZQST0; XQSTtsup:=XQSTt; end; - XEcart:=abs(ZQSobj-XQSTt); + + XEcart:=abs(ZQXsous-XQSTt); if XEcart<YSeuilConv then - ZSucces:=0; + ZSuccesRepart:=0; ZNiter:=ZNiter+1; - until (ZSucces=0) or (ZNiter>XNitermax); + + until (ZSuccesRepart=0) or (ZNiter>YNbmaxIter); + if XEcart>YEcartMax then YECartMax:=XEcart; - end; {fin du cas o— le laminage aval peut ˆtre atteint pile poil} - end; {fin du cas o— les soutirements minimaux locaux ne suffisent pas} + end; {fin du cas o— l'objectif aval peut ˆtre atteint pile poil} + + end; {fin du cas o— les soutirements minimaux locaux ne suffisent pas pour atteindre l'objectif de soutirement aval} + + {--Calcul des d‚bits stock‚s globaux sur l'ensemble des r‚servoirs, en --} + {--tenant compte des limites impos‚es par les contraintes physiques et --} + {--consignes locales et par les capacit‚s de r‚servoirs (ZQSTt1), ou --} + {--seulement par les contraintes physiques et consignes locales (ZQSTt0)--} + ZQSTt1:=B_min(B_max(ZQXsous,XQSTtmin3),XQSTtmax3); + ZQSTt0:=B_min(B_max(ZQXsous,XQSTtmin1),XQSTtmax1); - {--Calcul pour chaque r‚servoir du d‚bit … l'aval de la restitution, et --} - {--des d‚bits dans les canaux de prise et de restitution; caract‚risation--} - {--des diff‚rent d‚bits --} + {--CALCUL POUR CHAQUE RESERVOIR DU DEBIT A L'AVAL DE LA RESTITUTION ET--} + {--DES DEBITS DANS LES CANAUX DE PRISE ET DE RESTITUTION; CALCUL DES --} + {--CODES CARACTERISANT LES DIFFERENTS DEBITS CALCULES --} for Xi:=1 to YNblacs do begin - ZQOV[Xi]:=ZQNV[Xi]-ZQST[Xi]; - ZQe[Xi]:=(Amax(YQsmin[Xi]+ZQST[Xi],XQe1[Xi])+Amin(YQSmax[Xi]+ZQST[Xi],XQe2[Xi]))/2; - ZQs[Xi]:=ZQe[Xi]-ZQST[Xi]; - - {--calcul du code d‚crivant la position du d‚bit soutir‚ net compar‚ --} - {--aux bornes impos‚es par les rŠgles et consignes locales : code = -1 --} - {--pour soutir‚ min (diff‚rent de soutir‚ max), 1 pour soutir‚ max --} - {--(‚gal … soutir‚ min), 2 pour soutir‚ max (diff‚rent de soutir‚ min) --} - {-- et 0 entre les deux. Un code 3 signifie une anomalie. --} - if ((ZQSTmax[Xi]-YSeuilConv)>ZQST[Xi]) and (ZQST[Xi]>(ZQSTmin[Xi]+YSeuilConv)) then - ZCodeStock[Xi]:=0 + ZQV[Xi]:=ZQVnat[Xi]-ZQST[Xi]; + ZQE[Xi]:=B_max(B_min(ZQSmin[Xi]+ZQST[Xi],ZQEsup[Xi]),ZQEinf[Xi]); + ZQS[Xi]:=ZQE[Xi]-ZQST[Xi]; + + {--calcul du code A d‚crivant la position du d‚bit soutir‚ net compar‚ --} + {--aux bornes impos‚es par les contraintes physiques et les consignes --} + {--locales, ainsi que par les volumes pr‚sents et les capacit‚s de --} + {--r‚servoirs : code = -1 pour soutir‚ min (diff‚rent de soutir‚ max), --} + {--1 pour soutir‚ max (‚gal … soutir‚ min), 2 pour soutir‚ max --} + {--(diff‚rent de soutir‚ min), 0 entre les deux, -2 si inf … soutir‚ --} + {--min (anomalie) et 3 si sup … soutir‚ max (anomalie). --} + if ((ZQSTmax3[Xi]-YSeuilConv)>ZQST[Xi]) and (ZQST[Xi]>(ZQSTmin3[Xi]+YSeuilConv)) then + ZCodeRepart[Xi]:=0 else - if (ZQSTmax[Xi]-YSeuilConv)<=ZQST[Xi] then - if (ZQSTmax[Xi]+YSeuilConv)>=ZQST[Xi] then - if (abs(ZQSTmax[Xi]-ZQSTmin[Xi])<2*YSeuilConv) then - ZCodeStock[Xi]:=1 + if ZQST[Xi]>=(ZQSTmax3[Xi]-YSeuilConv) then + if ZQST[Xi]<=(ZQSTmax3[Xi]+YSeuilConv) then + if (abs(ZQSTmax3[Xi]-ZQSTmin3[Xi])<2*YSeuilConv) then + ZCodeRepart[Xi]:=1 + else + ZCodeRepart[Xi]:=2 + else + ZCodeRepart[Xi]:=3 + else + if ZQST[Xi]>=(ZQSTmin3[Xi]-YSeuilConv) then + ZCodeRepart[Xi]:=-1 + else + ZCodeRepart[Xi]:=-2; + + + {--calcul du code B d‚finissant la position du d‚bit dans le canal de --} + {--prise : -4 si inf‚rieur … QEmin, -3 si QEmin, -2 si ZQMnat-ZQMRef, --} + {---1 si ZQMnat-ZQMRes, 1 si QMnat, 2 si QEmax, 3 si sup‚rieur … QEmax--} + {--et 0 si ajust‚ --} + if (ZQE[Xi]>(ZQEmin[Xi]+YSeuilConv)) and (ZQE[Xi]<(ZQEmax[Xi]-YSeuilConv)) then + if abs(ZQMnat[Xi]-ZQMRef[Xi]-ZQE[Xi])<=YSeuilConv then + ZCodePrise[Xi]:=-2 + else + if abs(ZQMnat[Xi]-ZQMRes[Xi]-ZQE[Xi])<=YSeuilConv then + ZCodePrise[Xi]:=-1 + else + if abs(ZQMnat[Xi]-ZQE[Xi])<=YSeuilConv then + ZCodePrise[Xi]:=1 + else + ZCodePrise[Xi]:=0 + else + if ZQE[Xi]>=(ZQEmax[Xi]-YSeuilConv) then + if ZQE[Xi]<=(ZQEmax[Xi]+YSeuilConv) then + ZCodePrise[Xi]:=2 else - ZCodeStock[Xi]:=2 + ZCodePrise[Xi]:=3 else - ZCodeStock[Xi]:=3 + if ZQE[Xi]>=(ZQEmin[Xi]-YSeuilConv) then + ZCodePrise[Xi]:=-3 + else + ZCodePrise[Xi]:=-4; + + {--calcul du code C d‚finissant la position du d‚bit dans le canal de--} + {--restitution : -2 si sup‚rieur … QSmax, -1 si QSmax, 0 si ajust‚, --} + {--1 si QSmin et 2 si inf‚rieur … QSmin --} + if (ZQS[Xi]>(ZQSmin[Xi]+YSeuilConv)) and (ZQS[Xi]<(ZQSmax[Xi]-YSeuilConv)) then + ZCodeRestit[Xi]:=0 + else + if ZQS[Xi]>=(ZQSmax[Xi]-YSeuilConv) then + if ZQS[Xi]<=(ZQSmax[Xi]+YSeuilConv) then + ZCodeRestit[Xi]:=-1 + else + ZCodeRestit[Xi]:=-2 else - if ZQST[Xi]>=(ZQSTmin[Xi]-YSeuilConv) then - ZCodeStock[Xi]:=-1 + if ZQS[Xi]>=(ZQSmin[Xi]-YSeuilConv) then + ZCodeRestit[Xi]:=1 else - ZCodeStock[Xi]:=3; - - {--calcul du code d‚finissant la position du d‚bit dans le canal de--} - {--prise : -2 si Qemin, -1 si ZQM-ZQFM, 0 si ajust‚, --} - {--1 si ZQM-ZQRM, 2 si Qemax et 3 si ZQM --} - ZCodePrise[Xi]:=0; - if abs(YQemin[Xi]-ZQe[Xi])<=YSeuilConv then - ZCodePrise[Xi]:=-2; - if abs(ZQM[Xi]-ZQFM[Xi]-ZQe[Xi])<=YSeuilConv then - ZCodePrise[Xi]:=-1; - if abs(ZQM[Xi]-ZQRM[Xi]-ZQe[Xi])<=YSeuilConv then - ZCodePrise[Xi]:=1; - if abs(YQemax[Xi]-ZQe[Xi])<=YSeuilConv then - ZCodePrise[Xi]:=2; - if abs(ZQM[Xi]-ZQe[Xi])<=YSeuilConv then - ZCodePrise[Xi]:=3; - - {--calcul du code d‚finissant la position du d‚bit dans le canal de--} - {--restitution : -1 si Qsmax, 0 si ajust‚ et 1 si Qsmin --} - ZCodeRestit[Xi]:=0; - if abs(YQsmax[Xi]-ZQs[Xi])<=YSeuilConv then - ZCodeRestit[Xi]:=-1; - if abs(YQsmin[Xi]-ZQs[Xi])<=YSeuilConv then - ZCodeRestit[Xi]:=1; - - {--calcul du code d‚finissantla position du d‚bit … l'aval de la --} - {--restitution : 2 si inf … QRV, 1 si QRV, 0 si ajust‚, -1 si QFV et --} - {-- -2 si sup … QFV --} - if ((ZQFV[Xi]-YSeuilConv)>ZQOV[Xi]) and (ZQOV[Xi]>(ZQRV[Xi]+YSeuilConv)) then + ZCodeRestit[Xi]:=2; + + {--calcul du code D d‚finissantla position du d‚bit … l'aval de la --} + {--restitution : 2 si inf … QVRes, 1 si QVRes, 0 si ajust‚, -1 si QVRef et --} + {-- -2 si sup … QVRef --} + if (ZQV[Xi]>(ZQVRes[Xi]+YSeuilConv)) and (ZQV[Xi]<(ZQVRef[Xi]-YSeuilConv)) then ZCodeAval[Xi]:=0 else - if (ZQFV[Xi]-YSeuilConv)<=ZQOV[Xi] then - if (ZQFV[Xi]+YSeuilConv)>=ZQOV[Xi] then + if ZQV[Xi]>=(ZQVRef[Xi]-YSeuilConv) then + if ZQV[Xi]<=(ZQVRef[Xi]+YSeuilConv) then ZCodeAval[Xi]:=-1 else ZCodeAval[Xi]:=-2 else - if ZQOV[Xi]>=(ZQRV[Xi]-YSeuilConv) then + if ZQV[Xi]>=(ZQVRes[Xi]-YSeuilConv) then ZCodeAval[Xi]:=1 else ZCodeAval[Xi]:=2; - end; {fin de calcul des d‚bits pris et restitu‚s et des codes} + {--calcul du code E indiquant le d‚bit stock‚ dans le r‚servoir est de--} + {--signe contraire … l'objectif global de d‚bit stock‚ --} + if (ZQXsous*ZQST[Xi])<0 then + ZCodeSigne[Xi]:=1 + else + ZCodeSigne[Xi]:=0; + + end; {fin de boucle sur les r‚servoirs pour le calcul des d‚bits pris et restitu‚s et des codes} if XTest then ZTest:=1 diff --git a/src/CALCULS2.PAS b/src/CALCULS2.PAS index dccb242c40991547b68328b7c9a88d5e4f430ba8..c5c780c052181fe883507ab0319d1375e97b62f9 100644 --- a/src/CALCULS2.PAS +++ b/src/CALCULS2.PAS @@ -1,39 +1,104 @@ -Unit CALCULS2; - - +Unit CALCULS2; {JC Bader, nov 2016} interface - uses Utilit,Declara; + uses Utilit,DECLARA; + + procedure C2_LectureFreqNonDep; + procedure C2_LecturePuissanceQXdef_DecideTri; + procedure C2_LectureParametresStat; + PROCEDURE C2_Tri(var Ztab:YTab2; ZN:integer); + FUNCTION C2_Quantile(ZTab:YTab2; ZN:integer; Zfreq:double): double; + PROCEDURE C2_ISOFREQ(ZDateDebutFichier, ZDateDebut, ZDateFin:longint; var ZFic : YTypFOD; ZChaine : string; ZNorme : double; ZFormat : integer) ; - procedure LectureParametresStat; - PROCEDURE ECRITURE_STATS; - PROCEDURE Tri(var Ztab:YTab2; ZN:integer); - FUNCTION Quantile(ZTab:YTab2; ZN:integer; Zfreq:double): double; - PROCEDURE ISOFREQ(ZDateDebutFichier, ZDateDebut, ZDateFin:longint; var ZFic : YTypFOD; ZChaine : string) ; - PROCEDURE InitVolumeSimulEnSensChrono; IMPLEMENTATION -{============================================================================} +{========================================================================} +{--Lecture du paramŠtre YFreqNondep : fr‚quence de non d‚passement des --} +{--valeurs de d‚bit QMN dans les cours d'eau aux prises, utilis‚es dans--} +{--les calculs d'‚quilibrage des dur‚es potentielles de remplissage. --} +{========================================================================} + +procedure C2_LectureFreqNonDep; + begin + assign(YFicResult4,YRepP+YNomFicFNonDep); + {$i-} + reset(YFicResult4); + if ioresult=0 then + begin + readln(YFicResult4,YFreqNonDep); + if ioresult<>0 then + YFreqNonDep:=0.5 + else + YFreqNonDep:=B_min(B_max(YFreqNonDep,0.005),0.995); + close(YFicResult4); + end + else + YFreqNonDep:=0.5; + {$i+} + end; {fin de C2_LectureFreqNonDep} + +{======================================================================} +{--Lecture du paramŠtre YPuiss utilis‚ pour le calcul de la moyenne --} +{--des d‚faillance de d‚bit dues au manque de capacit‚ des r‚servoirs--} +{--et test l'ordre de trier ces d‚faillances --} +{======================================================================} + +procedure C2_LecturePuissanceQXdef_DecideTri; + begin + assign(YFicResult4,YRepP+YNomFicPuiss); + {$i-} + reset(YFicResult4); + if ioresult=0 then + begin + readln(YFicResult4,YPuiss); + if ioresult<>0 then + YPuiss:=2 + else + YPuiss:=B_min(B_max(YPuiss,0.1),5); + close(YFicResult4); + end + else + YPuiss:=2; + assign(YFicResult4,YRepP+YNomFicCalcTri); + reset(YFicResult4); + if ioresult=0 then + begin + YTestCalcTri:=true; + close(YFicResult4); + end + else + YTestCalcTri:=false; + {$i+} + end; {fin de C2_LecturePuissanceQXdef_DecideTri} + +{==========================================================================} +{--Lecture des paramŠtres YA et YB utilis‚s pour le calcul des fr‚quences--} +{--de non d‚passement : f = (rang-YA)(effectif+YB) --} +{==========================================================================} + +procedure C2_LectureParametresStat; + + var + XFic : text; -procedure LectureParametresStat; begin YNbTpsRet:=0; YChoixFreq:=false; - assign(YFicResult4,YRepP+YNomFicTpsRet); + assign(XFic,YRepP+YNomFicTpsRet); {$i-} - reset(YFicResult4); + reset(XFic); if ioresult=0 then begin - while (not(eof(YFicResult4))) and not(YChoixFreq) do + while (not(eof(XFic))) and not(YChoixFreq) do begin - readln(YFicResult4,YA,YB); + readln(XFic,YA,YB); if ioresult=0 then YChoixFreq:=true; end; - while (not(eof(YFicResult4))) and (YNbTpsret<YNbmaxTpsRet) do + while (not(eof(XFic))) and (YNbTpsret<YNbmaxTpsRet) do begin - readln(YFicResult4,YTps); + readln(XFic,YTps); if ioresult=0 then if YTps>=2 then begin @@ -41,13 +106,13 @@ procedure LectureParametresStat; YTpsRet[YNbTpsRet]:=YTps; end; end; - close(YFicResult4); + close(XFic); end; {$i+} if YChoixFreq then begin - YA:=Amin(Amax(0,YA),0.5); - YB:=Amin(Amax(0,YB),1); + YA:=B_min(B_max(0,YA),0.5); + YB:=B_min(B_max(0,YB),1); end else begin @@ -60,169 +125,19 @@ procedure LectureParametresStat; for Yi:=1 to YNbTpsRet do YTpsRet[Yi]:=YTpsRetParDefo[Yi]; end; - Tri(YTpsRet,YNbTpsRet); + C2_Tri(YTpsRet,YNbTpsRet); if YTpsRet[1]=2 then YjTpsRet:=2 else YjTpsRet:=1; - end; + end; {fin de C2_LectureParametresStat} -{===========================================================================} - -PROCEDURE ECRITURE_STATS; - begin - {--ECRITURE DES STATS. concernant la faisabilit‚ de l'objectif aval--} - writeln(YFicSortie,' Signification du code Succes pour l''ensemble des stations :'); - writeln(YFicSortie,' -3 : calcul non effectue pour cause de lacune de debit naturel ', - '(a la station aval du systeme ou au droit d''une prise ou d''une restitution)'); - writeln(YFicSortie,' -2 : possibilite theorique d''obtenir un debit egal a l''objectif a la station aval,', - ' mais non convergence du calcul (voir fin de ce fichier)'); - writeln(YFicSortie,' -1 : malgre un debit stocke net minimal (QSTmin) dans chaque reservoir, le debit obtenu a ', - 'la station aval est inferieur a l''objectif'); - writeln(YFicSortie,' 0 : a la station aval, le debit obtenu est egal a l''objectif, grace aux debits ', - 'stockes nets dans les reservoirs ', - '(dont au moins un superieur au minimum et au moins un inferieur au maximum)'); - writeln(YFicSortie,' 1 : malgre un debit stocke net maximal (QSTmax) dans chaque reservoir, le debit obtenu ', - 'a la station aval est superieur a l''objectif'); - writeln(YFicSortie,' 2 : meme avec un debit stocke net egal au debit naturel de prise dans chaque reservoir, ', - 'le debit obtenu a la station aval serait superieur a l''objectif'); - - writeln(YFicSortie,' Effectif des valeurs obtenues pour le code Succes :'); - write(YFicSortie,' '); - for Yi:=-3 to 2 do - write(YFicSortie,Yi,' : ',YNSucces[Yi],' ; '); - writeln(YFicSortie); - writeln(YficSortie); - writeln(YFicSortie); - - {--ECRITURE DES STATS. concernant les d‚bits stock‚s n‚cessaires--} - writeln(YFicSortie,' Signification du code A pour chaque reservoir, decrivant la position du debit stocke net ', - 'par rapport aux bornes imposee par les conditions locales a la prise et a la restitution ', - '(debit naturel, contraintes et consignes)'); - writeln(YFicSortie,' -2 : calcul non effectue pour cause de lacune de debit naturel ', - '(a la station aval du systeme ou au droit d''une prise ou d''une restitution)'); - writeln(YFicSortie,' -1 : debit stocke egal a la valeur minimale QSTmin (avec QSTmin < QSTmax)'); - writeln(YFicSortie,' 0 : debit stocke situe entre valeurs minimale QSTmin et maximale QSTmax ', - '(avec QSTmin < QSTmax)'); - writeln(YFicSortie,' 1 : debit stocke egal a la valeur maximale QSTmax (avec QSTmin = QSTmax)'); - writeln(YFicSortie,' 2 : debit stocke egal a la valeur maximale QSTmax (avec QSTmin < QSTmax)'); - writeln(YFicSortie,' Effectif des valeurs obtenues pour le code A :'); - write(YFicSortie,' valeur '); - for YRangLac:=1 to YNbLacs do - begin - for Yi:=length(YNomLac[YRanglac])+1 to 10 do - write(YFicSortie,' '); - write(YFicSortie,YNomLac[YRanglac],' '); - end; - writeln(YFicSortie); - for Yi:=-2 to 2 do - begin - write(YFicSortie,' ',YI:6,' '); - for YRangLac:=1 to YNbLacs do - write(YFicSortie,YNCodeRepart[YRangLac,Yi]:10,' '); - writeln(YFicSortie); - end; - writeln(YFicSortie); - - {--ECRITURE DES STATS concernant les d‚bits pris n‚cessaires--} - writeln(YficSortie); - writeln(YFicSortie,' Signification du code B pour chaque reservoir, decrivant la position du debit du canal de prise ', - 'par rapport aux bornes imposee par les conditions locales a la prise (debit naturel, ', - 'contraintes et consignes)'); - writeln(YFicSortie,' -3 : calcul non effectue pour cause de lacune de debit naturel ', - '(a la station aval du systeme ou au droit d''une prise ou d''une restitution)'); - writeln(YFicSortie,' -2 : debit preleve egal a la debitance minimale Qemin du canal de prise'); - writeln(YFicSortie,' -1 : debit preleve egal a la valeur minimale QMnat-QMref imposee par le debit de reference ', - 'QMref a l''aval de la prise et le debit naturel QMnat a la prise'); - writeln(YFicSortie,' 0 : debit preleve egal a aucune des bornes imposees'); - writeln(YFicSortie,' 1 : debit preleve egal a la valeur maximale QMnat-QMres imposee par le debit reserve ', - 'QMres a l''aval de la prise et le debit naturel QMnat a la prise'); - writeln(YFicSortie,' 2 : debit preleve egal a la debitance maximale Qemax du canal de prise'); - writeln(YFicSortie,' 3 : debit preleve egal au debit naturel QMnat a la prise'); - writeln(YFicSortie,' Effectif des valeurs obtenues pour le code B :'); - write(YFicSortie,' valeur '); - for YRanglac:=1 to YNbLacs do - begin - for Yi:=length(YNomLac[YRanglac])+1 to 10 do - write(YFicSortie,' '); - write(YFicSortie,YNomLac[YRanglac],' '); - end; - writeln(YFicSortie); - for Yi:=-3 to 3 do - begin - write(YFicSortie,' ',YI:6,' '); - for YRangLac:=1 to YNbLacs do - write(YFicSortie,YNCodePrise[YRangLac,Yi]:10,' '); - writeln(YficSortie); - end; - writeln(YFicSortie); - - {--ECRITURE DES STATS concernant les d‚bits restitu‚s n‚cessaires--} - writeln(YficSortie); - writeln(YFicSortie,' Signification du code C pour chaque reservoir, decrivant la position du debit du canal ', - 'de restitution par rapport aux bornes de debitance du canal '); - writeln(YFicSortie,' -2 : calcul non effectue pour cause de lacune de debit naturel ', - '(a la station aval du systeme ou au droit d''une prise ou d''une restitution)'); - writeln(YFicSortie,' -1 : debit restitue egal a la debitance maximale Qsmax du canal de restitution'); - writeln(YFicSortie,' 0 : debit restitue situe entre les bornes de debitance Qsmin et Qsmax du canal de restitution'); - writeln(YFicSortie,' 1 : debit restitue egal a la debitance minimale Qsmin du canal de restitution'); - writeln(YFicSortie,' Effectif des valeurs obtenues pour le code C :'); - write(YFicSortie,' valeur '); - for YRangLac:=1 to YNbLacs do - begin - for Yi:=length(YNomLac[YRanglac])+1 to 10 do - write(YFicSortie,' '); - write(YFicSortie,YNomLac[YRanglac],' '); - end; - writeln(YFicSortie); - for Yi:=-2 to 1 do - begin - write(YFicSortie,' ',YI:6,' '); - for YRangLac:=1 to YNbLacs do - write(YFicSortie,YNCodeRestit[YRangLac,Yi]:10,' '); - writeln(YFicSortie); - end; - writeln(YFicSortie); - - {--ECRITURE DES STATS concernant les d‚bits n‚cessaires … l'aval des --} - {--restitutions --} - writeln(YficSortie); - writeln(YFicSortie,' Signification du code D pour chaque reservoir, decrivant la position du debit ', - 'a l''aval de la restitution par rapport aux bornes imposees par les consignes ', - 'locales (debits reserve et de reference)'); - writeln(YFicSortie,' -3 : calcul non effectue pour cause de lacune de debit naturel ', - '(a la station aval du systeme ou au droit d''une prise ou d''une restitution)'); - writeln(YFicSortie,' -2 : debit superieur au debit de reference QVref'); - writeln(YFicSortie,' -1 : debit egal au debit de reference QVref'); - writeln(YFicSortie,' 0 : debit situe entre le debit reserve QVres et le debit de reference QVref'); - writeln(YFicSortie,' 1 : debit egal au debit reserve QVres'); - writeln(YFicSortie,' 2 : debit inferieur au debit reserve QVres'); - writeln(YFicSortie,' Effectif des valeurs obtenues pour le code D :'); - write(YFicSortie,' valeur '); - for YRangLac:=1 to YNbLacs do - begin - for Yi:=length(YNomLac[YRanglac])+1 to 10 do - write(YFicSortie,' '); - write(YFicSortie,YNomLac[YRanglac],' '); - end; - writeln(YFicSortie); - for Yi:=-3 to 2 do - begin - write(YFicSortie,' ',YI:6,' '); - for YRangLac:=1 to YNbLacs do - write(YFicSortie,YNCodeAval[YRangLac,Yi]:10,' '); - writeln(YFicSortie); - end; - writeln(YFicSortie); - writeln(YFicSortie,' Nombre de fourchettes initiales sous-dimentionnees pour le calcul de QST0 : ',YNbPbBornes); - writeln(YFicSortie,' Ecart absolu entre debit ideal obtenu et debit objectif atteignable a la station aval : ', - 'maximum obtenu = ',YEcartmax,' (critere de convergence (code Succes=0) =',YSeuilConv,')'); - writeln(YFicSortie); - end; +{===========================================================================} +{--Tri en ordre croissant des ZN premiŠres valeurs d'un tableau ZTab --} {===========================================================================} -PROCEDURE Tri(var Ztab:YTab2; ZN:integer); +PROCEDURE C2_Tri(var Ztab:YTab2; ZN:integer); var Xi : integer; Xj : integer; @@ -245,44 +160,66 @@ PROCEDURE Tri(var Ztab:YTab2; ZN:integer); begin ZTab[Xi]:=XTab[Xi]; end; - end; + end; {fin de C2_Tri} {===========================================================================} +{--Calcul de la valeur non d‚pass‚e … la fr‚quence Zfreq, … partir d'un --} +{--tableau ZTab de N valeurs tri‚es en ordre croissant --} +{===========================================================================} -FUNCTION Quantile(ZTab:YTab2; ZN:integer; Zfreq:double): double; +FUNCTION C2_Quantile(ZTab:YTab2; ZN:integer; Zfreq:double): double; var Xi : integer; Xpos: double; begin - Xi:=Aminin(ZN-1,AMaxin(1,trunc((ZN+YB)*ZFreq+YA))); + Xi:=B_minin(ZN-1,B_Maxin(1,trunc((ZN+YB)*ZFreq+YA))); XPos:=Xi-YA; Xpos:=ZFreq-XPos/(ZN+YB); XPos:=XPos*(ZTab[Xi+1]-ZTab[Xi]); - Quantile:=ZTab[Xi]+XPos*(ZN+YB) - end; + C2_Quantile:=ZTab[Xi]+XPos*(ZN+YB) + end; {fin de C2_Quantile} -{=============================================================================} +{===========================================================================} +{--A partir d'une chronique contenue dans un fichier ZFic et commen‡ant … --} +{--la date ZDateDebutFichier, ‚dition dans le fichier YFicResult4 de 3 --} +{--tableaux contenant pour chaque jour de l'ann‚e : valeurs tri‚es par --} +{--ann‚e, valeurs croissantes et quantiles pour des fr‚quences pr‚d‚finies--} +{===========================================================================} + +PROCEDURE C2_ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; + var ZFic : YTypFOD; ZChaine : string; + ZNorme : double; ZFormat : integer) ; + + {-------------------------------------------} + Procedure XEdite(ZZvaleur: double); + begin + case ZFormat of + 1 : write(YFicResult4,ZZValeur:15:2,' '); + 2 : write(YFicResult4,ZZValeur:15:13,' '); + 3 : write(YFicResult4,ZZValeur:15:8,' '); + 4 : write(YFicResult4,ZZValeur:15:10,' '); + end; + end; + {-------------------------------------------} -PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; - var ZFic : YTypFOD; - ZChaine : string) ; var XDate : string[5]; XChai2 : string[2]; XValeur : double; - + XMois : integer; + XJour : integer; begin {--calcul des ann‚es de d‚but et de fin de s‚rie des volumes … 24h--} - YJJ_MM_AAAA:=ADate(ZDateDebut); - val(copy(YJJ_MM_AAAA,7,4),YAnDebutV,YCode); - YJJ_MM_AAAA:=ADate(ZDateFin); - val(copy(YJJ_MM_AAAA,7,4),YAnFinV,YCode); + YJJ_MM_AAAA[YRangLac]:=B_Date(ZDateDebut); + val(copy(YJJ_MM_AAAA[YRangLac],7,4),YAnDebutV,YCode); + YJJ_MM_AAAA[YRangLac]:=B_Date(ZDateFin); + val(copy(YJJ_MM_AAAA[YRangLac],7,4),YAnFinV,YCode); {--ECRITURE D'EN-TÒTE DE FICHIER TEXTE DES RESULTATS--} rewrite(YFicResult4); writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ; ',YResume); - ADatation(YFicResult4); + B_Datation(YFicResult4); writeln(YFicResult4); writeln(YFicResult4,ZChaine); writeln(YFicResult4); @@ -322,29 +259,30 @@ PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; reset(ZFic); {--BOUCLE SUR LES MOIS DE L'ANNEE--} - for YMois:=1 to 12 do + for XMois:=1 to 12 do begin {--BOUCLE SUR LES JOURS DU MOIS (en ann‚e non bissextile)--} - for YJour:=1 to ALongMois(2001,YMois) do + for XJour:=1 to B_LongMois(2001,XMois) do begin - {--calcul pour le jour courant, de la premiŠre et de la derniŠre--} + + {--calcul pour le jour courant, de la premiŠre et de la derniŠre--} {--ann‚e pour lesquelles on a un volume calcul‚ … 24h --} - if ATJour(YAnDebutV,YMois,YJour)>=ZDateDebut then + if B_TJour(YAnDebutV,XMois,XJour)>=ZDateDebut then YAnPremier:=YAnDebutV else YAnPremier:=YAnDebutV+1; - if ATJour(YAnFinV,YMois,YJour)<=ZDateFin then + if B_TJour(YAnFinV,XMois,XJour)<=ZDateFin then YAnDernier:=YAnFinV else YAnDernier:=YAnFinV-1; - {--cnstruction de chaine date en format jj/mm--} - str(YJour,XChai2); - if YJour<10 then + {--construction de chaine date en format jj/mm--} + str(XJour,XChai2); + if XJour<10 then XChai2:='0'+XChai2; - str(YMois,XDate); - if YMois<10 then + str(XMois,XDate); + if XMois<10 then XDate:='0'+XDate; XDate:=XChai2+'/'+XDate; @@ -355,18 +293,19 @@ PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; write(YFicResult4,' '); for YAn:=YAnPremier to YAnDernier do begin - seek(ZFic,ATJour(YAn,YMois,YJour)-ZDateDebutFichier); - read(ZFic,YValBonneDate[YAn-YAnPremier+1]); - write(YFicResult4,YValBonneDate[YAn-YAnPremier+1]:15:2,' '); + seek(ZFic,B_TJour(YAn,XMois,XJour)-ZDateDebutFichier); + read(ZFic,YValBonneDate[YRanglac,YAn-YAnPremier+1]); + YValBonneDate[YRanglac,YAn-YAnPremier+1]:=YValBonneDate[YRanglac,YAn-YAnPremier+1]/ZNorme; + XEdite(YValBonneDate[YRangLac,YAn-YAnPremier+1]); end; for YAn:=YAnDernier+1 to YAnFinV do write(YFicResult4,' '); {--ECRITURE DES VALEURS TRIEES PAR VALEURS CROISSANTES--} write(YFicResult4,' ',XDate,' '); - Tri(YValBonneDate,YAnDernier-YAnPremier+1); + C2_Tri(YValBonneDate[YRangLac],YAnDernier-YAnPremier+1); for YAn:= YAnPremier to YAnDernier do - write(YFicResult4,YValBonneDate[YAn-YAnPremier+1]:15:2,' '); + XEdite(YValBonneDate[YRangLac,YAn-YAnPremier+1]); for YAn:=YAnDebutV to YAnPremier-1 do write(YFicResult4,' '); for YAn:=YAnDernier+1 to YAnFinV do @@ -374,7 +313,7 @@ PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; {--ECRITURE DES VALEURS TRIEES PAR FREQ. DECROISSANTE DE NON DEPASSMT.--} write(YFicResult4,' ',XDate,' '); - write(YFicResult4,YValBonneDate[YAnDernier-YAnPremier+1]:15:2,' '); + XEdite(YValBonneDate[YRanglac,YAnDernier-YAnPremier+1]); for Yi:=YNbTpsRet downto YjTpsRet do begin YFreq:=1-1/YTpsRet[Yi]; @@ -384,9 +323,9 @@ PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; until ((Yk-YA)/(YAnDernier-YanPremier+1+YB))<YFreq; if Yk<(YAnDernier-YAnPremier+1) then begin - XValeur:=YValBonneDate[Yk]+(YValbonneDate[Yk+1]-YValBonneDate[Yk]) + XValeur:=YValBonneDate[YRangLac,Yk]+(YValbonneDate[YRangLac,Yk+1]-YValBonneDate[YRangLac,Yk]) *(YFreq-(Yk-YA)/(YAndernier-YAnPremier+1+YB))*(YAnDernier-YAnPremier+1+YB); - write(YFicResult4,XValeur:15:2,' '); + XEdite(XValeur); end else write(YFicResult4,' '); @@ -401,13 +340,14 @@ PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; if Yk>1 then begin XValeur:=(YFreq-(Yk-1-YA)/(YAndernier-YAnPremier+1+YB))*(YAnDernier-YAnPremier+1+YB); - XValeur:=YValBonneDate[Yk-1]+(YValbonneDate[Yk]-YValBonneDate[Yk-1])*XValeur; - write(YFicResult4,XValeur:15:2,' '); + XValeur:=YValBonneDate[YRanglac,Yk-1]+(YValbonneDate[YRangLac,Yk]-YValBonneDate[YRangLac,Yk-1])*XValeur; + XEdite(XValeur); end else write(YFicResult4,' '); end; - writeln(YFicResult4,YValBonneDate[1]:15:2); + XEdite(YValBonneDate[YRanglac,1]); + writeln(YFicResult4); end; {fin de boucle sur les jours} @@ -416,47 +356,7 @@ PROCEDURE ISOFREQ (ZDateDebutFichier, ZDateDebut, ZDateFin:longint; close(YFicResult4); close(ZFic); - end; -{=============================================================================} - -PROCEDURE InitVolumeSimulEnSensChrono; - begin - YJJ_MM_AAAA:=ADate(YDateFinLac[YRangLac]-YDateFin+YDateDebut-1); - val(copy(YJJ_MM_AAAA,4,2),YMoisDebutLac,YCode); - val(copy(YJJ_MM_AAAA,1,2),YJourDebutLac,YCode); - YNIter:=0; - YConverge:=false; - if YTypeObjectif=0 then - YVDebut:=YVtot[YRangLac] - else - YVDebut:=0; - repeat - seek(YFicQST[YRanglac],filesize(YFicQST[YRangLac])-1); - YNIter:=YNIter+1; - YNbAn:=0; - YVolume:=YVDebut; - for Yi:=YDateFinLac[YRangLac]+YdateDebut-YDateFin-1 to YdateFinLac[YrangLac]-1 do - begin - YJJ_MM_AAAA:=ADate(Yi); - val(copy(YJJ_MM_AAAA,4,2),YMois,YCode); - val(copy(YJJ_MM_AAAA,1,2),YJour,YCode); - if (YMois=YMoisDebutLac) and (YJour=YJourDebutLac) then - begin - YNbAn:=YNbAn+1; - YValBonnedate[YNbAn]:=YVolume; - end; - read(YFicQST[YRangLac],YQST[YRangLac]); - seek(YFicQST[YRangLac],abs(filepos(YFicQST[YRanglac])-2)); - YVolume:=Amindouble(YVtot[YRangLac],Amax(0,YVolume+YQST[YrangLac]*86400)); - end; - Tri(YValBonneDate,YNbAn); - YVmedian:=Quantile(YValBonneDate,YNbAn,0.5); - if abs(YVMedian-YVDebut)<(YVtot[YRanglac]*YSeuilRConv) then - YConverge:=true - else - YVDebut:=Amindouble(YVtot[YRanglac],Amaxdouble(0,(YNbAn*YVMedian-YVDebut)/(YNbAn-1))); - until YConverge or (YNIter=YNbmaxIter); {fin des encadrements successifs} - end; + end; {fin de C2_ISOFREQ} {=============================================================================} diff --git a/src/CALCULS3.PAS b/src/CALCULS3.PAS index 0c55ddf1b82da382e729154f365b285cdcfb9b93..63169382b08bcfa125576fe2d08d5da6838ce3a5 100644 --- a/src/CALCULS3.PAS +++ b/src/CALCULS3.PAS @@ -1,234 +1,1106 @@ -Unit CALCULS3; +Unit CALCULS3; {JC Bader, nov 2016} -interface - uses Utilit,Declara,Calculs2; +INTERFACE - procedure CalculChroniquesVolume; + uses crt,Utilit,Interfas,DECLARA,Calculs1,Calculs2; + + procedure C3_CalculChroniquesVolume; IMPLEMENTATION -procedure CalculChroniquesVolume; +{==========================================================================} +{--Remplissage d'un tableau YQMNfreq (array[0..YNmaxLacs,1..365]) donnant--} +{--pour chaque jour de l'ann‚e le quantile de fr‚quence Zfreq au non --} +{--d‚passement du d‚bit stock‚ objectif … la station aval … 12H (YQXsous)--} +{--et des d‚bits des cours d'eau au droit des prises des diff‚rents --} +{--r‚servoirs, d‚cal‚s en temps selon les d‚lais de propagation jusqu'… --} +{--la station aval --} +{==========================================================================} + +procedure Ici_Calcul_Quantile_QMN(Zfreq: double); + var + Xi : integer; + XMois : integer; + XJour : integer; + XQMn : array[0..YNmaxLacs] of YTab2; + XJJ_MM_AAAA : YChai10; + XQuant : integer; + XFic : text; + + begin + + reset(YFicDeb); + + {--calcul des ann‚es de d‚but et de fin des d‚bits objectifs … 12 H--} + XJJ_MM_AAAA:=B_Date(YDateDebut); + val(copy(XJJ_MM_AAAA,7,4),YAnDebutV,YCode); + XJJ_MM_AAAA:=B_Date(YDateFin); + val(copy(XJJ_MM_AAAA,7,4),YAnFinV,YCode); + + assign(XFic,YRepR+YNomFicQuant); + rewrite(xfic); + writeln(XFic,'Rang du calcul : ',YCompteur,' ; ',YResume); + B_Datation(XFic); + writeln(XFic); + writeln(XFic,'Valeurs isofrequence (frequence de non depassement : ',ZFreq:6:4, + ') de l''objectif de debit stocke QXsous et des debits des cours d''eau QMN au droit des prises', + '(decales en temps selon delais de propagation)'); + writeln(XFic); + write(XFic,'quantieme aval '); + write(XFic,' QXsous '); + for Xi:=1 to YNbLacs do + write(XFic,' QMN(',Xi,') '); + writeln(Xfic); + + {--initialisation du quantiŠme--} + XQuant:=0; + + {--BOUCLE SUR LES MOIS DE L'ANNEE--} + for XMois:=1 to 12 do + begin + + {--BOUCLE SUR LES JOURS DU MOIS (en ann‚e non bissextile)--} + for XJour:=1 to B_LongMois(2001,XMois) do + begin + + XQuant:=XQuant+1; + + {--calcul pour le jour courant … la station aval, de la premiŠre --} + {--et de la derniŠre ann‚e pour lesquelles on a un d‚bit objectif--} + {--… 12 H --} + if B_TJour(YAnDebutV,XMois,XJour)>=YDateDebut then + YAnPremier:=YAnDebutV + else + YAnPremier:=YAnDebutV+1; + if B_TJour(YAnFinV,XMois,XJour)<=YDateFin then + YAnDernier:=YAnFinV + else + YAnDernier:=YAnFinV-1; + + {--remplissage du tableau XQMN par ordre chronologique--} + for YAn:=YAnPremier to YAnDernier do + begin + seek(YFicDeb,YDateFin-B_TJour(YAn,XMois,XJour)); + read(YFicDeb,Ydeb2); + XQMN[0,YAn-YAnPremier+1]:=Ydeb2.YQXsous; + for Xi:=1 to YNbLacs do + XQMn[Xi,YAn-YAnPremier+1]:=YDeb2.YQMnat[Xi]; + end; + + {--Tri du tableau XQMN par valeurs croissantes--} + for Xi:=0 to YNbLacs do + C2_Tri(XQMN[Xi],YAnDernier-YAnPremier+1); + + {--calcul de XQMN pour la fr‚quence d‚sir‚e--} + Yk:=YAnDernier-YAnPremier+2; + repeat + Yk:=Yk-1; + until (((Yk-YA)/(YAnDernier-YanPremier+1+YB))<ZFreq) or (Yk=1); + Yk:=B_minIn(Yk,YAnDernier-YAnPremier); + for Xi:=0 to YNbLacs do + YQMNfreq[Xi,XQuant]:=XQMN[Xi,Yk]+(XQMN[Xi,Yk+1]-XQMN[Xi,Yk]) + *(ZFreq-(Yk-YA)/(YAndernier-YAnPremier+1+YB))*(YAnDernier-YAnPremier+1+YB); + for Xi:=1 to YNbLacs do + YQMNfreq[Xi,XQuant]:=B_max(0,YQMNfreq[Xi,XQuant]); + + end; {fin de boucle sur les jours} + + end; {fin de boucle sur les mois} + + for Xi:=1 to YNbLacs do + YQMfreqMoy[Xi]:=0; + for XQuant:=1 to 365 do + begin + write(XFic,XQuant:14,' '); + for Xi:=0 to YNbLacs do + write(Xfic,YQMNfreq[Xi,XQuant]:21:12,' '); + writeln(Xfic); + for Xi:=1 to YNbLacs do + YQMfreqMoy[Xi]:=YQMfreqMoy[Xi]+YQMNfreq[Xi,XQuant]; + end; + close(Xfic); + for Xi:=1 to YnbLacs do + YQMfreqMoy[Xi]:=YQMfreqmoy[Xi]/365; + + end; {fin de Ici_Calcul_Quantile_QMN} + + +{=========================================================================} +{--Lecture sur fichier typ‚ des valeurs de Ydeb2(YQXsous,YQMnat,YQVnat) --} +{--et calcul des d‚bits r‚serv‚s et de r‚f‚rence aux prises et --} +{--restitutions, puis calcul de r‚partition du d‚bit … stocker. --} +{--ZChron : vrai pour calcul en sens chrono, faux sinon --} +{--ZDate : date compt‚e en nombre de jours aprŠs le 31/12/1599 --} +{=========================================================================} + +procedure Ici_CalculDebitsResRef_CalculRepartition(ZChron:boolean;ZDate:longint); + + begin + + with YDeb2 do + begin + + {--calcul des d‚bits r‚serv‚s et de r‚f‚rence--} + for YRangLac:=1 to YNbLacs do + begin + C1_QRefRes(ZChron,2,YRangLac,YDateEnJour[YRangLac],YQMnat[YRangLac],YQVVeille[YRangLac], + YChaiDate[YRangLac],YQVRef[YrangLac],YQVRes[YRangLac]); + C1_QRefRes(ZChron,1,YRangLac,YDateEnJour[YRangLac],YQMnat[YRangLac],YQVVeille[YRangLac], + YChaiDate[YRangLac],YQMRef[YrangLac],YQMRes[YRangLac]); + end; + + {--r‚partion entre r‚servoirs de l'objectif de d‚bit stock‚--} + C1_Repartition(ZDate,YOptionRepart, YTypeObjectif,ZChron,YQXsous, + YVolume,YQVnat,YQMnat,YQVRes,YQVRef,YQMRes,YQMRef, + YSuccesRepart,YcodeRepart,YCodeAval,YCodePrise,YCodeRestit,YCodeSigne, + YQST0,YQSTt0,YQSTt1,YVRobj,YVVobj, + YTPot,YPart,YQV,YQE,YQS,YQST,YQSTmin,YQSTmax, + YQEinf,YQEsup,YQSTmin1,YQSTmax1,YQSTmin2,YQSTmax2, + YQEmin,YQEmax,YQSmin,YQSmax, + YQXdef,YQSTpot,YVpot,YNIter,YTest,YNIterTps); + + end; + + end; {fin de Ici_CalculDebitsResRef_CalculRepartition} + +{=====================================================} +{--‚criture de r‚sultats d‚taill‚s sur fichier texte--} +{=====================================================} + +procedure Ici_Ecriture_resultats_Detailles(ZChron:boolean); + begin - if not YSaisie then + write(YFicResult2,B_Date(YDeb2.YdateEnJour[0]),' ',YDeb2.YQXsous:21:12,' '); + for YRangLac:=1 to YNbLacs do + begin + write(YFicResult2,' ',YChaiDate[YRangLac],' '); + if YAbsRel=1 then + write(YFicResult2,YVolume[YRangLac]:27:12,' ') + else + write(YFicResult2,(YVolume[YRangLac]/YVtot[YRangLac]):27:20,' '); + write(YFicResult2,YQEmin[YRangLac]:21,' ',YQEmax[YRangLac]:21,' ',YQSmin[YRangLac]:21,' ',YQSmax[YRangLac]:21,' '); + write(YFicResult2,YDeb2.YQMnat[YrangLac]:21:12,' ',Ydeb2.YQVnat[YrangLac]:21:12,' ', + YQMRef[YRanglac]:21:12,' ',YQMRes[YRangLac]:21:12,' ', + YQVRef[YRanglac]:21:12,' ',YQVRes[YRangLac]:21:12,' ', + YQEinf[YRangLac]:21:12,' ',YQEsup[YRangLac]:21:12,' ', + YQSTmin1[YRanglac]:21:12,' ',YQSTmax1[YRangLac]:21:12,' ', + YQSTmin2[YRanglac]:21:12,' ',YQSTmax2[YRangLac]:21:12,' ', + YQSTmin[YRanglac]:21:12,' ',YQSTmax[YRangLac]:21:12,' '); + case YOptionRepart of + 1..2: write(YFicResult2,YTpot[YRangLac]:24:5,' ',YPart[YRangLac]:21:12,' '); + 3 : write(YFicResult2,YVRobj:24:12,' ',YQSTpot[YRangLac]:21:12,' '); + 4..5: if YAbsRel=1 then + write(YFicResult2,YTpot[YRangLac]:24:5,' ',YVpot[YRangLac]:24:12,' ',YQSTpot[YRangLac]:21:12,' ') + else + write(YFicResult2,YTpot[YRangLac]:24:5,' ',(YVpot[YRangLac]/YVtot[Yranglac]):24:17,' ',YQSTpot[YRangLac]:21:12,' ') + end; + write(YFicResult2,YQST[YRangLac]:21:12,' ',YQV[YRangLac]:21:12,' ', + YQE[YRanglac]:21:12,' ',YQS[YRangLac]:21:12,' ', + YCodeRepart[YRangLac]:5,' ',YCodePrise[YrangLac]:5,' ', + YCodeRestit[YrangLac]:5,' ',YCodeAval[YrangLac]:5,' ', + YcodeSigne[YRangLac]:5,' '); + end; + if YAbsRel=1 then + write(YFicResult2,YVolTot1:27:12,' ',YVolTot0:27:12,' ',YVManque:27:12) + else + write(YFicResult2,(YVolTot1/YVtotCumul):27:20,' ',(YVolTot0/YVtotCumul):27:20,' ',(YVManque/YVtotCumul):27:20); + write(YficResult2,' ',YQST0:21:12,' ',YQXdef[0]:21:12,' ',YQXdef[1]:21:12,' ', + YQXdef[2]:21:12,YSuccesRepart:8,' ',YNIter:7,' ',YTest:2); + if YOptionRepart=5 then + write(YFicResult2,' ',YNItertps:4); + writeln(YFicResult2); + flush(YFicResult2); + + end; {fin de Ici_Ecriture_resultats_Detailles} + +{=============================================================} +{--Initialisation des statistiques de calcul de r‚partition --} +{=============================================================} + +procedure Ici_Init_Stat_Repartition; + + begin + YNTestNul:=0; + YNItermax:=0; + YNItermaxTps:=0; + for YrangLac:=1 to YNbLacs do begin - writeln; - writeln('Rang du calcul : ',YCompteur,' ; ',YResume); + for Yi:=-2 to 3 do + YNCodeRepart[YRanglac,Yi]:=0; + for Yi:=-2 to 2 do + YNCodeAval[YRanglac,Yi]:=0; + for Yi:=-4 to 3 do + YNCodePrise[YrangLac,Yi]:=0; + for Yi:=-2 to 2 do + YNCodeRestit[YRangLac,Yi]:=0; + for Yi:=0 to 1 do + YNCodeSigne[YRangLac,Yi]:=0; end; + for Yi:=-4 to 4 do + YNSucces[Yi]:=0; + end; {Ici_Init_Stat_Repartition} - for YRanglac:=1 to YNbLacs do +{==========================================================} +{--Mise … jour des statistiques du calcul de r‚partition --} +{--des Q stock‚s entre r‚servoirs --} +{==========================================================} +procedure Ici_Misaj_Stat_Repartition; + + begin + if YTest=0 then + YNTestNul:=YNTestNul+1; + YNItermax:=B_maxIn(YNItermax,YNIter); + YNItermaxTps:=B_maxIn(YNItermaxTps,YNIterTps); + for YRanglac:=1 to YNbLacs do + begin + YNCodeRepart[YRangLac,YCodeRepart[YRangLac]]:=YNCodeRepart[YRangLac,YCodeRepart[YRangLac]]+1; + YNCodePrise[YRangLac,YCodePrise[YRangLac]]:=YNCodePrise[YRangLac,YCodePrise[YRangLac]]+1; + YNCodeRestit[YRangLac,YCodeRestit[YRangLac]]:=YNCodeRestit[YRangLac,YCodeRestit[YRangLac]]+1; + YNCodeAval[YRangLac,YCodeAval[YRangLac]]:=YNCodeAval[YRangLac,YCodeAval[YRangLac]]+1; + YNCodeSigne[YRangLac,YCodeSigne[YRangLac]]:=YNCodeSigne[YRangLac,YCodeSigne[YRangLac]]+1; + end; + YNSucces[YSuccesRepart]:=YNSucces[YSuccesRepart]+1; + end; {fin de Ici_Misaj_Stat_Repartition} + +{=========================================================================} +{--Ecriture sur fichier de sortie texte (YNomFicResult1='Condstat') des --} +{--statistiques de r‚partion du d‚bit … stocker entre r‚servoirs --} +{=========================================================================} + +procedure Ici_Ecrit_Stat_Repartition(ZChron:boolean); + + var + XTot : array[0..YNmaxLacs] of longint; + + {----------------------------------------} + procedure XEntete; + begin + write(YFicSortie,' valeur '); + for YRangLac:=1 to YNbLacs do begin + for Yi:=length(YNomLac[YRanglac])+1 to 10 do + write(YFicSortie,' '); + write(YFicSortie,YNomLac[YRanglac],' '); + XTot[YRangLac]:=0; + end; + writeln(YFicSortie); + end; - {--message ‚cran--} - if YSaisie then - write(YnomLac[YRangLac]); - - {==CALCUL A REBOURS --> VOLUME EXTREME COMPATIBLE AVEC OBJECTIF FUTUR==} - - {--calcul de la date entiŠre du d‚bit stock‚ initial dans le lac --} - {--(d‚cal‚ du temps de propagation par rapport … la date initiale--} - {--du calcul consid‚r‚e … midi … la station aval du systŠme --} - YDateFinLac[YrangLac]:=trunc(YDateFin+0.5-YD[YRangLac]); - - {--initialisation du volume de r‚servoir (plein pour objectif Qmax et --} - {--vide pour un objectif Qmin) et calcul du jour et du mois de d‚but de--} - {--calcul … rebours --} - YJJ_MM_AAAA:=ADate(YDateFinLac[YRangLac]); - val(copy(YJJ_MM_AAAA,4,2),YMoisFinLac,YCode); - val(copy(YJJ_MM_AAAA,1,2),YJourFinLac,YCode); - YNIter:=0; - YConverge:=false; - if YTypeObjectif=0 then - YVFin:=0 - else - YVFin:=YVtot[YRangLac]; + {----------------------------------------} + procedure XEditTotal; + begin + write(YFicSortie,' total '); + for YRangLac:=1 to YNbLacs do + write(YFicSortie,XTot[YRangLac]:10,' '); + writeln(YFicSortie); + writeln(YFicSortie); + end; - {--ENCADREMENTS SUCCESSIFS POUR DETERMINER LE BON VOLUME INITIAL--} - repeat + {-----------------------------------------} + begin {d‚but de Ici_Ecrit_Stat_Repartition} - YNIter:=YNIter+1; - YNbAn:=0; - YVolume:=YVFin; - reset(YFicQST[YrangLac]); + if not ZChron then + begin + writeln(YFicSortie); + writeln(yFicSortie,'========================================================================='); + writeln(YFicSortie,'! STATISTIQUES DE REPARTITION DES DEBITS (STOCKE, PRIS, LACHE, PRODUIT) !'); + writeln(yFicSortie,'========================================================================='); + writeln(YFicSortie); + writeln(YFicSortie,'DEFINITION DE VARIABLES :'); + writeln(YFicSortie); + writeln(YFicSortie,' QSTmin1 et QSTmax1 : valeurs minimale et maximale de debit stocke net dans un reservoir, imposees par les contraintes physiques et consignes a sa prise et sa restitution'); + writeln(YFicSortie,' QSTmin3 et QSTmax3 : valeurs minimale et maximale de debit stocke net dans un reservoir, imposees par son volume d''eau present et par les contraintes physiques et consignes a sa prise et sa restitution'); + writeln(YFicSortie,' QSTmin2 et QSTmax2 : valeurs minimale et maximale de debit stocke net dans un reservoir, imposees par son volume d''eau present'); + writeln(YFicSortie,' QXsous : debit stocke net global (positif, negatif ou nul) necessaire pour obtenir un debit egal a QXobj dans le cours d''eau a la station aval (debit a soustraire au debit naturel a cette station)'); + writeln(YFicSortie,' QST : debit stocke net dans un reservoir (positif, negatif ou nul)'); + writeln(YFicSortie,' QMnat : debit naturel du cours d''eau a l''amont immediat de la prise d''un reservoir (positif ou nul)'); + writeln(YFicSortie); + writeln(YFicSortie,'SIGNIFICATION DES CODES :'); + writeln(YFicSortie); + writeln(YFicSortie,' Code Succes concernant le debit stocke global QXsous necessaire pour l''obtention d''un debit QXobj a la station aval :'); + if YTypeObjectif=0 then + write(YFicSortie,' (les codes -3, -2 et -1') + else + write(YFicSortie,' (les codes 1, 2, 3 et 4'); + write(yFicSortie,' signalent des defaillance de satisfaction de l''objectif de '); + if YTypeObjectif=0 then + writeln(YFicSortie,'soutien de debit)') + else + writeln(YFicSortie,'laminage de debit)'); + writeln(YFicSortie,' -4 : possibilite theorique d''obtenir un debit egal a QXobj a la station aval, mais non convergence du calcul (voir fin de ce fichier)'); + writeln(YFicSortie,' -3 : QXsous < somme(QSTmin1) <= somme(QSTmin3) = somme(QST)'); + writeln(YFicSortie,' (les contraintes et consignes aux prises et restitutions imposent, a la station aval, un debit inferieur a QXobj)'); + writeln(YFicSortie,' -2 : somme(QSTmin1) <= QXsous < somme(QSTmin2) <= somme(QSTmin3) = somme(QST)'); + writeln(YFicSortie,' (contrairement aux contraintes et consignes aux prises et restitutions, le volume d''eau global present impose, a la station aval, un debit inferieur a QXobj)'); + writeln(YFicSortie,' -1 : max(somme(QSTmin1),somme(QSTmin2)) <= QXsous < somme(QSTmin3) = somme(QST)'); + writeln(YFicSortie,' (les contraintes et consignes aux prises et restitutions et le volume d''eau global present imposent, a la station aval, un debit inferieur a QXobj,'); + writeln(YFicSortie,' mais un debit egal a QXobj pourrait etre obtenu avec le meme volume global, reparti autrement entre les reservoirs)'); + writeln(YFicSortie,' 0 : somme(QSTmin3) <= QXsous = somme(QST) <= somme(QSTmax3)'); + writeln(YFicSortie,' (a la station aval, le debit obtenu est egal a QXobj, grace aux valeurs ajustees des debits stockes dont une au moins differe des valeurs minimale et maximale'); + writeln(YFicSortie,' imposees par les contraintes et consignes a la prise et a la restitution et par le volume d''eau present)'); + writeln(YFicSortie,' 1 : somme(QST) = somme(QSTmax3) < QXsous <= min(somme(QSTmax1),somme(QSTmax2))'); + writeln(YFicSortie,' (les contraintes et consignes aux prises et restitutions et le volume d''eau global present imposent, a la station aval, un debit superieur a QXobj,'); + writeln(YFicSortie,' mais un debit egal a QXobj pourrait etre obtenu avec le meme volume global, reparti autrement entre les reservoirs)'); + writeln(YFicSortie,' 2 : somme(QST) = somme(QSTmax3) <= somme(QSTmax2) < QXsous <= somme(QSTmax1)'); + writeln(YFicSortie,' (contrairement aux contraintes et consignes aux prises et restitutions, le volume d''eau global present impose, a la station aval, un debit superieur a QXobj)'); + writeln(YFicSortie,' 3 : somme(QST) = somme(QSTmax3) <= somme(QSTmax1) < QXsous <= somme(QMnat)'); + writeln(YFicSortie,' (les contraintes et consignes aux prises et restitutions imposent, a la station aval, un debit superieur a QXobj)'); + writeln(YFicSortie,' 4 : somme(QST) = somme(QSTmax3) <= somme(QSTmax1) <= somme(QMnat) < QXsous'); + writeln(YFicSortie,' (meme avec un debit stocke net egal au debit naturel du cours d''eau au point de prise dans ', + 'chaque reservoir, le debit obtenu a la station aval serait superieur a QXobj)'); + writeln(YFicSortie); - {--boucle sur le temps en chrono inverse--} - for Yi:=YDateFinLac[YRanglac] downto (YDateFinLac[YRangLac]-(YDateFin-YDateDebut)) do + writeln(YFicSortie,' Code A pour chaque reservoir, decrivant la position du debit stocke net QST ', + 'par rapport aux bornes imposees par les contraintes physiques et consignes locales d''une part, et ', + 'par le volume present et la capacite du reservoir d''autre part'); + writeln(YFicSortie,' -2 : debit stocke inferieur a la valeur minimale QSTmin3 (anomalie)'); + writeln(YFicSortie,' -1 : debit stocke egal a la valeur minimale QSTmin3 (avec QSTmin3 < QSTmax3)'); + writeln(YFicSortie,' 0 : debit stocke situe entre valeurs minimale QSTmin3 et maximale QSTmax3 ', + '(avec QSTmin3 < QSTmax3)'); + writeln(YFicSortie,' 1 : debit stocke egal a la valeur maximale QSTmax3 (avec QSTmin3 = QSTmax3)'); + writeln(YFicSortie,' 2 : debit stocke egal a la valeur maximale QSTmax3 (avec QSTmin3 < QSTmax3)'); + writeln(YFicSortie,' 3 : debit stocke superieur a la valeur maximale QSTmax3 (anomalie)'); + writeln(YFicSortie); + writeln(YFicSortie,' Code B pour chaque reservoir, decrivant la position du debit QE pris dans le cours d''eau ', + 'par rapport aux bornes imposee par les conditions locales a la prise (debit naturel, ', + 'contraintes et consignes)'); + writeln(YFicSortie,' -4 : debit preleve inferieur au debit minimal QEmin de la prise '); + writeln(YFicSortie,' -3 : debit preleve egal au debit minimal QEmin de la prise'); + writeln(YFicSortie,' -2 : debit preleve egal a la valeur minimale QMnat-QMref imposee par le debit de reference ', + 'QMref a l''aval de la prise et le debit naturel QMnat a la prise'); + writeln(YFicSortie,' -1 : debit preleve egal a la valeur maximale QMnat-QMres imposee par le debit reserve ', + 'QMres a l''aval de la prise et le debit naturel QMnat a la prise'); + writeln(YFicSortie,' 0 : debit preleve egal a aucune des bornes imposees'); + writeln(YFicSortie,' 1 : debit preleve egal au debit naturel QMnat a la prise'); + writeln(YFicSortie,' 2 : debit preleve egal a la debitance maximale QEmax de la prise'); + writeln(YFicSortie,' 3 : debit preleve superieur a la debitance maximale QEmax de la prise (anomalie)'); - begin + writeln(YficSortie); + writeln(YFicSortie,' Code C pour chaque reservoir, decrivant la position du debit QS restitue dans le cours d''eau ', + 'par rapport aux bornes de debitance des organes de restitution '); + writeln(YFicSortie,' -2 : debit restitue superieur a la debitance maximale QSmax de la restitution'); + writeln(YFicSortie,' -1 : debit restitue egal a la debitance maximale QSmax de la restitution'); + writeln(YFicSortie,' 0 : debit restitue situe entre les bornes de debitance QSmin et QSmax de la restitution'); + writeln(YFicSortie,' 1 : debit restitue egal au debit minimal QSmin de la restitution'); + writeln(YFicSortie,' 2 : debit restitue inferieur au debit minimal QSmin de la restitution'); + writeln(YFicSortie); + writeln(YFicSortie,' Code D pour chaque reservoir, decrivant la position du debit QV ', + 'du cours d''eau a l''aval de la restitution par rapport aux bornes imposees par les consignes ', + 'locales (debits reserve et de reference)'); + writeln(YFicSortie,' -2 : debit superieur au debit de reference QVref'); + writeln(YFicSortie,' -1 : debit egal au debit de reference QVref'); + writeln(YFicSortie,' 0 : debit situe entre le debit reserve QVres et le debit de reference QVref'); + writeln(YFicSortie,' 1 : debit egal au debit reserve QVres'); + writeln(YFicSortie,' 2 : debit inferieur au debit reserve QVres'); + writeln(YFicSortie); + writeln(YFicSortie,' Code E pour chaque reservoir, decrivant le signe du debit stocke QST par ', + 'rapport a celui du debit stocke global necessaire QXsous'); + writeln(YFicSortie,' 0 : signe identique'); + writeln(YFicSortie,' 1 : signe inverse'); + writeln(YFicSortie); + writeln(YFicSortie); + writeln(YFicSortie,'============================================================================='); + writeln(yFicSortie); + writeln(YFicSortie,'RESULTATS OBTENUS DANS LE SENS CHRONOLOGIQUE INVERSE :'); + YNSuccesA:=YNSucces; + end + else + begin + YNSuccesB:=YNSucces; + writeln(YFicSortie,'============================================================================='); + writeln(YFicSortie); + writeln(YFicSortie,'RESULTATS OBTENUS DANS LE SENS CHRONOLOGIQUE :'); + end; + writeln(YFicSortie); + writeln(YFicSortie,' Effectif des valeurs obtenues pour le code Succes caracterisant ', + 'le debit stocke net global QXsous necessaire et la possibilite d''obtenir un debit ', + 'egal a QXobj dans le cours d''eau a la station aval :'); + writeln(YFicSortie,' valeur effectif'); + XTot[0]:=0; + for Yi:=-4 to 4 do + begin + writeln(YFicSortie,' ',Yi:6,' ',YNSucces[Yi]:8); + XTot[0]:=XTot[0]+YNSucces[Yi]; + end; + writeln(YFicSortie,' total ',XTot[0]:8); + writeln(YficSortie); - YJJ_MM_AAAA:=ADate(Yi); - val(copy(YJJ_MM_AAAA,4,2),YMois,YCode); - val(copy(YJJ_MM_AAAA,1,2),YJour,YCode); + writeln(YFicSortie,' Effectif des valeurs obtenues pour le code A caracterisant le debit stocke net QST dans chaque reservoir:'); + XEntete; + for Yi:=-2 to 3 do + begin + write(YFicSortie,' ',YI:6,' '); + for YRangLac:=1 to YNbLacs do + begin + write(YFicSortie,YNCodeRepart[YRangLac,Yi]:10,' '); + XTot[YRangLac]:=XTot[YRangLac]+YNCodeRepart[YRangLac,Yi]; + end; + writeln(YFicSortie); + end; + XEditTotal; - {--si quantiŠme = quantiŠme initial, stockage du volume--} - if (YMois=YMoisFinLac) and (YJour=YJourFinLac) then - begin - YNbAn:=YNbAn+1; - YValBonnedate[YNbAn]:=YVolume; - end; + writeln(YFicSortie,' Effectif des valeurs obtenues pour le code B caracterisant le debit QE entrant dans chaque reservoir :'); + XEntete; + for Yi:=-4 to 3 do + begin + write(YFicSortie,' ',YI:6,' '); + for YRangLac:=1 to YNbLacs do + begin + write(YFicSortie,YNCodePrise[YRangLac,Yi]:10,' '); + XTot[YRangLac]:=XTot[YRanglac]+YNCodePrise[YRangLac,Yi]; + end; + writeln(YficSortie); + end; + XEditTotal; - {--lecture de d‚bit stock‚ id‚al sur fichier typ‚ en chrono --} - {--inverse, et calcul de nouveau volume --} - read(YFicQST[YRangLac],YQST[YRanglac]); - YVolume:=Amindouble(YVtot[YRangLac],Amaxdouble(0,YVolume-YQST[YrangLac]*86400)); + writeln(YFicSortie,' Effectif des valeurs obtenues pour le code C caracterisant le debit QS sortant de chaque reservoir :'); + XEntete; + for Yi:=-2 to 2 do + begin + write(YFicSortie,' ',YI:6,' '); + for YRangLac:=1 to YNbLacs do + begin + write(YFicSortie,YNCodeRestit[YRangLac,Yi]:10,' '); + XTot[YRangLac]:=XTot[YRangLac]+YNCodeRestit[YRangLac,Yi]; + end; + writeln(YFicSortie); + end; + XEditTotal; - end; {fin de boucle sur le temps en chrono inverse} + writeln(YFicSortie,' Effectif des valeurs obtenues pour le code D caracterisant le debit influence QV du cours d''eau a l''aval immediat de chaque reservoir :'); + XEntete; + for Yi:=-2 to 2 do + begin + write(YFicSortie,' ',YI:6,' '); + for YRangLac:=1 to YNbLacs do + begin + write(YFicSortie,YNCodeAval[YRangLac,Yi]:10,' '); + XTot[YRangLac]:=XTot[YRangLac]+YNCodeAval[YRangLac,Yi]; + end; + writeln(YFicSortie); + end; + XEditTotal; - {--tri par valeurs croissantes des volumes obtenus pour le --} - {--quantiŠme initial --} - Tri(YValBonneDate,YNbAn); + writeln(YFicSortie,' Effectif des valeurs obtenues pour le code E caracterisant la contribution positive ou negative de chaque reservoir pour l''obtention d''un debit egal a QXobj a la station aval :'); + XEntete; + for Yi:=0 to 1 do + begin + write(YFicSortie,' ',YI:6,' '); + for YRangLac:=1 to YNbLacs do + begin + write(YFicSortie,YNCodeSigne[YRangLac,Yi]:10,' '); + XTot[YRangLac]:=XTot[YRangLac]+YNCodeSigne[YRangLac,Yi]; + end; + writeln(YFicSortie); + end; + XEditTotal; + write(YFicSortie,' Nombre de fourchettes initiales sous-dimentionnees pour le calcul de QST0'); + case YOptionRepart of + 1..2 : write(YFicSortie,'a'); + 3..5 : write(YFicSortie,'b'); + end; + writeln(YFicSortie,' : ',YNbPbBornes); + writeln(YFicSortie,' Ecart absolu entre debit ideal obtenu et debit objectif atteignable a la station aval : ', + 'maximum obtenu = ',YEcartmax,' (critere de convergence (code Succes=0) =',YSeuilConv,')'); + write(YFicSortie,' Valeur maximale de l''ecart relatif (V(initial)-Vmedian(quantieme initial))/Vtot : ',YEcartRmaxV,' (donc convergence '); + if YEcartRmaxV>YSeuilRconv then + write(YFicSortie,'non '); + writeln(YFicSortie,'atteinte (critere = ',YSeuilRconv,'))'); + writeln(YFicSortie,' Nombre d''iterations concernant le jeu de valeurs initiales de volume : ',YNIterVolInit,' (limite maximale imposee : ',YnbmaxIterVolinit,')'); + write(YFicSortie,' Nombre maximal d''iterations concernant le calcul de QST0'); + case YOptionRepart of + 1..2 : write(YFicSortie,'a'); + 3..5 : write(YFicSortie,'b'); + end; + writeln(YFicSortie,' : ',YNItermax,' (limite maximale imposee : ',YNbmaxIter,')'); + if YOptionRepart=5 then + writeln(YFicSortie,' Nombre maximal d''iterations concernant l''equilibrage des durees potentielles de remplissage : ',YNItermaxTps,' (limite maximale imposee : ',YnbItertpsmax,')'); - {--calcul du volume m‚dian obtenu pour le quantiŠme initial--} - YVmedian:=Quantile(YValBonneDate,YNbAn,0.5); + writeln(YFicSortie); + writeln(YFicSortie); - {--si volume m‚dian est proche du volume initial, la convergence--} - {--est obtenue, sinon on calcule un nouveau volume initial --} - if abs(YVMedian-YVFin)<(YVtot[YRanglac]*YSeuilRConv) then - YConverge:=true - else - YVFin:=Amindouble(YVtot[YRanglac],Amaxdouble(0,(YNbAn*YVMedian-YVFin)/(YNbAn-1))); + end; {fin de Ici_Ecrit_Stat_Repartition} - until YConverge or (YNIter=YNbmaxIter); {fin des encadrements successifs} +{=====================================================================} +{--Ouverture de fichier texte des ‚checs de d‚bit … la station aval--} +{--et ‚criture d'en-tˆte. --} +{=====================================================================} - {--message ‚cran : nombre d'it‚rations --} - if YSaisie then - write('(',YNiter); +procedure Ici_EcritureEnteteDefaillances(Zi:integer); - {--REMPLISSAGE FICHIERS TYPES DE VOLUME ET MANQUE CAPACITE PAR LACUNES--} - rewrite(YFicVobj[YRangLac]); - rewrite(YFicVobj0[YRangLac]); - rewrite(YFicVdef[YRangLac]); - YVolume:=Ylacune; - for Yi:=YDateDebut to YDateFin do - begin - write(YFicVobj[YRangLac],YVolume); - write(YFicVobj0[YRangLac],YVolume); - write(YFicVdef[YRangLac],YVolume); - end; + begin - {==CALCUL DEFINITIF DE LA CHRONIQUE DE VOLUME EN CHRONO INVERSE, AVEC==} - {==la bonne valeur initiale, et ‚criture sur fichiers typ‚s de ces ==} - {==volumes (d‚cal‚s de + 12h par rapport aux d‚bits stock‚s nets du ==} - {==lac), ainsi que des manques de capacit‚ de r‚servoir, dans le sens==} - {==chronologique. Dans le cas d'un objectif de laminage, les volumes ==} - {==sont les max … ne pas d‚passer pour ‚viter les ‚checs dus … un lac==} - {==plein ==} - - {--initialisation du volume en fin de p‚riode et ouverture du fichier--} - {--des d‚bits stock‚s en chrono inverse --} - YVobj:=YVFin; - YVobj0:=YVFin; - YVdef:=0; - YVdefmax[YRangLac]:=0; - reset(YFicQST[YrangLac]); - - {--boucle sur le temps en chrono inverse--} - for Yi:=YDateFinLac[YRanglac] downto (YDateFinLac[YRangLac]-(YDateFin-YDateDebut)) do + assign(YFicResult4,YRepR+YNomFicResult5[Zi]); + rewrite(YFicResult4); + writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ',Yresume); + B_Datation(YFicResult4); + writeln(YFicResult4); + write(YFicResult4,'Chroniques des echecs de satisfaction de l''objectif defini a la station aval : '); + if YTypeObjectif=0 then + write(YFicResult4,'manque') + else + write(YFicresult4,'exces'); + write(YFicResult4,' de debit par rapport a l''hydrogramme objectif (calcul en sens chronologique'); + if Zi=1 then + writeln(YFicResult4,' inverse)') + else + writeln(yFicResult4,')'); + writeln(YFicResult4); + writeln(YFicResult4,'Variables editees :'); + writeln(YFicResult4); + writeln(YFicResult4,'# date aval : date a laquelle on vise l''objectif de debit a la station situee a l''aval du systeme'); + write(YFicResult4,'# QXdef0 : echec inevitable absolu, du aux contraintes physiques (par exemple : impossibilite de '); + if YTypeObjectif=0 then + write(YFicResult4,'restituer plus que la debitance maximale des organes de restitution)') + else + write(YFicResult4,'prendre plus que le debit d''un cours d''eau ou plus que la debitance maximale d''une prise)'); + writeln(YFicResult4,' et consignes aux prises et restitutions'); + write(YFicResult4,'# QXdef2 (=QXdef1-QXdef0) : echec du aux volumes presents et aux capacites des reservoirs '); + if ((Zi=1) and (YTypeObjectif=0)) or ((Zi=2) and (YTypeObjectif=1)) then + writeln(YFicResult4,'(impossibilite d''obtenir un volume d''eau suffisant dans les reservoirs en fin de pas de temps)') + else + writeln(YFicResult4,'(impossibilite d''obtenir un volume de vide suffisant dans les reservoirs en fin de pas de temps)'); + writeln(YFicResult4,'# QXdef1 : echec cause par les contraintes physiques et consignes aux prises et restitutions d''une part, ', + 'et par les volumes presents et les capacites des reservoirs d''autre part'); + writeln(YFicResult4); + writeln(YFicResult4,' date aval ',' QXdef0 (m3/s) ',' QXdef2 (m3/s) ',' QXdef1 (m3/s) '); - begin + end; {fin de Ici_EcritureEntete5} - read(YFicQST[YRangLac],YQST[YRanglac]); - seek(YFicVobj[YRangLac],filepos(YFicVobj[YRangLac])-1); - write(YFicVobj[YRangLac],YVobj); - seek(YFicVobj[YRangLac],filepos(YFicVobj[YRangLac])-1); - seek(YFicVobj0[YRangLac],filepos(YFicVobj0[YRangLac])-1); - write(YFicVobj0[YRangLac],YVobj0); - seek(YFicVobj0[YRangLac],filepos(YFicVobj0[YRangLac])-1); - seek(YFicVdef[YRangLac],filepos(YFicVdef[YRangLac])-1); - write(YFicVdef[YRangLac],YVdef); - seek(YFicVdef[YRangLac],filepos(YFicVdef[YRangLac])-1); - YVobj:=Amindouble(YVtot[YRangLac],Amaxdouble(0,YVobj-YQST[YrangLac]*86400)); - - {--cas d'un objectif de d‚bit maximal : laminage de crue--} - if YTypeObjectif=1 then - begin - YVobj0:=Amindouble(YVtot[YRangLac],YVobj0-YQST[YrangLac]*86400); - YVdef:=Amax(0,-YVobj0); - end +{=========================================================================} +{--Calcul en sens chronologique inverse et en sens chronologique, de la --} +{--r‚partition des d‚bits stock‚s dans les r‚servoirs et des volumes --} +{--d'eau dans ceux-ci. --} +{=========================================================================} - {--cas d'un objectif de d‚bit minimal : soutien d'‚tiage--} - else - begin - YVobj0:=Amaxdouble(0,YVobj0-YQST[YrangLac]*86400); - YVdef:=AMax(0,YVobj0-YVtot[YRangLac]) - end; +procedure C3_CalculChroniquesVolume; - YVdefmax[YRangLac]:=amax(YVdefmax[YRanglac],YVdef); - - end; {fin de boucle sur le temps en chrono inverse} - - close(YFicVdef[YRangLac]); - close(YFicVobj[YRangLac]); - close(YFicVobj0[YRangLac]); - - {==CALCUL EN SENS CHRONO -> VOLUME OPTIMAL POUR OBJECTif IMMEDIAT ==} - {--On effectue ci-dessous un calcul en sens chronologique sens‚ --} - {--reproduire de fa‡on r‚aliste une gestion consistant … stocker (en +--} - {--ou en -) dans le r‚servoir pour atteindre de suite l'objectif aval.--} - {--Ceci correspond … la meilleure gestion qu'on puisse r‚aliser. Le --} - {--d‚bit stock‚ ainsi obtenu est alors compar‚ au d‚bit stock‚ id‚al --} - {--pour ‚valuer une d‚faillance qui, somm‚e pour tous les r‚servoirs --} - {--et ajout‚e aux d‚faillances in‚vitables, donne les d‚faillances --} - {--minimales dues aux diff‚rentes causes (r‚partition des apports --} - {--naturels, contraintes et consignes aux prises et restitutions et --} - {--manque de capacit‚ des r‚servoirs --} - - {--INITIALISATION DU VOLUME POUR CALCUL EN SENS CHRONO (comme pour le --} - {--calcul en chrono inverse, on cherche par encadrements successifs une--} - {--valeur co‹ncidant avec la mediane obtenue pour le quantieme initial)--} - InitVolumeSimulEnSensChrono; - - {--CALCUL DEFINITIF EN SENS CHRONO--} - YVolume:=YVDebut; - seek(YFicQST[YRanglac],filesize(YFicQST[YRangLac])-1); - rewrite(YFicVges[YRanglac]); - reset(YFicQdef[1]); - for Yi:=YdateDebut to YdateFin do + Var + Xi : integer; + + begin + + {--messages--} + if not YSaisie then + begin + writeln; + writeln('Rang du calcul : ',YCompteur,' ; ',YResume); + end + else + begin + A_Titre; + writeln; + end; + write(' calcul de Vobj en chrono inverse (it‚r. en cours sur Vobj initial : '); + A_lecture_xy; + + {==INITIALISATIONS AVANT CALCUL A REBOURS DU VOLUME EXTREME COMPATIBLE==} + {==AVEC OBJECTIF FUTUR ==} + + {--Initialisations g‚n‚rales--} + YNIterVolInit:=0; + YConvergeTout:=false; + + if YOptionRepart=5 then + Ici_Calcul_Quantile_QMN(YFreqNonDep); + + {--Initialisations pour chaque lac--} + for YRanglac:=1 to YNbLacs do + + begin + + {--calcul de la date entiŠre du d‚bit stock‚ initial dans le lac --} + {--(d‚cal‚ du temps de propagation par rapport … la date initiale--} + {--du calcul consid‚r‚e … midi … la station aval du systŠme) --} + YDateFinLac[YrangLac]:=trunc(YDateFin+0.5-YD[YRangLac]); + YDecalDateV[YRangLac]:=YDateFinLac[YRangLac]-YDateFin; + + {--initialisation du volume de r‚servoir (plein pour objectif Qmax et --} + {--vide pour un objectif Qmin) et calcul du jour et du mois de d‚but de--} + {--calcul … rebours --} + YJJ_MM_AAAA[YRangLac]:=B_Date(YDateFinLac[YRangLac]); + val(copy(YJJ_MM_AAAA[YRangLac],4,2),YMoisFinLac[YRangLac],YCode); + val(copy(YJJ_MM_AAAA[YRangLac],1,2),YJourFinLac[YRangLac],YCode); + if YTypeObjectif=0 then + YVFin[YRangLac]:=0 + else + YVFin[YRangLac]:=YVtot[YRangLac]; + + end; {fin des initialisations pour chaque lac} + + {--ENCADREMENTS SUCCESSIFS POUR DETERMINER LES BONS VOLUMES INITIAUX--} + {-- du calcul en chronologie inverse --} + repeat + + YNIterVolInit:=YNIterVolInit+1; + gotoxy(Ax,Ay); + write(YNIterVolInit,')'); + for YRangLac:=1 to YNbLacs do + begin + YNbAn[YRangLac]:=0; + YVolume[YRangLac]:=YVFin[YRangLac]; + YQVVeille[YRangLac]:=YLacune; + end; + reset(YFicDeb); + + {--boucle sur le temps en chrono inverse--} + for Yi:=YDateFin downto YDateDebut do + begin + + {--pour chaque lac, stockage du volume si bonne date--} + for YRanglac:=1 to YNbLacs do begin - read(YFicQST[YRangLac],YQST[YRangLac]); - seek(YFicQST[YRangLac],abs(filepos(YFicQST[YRanglac])-2)); - YVges:=Amindouble(YVtot[YRangLac],Amax(0,YVolume+YQST[YrangLac]*86400)); - write(YFicVges[YRangLac],YVges); - YQSTeffectif:=(YVges-YVolume)/86400; - if YTypeObjectif=0 then {cas de soutien d'‚tiage} - YQVdef:=Amax(0,YQSTeffectif-YQST[YRangLac]) - else {cas de laminage de crue} - YQVdef:=Amax(0,YQST[YRangLac]-YQSTEffectif); - read(YFicQdef[1],YQdef1); - seek(YFicQdef[1],filepos(YFicQdef[1])-1); - YQdef1:=YQdef1+YQVdef; - write(YFicQdef[1],YQdef1); - YVolume:=YVges; + YJJ_MM_AAAA[YRangLac]:=B_Date(Yi+YDecalDateV[YRangLac]); + val(copy(YJJ_MM_AAAA[YRangLac],4,2),YMois[YRangLac],YCode); + val(copy(YJJ_MM_AAAA[YRangLac],1,2),YJour[YRangLac],YCode); + if (YMois[YRangLac]=YMoisFinLac[YRangLac]) and (YJour[YRangLac]=YJourFinLac[YRangLac]) then + begin + YNbAn[YRangLac]:=YNbAn[YRanglac]+1; + YValBonnedate[YRangLac,YNbAn[YRanglac]]:=YVolume[YRanglac]; + end; end; - if YSaisie then - write(',',YNIter,') '); - {--FERMETURE DES FICHIERS TYPES DE QST ET QDEF[1]--} - close(YFicQST[YrangLac]); - close(YFicQdef[1]); + {--lecture sur fichier typ‚ de l'enregistrement Ydeb2 contenant : --} + {--YQXsous,YDateEnJour,YQMnat,et YQVnat. --} + read(YFicDeb,YDeb2); + + {--calcul des d‚bits r‚serv‚s et de r‚f‚rence aux prises et --} + {--restitutions, puis calcul de r‚partition du d‚bit … stocker. --} + {--Enfin, nouvelle valeur pour les d‚bits du pas de temps pr‚c‚dent--} + {--… l'aval des restitutions --} + Ici_CalculDebitsResRef_CalculRepartition(false,Yi); + YQVVeille:=YQV; + {--calcul des nouveaux volumes--} + for YRangLac:=1 to YNbLacs do + YVolume[YRangLac]:=B_mindouble(YVtot[YRangLac],B_maxdouble(0,YVolume[YRangLac]-YQST[YrangLac]*YdT)); - {--CALCUL DU VOLUME OPERATIONNEL Vop--} - rewrite(YFicVop[YRangLac]); - reset(YFicVobj[YRangLac]); - reset(YFicVges[YRangLac]); - while not eof(YFicVobj[YRangLac]) do + end; {fin de boucle sur le temps en chrono inverse} + + {--Test de convergence du calcul--} + YConvergeTout:=true; + YEcartRmaxV:=0; + for YRangLac:=1 to YNbLacs do + begin + + {--tri par valeurs croissantes des volumes obtenus pour le --} + {--quantiŠme initial --} + C2_Tri(YValBonneDate[YRanglac],YNbAn[YRangLac]); + + {--calcul du volume m‚dian obtenu pour le quantiŠme initial--} + YVmedian[YRangLac]:=C2_Quantile(YValBonneDate[YRangLac],YNbAn[YRangLac],0.5); + + {--si volume m‚dian est loin du volume initial, la convergence--} + {--n'est pas obtenue. --} + YEcartRmaxV:=B_max(YEcartRmaxV,abs(YVMedian[YRangLac]-YVFin[YRangLac])/YVtot[YRanglac]); + if YEcartRmaxV>YSeuilRConv then + YConvergeTout:=false; + end; + + {--si la convergence n'est pas obtenue, calcul de nouveau volume--} + {--initial pour chaque r‚servoir --} + if not YConvergeTout then + for YRanglac:=1 to YNbLacs do + YVFin[YRangLac]:=B_mindouble(YVtot[YRanglac],B_maxdouble(0,(YNbAn[YRangLac]*YVMedian[YRanglac]-YVFin[YRangLac])/(YNbAn[YRangLac]-1))); + + until YConvergeTout or (YNIterVolInit=YNbmaxIterVolInit); {fin des encadrements successifs portant sur les volumes initiaux} + + {==INITIALISATIONS AVANT CALCUL DEFINITIF EN CHRONO INVERSE==} + reset(YFicDeb); + C1_EcritureEnteteResultDetail(false); + Ici_Init_Stat_Repartition; + YVolTot1:=0; + gotoxy(Ax,Ay); + write('finale)'); + + {--‚criture de lacunes dans le fichier typ‚ des manques de volume--} + rewrite(YFicVdef[1]); + for Yi:=YDateDebut to YDateFin do + write(YFicVdef[1],YLacune); + + for YRanglac:=1 to YNbLacs do + begin + + {--Ecriture lacunes dans fichiers typ‚s de volume--} + rewrite(YFicVobj[YRangLac]); + YVolume[YRangLac]:=Ylacune; + for Yi:=YDateDebut to YDateFin do + write(YFicVobj[YRangLac],YVolume[YRangLac]); + + {--initialisation du volume en fin de p‚riode et ouverture du fichier--} + {--des d‚bits stock‚s en chrono inverse --} + YVolume[YRanglac]:=YVFin[YRangLac]; + YQVVeille[YRangLac]:=YLacune; + YVolTot1:=YVolTot1+YVolume[YRangLac]; + YSollicitation[1,YRangLac]:=0; + + end; + YVolTot0:=YVolTot1; + YVManque:=0; + YVManquemax[1]:=0; + + {==CALCUL DEFINITIF DE LA CHRONIQUE DE VOLUME EN CHRONO INVERSE, avec==} + {==la bonne valeur initiale, et ‚criture sur fichiers typ‚s de ces ==} + {==volumes (d‚cal‚s de + 12h par rapport aux d‚bits stock‚s nets du ==} + {==lac), ainsi que des manques de capacit‚ de r‚servoir, dans le sens==} + {==chronologique. Dans le cas d'un objectif de laminage, les volumes ==} + {==sont les max … ne pas d‚passer pour ‚viter les ‚checs dus … un lac==} + {==plein ==} + + {--initialisations concernant les d‚faillances de d‚bit--} + Ici_EcritureEnteteDefaillances(1); + for Xi:=0 to 2 do + begin + YNbQXdefNul[Xi,1]:=0; + YQXdefmoyGlop[Xi,1]:=0; + assign(YFicQXdef[Xi,1],YRepT+YNomFicQXdef[1]+YExt[Xi]); + rewrite(YFicQXdef[Xi,1]); + end; + + {--boucle sur le temps en chrono inverse--} + for Yi:=YDateFin downto YDateDebut do + begin + + {--‚criture volumes Vobj(=YVolume) et Vdef sur fichiers typ‚s--} + for YRangLac:=1 to YNbLacs do + begin + seek(YFicVobj[YRangLac],filepos(YFicVobj[YRangLac])-1); + write(YFicVobj[YRangLac],YVolume[YRanglac]); + seek(YFicVobj[YRangLac],filepos(YFicVobj[YRangLac])-1); + end; + seek(YFicVdef[1],filepos(YFicVdef[1])-1); + write(YFicVdef[1],YVManque); + seek(YFicVdef[1],filepos(YFicVdef[1])-1); + + {--lecture sur fichier typ‚ de l'enregistrement Ydeb2 contenant : --} + {--YQXsous, YDateEnJour, YQMnat et YQVnat) --} + read(YFicDeb,YDeb2); + + {--calcul des d‚bits r‚serv‚s et de r‚f‚rence aux prises et --} + {--restitutions, puis calcul de r‚partition du d‚bit … stocker. --} + Ici_CalculDebitsResRef_CalculRepartition(false,Yi); + + {--calcul des nouveaux volumes--} + for YRangLac:=1 to YNbLacs do + YVolumePeutEtr[YRangLac]:=B_mindouble(YVtot[YRangLac],B_maxdouble(0,YVolume[YRangLac]-YQST[YrangLac]*YdT)); + + {Ecriture des r‚sultats d‚taill‚s sur fichier texte--} + Ici_Ecriture_Resultats_Detailles(false); + + {--nouvelles valeurs pour les d‚bits du pas de temps pr‚c‚dent … --} + {--l'aval des restitutions (QVVeille) et pour le volume au pas de--} + {--temps pr‚c‚dent (YVolume) --} + YVolume:=YVolumePeutEtr; + YQVVeille:=YQV; + + {--calcul des volumes pr‚sents globaux et du manque de capacit‚--} + YVolTot1:=B_min(YVTotCumul,B_max(0,YVolTot1-YQSTt1*YdT)); + YVolTot0:=YVolTot0-YQSTt0*YdT; + if YTypeObjectif=0 then + begin + YVolTot0:=B_max(YVolTot0,YVolTot1); + YVManque:=YVolTot0-YVolTot1; + end + else + begin + YVolTot0:=B_min(YVolTot0,YVolTot1); + YVmanque:=YVoltot1-YVolTot0; + end; + YVManqueMax[1]:=B_max(YVManqueMax[1],YVManque); + + {--mise … jour des statistiques de r‚partition du d‚bit … stocker--} + Ici_Misaj_Stat_Repartition; + + {--stockage des valeurs de d‚faillance de d‚bit et mise --} + {--… jour de YQXdefmoy glop pour type Xi de d‚faillance de 0 … 2--} + for Xi:=0 to 2 do + begin + if YQXdef[Xi]<=YTouComNul then + YNbQXdefNul[Xi,1]:=YNbQXdefNul[Xi,1]+1 + else + YQXdefmoyGlop[Xi,1]:=YQXdefmoyGlop[Xi,1]+exp(YPuiss*ln(YQXdef[Xi])); + write(YFicQXdef[Xi,1],YQXdef[Xi]); + end; + writeln(YFicResult4,B_Date(Yi),' ',YQXdef[0]:23:3,' ',YQXdef[2]:23:3,' ',YQXdef[1]:23:3); + + {--calcul du taux de sollicitation--} + for YRangLac:=1 to YNbLacs do + if YTypeObjectif=1 then + YSollicitation[1,YRangLac]:=YSollicitation[1,YRangLac]+SQR((YVtot[Yranglac]-YVolume[YRangLac])/YVtot[YRanglac]) + else + YSollicitation[1,YRangLac]:=YSollicitation[1,YRangLac]+SQR(YVolume[YrangLac]/YVTot[YRangLac]); + + end; {fin de la boucle sur le temps en chrono inverse} + + {--Ecriture sur fichier texte de sortie des stats de r‚partition--} + Ici_Ecrit_Stat_Repartition(false); + + {--fermeture du fichiers binaire (Vobj) et du fichier texte --} + {--des r‚sultats d‚taill‚s en sens chronologique inverse; --} + {--calcul final du taux de sollicitation de chaque r‚servoir --} + for Xi:=0 to 2 do + close(YFicQXdef[Xi,1]); + close(YFicResult2); + for Xi:=0 to 2 do + if YQXdefmoyGlop[Xi,1]>0 then + YQXdefmoyGlop[Xi,1]:=exp(ln(YQXdefmoyGlop[Xi,1]/(YDateFin-YDateDebut+1))/YPuiss); + for YRangLac:=1 to YNbLacs do + begin + close(YFicVobj[YRangLac]); + YSollicitation[1,YRanglac]:=SQRT(YSollicitation[1,YRangLac]/(YDateFin-YdateDebut+1)); + end; + close(YFicVdef[1]); + + gotoxy(Ax-36,Ay); + clreol; + writeln(' : termin‚ '); + write(' calcul de Vges en sens chrono (iter. en cours sur Vges initial : '); + A_lecture_xy; + + {==CALCUL EN SENS CHRONO -> VOLUME OPTIMAL POUR OBJECTif IMMEDIAT ==} + {--On effectue ci-dessous un calcul en sens chronologique cens‚ --} + {--reproduire de fa‡on r‚aliste une gestion consistant … stocker (en +--} + {--ou en -) dans le r‚servoir pour atteindre de suite l'objectif aval.--} + + {--initialisations g‚n‚rales--} + YNIterVolInit:=0; + YconvergeTout:=false; + + {--initialisations pour chaque lac--} + for YRangLac:=1 to YNbLacs do + begin + YJJ_MM_AAAA[YRangLac]:=B_Date(YDateFinLac[YRangLac]-YDateFin+YDateDebut-1); + val(copy(YJJ_MM_AAAA[YRangLac],4,2),YMoisDebutLac[YRangLac],YCode); + val(copy(YJJ_MM_AAAA[YRangLac],1,2),YJourDebutLac[YRangLac],YCode); + if YTypeObjectif=0 then + YVDebut[YRangLac]:=YVtot[YRangLac] + else + YVDebut[YRangLac]:=0; + end; {fin des initialisations pour chaque lac} + + {--Encadrements successifs pour d‚terminer les bons volumes initiaux--} + repeat + + YNIterVolInit:=YNIterVolInit+1; + gotoxy(Ax,Ay); + write(YNIterVolInit,')'); + seek(YFicDeb,filesize(YFicDeb)-1); + for YRangLac:=1 to YNbLacs do + begin + YNbAn[YRangLac]:=0; + YVolume[YRanglac]:=YVDebut[YRangLac]; + YQVVeille[YRangLac]:=YLacune; + end; + + {--boucle sur le temps en sens chronologique--} + for Yi:=YdateDebut to YdateFin do + begin + + {--Pour chaque lac, stockage du volume si bonne date--} + for YRangLac:=1 to YNbLacs do begin - read(YFicVobj[YRangLac],YVobj); - read(YFicVges[YRangLac],YVges); - if YTypeObjectif=0 then {cas du soutien d'‚tiage} - YVop:=amin(YVobj,YVges) - else {cas du laminage de crue} - YVop:=amax(YVobj,YVges); - write(YFicVop[YRangLac],YVop); + YJJ_MM_AAAA[YRangLac]:=B_Date(Yi+YDecalDateV[YRangLac]-1); + val(copy(YJJ_MM_AAAA[YRangLac],4,2),YMois[YRangLac],YCode); + val(copy(YJJ_MM_AAAA[YRangLac],1,2),YJour[YRangLac],YCode); + if (YMois[YRangLac]=YMoisDebutLac[YRangLac]) and (YJour[YRangLac]=YJourDebutLac[YRangLac]) then + begin + YNbAn[YRangLac]:=YNbAn[YRanglac]+1; + YValBonnedate[YRanglac,YNbAn[YRanglac]]:=YVolume[YRangLac]; + end; end; - close(YFicVobj[YRangLac]); - close(YFicVges[YRangLac]); - close(YFicVop [YRangLac]); - end; {fin de boucle sur les r‚servoirs pour calcul des volumes limites} - end; + {--lecture sur fichier typ‚ des valeurs de Ydeb2(YQXsous,YQMnat,YQVnat)--} + read(YFicDeb,YDeb2); + + {--calcul des d‚bits r‚serv‚s et de r‚f‚rence aux prises et --} + {--restitutions, puis calcul de r‚partition du d‚bit … stocker. --} + {--Enfin, nouvelle valeur pour les d‚bits du pas de temps pr‚c‚dent--} + {--… l'aval des restitutions --} + Ici_CalculDebitsResRef_CalculRepartition(true,Yi); + YQVVeille:=YQV; + + {--calcul des volumes … utiliser au pas de temps suivant--} + for YRanglac:=1 to YNbLacs do + YVolume[YRangLac]:=B_mindouble(YVtot[YRangLac],B_max(0,YVolume[YRangLac]+YQST[YrangLac]*YdT)); + + seek(YFicDeb,abs(filepos(YFicDeb)-2)); + + end;{fin de boucle sur le temps en sens chronologique} + + {--test de convergence et calcul du nouveau volume initial … tester--} + YConvergeTout:=true; + YEcartRmaxV:=0; + for YRangLac:=1 to YNbLacs do + begin + C2_Tri(YValBonneDate[YRangLac],YNbAn[YRanglac]); + YVmedian[YRangLac]:=C2_Quantile(YValBonneDate[YRangLac],YNbAn[YRangLac],0.5); + YEcartRmaxV:=B_max(YEcartRmaxV,abs(YVMedian[YRangLac]-YVDebut[YRangLac])/YVtot[YRanglac]); + if YEcartRmaxV>YSeuilRConv then + YConvergeTout:=false; + end; + if not YConvergeTout then + for YRangLac:=1 to YNbLacs do + YVDebut[YRangLac]:=B_mindouble(YVtot[YRanglac],B_maxdouble(0,(YNbAn[YRangLac]*YVMedian[YRangLac]-YVDebut[YRangLac])/(YNbAn[YRangLac]-1))); + + until YConvergeTout or (YNIterVolInit=YNbmaxIterVolInit); {fin des encadrements successifs} + + {==CALCUL DEFINITIF EN SENS CHRONO, avec la bonne valeur initiale, et==} + {==‚criture sur fichiers typ‚s de ces volumes (d‚cal‚s de - 12h par ==} + {==rapport aux d‚bits stock‚s nets du lac), ainsi que des manques de ==} + {==capacit‚ de r‚servoir, dans le sens chronologique. ==} + + {--initialisations concernant les d‚faillances de d‚bit--} + Ici_EcritureEnteteDefaillances(2); + for Xi:=0 to 2 do + begin + YNbQXdefNul[Xi,2]:=0; + YQXdefmoyGlop[Xi,2]:=0; + assign(YFicQXdef[Xi,2],YRepT+YNomFicQXdef[2]+YExt[Xi]); + rewrite(YFicQXdef[Xi,2]); + end; + + {--autres initialisations--} + seek(YFicDeb,filesize(YFicDeb)-1); + C1_EcritureEnteteResultDetail(true); + Ici_Init_Stat_Repartition; + YVolTot1:=0; + rewrite(YFicVdef[2]); + for YRangLac:=1 to YNbLacs do + begin + YVolume[YRangLac]:=YVDebut[YRangLac]; + rewrite(YFicVges[YRanglac]); + YQVVeille[YRangLac]:=YLacune; + YVolTot1:=YVolTot1+YVolume[YRangLac]; + YSollicitation[2,YRangLac]:=0; + end; + YVolTot0:=YVolTot1; + YVManque:=0; + YVManqueMax[2]:=0; + gotoxy(Ax,Ay); + write('finale)'); + + {--boucle sur le temps en sens chronologique--} + for Yi:=YdateDebut to YdateFin do + begin + + {--lecture sur fichier typ‚ des valeurs de Ydeb2(YQXsous,YQMnat,YQVnat)--} + {--et ‚criture du volume manquant --} + read(YFicDeb,YDeb2); + write(YFicVdef[2],YVManque); + YVManqueMax[2]:=B_max(YVmanqueMax[2],YVManque); + + {--calcul des d‚bits r‚serv‚s et de r‚f‚rence aux prises et --} + {--restitutions, puis calcul de r‚partition du d‚bit … stocker. --} + {--Enfin, nouvelle valeur pour les d‚bits du pas de temps pr‚c‚dent--} + {--… l'aval des restitutions --} + Ici_CalculDebitsResRef_CalculRepartition(true,Yi); + YQVVeille:=YQV; + + {Ecriture des r‚sultats d‚taill‚s sur fichier texte--} + Ici_Ecriture_Resultats_Detailles(true); + + {--calcul des volumes pr‚sents globaux et du manque de capacit‚--} + YVolTot1:=B_min(YVTotCumul,B_max(0,YVolTot1+YQSTt1*YdT)); + YVolTot0:=YVolTot0+YQSTt0*YdT; + if YTypeObjectif=0 then + begin + YVolTot0:=B_min(YVolTot0,YVolTot1); + YVmanque:=YVoltot1-YVolTot0; + {YVmanque:=Bmax(0,-YVolTot0);} + end + else + begin + YVolTot0:=B_max(YVolTot0,YVolTot1); + YVManque:=YVolTot0-YVolTot1; + {YVManque:=Bmax(0,YVolTot0-YVTotCumul);} + end; + + {--mise … jour des statistiques de r‚partition du d‚bit … stocker--} + Ici_Misaj_Stat_Repartition; + + {--stockage des valeurs de d‚faillance de d‚bit et mise --} + {--… jour de YQXdefmoy glop pour type Xi de d‚faillance de 0 … 2--} + for Xi:=0 to 2 do + begin + if YQXdef[Xi]<=YTouComNul then + YNbQXdefNul[Xi,2]:=YNbQXdefNul[Xi,2]+1 + else + YQXdefmoyGlop[Xi,2]:=YQXdefmoyGlop[Xi,2]+exp(YPuiss*ln(YQXdef[Xi])); + write(YFicQXdef[Xi,2],YQXdef[Xi]); + end; + writeln(YFicResult4,B_Date(Yi),' ',YQXdef[0]:23:3,' ',YQXdef[2]:23:3,' ',YQXdef[1]:23:3); + + {--calcul de Vges pour le pas de temps suivant--} + for YRangLac:=1 to YNbLacs do + begin + YVges[YRangLac]:=B_mindouble(YVtot[YRangLac],B_max(0,YVolume[YRangLac]+YQST[YrangLac]*YdT)); + write(YFicVges[YRangLac],YVges[YRangLac]); + YVolume[YRangLac]:=YVges[YRangLac]; + end; + seek(YFicDeb,abs(filepos(YFicDeb)-2)); + + {--calcul du taux de sollicitation--} + for YRangLac:=1 to YNbLacs do + if YTypeObjectif=0 then + YSollicitation[2,YRangLac]:=YSollicitation[2,YRangLac]+SQR((YVtot[Yranglac]-YVolume[YRangLac])/YVtot[YRanglac]) + else + YSollicitation[2,YRangLac]:=YSollicitation[2,YRangLac]+SQR(YVolume[YrangLac]/YVTot[YRangLac]); + + end; {fin de boucle sur le temps en sens chronologique} + + gotoxy(Ax-36,Ay); + clreol; + writeln(' : termin‚ '); + + {--Ecriture sur fichier texte de sortie des stats de r‚partition--} + Ici_Ecrit_Stat_Repartition(true); + + {--FERMETURE DES FICHIERS TYPES (YQXdef, YDeb2) ET TEXTE, et calcul --} + {--de la d‚faillance moyenne de d‚bit due au manque de capacit‚ des--} + {--r‚servoirs --} + for Xi:=0 to 2 do + close(YFicQXdef[Xi,2]); + close(YFicDeb); + close(YFicVdef[2]); + close(YFicResult2); + for Xi:=0 to 2 do + if YQXdefmoyGlop[Xi,2]>0 then + YQXdefmoyGlop[Xi,2]:=exp(ln(YQXdefmoyGlop[Xi,2]/(YDateFin-YDateDebut+1))/YPuiss); + close(YFicResult4); + + {--CALCUL DU VOLUME OPERATIONNEL Vop et ‚criture sur fichier typ‚--} + for YRangLac:= 1 to YNbLacs do + begin + YSollicitation[2,YRanglac]:=SQRT(YSollicitation[2,YRangLac]/(YDateFin-YdateDebut+1)); + rewrite(YFicVop[YRangLac]); + reset(YFicVobj[YRangLac]); + reset(YFicVges[YRangLac]); + while not eof(YFicVobj[YRangLac]) do + begin + read(YFicVobj[YRangLac],YVobj[YRangLac]); + read(YFicVges[YRangLac],YVges[YRangLac]); + if YTypeObjectif=0 then + YVop[YRangLac]:=B_min(YVobj[YRangLac],YVges[YrangLac]) + else + YVop[YRangLac]:=B_max(YVobj[YRangLac],YVges[YrangLac]); + write(YFicVop[YRangLac],YVop[YrangLac]); + end; + + close(YFicVobj[YRangLac]); + close(YFicVges[YRangLac]); + close(YFicVop [YRangLac]); + end; + + end; {fin de procedure C3_CalculChroniquesVolume} + + {--ACHTUNG : FICHIERS TYPES. A ce moment, les fichiers typ‚s de Vobj,--} + {--Vges et Vop contiennent des volumes instantan‚s class‚s par ordre --} + {--chronologique, entre la date YDateDebut+0.5+YDecalDateQ+0.5 --} + {--(premiŠre valeur) et YDateFin+0.5+YDecalDateQ+0.5. --} + +{-------------------------------------------------------------------------} BEGIN END. diff --git a/src/CALCULS4.PAS b/src/CALCULS4.PAS index ca712bb388dd28aa3d422ce31201152939ded512..690783720ec014ef54f9a0cf177be6f3817acdc6 100644 --- a/src/CALCULS4.PAS +++ b/src/CALCULS4.PAS @@ -1,19 +1,27 @@ -Unit CALCULS4; +Unit CALCULS4; {JC Bader, nov 2016} interface - uses Utilit,Declara; + uses Utilit,DECLARA; -procedure TriChronique(var ZFic:YtypFod; ZNbNul : longint; ZTouComNul : double; +procedure C4_TriChronique(var ZFic,ZFicT:YtypFod; ZNbNul : longint; ZTouComNul : double; var ZQmoy,ZQmed,ZQmax,ZQmin : double; var ZQRare,ZQfrequent : YtypFreq); IMPLEMENTATION + +{=======================================================================} +{==Tri des valeurs d'une chronique contenue dans le fichier Zfic et --} +{--‚criture de ces valeurs tri‚es dans le fichier ZFicT, puis calcule --} +{--les valeurs d‚pass‚es ou non d‚pass‚es pour certaines fr‚quences --} +{--pr‚d‚finies ainsi que min, max, m‚diane et moyenne --} {=======================================================================} -procedure TriChronique(var ZFic:YtypFod; ZNbNul : longint; ZTouComNul : double; + +procedure C4_TriChronique(var ZFic,ZFicT:YtypFod; ZNbNul : longint; ZTouComNul : double; var ZQmoy,ZQmed,ZQmax,ZQmin : double; var ZQRare,ZQfrequent : YtypFreq); const XNomFicTri : string = 'TRI'; XNul : double = 0; + var XFic : YTypFod; XRang : longint; @@ -23,10 +31,10 @@ procedure TriChronique(var ZFic:YtypFod; ZNbNul : longint; ZTouComNul : double; XStop : boolean; Xi : integer; Xfreq : double; + begin - assign(XFic,YRepT+XNomFicTri); - rewrite(XFic); reset(ZFic); + rewrite(ZFicT); ZQmoy:=0; repeat read(ZFic,XQ); @@ -34,61 +42,55 @@ procedure TriChronique(var ZFic:YtypFod; ZNbNul : longint; ZTouComNul : double; if XQ>ZTouComNul then begin XStop:=false; - XRang:=filesize(XFic)-1; - seek(Xfic,amaxin(0,Xrang)); + XRang:=filesize(ZFicT)-1; + seek(ZFicT,B_maxin(0,Xrang)); while (XRang>=0) and (not Xstop) do begin - read(XFic,XQpred); + read(ZFicT,XQpred); if XQPred>XQ then XStop:=true else begin - write(XFic,XQPred); + write(ZFicT,XQPred); XRang:=XRang-1; - seek(XFic,amaxin(0,XRang)); + seek(ZFicT,B_maxin(0,XRang)); end; end; - write(XFic,XQ); + write(ZFicT,XQ); end; until eof(ZFic); - seek(Xfic,filesize(XFic)); + close(ZFic); + seek(ZFicT,filesize(ZFicT)); for XRang:=1 to ZNbNul do - write(XFic,XNul); - reset(XFic); - reset(Zfic); - repeat - read(XFic,XQ); - write(ZFic,XQ); - until eof(XFic); - close(XFic); - reset(ZFic); - read(ZFic,ZQmax); - XEffectif:=filesize(ZFic); - seek(ZFic,XEffectif-1); - read(Zfic,ZQmin); + write(ZFicT,XNul); + reset(ZFicT); + read(ZFicT,ZQmax); + XEffectif:=filesize(ZFicT); + seek(ZFicT,XEffectif-1); + read(ZFicT,ZQmin); ZQmoy:=ZQmoy/XEffectif; for Xi:=1 to YNbFreq do begin XFreq:=1/YTpsFreq[Xi]; - XRang:=amaxlongint(1,trunc((XEffectif+YB)*Xfreq+YA)); - seek(ZFic,XRang-1); - read(ZFic,XQpred,XQ); + XRang:=B_maxlongint(1,trunc((XEffectif+YB)*Xfreq+YA)); + seek(ZFicT,XRang-1); + read(ZFicT,XQpred,XQ); ZQRare[Xi]:=XQPred+(XQ-XQpred)*(XFreq-(XRang-YA)/(XEffectif+YB))*(XEffectif+YB); end; XFreq:=0.5; - XRang:=amaxlongint(1,trunc((XEffectif+YB)*XFreq+YA)); - seek(ZFic,XRang-1); - read(ZFic,XQpred,XQ); + XRang:=B_maxlongint(1,trunc((XEffectif+YB)*XFreq+YA)); + seek(ZFicT,XRang-1); + read(ZFicT,XQpred,XQ); ZQmed:=XQPred+(XQ-XQpred)*(XFreq-(XRang-YA)/(XEffectif+YB))*(XEffectif+YB); for Xi:=1 to YNbFreq do begin XFreq:=1-1/YTpsFreq[YNbFreq+1-Xi]; - XRang:=aminlongint(XEffectif-1,trunc((XEffectif+YB)*Xfreq+YA)); - seek(ZFic,XRang-1); - read(ZFic,XQpred,XQ); + XRang:=B_minlongint(XEffectif-1,trunc((XEffectif+YB)*Xfreq+YA)); + seek(ZFicT,XRang-1); + read(ZFicT,XQpred,XQ); ZQFrequent[Xi]:=XQPred+(XQ-XQpred)*(XFreq-(XRang-YA)/(XEffectif+YB))*(XEffectif+YB); end; - close(ZFic); + close(ZFicT); end; {=======================================================================} diff --git a/src/DECLARA.PAS b/src/DECLARA.PAS index 78cdf77cc8bd6b879414f4d59b7f5159f3827151..02a991916af1876b472bd7b9857d64b538229225 100644 --- a/src/DECLARA.PAS +++ b/src/DECLARA.PAS @@ -2,85 +2,124 @@ UNIT DECLARA; INTERFACE -const - YNbmaxAn = 250; {nombre maximal d'ann‚es pouvant ˆtre trait‚es dans le calcul … rebours} - YnbmaxTpsRet = 12; - Ynbfreq = 8; - YNmaxLacs = 4; {nombre maximal de lacs autoris‚} +CONST {valeurs} + + YCritRelDuree = 0.025; {critŠre relatif de convergence pour l'‚galisation des temps de remplissage} + YCritAbsDuree = 0.25; {critŠre absolu de convergence pour l'‚galisation des temps de remplissage} + YEcartMax : double=0; {max d'‚cart absolu obtenu entre d‚bit aval et d‚bit aval objectif atteignable} + YDelaiMax = 4; {indice sup‚rieur du tableau des d‚bits lus} + YDelaiMin = -8; {indice inf‚reur du tableau des d‚bits lus} + YdT = 86400; + YInterpolPermi= true; {pour autoriser reconst des lacunes isol‚es de d‚bits stations} + YLacune = -99; {code lacune de d‚bit} + YNbfreq = 8; + YNbmaxAn = 250; {nombre maximal d'ann‚es pouvant ˆtre trait‚es dans le calcul … rebours} + YNbmaxIter = 400; {nombre max d'it‚rations pour obtenir la norme de d‚bit stock‚ … r‚partir} + YNbmaxIterVol = 100; {nombre max d'it‚rations pour obtention des bons volumes conditionnant la r‚partition} + YNbmaxIterVolInit = 50; {Nombre max d'it‚rations pour obtenir le bon jeu de volumes initiaux} + YNbIterTpsMax = 150; {nombre max d'it‚rations pour ‚galisation des temps de remplissage} + YNmaxLacs = 4; {nombre maximal de lacs autoris‚} + YNbmaxPivot = 10; {nombre maximal de dates pivot autoris‚} + YNbmaxSeuil = 5; {nombre max de seuil dans formule} + YNmaxBareme = 10; {taille maximale de barŠme de QEmin, QEmax, Qsmi et Qsmax en fonction du volume} YNmaxStat = 30; - YnbmaxIter = 100; + YNbmaxTpsRet = 12; + YNbmaxVersion = 25; {nombre max de versions de paramŠtres barrages et r‚seaux} + YRelax = 0.9; {r‚glage entre 0 et 1 pour la convergence d'‚galisation des temps de remplissage} + YSeuilConv = 1e-10; {seuil de convergence} + YSeuilRconv = 1e-12; {seuil relatif de convergence dans le calcul … rebours, sur volume lac} YTouComNul : double = 1e-10; - YSeuilConv = 1e-10; {seuil de convergence} + YTpotMaxiAdmis= 3653; {limite max de dur‚e Tpot de reconstitution de volume utilisable maximal} + +CONST {chaines de caractŠres} + + YExIsofreq = '.dat'; + YNomFicCalcTri= 'OUITRI.txt'; {nom du fichier dont l'existence d‚clenche le calcul de tri de QXdef} + YNomFicChoix = 'CHOIX.txt'; {nom du fichier des options de calcul} + YNomFicDeb = 'Debit'; + YNomFicDebTemp= 'DebitTmp'; + YNomFicFin = 'FIN.txt'; {nom du fichhier d‚truit au d‚but du programme puis cr‚‚ et ferm‚ … la fin} + YNomFicFNonDep= 'FreqNDep.txt'; {nom du fichier contenant la fr‚quence au non d‚passement souhait‚e pour l'utilisation des QMN dans la m‚thode 5} + YNomFicMode = 'MODE.txt'; {nom du fichier du code 0 ou 1 d‚terminant les entr‚es par saisie clavier ou lecture fichier} + YNomFicPuiss = 'PUISS.txt'; {nom du fichier contenant la puissance … appliquer … QXdef} + YNomFicQuant = 'QMNquant'; {nom du fichier d'‚dition des 365 valeurs de d‚bit de cours d'eaub … la prise pour un quantile donn‚} + YNomFicQST = 'Qst-'; {base du nom des fichiers typ‚s de d‚bit stock‚} + YNomFicRangCal= 'compteur'; + YnomFicReglage= 'REGLAGE.txt'; {nom du fichier des r‚glages pour r‚partition des taches'} + YNomFicResChr1= 'Chrono.txt'; {nom de fichier des r‚sultats d‚taill‚s obtenus en sens chronologique --> calcul de Vges} + YNomFicResChr2= 'PaChrono.txt';{nom de fichier des r‚sultats d‚taill‚s obtenus en sens chronologique inverse --> calcul de Vobj} + YNomFicResDef = 'QXdef'; + YNomFicResult1= 'Qobs-P-R.txt';{nom de fichiers de r‚sultats : chronique des d‚bits observ‚s} + YNomFicResult2= 'QSynchro.txt';{nom fichier de d‚bits synchronis‚s (prise en compte des d‚lais de propagation)} + YNomFicResult4= 'Volumes.txt'; + YNomFicResult6= 'Bilan'; + YNomFicResultVobj= 'VOBJ'; + YNomFicResultVop = 'VOP'; + YNomFicResultM= 'Vdef'; + YNomFicSortie = 'CondStat'; {nom du fichier r‚sumant les conditions du calcul et des stats de r‚sultats} + YNomFicTpsRet = 'RETOUR.txt'; {nom du fichier des temps de retour d‚sir‚s pour analyse statistique} + YNomFicV = 'Vobj-'; {base du nom des fichiers typ‚s de volume stock‚ ‚valu‚s en chrono inverse} + YNomFicVdef = 'Vdef-'; {base du nom des fichiers typ‚s de manque de capacit‚} + YNomFicVges = 'Vges-'; {base du nom des fichiers typ‚s de volume stock‚ ‚valu‚s en sens chronologique} + YNomFicVop = 'Vop-'; {base du nom des fichiers typ‚s de volume op‚rationnel} + YRepB ='BARRAGES\'; + YRepD ='DONNEES\'; + YRepO ='OBJECTIF\'; + YRepP ='PARAMETR\'; + YRepR ='RESULTAT\'; + YRepS ='RESEAUX\'; + YRepStations ='STATIONS\'; + YRepT ='TEMPORAI.RE\'; + YNomFicQXdef : array[1..2] of string = ('QXdefA-','QXdefB-'); {base du nom des fichiers typ‚s de d‚faillance de d‚bit, pour sens pas chrono et sens chrono} + YNomFicQXdefT : array[1..2] of string = ('QXdefTA-','QXdefTB-'); {base du nom des fichiers typ‚s de d‚faillance de d‚bit (valeurs tri‚es), pour sens pas chrono et sens chrono} + YNomFicResult5: array[1..2] of string = ('EchecQ-A.txt','EchecQ-B.txt');{noms de fichiers r‚sultats concernant les d‚faillances de d‚bit, pour sens pas chrono et sens chrono} + + +TYPE -Type YChai2 = string[2]; YChai8 = string[8]; YChai10 = string[10]; YTab1 = array[1..YNmaxLacs] of double; - Ytab2 = Array[1..YNbmaxAn] of double; + Ytab2 = array[1..YNbmaxAn] of double; + YTab3 = array[0..2] of double; YTabInt1 = array[1..YNmaxLacs] of integer; - YTypTpsRet = array[1..YNbmaxTpsRet] of double; YTypFOD = file of double; YTypFreq = array[1..YNbFreq] of double; + YTypTpsRet = array[1..YNbmaxTpsRet] of double; + + YTypDeb2 = record + YQXsous : double; {objectif de d‚bit stock‚ … la station aval} + YDateEnjour : array[0..YNMaxlacs] of longint; {date compt‚e en jours depuis le 31/12/1899} + YQMnat : YTab1; {d‚bit naturel … la prise, d‚cal‚ de -D par rapport … station aval systŠme (D = tps propag)} + YQVnat : YTab1; {d‚bit naturel … la restitution, d‚cal‚ de -D par rapport … station aval systŠme (D = tps propag)} + end; + YBareme = record + YEffectif : integer; + YVolume : array[1..YNmaxBareme] of double; + YDebit : array[1..YNmaxBareme] of double; + end; + +CONST {tableaux} -const - YSuffixe : array[1..2] of YChai2 =('.1','.2'); - YInterpolPermi= true; {pour autoriser reconst des lacunes isol‚es de d‚bits stations} - YLacune = -99; {code lacune de d‚bit} - YNomFicRangCal= 'compteur'; - YNomFicSortie = 'CondStat'; {nom du fichier r‚sumant les conditions du calcul et des stats de r‚sultats} - YnomFicResult1= 'Qobs-P-R.txt'; {nom de fichiers de r‚sultats : chronique des d‚bits observ‚s} - YnomFicResult2= 'Q-ideal.txt'; {nom fichiers de r‚sult. : chron. contraintes, consignes, r‚part. objectif, Qstock‚ id‚al } - YNomFicResult3= 'QStock-I.txt'; {nom de fichier de r‚sultats : chronique des d‚bits stock‚s min, max et id‚aux} - YNomFicResult4= 'Volumes.txt'; - YNomFicResult5= 'Echecs-Q.txt'; - YNomFicResult6= 'EchecTri.txt'; - YNomFicResultVobj= 'Vobj'; - YNomFicResultVop = 'Vop'; - YNomFicResultM= 'MANQUE'; - YNomFicResDef = 'ECHEC'; - - YnomFicReglage= 'REGLAGE.TXT'; {nom du fichier des r‚glages pour r‚partition des taches'} - YNomFicChoix = 'CHOIX.TXT'; {nom du fichier des options de calcul} - YNomFicMode = 'MODE.TXT'; {nom du fichier du code 0 ou 1 d‚terminant les entr‚es par saisie clavier ou lecture fichier} - YNomFicFin = 'FIN.TXT'; {nom du fichhier d‚truit au d‚but du programme puis cr‚‚ et ferm‚ … la fin} - YNomFicQdef = 'Qdef-'; {base du nom des fichiers typ‚s de d‚faillance de d‚bit} - YNomFicQST = 'QST-'; {base du nom des fichiers typ‚s de d‚bit stock‚} - YNomFicV = 'Vobj-'; {base du nom des fichiers typ‚s de volume stock‚ ‚valu‚s en chrono inverse} - YNomFicVobj0 = 'Vobj0-'; {base du nom des fichiers typ‚s de volume stock‚ ‚valu‚s en chrono inverse avec capacit‚ infinie} - YNomFicVges = 'Vges-'; {base du nom des fichiers typ‚s de volume stock‚ ‚valu‚s en sens chronologique} - YNomFicVdef = 'Vdef-'; {base du nom des fichiers typ‚s de manque de capacit‚} - YNomFicVop = 'Vop-'; {base du nom des fichiers typ‚s de volume op‚rationnel} - YNomFicTpsRet = 'RETOUR.TXT';{nom du fichier des temps de retour d‚sir‚s pour analyse statistique} - - YNbmaxPivot = 10; {nombre maximal de dates pivot autoris‚} - YNbmaxSeuil = 5; {nombre max de seuil dans formule} - YDelaiMin = -8; {indice inf‚reur du tableau des d‚bits lus} - YDelaiMax = 4; {indice sup‚rieur du tableau des d‚bits lus} YNomDebit : array[1..4] of string = ('QMres','QVres','QMref','QVref'); YNomParamLac : array[1..13] of string[20] = ('nom de station aval','nombre de stations', - 'Qemin','Qemax','Qsmin','Qsmax','Volume','Delai de propagation', + 'QEmin','QEmax','Qsmin','Qsmax','Volume','Delai de propagation', 'type de formule ou nombre de dates','borne de gradient', 'quantiemes','rangs de formules','formule'); YNomParamReso : array[1..16] of string[42] = ('nombre de stations amont ou intermediaires', 'identifiant aval', 'identifiant amont','identifiant intermediaire','PKV','PKM', - 'PKamont','TV','TM','Tamont','Tintermediaire','Saval','SV', - 'SM','Samont','Sintermediaire'); - YRepR ='RESULTAT\'; - YRepD ='DONNEES\'; - YRepO ='OBJECTIF\'; - YRepP ='PARAMETR\'; - YRepT ='TEMPORAI.RE\'; + 'PKamont','TV','TM','Tamont','Tintermediaire','Saval','Sv', + 'Sm','Samont','Sintermediaire'); YSeparateur : set of byte = [0..39,42,44,58,59,123..255]; - YSeuilRconv = 0.001; {seuil relatif de convergence dans le calcul … rebours, sur volume lac} - YTpsRetParDefo: YTypTpsRet =(2,3,4,5,10,15,20,25,50,100,150,200); + YSuffixe : array[1..2] of YChai2 =('.1','.2'); YTpsFreq : YTypFreq=(1000.0,500.0,200.0,100.0,50.0,20.0,10.0,5.0); - YEcartMax : double=0; {max d'‚cart absolu obtenu entre d‚bit aval et d‚bit aval objectif atteignable} - + YTpsRetParDefo: YTypTpsRet =(2,3,4,5,10,15,20,25,50,100,150,200); + YExt : array[0..2] of char = ('0','1','2'); -var +VAR {fichiers} YFiText : text; {fichier texte} YFicSortie : text; {fichier texte pour sortie de r‚sultats} @@ -88,222 +127,309 @@ var YFicResult2 : text; {fichiers texte pour sortie de r‚sultats} YFicResult3 : text; {fichier texte pour sortie de r‚sultats} YFicResult4 : text; + YFicTest : text; + + YFicQXdef : array[0..3,1..2] of YTypFOD;{pour QXdef0 … QXdef?, et pour sens pas chrono et sens chrono} + YFicQXdefT : array[1..2,1..2] of YTypFOD;{pour QXdef1 … QXdef2 tri‚s, et pour sens pas chrono et sens chrono} - YFicQdef : array[0..3] of YTypFOD; YFicVdef : array[1..YNmaxLacs] of YTypFOD; - YFicQST : array[1..YNmaxLacs] of YTypFOD; YFicVobj : array[1..YNmaxLacs] of YTypFOD; - YFicVobj0 : array[1..YNmaxLacs] of YTypFOD; YFicVop : array[1..YNmaxLacs] of YTypFOD; YFicVges : array[1..YNmaxLacs] of YTypFOD; - YNomFicDebit : string; {nom du fichier des d‚bits naturels} - YNomFicObjectif: string; {nom du fichier des d‚bits objectifs} + YFicDeb : file of YTypDeb2; + YFicDebTemp : file of YTypDeb2; - YExtension : string[2]; - YNum : string[2]; - YNomStatAval : Ychai8; {code d'identification de station aval du systŠme} - YJJ_MM_AAAA : YChai10; - YDat1 : YChai10; - YDat2 : YChai10; - YChaine93 : string[93]; - YChaine : string; - YNomFicLacs : string; {nom du fichier des paramŠtres des lacs} - YResume : string; +VAR {chaines de caractŠres} + YChaine : string; + YChaine93 : string[93]; + YChaine228 : string[228]; + YNomFicDebit : string; {nom du fichier des d‚bits naturels} + YNomFicLacs : string; {nom du fichier des paramŠtres des lacs} + YNomFicObjectif: string; {nom du fichier des d‚bits objectifs} + YNomRepBarrage : string; {nom du r‚pertoire (chemin complet) des fichiers de rŠgles barrage} + YNomRepReseau : string; {nom du r‚pertoire (chemin complet) des fichiers de r‚seaux associ‚s aux barrages} + YResume : string; + + YExtension : string[2]; + YNum : string[2]; + YDat1 : YChai10; + YDat2 : YChai10; + YNomStatAval : Ychai8; {code d'identification de station aval du systŠme} + +VAR {boolean} + YCodeTpot : boolean; {si true : Tpot = Tpot1, dur‚e potentielle minimale de reconstitution de volume utilisable maximal aprŠs fin de pas de temps} + {si false : Tpot = Tpot2, dur‚e potentielle d'‚puisement de volume utilisable aprŠs fin de pas de temps} YSaisie : boolean; {true pour saisie des choix de calcul au clavier, false pour lecture sur fichier} YChoixFreq : boolean; {true si param‚trage de formule de fr‚quence} - YConverge : boolean; + YConvergeTout : boolean; YDernierLuGlop: boolean; YOuvertEtLu : boolean; YCalculPossibl: boolean; {true si paramŠtres lus sans problŠme dans fichiers en entr‚e} YGlopGlopDebit: boolean; {true si nombre suffisant de lignes lues dans fichier de d‚bit de base} - YlacuneDebit : boolean; {true si d‚bits stations existent pour calcul de Qnat prise ou restit.} + YlacuneDebit : boolean; {true si d‚bits stations existent pour calcul de QXnat prise ou restit.} YStandard : boolean; {true si r‚partition des tƒches selon volume exploitable r‚el des lacs} + YTestCalcTri : boolean; {si true, alors calculs de tri de QXdef et stockage des r‚sultats} + YYaBonResult : boolean; +VAR {entiers} + + YAbsRel : integer; {code d'‚dition des volumes : 1 pour valeurs absolues, 2 pour valeurs relatives} Yan : integer; {ann‚e} YAnDebutV : integer; + YAnDernier : integer; YAnFinV : integer; YAnPremier : integer; - YAnDernier : integer; YChoix : integer; {0 pour saisie clavier et autre pour lecture sur fichier (options de calcul)} YCode : integer; {code de bonne traduction de chaŒne en num‚rique} + YComplet : integer; {1 si d‚bit aval et d‚bits d‚cal‚s aux prises et restit. existent, 0 sinon} YCompteur : integer; {rang du calcul} YjTpsRet : integer; - YJour : integer; {jour} - YJourDebutLac : integer; - YJourFinLac : integer; {jour de fin de calcul … rebours} - YMois : integer; {mois} - YMoisDebutLac : integer; - YMoisFinLac : integer; {mois de fin de calcul … rebours} - YNbAn : integer; {nbre d'ann‚es entiŠres du calcul … rebours} YNbLacs : integer; {nombre de r‚servoirs} YNbPbReglage : integer; {nombre de problŠmes de lecture des r‚glages de volume de r‚servoir} + YNbQXobj : integer; {nombre de triplets jour/date d‚bit objectif lus et corrects} YNbTpsRet : integer; {nombre de temps de retour utilis‚s pour analyse statistique} - YNbQobj : integer; {nombre de triplets jour/date d‚bit objectif lus et corrects} YNIter : integer; {nombre d'it‚rations dans calcul de r‚partition} YNItermax : integer; + YNItermaxTps : integer; + YNIterTps : integer; {nombre d'it‚rations pour ‚galisation des temps potentiels de remplissage} + YNIterVolInit : integer; + YNIterVolume : integer; {nombre d'it‚rations pour obtenir les bons volumes … un pas de temps donn‚} YNMalLu : integer; {nombre de problŠmes de lecture des paramŠtres} YNProbleme : integer; {Nombre de problŠmes d‚tect‚s sur les paramŠtres} + YOptionRepart : integer; {1 pour r‚partition fig‚e, 2 pour r‚partition variable} YQuant : integer; YRangDelai : integer; {rang de d‚bit dans tableau YQ} YRangLac : integer; {rang du lac} + YRangPBarrage : integer; {rang et nom du sous-r‚pertoire contenant une version de paramŠtres r‚servoirs} + YRangPReseau : integer; {rang et nom du sous-r‚pertoire contenant une version de paramŠtres r‚seau} YrangStatAval : integer; {rang de station aval syst. dans fichier des d‚bits de base} YSuccesRepart : integer; {code objectif r‚partition : -1= non atteint, 0=non converg‚, 1=atteint, 2=d‚pass‚} YTest : integer; {1 si croissance de pr‚lŠvement total en fonction de QS0, 0 sinon} YTypeDebit : integer; {1=QRM, 2=QRV, 2=QFM, 4=QFV} YTypeObjectif : integer; {0:minimal, 1:maximal} - YDateInitiale : longint; {date de d‚but des donn‚es (ref stat aval systŠme)} + YDateDebut : longint; {d‚but de p‚riode souhait‚e pour le calcul (ref station aval systŠme)} YDateDebutV : longint; YDateFin : longint; {fin de p‚riode souhait‚e pour le calcul (ref station aval systŠme)} YDateFinV : longint; + YDateInitiale : longint; {date de d‚but des donn‚es (ref stat aval systŠme)} Yi : longint; Yj : longint; Yk : longint; YMeilleurDebut: longint; {d‚but de plus longue p‚riode de donn‚es sans lacune} YMeilleurFin : longint; {fin de plus longue p‚riode de donn‚es sans lacune} YNbEcrit : longint; {nombre de lignes de r‚sultats ‚crites sur fichier} - YNbQdefNul : longint; {nombre d'‚checs suppl‚mentaires nuls} YNbPbBornes : longint; {effectif des pb d'initialisation de fourchette de QS0} YNTestNul : longint; YPlusLongDuree: longint; {dur‚e de la plus longue p‚riode sans lacune} YQuantieme : longint; YRangLu : longint; {index de lecture dans fichiuer des d‚bits avalsyst., prises et restit.} +VAR {r‚els} YA : double; {paramŠtre de fr‚quence = (j-A)/(N+B), entre 0 et 0.5} YB : double; {paramŠtre de fr‚quence = (j-A)/(N+B), entre 0 et 1} YdelMaxKiFodra: double; {dimension max souhaitable de tableau de d‚bit} YdelMinKiFodra: double; {dimension min souhaitable de tableau de d‚bit} - + YEcartRVol : double; {Ecart relatif entre volume de fin de pas de temps et celui qu'il faudrait} + YEcartRmaxV : double; {max sur r‚servoirs d'‚cart relatif entre V initial et Vm‚dian du mˆme quantiŠme} YFreq : double; {fr‚quence de non d‚passement} + YFreqNonDep : double; {fr‚quence des valeurs de d‚bit QMN des cours d'eau aux prises utilis‚es pour ‚quilibrage desdur‚es de remlplissage} + YPuiss : double; {puissance de QXdef pour calcul de d‚faillance moyenne de d‚bit … la station aval} YQAntmin : double; {minimum des d‚bits nat restitutions associ‚s (tps propag) au Q avl systŠme} - YQdef : double; {* d‚faillance Q in‚vitable suppl‚mentaire % objectif aval, due … manque de capacit‚ de r‚servoir} - YQdef0 : double; {* d‚faillance Q in‚vitable absolue % objectif aval, due … Q naturels et rŠgles et consignes r‚serv.} - YQDef1 : double; {* d‚faillance Q in‚vitable (absolue + suppl‚mentaire) % objectif aval, due aux diff‚rentes cause} - YQdefmax : double; - YQdefmed : double; - YQdefmin : double; - YQdefmoy : double; YQST0 : double; {* norme des d‚bits … soutirer en proportion des volumes de r‚servoirs} - YQSTeffectif : double; {d‚bit stock‚} - YQVdef : double; {* d‚faillance de d‚bit … l'aval de la restitution, caus‚e par manque de capacit‚} + YQSTt0 : double; {d‚bit stock‚ global sans prise en compte des limites de capacit‚ de r‚servoirs} + YQSTt1 : double; {d‚bit stock‚ global} YTps : double; {temps de retour} - YVDebut : double; {volume du reservoir au d‚but de simulation en sens chrono} - YVdef : double; {* manque de capacit‚ de r‚servoir pour pouvoir ‚viter tous les ‚checs (sauf in‚vitables absolus)} - YVdefsom : double; {somme des YVdef sur les diff‚rents r‚servoirs} - YVdefsommax : double; {valeur maximale sur la chronique, YVdefsom} - YVFin : double; {volume de r‚servoir au d‚but du calcul … rebours} - YVges : double; {* volume de r‚servoir au cours du calcul en sens chrono} - YVmedian : double; {volume median de r‚servoir … la date JJMM (d‚but calcul … rebours)} - YVobj : double; {* volume limite … respecter pour satisfaire au mieux l'objectif aval (calcul‚ … rebours)} - YVobj0 : double; {* volume id‚al de r‚servoir au cours du calcul … rebours} - YVolume : double; {volume d'eau dans le r‚servoir} - YVop : double; {volume op‚rationnel (combinaison de Vobj et Vges)} + YVdef0 : double; {manque de capacit‚ de r‚servoir pour pouvoir ‚viter tous les ‚checs (sauf in‚vitables absolus)} + YVManque : double; {volume manquant} + YVolTot0 : double; {volume global pr‚sent sans limitation due aux capacit‚s de r‚servoirs} + YVolTot1 : double; {volume global pr‚sent} YVopAnt : double; {volume op‚rationnel (combinaison de Vobj et Vges)} YVopNouv : double; {volume op‚rationnel (combinaison de Vobj et Vges)} - YVTotCumul : double; {somme des volumes de r‚servoirs} + YVRobj : double; {objectif commun de taux de remplissage} + YVRTotCumul : double; {somme des volumes fictifs de r‚servoirs} + YVTotCumul : double; {somme des volumes r‚els de r‚servoirs} + YVVobj : double; {objectif commun de volume vide cumul‚} + +VAR {tableaux de chaines de caractŠres} YChaiDate : array[1..YNmaxLacs] of YChai10; {date en clair} - YNomStatAv : array[1..YNmaxLacs] of YChai8; {nom de station aval} - YNomStatInt : array[1..YNmaxlacs] of YChai8; {nom de station interm‚diaire} YNomLac : array[1..YNmaxLacs] of YChai8; {nom de lac dans fichier lacs} YNomReseau : array[1..YNmaxLacs] of YChai8; {nom de lac dans 2emes fichiers de paramŠtres (r‚seaux)} YNomReservoir : array[1..YNmaxLacs] of YChai8; {nom de lac dans les 1ers fichiers de paramŠtres (contraintes et consignes)} + YNomStatAv : array[1..YNmaxLacs] of YChai8; {nom de station aval} + YNomStatInt : array[1..YNmaxlacs] of YChai8; {nom de station interm‚diaire} YDate : array[YDelaimin..YDelaiMax] of YChai8; {date cod‚e aaaammjj} + YJJ_MM_AAAA : array[0..YNmaxLacs] of YChai10; + YNomStatAm : array[1..YNmaxLacs,1..2] of Ychai8; {nom de station amont} +VAR {tableaux d'entiers} + + YJour : array[0..YNmaxLacs] of integer; {jour} + YMois : array[0..YNmaxLacs] of integer; {mois} YNbModif : array[0..YNmaxLacs] of integer; {nombre de corrections de paramŠtres} - YCodeAval : YTabInt1; {code pour Qavalrestit : -2= sup … QFV, -1=QFV, 0=ajust‚, 1=QRV, 2= inf … QRV} - YCodePrise : YTabint1; {code pour Q prise : -2=Qemin, -1=QM-QFM, 0= ajust‚, 1=QM-QRM, 2=Qemax, 3=QM} - YcodeRepart : YTabInt1; {code pour d‚bit soutir‚ : -1= minimal, 0=ajust‚, 1=maximal} - YCodeRestit : YTabint1; {code pour Q restit : -1=Qsmax, 0=ajust‚, 1=Qsmin} + YDateFinLac : array[0..YNmaxLacs] of longint; {date finale du calcul … rebours} + + YCodeAval : YTabInt1; {code pour Qavalrestit : -2= sup … QVref, -1=QVref, 0=ajust‚, 1=QVres, 2= inf … QVres} + YCodePrise : YTabint1; {code pour Q prise : -4= inf … QEmin,-3=QEmin, -2=QM-QMref, -1=QM-QMres, 0= ajust‚, 1=QM, 2=QEmax, 3=QMsup … QEmax} + YcodeRepart : YTabInt1; {code pour d‚bit soutir‚ : -2= inf … minimal, -1= minimal<maximal, 0=ajust‚, 1=maximal=minimal, 2=maximal>minimal, 3= sup … maximal} + YCodeRestit : YTabint1; {code pour Q restit : -2=sup … QSmax, -1=Qsmax, 0=ajust‚, 1=Qsmin, 2=inf … QSmin} + YCodeSigne : YTabint1; {code pour Qstock‚ : 0 si de mˆme signe que QXsous, 1 sinon} + YJourDebutLac : YTabInt1; + YJourFinLac : YTabInt1; {jour de fin de calcul … rebours} + YMoisDebutLac : YTabInt1; + YMoisFinLac : YTabInt1; {mois de fin de calcul … rebours} YNam : YTabInt1; {nombre de stations amont} + YNbAn : YTabInt1; {nbre d'ann‚es entiŠres du calcul … rebours} YNint : YTabInt1; {nombre de stations interm‚diaires} - + YDecalDateV : YTabInt1; {d‚calage entier de date pour calcul des Vobj} YRangStatAv : YTabInt1; {rang de station aval dans fichier des d‚bits de base} YRangStatInt : YTabInt1; {rang de station interm‚diaire dans fichier des d‚bits de base} - YNCodeAval : array[1..YNmaxLacs,-3..2] of longint; + YNbQXdefNul : array[0..2,1..2] of longint; {nombre d'‚checs nuls,pour QXdef0, QXdef1 ou QXdef2, et pour sens inverse chrono ou sens chrono} + YNCodeAval : array[1..YNmaxLacs,-2..2] of longint; + YNCodePrise : array[1..YNmaxLacs,-4..3] of longint; YNcodeRepart : array[1..YNmaxLacs,-2..3] of longint; - YNCodePrise : array[1..YNmaxLacs,-3..3] of longint; - YNCodeRestit : array[1..YNmaxLacs,-2..1] of longint; - YNSucces : array[-3..2] of longint; + YNCodeRestit : array[1..YNmaxLacs,-2..2] of longint; + YNCodeSigne : array[1..YNmaxLacs,0..1] of longint; + YNSucces : array[-4..4] of longint; + YNSuccesA : array[-4..4] of longint; {YNSucces pour sens chronologique} + YNSuccesB : array[-4..4] of longint; {YNSucces pour sens chronologique inverse} + + YDateObj : array[0..366] of integer; {dates objectifs lues sur fichier} YRangStatAm : array[1..YNmaxLacs,1..2] of integer; {rang de station amont dans fichier des Q de base} - YNbPivot : array[1..YNmaxLacs,1..4] of integer; {nombre de dates pivot pour rŠgles de d‚bit} YNbFormule : array[1..YNmaxLacs,1..4] of integer; {nombre de formules pour rŠgles de d‚bit} + YNbPivot : array[1..YNmaxLacs,1..4] of integer; {nombre de dates pivot pour rŠgles de d‚bit} YTypeFormule : array[1..YNmaxLacs,1..4] of integer; {code entre 0 et 2 prise en compte ou non de gradient} YNbSeuil : array[1..YNmaxLacs,1..4,1..YNbmaxPivot] of integer; {nombre de seuil dans rŠgle de d‚bit} YQuantPivot : array[1..YNmaxLacs,1..4,1..YNbmaxPivot] of integer; {date de d‚but pour rŠgle de d‚bit} YRangFormule : array[1..YNmaxLacs,1..4,0..YNbmaxPivot] of integer; {rang de rŠgle de d‚bit} - YDateEnJour : array[0..YNMaxlacs] of longint; {date compt‚e en jours depuis le 31/12/1899} - YDateFinLac : array[0..YNmaxLacs] of longint; {date finale du calcul … rebours} +VAR {tableaux de r‚els, fa‡on fa‡on} - YD : YTab1; {* temps de propag entre restitution et station aval du systŠme} + YD : YTab1; {temps de propag entre restitution et station aval du systŠme} YdecalDateQ : YTab1; {partie fractionnaire de la date (en jour) des d‚bits de r‚servoir} - YDint : YTab1; {* temps de propag entre station interm‚diaire et station aval de r‚servoir} + YDint : YTab1; {temps de propag entre station interm‚diaire et station aval de r‚servoir} + YDuree : YTab1; {dur‚e th‚orique de remplissage} YPart : YTab1; {part de travail assign‚e au r‚servoir en fonction de son volume r‚gl‚} YPartTheorique: YTab1; {part de travail assign‚e au r‚servoir en fonction de son volume} - YQe : YTab1; {* d‚bit du canal de prise} - YQemax : YTab1; {* d‚bitance max de prise} - YQemin : YTab1; {* d‚bitance min de prise} - YQMnat : YTab1; {* d‚bit nat … prise, d‚cal‚ de -D par rapport … station aval systŠme (T = tps propag)} - YQMRef : Ytab1; {* d‚bit de r‚f‚rence juste … l'aval de la restitution} - YQMRes : YTab1; {* d‚bit r‚serv‚ juste … l'aval de la restitution} - YQV : YTab1; {* d‚bit du cours d'eau influenc‚ par le r‚servoir, juste … l'aval de la restitution} - YQVRef : Ytab1; {* d‚bit de r‚f‚rence juste … l'aval de la restitution} - YQVRes : YTab1; {* d‚bit r‚serv‚ juste … l'aval de la restitution} - YQs : YTab1; {* d‚bit du canal de restitution} - YQsmax : YTab1; {* d‚bitance max de restitution} - YQsmin : YTab1; {* d‚bitance min de restitution} - YQST : YTab1; {* d‚bit soutir‚ net local} - YQSTmax : YTab1; {* d‚bit soutir‚ net local maximal} - YQSTmin : YTab1; {* d‚bit soutir‚ net local minimal} - YQVnat : YTab1; {* d‚bit nat … restitution, d‚cal‚ de -D par rapport … station aval systŠme (T = tps propag)} + YQE : YTab1; {d‚bit de la prise} + YQEinf : YTab1; {d‚bit minimal de la prise} + YQEsup : YTab1; {d‚bit maximal de la prise} + YQEmax : YTab1; {d‚bitance maximale de la prise} + YQEmax0 : YTab1; {valeur de QEmax pour V=0} + YQEmax1 : YTab1; {valeur de QEmax pour V=Vtot} + YQEmin : YTab1; {d‚bitance minimale de la prise} + YQEmin0 : YTab1; {valeur de QEmin pour V=0} + YQEmin1 : YTab1; {valeur de QEmin pour V=Vtot} + YQMmoyen : YTab1; {d‚bit moyen de cours d'eau … la prise} + YQMfreqMoy : YTab1; {d‚bit moyen de cours d'eau … la prise pour un hydrogramme annuel isofr‚quence donn‚} + YQMref : YTab1; {d‚bit de r‚f‚rence … l'aval de la prise} + YQMres : YTab1; {d‚bit r‚serv‚ … l'aval de la prise} + YQS : YTab1; {d‚bit de la restitution} + YQSmax : YTab1; {d‚bitance maximale de la restitution} + YQSmax0 : YTab1; {valeur de QSmax pour V=0} + YQSmax1 : YTab1; {valeur de QSmax pour V=Vtot} + YQSmin : YTab1; {d‚bitance minimale de la restitution} + YQSmin0 : YTab1; {valeur de QSmin pour V=0} + YQSmin1 : YTab1; {valeur de QSmin pour V=Vtot} + YQST : YTab1; {d‚bit soutir‚ net local} + YQSTeffectif : YTab1; {d‚bit stock‚} + YQSTmax : YTab1; {d‚bit soutir‚ net local maximal} + YQSTmax1 : YTab1; {valeur maximale de d‚bit stock‚ impos‚e par les contraintes physiques et consignes locales} + YQSTmax2 : YTab1; {valeur maximale de d‚bit stock‚ impos‚e par le volume pr‚sent dans le r‚servoir} + YQSTmin : YTab1; {d‚bit soutir‚ net local minimal} + YQSTmin1 : YTab1; {valeur minimale de d‚bit stock‚ impos‚e par les contraintes physiques et consignes locale} + YQSTmin2 : YTab1; {valeur minimale de d‚bit stock‚ impos‚e par le volume pr‚sent dans le r‚servoir} + YQSTpot : YTab1; {d‚bit stock‚ th‚orique dans le r‚servoir, pour ‚quilibrage des taux de remplissage ou des dur‚es de remplissage} + YQV : YTab1; {d‚bit du cours d'eau influenc‚ par le r‚servoir, juste … l'aval de la restitution} + YQVdef : YTab1; {d‚faillance de d‚bit … l'aval de la restitution, caus‚e par manque de capacit‚} + YQVref : YTab1; {d‚bit de r‚ference … l'aval de la restitution} + YQVres : YTab1; {d‚bit r‚serv‚ … l'aval de la restitution} YQVVeille : YTab1; {d‚bit de la veille au point de restitution} YReglage : YTab1; {ajustement demand‚ du volume (fraction du volume cumul‚ de tous les r‚servoirs)} - YSav : YTab1; {* superficie de BV … station aval de r‚servoir} - YSint : YTab1; {* superficie de BV … station interm‚diaire de r‚servoir} - YVdefmax : YTab1; {valeur maximale de capacit‚ manquante Vdef} + YSav : YTab1; {superficie de BV … station aval de r‚servoir} + YSint : YTab1; {superficie de BV … station interm‚diaire de r‚servoir} + YTPot : YTab1; {temps minimal de remplissage du volume vide} + YVDebut : YTab1; {volume du reservoir au d‚but de simulation en sens chrono} + YVFin : YTab1; {volume de r‚servoir au d‚but du calcul … rebours} + YVges : YTab1; {volume de r‚servoir au cours du calcul en sens chrono} + YVmedian : YTab1; {volume median de r‚servoir … la date JJMM (d‚but calcul … rebours)} + YVobj : YTab1; {volume limite … respecter pour satisfaire au mieux l'objectif aval (calcul‚ … rebours)} YVobjAnt : YTab1; - YVobjNouv : Ytab1; - YVtot : YTab1; {* volume maximal stockable dans le r‚servoir} + YVobjNouv : YTab1; + YVolume : YTab1; {volume d'eau dans le r‚servoir} + YVolumePeutEtr: YTab1; {valeur temporaire de YVolume, adopt‚e si convergence} + YVop : YTab1; {volume op‚rationnel (combinaison de Vobj et Vges)} YVRtot : YTab1; {pareil que Vtot, mais r‚gl‚ pour r‚partition des taches} + YVpot : YTab1; {volume objectif th‚orique en fin de pas de temps, ‚quilibrant les dur‚es potentielles minimales de reconstitution de volume utilisable max} + YVtot : YTab1; {volume maximal stockable dans le r‚servoir} - YValBonneDate : YTab2; {valeurs d'une variable correspondant … une date JJMM … l'int‚rieur d'une chronique} YTpsRet : YTab2; {temps de retour utilis‚s dans l'analyse statistique} - YDam : array[1..YNmaxLacs,1..2] of double; {* temps de propagation entre station amont et station aval de r‚servoir} - YDM : array[1..YNmaxLacs,1..2] of double; {* d‚lai de propag. entre point de prise et station aval de r‚servoir} - YDV : array[1..YNmaxLacs,1..2] of double; {* d‚lai de propag. entre point de restit. et station aval de r‚servoir} - YSam : array[1..YNmaxLacs,1..2] of double; {* superficie de BV … station amont de r‚servoir} - YSM : array[1..YNmaxLacs,1..2] of double; {* superficie de BV au point de prise de r‚servoir} - YSV : array[1..YNmaxLacs,1..2] of double; {* superficie de BV au point de restitution de r‚servoir} + YQXdef : YTab3; {d‚faillance de d‚bit … station aval due … : + 0: contraintes physiques et consignes locales + 1: contraintes physiques et consignes locales, ainsi que volumes pr‚sents et capacit‚ des r‚servoirs + 2: volumes pr‚sents et capacit‚ des r‚servoirs} + + YNorme : array[0..YNmaxlacs] of double; {norme d'‚dition des volumes (1 pour valeur absolue, Vtot pour valeur relative)} + YVdefmax : array[0..YNmaxlacs] of double; {valeur maximale de capacit‚ manquante Vdef} + + YVManqueMax : array[1..2] of double; {manque max de volume global exploitable pour minimiser les d‚faillances, sens chrono et pas chrono} + + YSollicitation: array[1..3] of YTab1; {taux quadratique de sollicitation de r‚servoir, en sens pas chrono, sens chrono et moyenne des deux} + + YVobjMoyrel : array[1..2] of YTab1; {valeur moyenne de Vobj divis‚e par YVtot, en sens pas chrono et sens chrono} + + YQXdefmax : array[1..2,1..2] of double; {QXdef1 ou QQXdef2 ; sens pas chrono et sens chrono} + YQXdefmed : array[1..2,1..2] of double; {QXdef1 ou QQXdef2 ; sens pas chrono et sens chrono} + YQXdefmin : array[1..2,1..2] of double; {QXdef1 ou QQXdef2 ; sens pas chrono et sens chrono} + YQXdefmoy : array[1..2,1..2] of double; {QXdef1 ou QQXdef2 ; sens pas chrono et sens chrono} + YQXdefmoyGlop : array[0..2,1..3] of double; {QXdef0,QXdef1 ou QXdef2;chrono inverse ou chrono} YBorneGradient: array[1..YNmaxLacs,1..4] of double; {gradient max permis … la restitution} + {YBorneDebit : array[1..YNmaxLacs,1..4] of double;} {max de d‚bit r‚serv‚ ou de r‚f‚rence en situation normale} + YDam : array[1..YNmaxLacs,1..2] of double; {temps de propagation entre station amont et station aval de r‚servoir} + YDm : array[1..YNmaxLacs,1..2] of double; {d‚lai de propag. entre point de prise et station aval de r‚servoir} + YDv : array[1..YNmaxLacs,1..2] of double; {d‚lai de propag. entre point de restit. et station aval de r‚servoir} + YSam : array[1..YNmaxLacs,1..2] of double; {superficie de BV … station amont de r‚servoir} + YSm : array[1..YNmaxLacs,1..2] of double; {superficie de BV au point de prise de r‚servoir} + YSv : array[1..YNmaxLacs,1..2] of double; {superficie de BV au point de restitution de r‚servoir} + + YValBonneDate : array[1..YNmaxlacs] of YTab2; {valeurs d'une variable correspondant … une date JJMM … l'int‚rieur d'une chronique} YQ : array[0..YNmaxStat,YDelaiMin..YDelaiMax] of double; {d‚bit stations ou aval syst., prises et restitutions} - YSeuil : array[1..YNmaxLacs,1..4,1..YNbmaxPivot,1..YNbmaxSeuil] of double; {seuil Q amont pour rŠgle Q r‚s. ou ref.} YDebit : array[1..YNmaxLacs,1..4,1..YNbmaxPivot,1..YNbmaxSeuil] of double; {Q pour rŠgle de d‚bit r‚s. ou ref.} + YSeuil : array[1..YNmaxLacs,1..4,1..YNbmaxPivot,1..YNbmaxSeuil] of double; {seuil Q amont pour rŠgle Q r‚s. ou ref.} - YQObj : array[0..366] of double; {* d‚bits objectifs calcul‚s pour chaque jour de l'ann‚e} YDebitObj : array[0..366] of double; {d‚bits objectifs lus sur fichier} + YQXobj : array[0..366] of double; {d‚bits objectifs calcul‚s pour chaque jour de l'ann‚e} - YQdefRare : YTypFreq; - YQdefFrequent: YTypFreq; + YQMNfreq : array[0..YNmaxLacs,1..365] of double; {valeurs de YQXsous et YQMnat en fonction du quantiŠme, pour une fr‚quence de non d‚passement donn‚e} - YDateObj : array[0..366] of integer; {dates objectifs lues sur fichier} + YQXdefFrequent : array[1..2,1..2] of YTypFreq; {pour QXdef1 ou QXdef2 et sens pas chrono et sens chrono} + YQXdefRare : array[1..2,1..2] of YTypFreq; {pour QXdef1 ou QXdef2 et sens pas chrono et sens chrono} + +VAR {enregistrements} + + YDeb2 : YTypDeb2; + YQVemax : array[1..YNmaxLacs] of YBareme; {bareme de d‚bitance max de prise} + YQVemin : array[1..YNmaxLacs] of YBareme; {bareme de d‚bitance min de prise} + YQVsmax : array[1..YNmaxLacs] of YBareme; {bareme de d‚bitance max de restitution} + YQVsmin : array[1..YNmaxLacs] of YBareme; {bareme de d‚bitance min de restitution} IMPLEMENTATION diff --git a/src/ECRAN.PAS b/src/ECRAN.PAS index 04090078ba7891a6e734ec28fc23bf43453da355..4c9df477a53a3144d97b9b034a458b638f177ebb 100644 --- a/src/ECRAN.PAS +++ b/src/ECRAN.PAS @@ -2,111 +2,171 @@ UNIT ECRAN; interface -uses crt, Interfas, Utilit, Declara; - -procedure Ysaisie1; -procedure YSaisie2; -procedure Ysaisie3; -procedure YSaisie4; -procedure YSaisie5; -procedure YSaisie6; -procedure YSaisie7; -procedure Ysaisie8; -procedure YSaisie9; -procedure YSaisie10; - +uses crt, Utilit, Interfas, DECLARA; + +procedure E_Message1; +procedure E_Saisie2; +procedure E_Saisie6; +procedure E_Saisie7; +procedure E_Message7; +procedure E_Message9; +procedure E_Message10; +procedure E_Message11; +procedure E_Message12; IMPLEMENTATION - procedure YSaisie1; + procedure E_Message1; begin - AWindow1; + A_Window1; clrscr; - Atitre; + A_titre; end; - procedure Ysaisie2; + procedure E_saisie2; begin - aquest; + a_quest; + writeln; write('type du d‚bit objectif : minimal ('); - ASulad; + A_Sulad; write(0); - aquest; + a_quest; write(') ou maximal ('); - apropo; + a_propo; write(1); - aquest; + a_quest; write(') ? '); - AchoixOption(YTypeObjectif,0,1,0); + A_choixOption(YTypeObjectif,0,1,0); writeln; - ATitre; - write ('calcul des d‚bits stock‚s, pr‚lev‚s et restitu‚s pour l''objectif du '); - ALecture_xy; + A_titre; + write('synchronisation des d‚bits et analyse des lacunes : en cours'); + A_Lecture_xy; end; - procedure YSaisie3; - begin - gotoxy(Ax,Ay); - write(YJJ_MM_AAAA); - end; - - procedure YSaisie4; + procedure E_Saisie6; begin - gotoxy(Ax-20,Ay); + gotoxy(Ax-8,Ay); clreol; - writeln(' : termin‚'); - end; - - procedure YSaisie5; - begin - ATitre; + writeln('termin‚'); + writeln; + A_Titre; write('p‚riode la plus longue de r‚sultats utilisables : '); - writeln('du ',ADate(YMeilleurDebut),' au ',ADate(YMeilleurFin)); + writeln('du ',B_Date(YMeilleurDebut),' au ',B_Date(YMeilleurFin)); writeln; - end; - - procedure YSaisie6; - begin - Aquest; + A_quest; write('dates de d‚but et fin des calculs (jjmmaaaa) ? '); - ALecture_xy; - ASaisidate (YJour,YMois,YAn,YChaine,ADate(YMeilleurDebut),ADate(YMeilleurFin-3*365)); - YDateDebut:=ATJour(YAn,YMois,YJour); + A_Lecture_xy; + A_Saisidate (YJour[0],YMois[0],YAn,YChaine,B_Date(YMeilleurDebut),B_Date(YMeilleurFin-3*365)); + YDateDebut:=B_TJour(YAn,YMois[0],YJour[0]); gotoxy(Ax+10,Ay); - ASaisidate (YJour,YMois,YAn,YChaine,ADate(YDateDebut+3*365),ADate(YMeilleurFin)); - YDateFin:=ATJour(YAn,YMois,YJour); + A_Saisidate (YJour[0],YMois[0],YAn,YChaine,B_Date(YDateDebut+3*365),B_Date(YMeilleurFin)); + YDateFin:=B_TJour(YAn,YMois[0],YJour[0]); end; - procedure Ysaisie7; + procedure E_Saisie7; begin - Atexte; - write('la p‚riode, inf‚rieure … 3 ans, est trop courte. ABANDON du calcul'); - ATapez; + A_quest; + writeln; + write('r‚sultats de volumes ‚dit‚s en valeurs absolues ('); + A_Sulad; write(1); A_quest; + write(') ou relatives ('); + A_Propo; write('2'); A_quest; write(') ? '); + A_ChoixOption(YAbsRel,1,2,1); + A_quest; + writeln; + write('mode de r‚partition des stockages : fig‚e ('); + A_propo; write(1); A_quest; + write(') ou variable ('); + A_sulad; write('2'); A_quest; write(') ? '); + A_ChoixOption(YOptionRepart,1,2,2); + if YOptionRepart=2 then + begin + A_titre; + writeln; + writeln('options disponibles pour la r‚partition variable :'); + A_Propo; write(' 2'); A_titre; + writeln(' : r‚partition en fonction de V et Tpot (duree potentielle minimale de'); + writeln(' reconstitution du volume utilisable maximal)'); + A_propo; write(' 3'); A_titre; + writeln(' : r‚partition visant … ‚quilibrer V/Vtot entre r‚servoirs'); + A_Sulad; write(' 4'); A_titre; + writeln(' : r‚partition visant … ‚quilibrer, entre les r‚servoirs, la dur‚e'); + writeln(' potentielle minimale Tpot1 de reconstitution du volume utilisable maximal'); + A_propo; write(' 5'); A_titre; + writeln(' : r‚partition visant … ‚quilibrer, entre les r‚servoirs, la dur‚e'); + writeln(' potentielle minimale Tpot2 d''‚puisement complet du volume utilisable'); + A_Quest; + write('option choisie ? '); + A_ChoixOption(YOptionRepart,2,5,4); + if YOptionRepart>3 then + begin + YCodeTpot:=(YOptionRepart=4); + A_titre; + writeln; + write('choix des d‚bits dans les cours d''eau, … utiliser pour calculer TPot'); + if YOptionRepart=4 then + write('1') + else + write('2'); + writeln(' :'); + A_Sulad; write(' 1'); A_titre; + writeln(' : valeurs moyennes interannuelles'); + A_propo; write(' 2'); A_titre; + writeln(' : hydrogrammes annuels isofr‚quence'); + A_Quest; + write('option choisie ? '); + A_ChoixOption(YOptionRepart,1,2,1); + YOptionRepart:=YOptionRepart+3; + end; + end; + A_titre; + writeln; end; - procedure Ysaisie8; + procedure E_Message7; begin - ATitre; - writeln; - write('volumes calcul‚s (it‚r.) : '); + A_texte; + write('la p‚riode, inf‚rieure … 3 ans, est trop courte. ABANDON du calcul'); + A_Tapez; end; - procedure ysaisie9; + procedure E_Message9; begin + gotoxy(Ax,Ay); + writeln('termin‚e'); writeln; write('analyse statistique des r‚sultats : '); - Alecture_xy; + A_lecture_xy; write('en cours'); end; - procedure Ysaisie10; + procedure E_Message10; begin gotoxy(Ax,Ay); writeln('termin‚e'); + writeln; writeln('FIN NORMALE DU PROGRAMME'); - ATapez; + if YSaisie then + A_Tapez; + end; + + procedure E_Message11; + begin + A_window1; + clrscr; + A_Titre; + writeln; + writeln; + writeln('ECHEC DU PROGRAMME'); + A_tapez; end; + procedure E_Message12; + begin + write(' ‚dition du bilan : '); + A_Lecture_xy; + write ('en cours'); + end; BEGIN diff --git a/src/ENDE.PAS b/src/ENDE.PAS new file mode 100644 index 0000000000000000000000000000000000000000..9163cb934d1c0d74052d15504eca9f8ce17e2bba --- /dev/null +++ b/src/ENDE.PAS @@ -0,0 +1,16 @@ +Program Ende; + + +{cr‚ation et fermeture du fichier marquant la fin de SURVGEST} + + const + XNomFicFin = 'FiniFini'; + + var + XFitext : text; + + begin + assign(XFitext,XNomFicFin); + rewrite(XFitext); + close(XFitext); + end. \ No newline at end of file diff --git a/src/INTERFAS.PAS b/src/INTERFAS.PAS index a0359bc22fc46fed14e8c21e68fc61c7b793777b..1ae500743148938489874855ff3517a08337090a 100644 --- a/src/INTERFAS.PAS +++ b/src/INTERFAS.PAS @@ -9,17 +9,11 @@ USES crt, Utilit; const ANbTouchSpecial = 3; - + ANomFicTailleFenetre='TaillFen.txt'; type ATypTouch = array[1..ANbTouchSpecial] of boolean; const - ALPT : string[20]= 'lpt1'; - ANomExistImp= 'ExistImp'; - ANomImprim = 'CODEIMPR.txt'; - APrnPetit : string= '&k2S'; - APrnLignSer : string= '&l8D'; - APrnEject : string= '&l0H'; ASpecialFalse : ATypTouch = (false,false,false); ATouchSpecialAutorise : ATypTouch = (false,false,false); ACodeToucheSpecial:array[1..3,1..2] of integer = ((27,0),(0,83),(0,75)); @@ -28,145 +22,90 @@ var ATouchSpecial : ATypTouch; {1: ‚chap; 2:suppr; 3:arriŠre} ARangTouchSpecial:integer; ALignemax : integer; + ALignmaxEcran : integer; Ax : integer; Ay : integer; - ADelai : integer; - AMotDepasse : AChai4; - ADestin : integer; {1:impression, 2:fichier, 3:‚cran} - -procedure ASautScr(Zi:integer); -procedure ASouligne(Zn:integer); -procedure ADoubleSoulignSCr(Zn:integer); -procedure ASoulignScr(Zn:integer); -procedure AAlerte; -procedure ABruit; -procedure AAbandon; -procedure AAvorte; -procedure ATapez; -procedure ACouleur (Zi,Zj:integer); -procedure ATitre; -procedure ATexte; -procedure APropo; -procedure ASulad; -procedure AChoix; -procedure AQuest; -procedure AClign; -procedure AAchtu; -function AMopas:boolean; -procedure ASaisisi; -procedure ALecture_xy; -procedure AAutoriseTouche(ZEchap,ZSuppr,ZArrier:boolean); -procedure AReponselem (var ZNom:string; ZTaille:integer; ZAccepte:Aensemble); -procedure AReponse (var ZNom:string;ZTaille:integer); -procedure AReponseNu (var ZNom:string;ZTaille:integer); -procedure AMenu (ZS:string; Zi:integer; ZChoix:boolean); -procedure AChoisissez; -procedure ADemandeChoix; -procedure AOuinon (Zselon:boolean); -procedure AValid; -procedure AChoixOption (var ZOption:integer;ZOptionMin,ZOptionMax,ZPrefere:integer); -procedure ASaisireel (var ZR:Aprecis2; ZRmin,ZRmax:Aprecis2; ZTaille:integer); -procedure ASaisiint (var ZR:integer; ZRmin,ZRmax:integer; ZTaille:integer); -procedure ASaisidate (var Zjour,Zmois,Zan:integer; var ZDada:string; ZDadamin,ZDadamax:string); -procedure AWindow(C1,L1,C2,L2:integer); -procedure Awindow1; -procedure Awindow15; -procedure Awindow2; -procedure Awindow25; -procedure Awindow3; -procedure Awindow35; -procedure Awindow355; -procedure Awindow4; -procedure Awindow45; -procedure Awindow451; -procedure Awindow455; -procedure Awindow4555; -procedure Awindow5; -procedure Awindow55; -procedure Awindow6; -procedure Awindow7; -procedure AFrein; -procedure Aeditmajusc; + Alst : text; + +procedure A_Tapez; +procedure A_Couleur (Zi,Zj:integer); +procedure A_Titre; +procedure A_Texte; +procedure A_Propo; +procedure A_Sulad; +procedure A_Choix; +procedure A_Quest; +procedure A_Clign; +procedure A_Lecture_xy; +procedure A_AutoriseTouche(ZEchap,ZSuppr,ZArrier:boolean); +procedure A_Reponselem (var ZNom:string; ZTaille:integer; ZAccepte:Bensemble); +procedure A_Reponse (var ZNom:string;ZTaille:integer); +procedure A_ReponseNu (var ZNom:string;ZTaille:integer); +procedure A_Menu (ZS:string; Zi:integer; ZChoix:boolean); +procedure A_Choisissez; +procedure A_DemandeChoix; +procedure A_Ouinon (Zselon:boolean); +procedure A_Valid; +procedure A_ChoixOption (var ZOption:integer;ZOptionMin,ZOptionMax,ZPrefere:integer); +procedure A_Saisireel (var ZR:Bprecis2; ZRmin,ZRmax:Bprecis2; ZTaille:integer); +procedure A_Saisiint (var ZR:integer; ZRmin,ZRmax:integer; ZTaille:integer); +procedure A_Saisidate (var Zjour,Zmois,Zan:integer; var ZDada:string; ZDadamin,ZDadamax:string); +procedure A_Window(C1,L1,C2,L2:integer); +procedure A_window1; +procedure A_window15; +procedure A_window2; +procedure A_window25; +procedure A_window3; +procedure A_window35; +procedure A_window355; +procedure A_window4; +procedure A_window45; +procedure A_window451; +procedure A_window455; +procedure A_window4555; +procedure A_window5; +procedure A_window55; +procedure A_window6; +procedure A_window7; {============================================================================} IMPLEMENTATION +procedure A_Couleur(Zi,Zj:integer); begin textbackground(Zi); textcolor(Zj); end; -procedure ASautScr(Zi:integer); - var Xk:integer; begin for Xk:=1 to Zi do writeln; end; - -procedure ASouligne(Zn:integer); - var Xk:integer; begin for Xk:=1 to Zn do write(Alst,'-'); writeln(Alst); end; - -procedure ADoubleSoulignSCr(Zn:integer); - var Xk:integer; begin for Xk:=1 to Zn do write('='); writeln; end; - -procedure ASoulignScr(Zn:integer); - var Xk:integer; begin for Xk:=1 to Zn do write(chr(196)); writeln; end; - -procedure AAlerte; begin {sound(50);} delay(ADelai); nosound; end; - -procedure ABruit ; begin {sound(100);} delay(ADelai); nosound; end; - -procedure ACouleur(Zi,Zj:integer); begin textbackground(Zi); textcolor(Zj); end; - -procedure ATitre; begin ACouleur(0,15); end; - -procedure ATexte; begin ACouleur(0,12); end; +procedure A_Titre; begin A_Couleur(0,15); end; -procedure APropo; begin ACouleur(0,2); end; +procedure A_Texte; begin A_Couleur(0,12); end; -procedure ASulad; begin ACouleur(0,10+blink); end; +procedure A_Propo; begin A_Couleur(0,2); end; -procedure AChoix; begin ACouleur(4,14); end; +procedure A_Sulad; begin A_Couleur(0,10+blink); end; -procedure AQuest; begin ACouleur(0,11); end; +procedure A_Choix; begin A_Couleur(4,14); end; -procedure AClign; begin ACouleur(0,31); end; +procedure A_Quest; begin A_Couleur(0,11); end; -procedure AAchtu; begin AAlerte; AClign; end; - -procedure AAbandon; - begin AAlerte; AAchtu; writeln; write('PROCEDURE ABANDONNEE'); delay(65*ADelai); ATitre; end; - -procedure AAvorte; - begin AAlerte; AAchtu; writeln; writeln('PROCEDURE AVORTEE'); delay(65*ADelai); ATitre; end; +procedure A_Clign; begin A_Couleur(0,31); end; {----------------------------------------------------------------------------} -procedure ATapez; +procedure A_Tapez; var XCh:char; begin - ASautscr(2);write('tapez une touche'); - Abruit; repeat until keypressed; while keypressed do XCh:=readkey; + while keypressed do Xch:=readkey; + writeln; writeln; write('tapez une touche'); + repeat until keypressed; while keypressed do XCh:=readkey; end; {----------------------------------------------------------------------------} -function AMopas:boolean; - - begin - if AMotdepasse<>'babu' then - begin - Abruit;writeln; AQuest; write(' Mot de passe ? '); - ACouleur(0,0); readln(AMotdepasse); if AMotdepasse<>'babu' then AAlerte; - ATitre; AMopas:=(AMotdepasse='babu'); - end - else AMopas:=true; - end; - -procedure ASaisisi; - begin ATitre; clrscr; writeln('SAISIE'); writeln; end; - -{----------------------------------------------------------------------------} - -procedure ALecture_xy; +procedure A_Lecture_xy; begin Ax:=wherex; Ay:=wherey; end; {----------------------------------------------------------------------------} -procedure AAutoriseTouche(ZEchap,ZSuppr,ZArrier:boolean); +procedure A_AutoriseTouche(ZEchap,ZSuppr,ZArrier:boolean); begin ATouchSpecialAutorise :=ASpecialFalse; ATouchSpecialAutorise[1]:=ZEchap; @@ -176,7 +115,7 @@ procedure AAutoriseTouche(ZEchap,ZSuppr,ZArrier:boolean); {---------------------------------------------------------------------------} -procedure AReponselem(var ZNom:string; ZTaille:integer; ZAccepte:Aensemble); +procedure A_Reponselem(var ZNom:string; ZTaille:integer; ZAccepte:Bensemble); var Xch:char; X1:integer; @@ -185,8 +124,8 @@ procedure AReponselem(var ZNom:string; ZTaille:integer; ZAccepte:Aensemble); begin ARangTouchSpecial:=0; ATouchSpecial:=ASpecialFalse; - ABruit; textbackground(0); - gotoxy(Ax,Ay); clreol; AChoix; ZNom:=''; + textbackground(0); + gotoxy(Ax,Ay); clreol; A_Choix; ZNom:=''; for Xi:=1 to ZTaille do write(' '); gotoxy(Ax,Ay); repeat @@ -221,8 +160,7 @@ procedure AReponselem(var ZNom:string; ZTaille:integer; ZAccepte:Aensemble); begin ZNom:=ZNom+XCh; write(XCh); end else if (ord(XCh)=8) and (length(ZNom)>0) then - begin ZNom:=copy(ZNom,1,length(ZNom)-1); write(XCh); write(' '); write(XCh); end - else if (Ord(XCh)<>13) and (ARangTouchSpecial=0) then AAlerte; + begin ZNom:=copy(ZNom,1,length(ZNom)-1); write(XCh); write(' '); write(XCh); end; while keypressed do XCh:=readkey; until (ord(XCh)=13) or (ARangTouchSpecial<>0); if ord(XCh) = 13 then @@ -236,95 +174,92 @@ procedure AReponselem(var ZNom:string; ZTaille:integer; ZAccepte:Aensemble); {----------------------------------------------------------------------------} -procedure AReponse(var ZNom:string; ZTaille:integer); +procedure A_Reponse(var ZNom:string; ZTaille:integer); begin - AReponselem(ZNom,ZTaille,[32,43,44,45,46,48..58,65..90,92,95,97..122]); + A_Reponselem(ZNom,ZTaille,[32,43,44,45,46,48..58,65..90,92,95,97..122]); end; {----------------------------------------------------------------------------} -procedure AReponseNu(var ZNom:string; ZTaille:integer); +procedure A_ReponseNu(var ZNom:string; ZTaille:integer); begin - AReponselem(ZNom,ZTaille,[43,45,46,48..58]); + A_Reponselem(ZNom,ZTaille,[43,45,46,48..58]); end; {----------------------------------------------------------------------------} -procedure AMenu(ZS:string; Zi:integer; ZChoix:boolean); +procedure A_Menu(ZS:string; Zi:integer; ZChoix:boolean); begin - ATexte; write(ZS); - if ZChoix then ASulad else APropo; - write(Zi); ATexte; writeln + A_Texte; write(ZS); + if ZChoix then A_Sulad else A_Propo; + write(Zi); A_Texte; writeln end; -procedure AChoisissez; - begin ATitre ;writeln (' Choisissez une des options suivantes:'); writeln; end; +procedure A_Choisissez; + begin A_Titre ;writeln (' Choisissez une des options suivantes:'); writeln; end; -procedure ADemandeChoix; - begin writeln; AQuest; write (' option choisie ? '); end; +procedure A_DemandeChoix; + begin writeln; A_Quest; write (' option choisie ? '); end; {----------------------------------------------------------------------------} -procedure AOuinon(ZSelon:boolean); +procedure A_Ouinon(ZSelon:boolean); var XBon: boolean; begin repeat - AReponse(ANom,1); - if ANom='' then + A_Reponse(BNom,1); + if BNom='' then begin - if ZSelon then ANom:='O'else ANom:='N'; - gotoxy(Ax,Ay); AChoix; write(ANom); textbackground(0); WRITELN; + if ZSelon then BNom:='O'else BNom:='N'; + gotoxy(Ax,Ay); A_Choix; write(BNom); textbackground(0); WRITELN; end; - if (ANom='o') or (ANom='0') then ANom:='O'; if (ANom='n') then ANom:='N'; - XBon:= (ANom='O') or (ANom='N') ; - if not XBon then AAlerte; + if (BNom='o') or (BNom='0') then BNom:='O'; if (BNom='n') then BNom:='N'; + XBon:= (BNom='O') or (BNom='N') ; until XBon end; -procedure AValid; +procedure A_Valid; begin - AQuest; writeln; write(' validation ('); ASulad; write('O'); - AQuest; write('/'); APropo; write('N'); AQuest; write(') ? '); ALecture_xy; - AOuinon(true); + A_Quest; writeln; write(' validation ('); A_Sulad; write('O'); + A_Quest; write('/'); A_Propo; write('N'); A_Quest; write(') ? '); A_Lecture_xy; + A_Ouinon(true); end; {----------------------------------------------------------------------------} -Procedure AChoixOption(var ZOption:integer;ZOptionMin,ZOptionMax,ZPrefere:integer); +Procedure A_ChoixOption(var ZOption:integer;ZOptionMin,ZOptionMax,ZPrefere:integer); var XBon:boolean; begin - Alecture_xy; + A_lecture_xy; {$i-} repeat - AReponseNu(ANom,3); - if ANom='' then + A_ReponseNu(BNom,3); + if BNom='' then begin - str(ZPrefere,ANom); gotoxy(Ax,Ay); AChoix; write(ZPrefere); Textbackground(0); - delay(10*ADElai); writeln; + str(ZPrefere,BNom); gotoxy(Ax,Ay); A_Choix; write(ZPrefere); Textbackground(0); + writeln; end; - val(ANom,ZOption,ACode); - XBon:= ((ioresult=0) and (ACode=0) and (ZOption>=ZOptionMin) and (ZOption<=ZOptionMax)) - or (ANom=''); - if not XBon then AAlerte; + val(BNom,ZOption,BCode); + XBon:= ((ioresult=0) and (BCode=0) and (ZOption>=ZOptionMin) and (ZOption<=ZOptionMax)) + or (BNom=''); until XBon; {$i+} end; {----------------------------------------------------------------------------} -procedure ASaisireel(var ZR:Aprecis2;ZRmin,ZRmax:Aprecis2; ZTaille:integer); +procedure A_Saisireel(var ZR:Bprecis2;ZRmin,ZRmax:Bprecis2; ZTaille:integer); var XBon:boolean; begin - ALecture_xy; + A_Lecture_xy; {$i-} repeat - AReponseNu(ANom,ZTaille); - val(ANom,ZR,ACode); - XBon:=((ioresult=0) and (ACode=0) and (ZR>=ZRmin) and (ZR<=ZRMax)) + A_ReponseNu(BNom,ZTaille); + val(BNom,ZR,BCode); + XBon:=((ioresult=0) and (BCode=0) and (ZR>=ZRmin) and (ZR<=ZRMax)) or (ARangTouchSpecial<>0); - if not XBon then AAlerte; until XBon; {$i+} end; @@ -332,112 +267,106 @@ procedure ASaisireel(var ZR:Aprecis2;ZRmin,ZRmax:Aprecis2; ZTaille:integer); {----------------------------------------------------------------------------} -procedure ASaisiint(var ZR:integer;ZRmin,ZRmax:integer; ZTaille:integer); +procedure A_Saisiint(var ZR:integer;ZRmin,ZRmax:integer; ZTaille:integer); var XBon:boolean; begin - ALecture_xy; + A_Lecture_xy; {$i-} repeat - AReponseNu(ANom,ZTaille); - val(ANom,ZR,ACode); - XBon:=((ioresult=0) and (ACode=0) and (ZR>=ZRmin) and (ZR<=ZRMax)) + A_ReponseNu(BNom,ZTaille); + val(BNom,ZR,BCode); + XBon:=((ioresult=0) and (BCode=0) and (ZR>=ZRmin) and (ZR<=ZRMax)) or (ARangTouchSpecial<>0); - if not XBon then AAlerte; until XBon; {$i+} end; {----------------------------------------------------------------------------} -{----------------------------------------------------------------------------} - -procedure ASaisidate(var Zjour,Zmois,Zan:integer; var ZDada:string; ZDadamin,ZDadamax:string); +procedure A_Saisidate(var Zjour,Zmois,Zan:integer; var ZDada:string; ZDadamin,ZDadamax:string); {corrig‚ 2000} var XBon :boolean; - XMinizup,XMatouvu:Aprecis2; + XMinizup,XMatouvu:Bprecis2; begin - ALecture_xy; + A_Lecture_xy; {$i-} - val(copy(ZDadamin,1,2),Zjour,Acode1); val(copy(ZDadamin,4,2),Zmois,Acode2); - val(copy(ZDadamin,7,4),Zan,Acode3); + val(copy(ZDadamin,1,2),Zjour,Bcode1); val(copy(ZDadamin,4,2),Zmois,Bcode2); + val(copy(ZDadamin,7,4),Zan,Bcode3); XMinizup:=Zjour+100*ZMois+10000.0*ZAn; - val(copy(ZDadamax,1,2),Zjour,Acode1); val(copy(ZDadamax,4,2),Zmois,Acode2); - val(copy(ZDadamax,7,4),Zan,Acode3); + val(copy(ZDadamax,1,2),Zjour,Bcode1); val(copy(ZDadamax,4,2),Zmois,Bcode2); + val(copy(ZDadamax,7,4),Zan,Bcode3); XMatouvu:=Zjour+100*ZMois+10000.0*ZAn; repeat - Areponsenu(ANom,8); - ZDada:=copy(ANom,1,2)+'.'+copy(ANom,3,2)+'.'+copy(ANom,5,4); - val(copy(ZDada,1,2),Zjour,Acode1); val(copy(ZDada,4,2),Zmois,Acode2); - val(copy(ZDada,7,4),Zan,Acode3); - XBon:=((Acode1=0) and (Acode2=0) and (Acode3=0) and (Zmois>0) and (Zmois<13) and - (Zjour>0) and (Zjour<=Alongmois(ZAn,ZMois)) and + A_reponsenu(BNom,8); + ZDada:=copy(BNom,1,2)+'.'+copy(BNom,3,2)+'.'+copy(BNom,5,4); + val(copy(ZDada,1,2),Zjour,Bcode1); val(copy(ZDada,4,2),Zmois,Bcode2); + val(copy(ZDada,7,4),Zan,Bcode3); + XBon:=((Bcode1=0) and (Bcode2=0) and (Bcode3=0) and (Zmois>0) and (Zmois<13) and + (Zjour>0) and (Zjour<=B_longmois(ZAn,ZMois)) and ((Zjour+100*ZMois+10000.0*ZAn)<=XMatouvu) and ((Zjour+100*ZMois+10000.0*ZAn)>=XMinizup)) or (ARangTouchSpecial<>0); if not XBon then begin - AAlerte; - if wherey=25 then Ay:=23; + if wherey=ALignemax then Ay:=ALignemax-1; end; until XBon {$i+} end; {----------------------------------------------------------------------------} -procedure AWindow(C1,L1,C2,L2:integer); begin; window(C1,L1,C2,L2); Alignemax:=L2-L1+1; end; +procedure A_Window(C1,L1,C2,L2:integer); begin; window(C1,L1,C2,L2); Alignemax:=L2-L1+1; end; -procedure Awindow1; begin ; window(1,1,80,25); ALignemax:=25; end; +procedure A_window1; begin ; window(1,1,80,ALignmaxEcran); ALignemax:=ALignmaxEcran; end; -procedure Awindow15;begin ; window(1,2,80,25); ALignemax:=24; end; +procedure A_window15;begin ; window(1,2,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-1; end; -procedure Awindow2; begin ; window(1,3,80,25); ALignemax:=23; end; +procedure A_window2; begin ; window(1,3,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-2; end; -procedure Awindow25;begin ; window(1,4,80,25); ALignemax:=22; end; +procedure A_window25;begin ; window(1,4,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-3; end; -procedure Awindow3; begin ; window(1,5,80,25); ALignemax:=21; end; +procedure A_window3; begin ; window(1,5,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-4; end; -procedure Awindow35;begin ; window(1,6,80,25); ALignemax:=20; end; +procedure A_window35;begin ; window(1,6,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-5; end; -procedure Awindow355; begin ; window(1,7,80,25); ALignemax:=19; end; +procedure A_window355; begin ; window(1,7,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-6; end; -procedure Awindow4; begin ; window(1,8,80,25); ALignemax:=18; end; +procedure A_window4; begin ; window(1,8,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-7; end; -procedure Awindow45;begin ; window(1,10,80,25); ALigneMax:=16; end; +procedure A_window45;begin ; window(1,10,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-9; end; -procedure Awindow451;begin ; window(1,11,80,25); ALigneMax:=15; end; +procedure A_window451;begin ; window(1,11,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-10; end; -procedure Awindow455;begin ; window(1,12,80,25); ALigneMax:=14; end; +procedure A_window455;begin ; window(1,12,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-11; end; -procedure Awindow4555; begin ; window(1,13,80,25); ALignemax:=13; end; +procedure A_window4555; begin ; window(1,13,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-12; end; -procedure Awindow5; begin ; window(1,14,80,25); Alignemax:=12; end; +procedure A_window5; begin ; window(1,14,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-13; end; -procedure Awindow55; begin ; window(1,15,80,25); Alignemax:=11; end; - -procedure Awindow6; begin ; window(1,16,80,25); Alignemax:=10; end; - -procedure Awindow7; begin ; window(1,18,80,25); Alignemax:=8; end; - -{----------------------------------------------------------------------------} +procedure A_window55; begin ; window(1,15,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-14; end; -procedure AFrein; - var idelai :longint; - begin for idelai:=1 to Adelai do delay(10); end; +procedure A_window6; begin ; window(1,16,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-15; end; -{----------------------------------------------------------------------------} +procedure A_window7; begin ; window(1,18,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-17; end; -procedure Aeditmajusc; - var - Xi:shortint; - XC:char; - begin - for Xi:=1 to length(ANom) do write(upcase(ANom[Xi])); - end; {============================================================================} BEGIN Textmode(lo(lastmode)); ALignemax:=25; + ALignmaxEcran:=25; + {$i-} + assign(Alst,ANomFicTailleFenetre); + reset(Alst); + read(Alst,ALignMaxEcran); + if ioresult=0 then + begin + if (AlignMaxEcran>95) or (AlignMaxEcran<9) then + ALignMaxEcran:=25; + close(Alst); + end; + {$i+} + END. - \ No newline at end of file + diff --git a/src/PARAM.PAS b/src/PARAM.PAS index cce4ff09985e406417edcbc49fa18f3281f65aa3..981dcc1a2e97f8e7aabfa97c40b5f714deb56e6b 100644 --- a/src/PARAM.PAS +++ b/src/PARAM.PAS @@ -1,34 +1,58 @@ -UNIT PARAM; +UNIT PARAM; {JC Bader, nov 2016} INTERFACE uses Crt,Utilit,Interfas,DECLARA; - procedure EcritureSeparation; - procedure ChoixEntreeOptions; - procedure DatesLuesSurFichier; - procedure LectureRegles; - procedure EntreesLac; - procedure StationAval; - procedure EcritureParametresLacs(var ZFic:text); - procedure ContraintesEtConsignesLacs; - procedure EntreeReseaux; - procedure EcritureParametresReseaux(var ZFic:text); - procedure ParametresReseau; + function P_InterpolBareme(ZZV : double; ZZBareme : YBareme): double; + procedure P_EcritureSeparation; + procedure P_ChoixEntreeOptions; + procedure P_DatesLuesSurFichier; + procedure P_StationAval; + procedure P_ContraintesEtConsignesLacs; + procedure P_ParametresReseau; IMPLEMENTATION +{========================================================================} -{============================================================================} -procedure EcritureSeparation; +function P_InterpolBareme(ZZV : double; ZZBareme : YBareme): double; + var + Wi : integer; + begin + with ZZBareme do + begin + if YEffectif= 1 then + P_InterpolBareme:=YDebit[1] + else + begin + Wi:=1; + repeat + Wi:=Wi+1 + until (Wi=YEffectif) or (YVolume[Wi]>=ZZV); + P_InterpolBareme:=B_maxdouble(0,YDebit[Wi-1]+(YDebit[Wi]-YDebit[Wi-1])*(ZZV-YVolume[Wi-1])/(YVolume[Wi]-YVolume[Wi-1])); + end; + end; + end; {fin de fonction P_InterpoleBareme} + +{========================================================================} + +procedure P_EcritureSeparation; begin writeln(YFicSortie); writeln(YFicSortie,'=============================================================================='); writeln(YFicSortie); - end; + end; {fin de procedure P_EcritureSeparation} + +{========================================================================} +{--d‚termination du mode d'entr‚e des paramŠtres de calcul --} +{========================================================================} + +procedure P_ChoixEntreeOptions; + + var + XTpot : integer; -{============================================================================} -procedure ChoixEntreeOptions; begin assign(YFitext,YNomFicFin); @@ -38,7 +62,7 @@ procedure ChoixEntreeOptions; begin end; YSaisie:=true; - assign(YFitext,YNomFicMode); + assign(YFitext,YRepP+YNomFicMode); reset(YFitext); if ioresult=0 then begin @@ -49,7 +73,7 @@ procedure ChoixEntreeOptions; end; if not YSaisie then begin - assign(YFitext,YNomFicChoix); + assign(YFitext,YRepP+YNomFicChoix); reset(YFitext); writeln; writeln('Le contenu du fichier ',YNomFicMode,' entraŒne la lecture des options de calcul'); @@ -57,76 +81,103 @@ procedure ChoixEntreeOptions; if ioresult=0 then begin readln(YFitext,YNomFicLacs); + readln(YFitext,YRangPBarrage); + readln(YFitext,YRangPReseau); readln(YFitext,YNomFicDebit); readln(YFitext,YNomFicObjectif); readln(YFitext,YTypeObjectif); + if YTypeObjectif<>0 then + YTypeObjectif:=1; readln(YFiText,YDat1); readln(YFitext,YDat2); + readln(YFitext,YAbsRel); + if YAbsRel<>1 then + YAbsRel:=2; + readln(YFitext,YOptionrepart); + if YOptionRepart>3 then + begin + readln(YFitext,XTpot); + if XTpot=1 then + YCodeTpot:=true + else + YCodeTpot:=false; + end; close(YFitext); end else YSaisie:=true; end; + if YSaisie then + begin + A_Window1; + clrscr; + end; {$i+} - end; -{============================================================================} + end; {fin de P_ChoixEntreeOptions} + +{========================================================================} +{--Prise en compte des dates de d‚but et fin de calcul YDat1 et Ydat2 --} +{--(pr‚c‚demment lues directement sur fichier des options de calcul) --} +{--pour d‚finir la p‚riode de calcul [YDateDebut YdateFin] au sein de --} +{--la p‚riode [YMeilleurDebut YMeilleurFin]. --} +{========================================================================} -procedure DatesLuesSurFichier; +procedure P_DatesLuesSurFichier; begin YDateDebut:=YMeilleurDebut; - YDateFin:=YMeilleurFin; val(copy(YDat1,7,4),YAn,YCode); if YCode=0 then begin - val(copy(YDat1,4,2),YMois,YCode); - if (YCode=0) and (YMois>0) and (Ymois<13) then + val(copy(YDat1,4,2),YMois[0],YCode); + if (YCode=0) and (YMois[0]>0) and (Ymois[0]<13) then begin - val(copy(YDat1,1,2),YJour,YCode); - if (YCode=0) and (YJour>0) and (YJour<=ALongMois(YAn,YMois)) then + val(copy(YDat1,1,2),YJour[0],YCode); + if (YCode=0) and (YJour[0]>0) and (YJour[0]<=B_LongMois(YAn,YMois[0])) then begin - YDateDebut:=amaxlongInt(YmeilleurDebut,aminlongInt(ATJour(YAn,YMois,YJour),YMeilleurFin-3*365)); + YDateDebut:=B_maxlongInt(YmeilleurDebut,B_minlongInt(B_TJour(YAn,YMois[0],YJour[0]),YMeilleurFin-3*365)); end; end; end; val(copy(YDat2,7,4),YAn,YCode); if YCode=0 then begin - val(copy(YDat2,4,2),YMois,YCode); - if (YCode=0) and (YMois>0) and (Ymois<13) then + val(copy(YDat2,4,2),YMois[0],YCode); + if (YCode=0) and (YMois[0]>0) and (Ymois[0]<13) then begin - val(copy(YDat2,1,2),YJour,YCode); - if (YCode=0) and (YJour>0) and (YJour<=ALongMois(YAn,YMois)) then - YDateFin:=AminlongInt(AmaxlongInt(YDateDebut+3*365,ATJour(YAn,Ymois,YJour)),YmeilleurFin); + val(copy(YDat2,1,2),YJour[0],YCode); + if (YCode=0) and (YJour[0]>0) and (YJour[0]<=B_LongMois(YAn,YMois[0])) then + YDateFin:=B_minlongInt(B_maxlongInt(YDateDebut+3*365,B_TJour(YAn,Ymois[0],YJour[0])),YmeilleurFin); end; end; - end; + end; {fin de procedure P_DatesLuesSurFichier} {============================================================================} - procedure Controle (ZRang : integer; var Z : double; Z1,Z2:double); - begin - if (Z<Z1) or (Z>Z2) then - begin - Z:=Amindouble(Amaxdouble(Z,Z1),Z2); - YNbModif[ZRang]:=YNbModif[ZRang]+1; - end; - end; + +procedure Ici_Controle (ZRang : integer; var Z : double; Z1,Z2:double); + begin + if (Z<Z1) or (Z>Z2) then + begin + Z:=B_mindouble(B_maxdouble(Z,Z1),Z2); + YNbModif[ZRang]:=YNbModif[ZRang]+1; + end; + end; {fin de procedure Ici_Controle} {============================================================================} - procedure ControleEntier (ZRang : integer; var Z : integer; Z1,Z2:integer); - begin - if (Z<Z1) or (Z>Z2) then - begin - Z:=AminIn(AmaxIn(Z,Z1),Z2); - YNbModif[ZRang]:=YNbModif[ZRang]+1; - end; - end; +procedure Ici_ControleEntier (ZRang : integer; var Z : integer; Z1,Z2:integer); + begin + if (Z<Z1) or (Z>Z2) then + begin + Z:=B_minIn(B_maxIn(Z,Z1),Z2); + YNbModif[ZRang]:=YNbModif[ZRang]+1; + end; + end; {fin de procedure Ici_ControleEntier} {============================================================================} -procedure TestLecture (ZRangLac,ZTypeDebit,ZRangDonnee,ZRang : integer); +procedure Ici_TestLecture (ZRangLac,ZTypeDebit,ZRangDonnee,ZRang : integer); begin if ioresult<>0 then begin @@ -140,68 +191,83 @@ procedure TestLecture (ZRangLac,ZTypeDebit,ZRangDonnee,ZRang : integer); if ZRang<>0 then write(YFicSortie,'(',ZRang,')'); end; - end; + end; {fin de procedure Ici_TestLecture} {===========================================================================} {--Lecture des paramŠtres de station aval, lacs et Temps de propag. --} {--Ecriture sur fichier de sortie des ‚ventuels PB de lecture rencontr‚s. --} {===========================================================================} -procedure EntreesLac; +procedure Ici_EntreesLac; var + XIoResult : integer; XSeraRien : integer; Xi : integer; + XNbVersion : integer; XChai8 : YChai8; + XFic : text; + XEnTete : string; + XRangVersion : array[1..YNbmaxVersion] of integer; BEGIN {d‚but de procedure EntreeLacs} {--Message ‚cran d'entr‚e de programme, saisie du nom de fichier des lacs--} if YSaisie then begin - aTitre; + a_Titre; writeln(' CALCUL DES VOLUMES MINIMAUX OU MAXIMAUX QU''IL FAUT RESPECTER DANS DES'); writeln(' RESERVOIRS POUR POUVOIR SATISFAIRE AU MIEUX UN OBJECTIF DE GESTION COMMUN'); writeln(' (HYDROGRAMME ANNUEL MINIMAL OU MAXIMAL DEFINI A UNE STATION SITUEE A L''AVAL)'); writeln; - write('Le calcul n‚cessite certains paramŠtres et donn‚es pr‚alablement saisis selon un'); - writeln('format impos‚ dans des fichiers texte situ‚s dans les r‚pertoires suivants : '); + writeln('Le calcul n‚cessite certains paramŠtres et donn‚es pr‚alablement saisis selon'); + writeln('un format impos‚ dans des fichiers texte situ‚s dans les r‚pertoires suivants :'); + writeln; writeln(YRepP,' : '); - writeln('-un fichier localisant l''objectif de gestion et listant les r‚servoirs situ‚s …'); - writeln(' l''amont avec leurs capacit‚s et les temps de propagation jusqu''… l''aval'); - writeln('-deux fichiers par r‚servoir, pr‚cisant : 1) ses contraintes et consignes de'); - writeln(' gestion ; 2) les stations … utiliser, les temps de propagation et les'); - writeln(' superficies de bassin versant n‚cessaires, pour le calcul des d‚bits naturels'); - writeln(' aux points de prise et de restitution'); - writeln('-un fichier (facultatif) nomm‚ ',YNomFicTpsRet,', listant les temps de retour …'); - writeln(' utiliser pour l''analyse statistique des r‚sultats'); + writeln(' -un fichier (facultatif) nomm‚ ',YNomFicTpsRet,', listant les temps de retour'); + writeln(' … utiliser pour l''analyse statistique des r‚sultats'); + writeln; + writeln(YRepP,YRepStations,' : '); + writeln(' -un fichier localisant l''objectif de gestion et listant les r‚servoirs situ‚s'); + writeln(' … l''amont avec les temps de propagation entre ceux-ci et l''objectif'); + writeln; + writeln('Sous-r‚pertoire de ',YRepP,YRepB,' (nom : entier entre 1 et ',YNbmaxVersion,') :'); + writeln(' -un fichier par r‚servoir pr‚cisant ses contraintes et consignes de gestion'); + writeln; + writeln('Sous-r‚pertoire de ',YRepP,YRepS,' (nom : entier entre 1 et ',YNbmaxVersion,' ) :'); + writeln(' -un fichier par r‚servoir pr‚cisant les stations … utiliser, les temps de '); + writeln(' propagation et les superficies de bassin versant n‚cessaires, pour le'); + writeln(' calcul des d‚bits naturels aux points de prise et de restitution'); + writeln; writeln(YRepD,' : '); - writeln('-un fichier des d‚bits journaliers naturels aux stations n‚cessaires'); + writeln(' -un fichier des d‚bits journaliers naturels aux stations n‚cessaires'); + writeln; writeln(YRepO,' : '); - writeln('-un fichier d‚finisant l''hydrogramme objectif annuel … la station aval'); + writeln(' -un fichier d‚finissant l''hydrogramme objectif annuel … la station aval'); writeln; - writeln('Les r‚sultats sont ‚dit‚s en fichiers texte dans le r‚pertoire ',YRepR); - ATapez; - aquest; + write('Les r‚sultats sont ‚dit‚s en fichiers texte dans le r‚pertoire ',YRepR); + A_Tapez; + a_texte; clrscr; + + A_quest; write('nom du fichier localisant l''objectif de gestion (station aval) ? '); - Alecture_xy; - AReponse(YNomFicLacs,15); - ATitre; + A_lecture_xy; + A_Reponse(YNomFicLacs,14); end; - writeln(YFicSortie,'Nom du fichier localisant l''objectif aval et caracterisant les reservoirs ', - 'situes a l''amont : ',YNomFicLacs); + writeln(YFicSortie,'Nom du fichier localisant l''objectif aval, listant les reservoirs ', + 'situes a l''amont et donnant les temps de propagation : ',YRepP,YRepStations,YNomFicLacs); writeln(YFicSortie); YResume:='systeme = '+YNomFicLacs+'['; - {--ouverture du fichier des paramŠtres des lacs--} + {--ouverture du fichier des paramŠtres de station aval--} {$i-} - assign(YFitext,YrepP+YNomFicLacs); + assign(YFitext,YRepP+YRepStations+YNomFicLacs); YOuvertEtLu:=false; reset(YFitext); - {--cas d'ouverture correcte du fichier des paramŠtres des lacs--} + {--cas d'ouverture correcte du fichier des paramŠtres de station aval--} if ioresult=0 then begin @@ -219,9 +285,9 @@ procedure EntreesLac; {--lecture du nom de station aval et du nombre de lacs--} YNbModif[0]:=0; - readln(YFitext,YNomStatAval); TestLecture(0,0,1,0); - readln(YFiText,YNbLacs); TestLecture(0,0,2,0); - ControleEntier(0,YNbLacs,1,YNmaxLacs); + readln(YFitext,YNomStatAval); Ici_TestLecture(0,0,1,0); + readln(YFiText,YNbLacs); Ici_TestLecture(0,0,2,0); + Ici_ControleEntier(0,YNbLacs,1,YNmaxLacs); {--lecture des noms de r‚servoirs--} for YRangLac:=1 to YNbLacs do @@ -238,8 +304,8 @@ procedure EntreesLac; for YRanglac:=1 to YNbLacs do begin readln(YFiText,YD[YRangLac]); - TestLecture(YRangLac,0,8,0); - Controle(0,YD[YRangLac],0,1e20); + Ici_TestLecture(YRangLac,0,8,0); + Ici_Controle(0,YD[YRangLac],0,1e20); end; close(YFitext); @@ -248,10 +314,11 @@ procedure EntreesLac; begin {--‚criture en sortie--} - write(YFicSortie,'AUCUN'); + writeln(YFicSortie,'AUCUN'); + writeln(YFicSortie); {--lecture ‚ventuelle des r‚glages--} - assign(YFitext,YNomFicReglage); + assign(YFitext,YRepP+YNomFicReglage); reset(YFitext); if (ioresult=0) then begin @@ -274,17 +341,162 @@ procedure EntreesLac; for YRanglac:=1 to YNbLacs do YReglage[Yranglac]:=0; + {--Choix de la version des paramŠtres de contraintes et consignes.--} + {--Ce bloc permet de d‚finir le nom YNomRepBarrage du r‚pertoire --} + {--contenant les fichiers caract‚risant les contraintes et --} + {--de chaque r‚servoir. --} + if YSaisie then + begin + A_Titre; + writeln; + writeln('versions disponibles pour les contraintes et consignes de r‚servoirs :'); + XNbVersion:=0; + for Xi:=1 to YNbMaxVersion do + begin + str(Xi,YNomRepBarrage); + YNomRepBarrage:=YRepP+YRepB+YNomRepBarrage+'\'; + assign(XFic,YNomRepBarrage+'version.txt'); + reset(XFic); + if IOResult=0 then + begin + readln(XFic,XEnTete); + if IOResult=0 then + begin + XNbVersion:=XNbVersion+1; + A_Propo; + write(XNbVersion:2); + A_Titre; + writeln(' : [',Xi:2,'] ',XEntete); + XRangVersion[XNbVersion]:=Xi; + end; + close(XFic); + end; + end; + if XNbVersion=0 then + begin + YRangPBarrage:=0; + writeln('Liste vide. Calcul impossible'); + A_Tapez; + end + else + begin + if XNbVersion=1 then + begin + Xi:=1; + writeln('Cette version des paramŠtres sera utilis‚e pour les calculs.'); + end + else + begin + A_Quest; + write('version de paramŠtres … utiliser (entre 1 et ',XNbVersion,') ? '); + A_SaisiInt(Xi,1,XNbVersion,2); + end; + YRangPBarrage:=XRangVersion[Xi]; + end; + writeln; + end; + if YRangPBarrage>0 then + begin + str(YRangPBarrage,YNomRepBarrage); + YNomRepBarrage:=YRepP+YRepB+YNomRepBarrage+'\'; + assign(XFic,YNomRepBarrage+'version.txt'); + reset(XFic); + readln(XFic,XEnTete); + close(XFic); + writeln(YFicSortie,'Version utilisee pour les parametres de consignes et contraintes locales : rang ',YRangPBarrage); + writeln(YFicSortie,' (',XEntete,')'); + writeln(YFicSortie); + end + else + writeln(yFicSortie,'Aucune version disponible pour les parametres de consignes et contraintes locales des reservoirs. Calcul impossible.'); + flush(YFicSortie); + {--Cas o— une version de paramŠtres de rŠgles et consignes locales a--} + {--pu ˆtre s‚lectionn‚ : alors choix de la version des paramŠtres de--} + {--r‚seaux. Ce bloc permet de d‚finir le nom YNomRepReseau du --} + {--r‚pertoire contenant les fichiers caract‚risant le r‚seau de --} + {--stations associ‚ … chaque r‚servoir. --} + if YRangPBarrage>0 then + begin + if YSaisie then + begin + A_Titre; + writeln('versions disponibles pour les r‚seaux de stations associ‚s aux r‚servoirs :'); + XNbVersion:=0; + for Xi:=1 to YNbMaxVersion do + begin + str(Xi,YNomRepReseau); + YNomRepReseau:=YRepP+YRepS+YNomRepReseau+'\'; + assign(XFic,YNomRepReseau+'version.txt'); + reset(XFic); + if IOResult=0 then + begin + readln(XFic,XEnTete); + if IOResult=0 then + begin + XNbVersion:=XNbVersion+1; + A_Propo; + write(XNbVersion:2); + A_Titre; + writeln(' : [',Xi:2,'] ',XEntete); + XRangVersion[XNbVersion]:=Xi; + end; + close(XFic); + end; + end; + if XNbVersion=0 then + begin + YRangPReseau:=0; + writeln('Liste vide. Calcul impossible'); + A_tapez; + end + else + begin + if XNbVersion=1 then + begin + Xi:=1; + writeln('Cette version des paramŠtres sera utilis‚e pour les calculs.'); + end + else + begin + A_Quest; + write('version de paramŠtres … utiliser (entre 1 et ',XNbVersion,') ? '); + A_SaisiInt(Xi,1,XNbVersion,2); + end; + YRangPReseau:=XRangVersion[Xi]; + end; + writeln; + end; {fin du cas o— saisie clavier} + if YRangPReseau>0 then + begin + str(YRangPReseau,YNomRepReseau); + YNomRepReseau:=YRepP+YRepS+YNomRepReseau+'\'; + assign(XFic,YNomRepReseau+'version.txt'); + reset(XFic); + readln(XFic,XEnTete); + close(XFic); + writeln(YFicSortie,'Version utilisee pour les parametres de reseaux de stations associes aux reservoirs : rang ',YRangPReseau); + writeln(YFicSortie,' (',XEntete,')'); + writeln(YFicSortie); + end + else + writeln(yFicSortie,'Aucune version disponible pour les parametres de reseaux de stations associes aux reservoirs. Calcul impossible.'); + flush(YFicSortie); + end; {fin du cas ou version de paramŠtres rŠgles et consignes a ‚t‚ s‚lectionn‚} + end; {fin du cas o— aucune erreur n'est d‚tect‚e} writeln(YFicSortie); - end {fin du cas o— le fichier n'est pas vide} + end {fin du cas o— le fichier des paramŠtres de station aval n'est pas vide} - {--cas o— le fichier est vide--} + {--cas o— le fichier des paramŠtres de station aval est vide--} else - writeln(YFicSortie,'Probleme detecte : lecture impossible dans le fichier ',YNomFicLacs); + begin + writeln(YFicSortie,'Probleme detecte : lecture impossible dans le fichier ',YNomFicLacs); + close(YFitext); + end; - end {fin du cas d'ouverture correcte du fichier} + end {fin du cas d'ouverture correcte du fichier des paramŠtres de station aval} {--cas d'ouverture incorrecte du fichier--} else @@ -300,12 +512,11 @@ procedure EntreesLac; begin writeln(YFicSortie,'Identifiant de la station situee a l''aval du systeme : ',YNomStatAval); writeln(YFicSortie); - writeln(YFicSortie,'Nombre de reservoirs : ',YNbLacs); + writeln(YFicSortie,'Nombre K de reservoirs : ',YNbLacs); writeln(YFicSortie); - writeln(YFicSortie,'Noms des reservoirs, temps de propagation D entre point de restitution et station aval (heures)', - ' et reglage de volume desire Ec pour repartition des taches :'); + writeln(YFicSortie,'Noms des reservoirs et temps de propagation D entre point de restitution et station aval (heures) :'); for YRangLac:=1 to YNbLacs do - writeln(YFicSortie,' ',YNomLac[YRangLac],' : ',YD[YRangLac],' ',YReglage[YRangLac]); + writeln(YFicSortie,' ',YNomLac[YRangLac],' : ',YD[YRangLac]); writeln(YFicSortie); if YNbModif[0]>1 then writeln(YFicSortie,'ATTENTION : ', YNbModif[0],' valeurs modifiees par rapport aux originales (non conformes)') @@ -315,14 +526,18 @@ procedure EntreesLac; writeln(YFicSortie); end; - END; {fin de procedure EntreeLacs} + END; {fin de procedure Ici_EntreesLac} -{============================================================================} -procedure StationAval; +{===========================================================================} +{--Appelle la procedure de Lecture des paramŠtres de station aval, lacs et==} +{==Temps de propag. ==} +{===========================================================================} + +procedure P_StationAval; begin YNbLacs:=0; - EntreesLac; - EcritureSeparation; + Ici_EntreesLac; + P_EcritureSeparation; YCalculPossibl:= (YNMalLu=0) and YOuvertEtLu; if YSaisie then begin @@ -342,186 +557,272 @@ procedure StationAval; writeln(YFicSortie,'ABANDON DU CALCUL (probleme dans le fichier ',YNomFicLacs,')'); close(YFicSortie); end; - end; + flush(YFicSortie); + end; {fin de procedure P_StationAval} -{============================================================================} -{==Lecture des contraintes et consignes dans le fichier de paramŠtres ==} -{==associ‚ … la station de rang YRanglac ==} -{============================================================================} +{===========================================================================} +{==Lecture des contraintes et consignes dans le fichier de paramŠtres ==} +{==associ‚ au r‚servoir de rang YRanglac ==} +{===========================================================================} -procedure LectureRegles; +procedure Ici_LectureRegles; var - XRangFormule : integer; - XRangPivot : integer; - XRangSeuil : integer; - XPivotAnt : integer; - XSeraRien : integer; - Xi : integer; - XSeuilAnt : double; - XChai8 : YChai8; + XRangFormule : integer; + XRangPivot : integer; + XRangSeuil : integer; + XPivotAnt : integer; + XSeraRien : integer; + Xi : integer; + Xj : integer; + XSeuilAnt : double; + XChai8 : YChai8; + XChaine : string; + Xbareme : YBareme; -BEGIN + BEGIN - {$i-} + {$i-} - {--ouverture du fichier des contraintes et consignes--} - assign(YFitext,YRepP+YNomLac[YRangLac]+YSuffixe[1]); - reset(YFitext); - YOuvertEtLu:=false; + {--ouverture du fichier des contraintes et consignes--} + assign(YFitext,YNomRepBarrage+YNomLac[YRangLac]+YSuffixe[1]); + reset(YFitext); + YOuvertEtLu:=false; - {--cas d'ouverture correcte du fichier des contraintes et consignes--} - if ioresult=0 then + {--cas d'ouverture correcte du fichier des contraintes et consignes--} + if ioresult=0 then - begin + begin - {--cas o— le fichier n'est pas vide--} - if not eof(YFiText) then + {--cas o— le fichier n'est pas vide--} + if not eof(YFiText) then - begin - YNMalLu:=0; - readln(YFitext); - XSerarien:=ioresult; - readln(YFitext,XChai8); - YNomReservoir[YRangLac]:=''; - for Xi:=1 to length(XChai8) do - if not(ord(XChai8[Xi]) in YSeparateur) then - YNomReservoir[YRangLac]:=concat(YNomReservoir[YrangLac],XChai8[Xi]); - if (ioresult=0) then - YOuvertEtLu:=true; - write (YFicSortie,'Problemes detectes dans la lecture du fichier ',YNomLac[YRanglac],YSuffixe[1],' : '); - - {--lecture des contraintes de gestion des canaux (prise et restitition) et du volume utile} - - YNbModif[YRangLac]:=0; - readln(YFiText,YQemin[YRangLac]); TestLecture(YRangLac,0,3,0); - readln(YFiText,YQemax[YRangLac]); TestLecture(YRangLac,0,4,0); - readln(YFiText,YQsmin[YRangLac]); TestLecture(YRangLac,0,5,0); - readln(YFiText,YQsmax[YRangLac]); TestLecture(YRangLac,0,6,0); - readln(YFiText,YVtot[YRangLac]); TestLecture(YRangLac,0,7,0); - - Controle(YrangLac,YQemin[YRangLac],0,1e20); - Controle(YrangLac,YQemax[YRangLac],YQemin[YRangLac],1e20); - Controle(YrangLac,YQsmin[YRangLac],0,1e20); - Controle(YrangLac,YQsmax[YRangLac],YQsmin[YRangLac],1e20); - Controle(YrangLac,YVtot[YRangLac],0,1e20); - - YVtot[YRangLac]:=YVtot[YRangLac]*1e6; - YD[YRanglac]:=YD[YRanglac]/24; - YVTotCumul:=YVTotCumul+YVtot[YRangLac]; - if YRangLac=YNblacs then - YResume:=YResume+YNomLac[YRangLac]+'] ; ' - else - YResume:=YResume+YNomLac[YRangLac]+', '; - - {--boucle sur les 4 types de d‚bit de r‚f‚rence et r‚serv‚s : --} - {--QRM, QRV, QFM QFV --} - for YTypeDebit:=1 to 4 do - - begin - read(YFiText,YTypeFormule[YRangLac,YTypeDebit],YNbPivot[YRangLac,YTypeDebit]); - TestLecture(YRanglac,YTypeDebit,9,0); - ControleEntier(YrangLac,YTypeFormule[YRangLac,YTypeDebit],0,2); - ControleEntier(YrangLac,YNbPivot[YRangLac,YTypeDebit],1,YNbmaxPivot); - if YTypeFormule[YRangLac,YTypeDebit] <>0 then - begin - read(YFitext,YBorneGradient[YRangLac,YTypeDebit]); - TestLecture(YRangLac,YTypeDebit,10,0); - Controle(YrangLac,YBorneGradient[YRangLac,YTypeDebit],0,1e20); - end; - readln(YFiText); - XPivotAnt:=0; - for XRangPivot:=1 to YNbPivot[YRangLac,YTypeDebit] do - begin - read(YFitext,YQuantPivot[YRangLac,YTypeDebit,XRangPivot]); - TestLecture(YRangLac,YTypeDebit,11,XRangPivot); - ControleEntier(YrangLac,YQuantPivot[YrangLac,YTypeDebit,XRangPivot], - XPivotAnt+1,365-YNbPivot[YRangLac,YTypeDebit]+XRangPivot); - XPivotAnt:=YQuantPivot[YRangLac,YTypeDebit,XRangPivot]; - end; - readln(YFitext); - YNbFormule[YRangLac,YTypeDebit]:=0; - for XRangPivot:=1 to YNbPivot[YRangLac,YTypeDebit] do - begin - read(YFitext,YRangFormule[YRangLac,YTypeDebit,XRangPivot]); - TestLecture(YRangLac,YTypeDebit,12,XRangPivot); - ControleEntier(YrangLac,YrangFormule[YRangLac,YTypeDebit,XRangPivot],1,YNbPivot[YRangLac,YTypeDebit]); - YNbFormule[YRangLac,YTypeDebit]:=Amaxin(YNbFormule[YRangLac,YTypeDebit], + begin + YNMalLu:=0; + readln(YFitext,XChaine); + XSerarien:=ioresult; + writeln(YFicSortie,'En-tete du fichier : ',XChaine); + writeln(YFicSortie); + readln(YFitext,XChai8); + YNomReservoir[YRangLac]:=''; + for Xi:=1 to length(XChai8) do + if not(ord(XChai8[Xi]) in YSeparateur) then + YNomReservoir[YRangLac]:=concat(YNomReservoir[YrangLac],XChai8[Xi]); + if (ioresult=0) then + YOuvertEtLu:=true; + write (YFicSortie,'Problemes detectes dans la lecture du fichier ',YNomLac[YRanglac],YSuffixe[1],' : '); + + {--lecture des contraintes de gestion des canaux (prise et restitution)} + + YNbModif[YRangLac]:=0; + + for Xi:=1 to 4 do + begin + with XBareme do + begin + read(YFiText,YEffectif); + Ici_TestLecture(YRangLac,0,Xi+2,0); + Ici_ControleEntier(YRangLac,YEffectif,1,YNmaxBareme); + for Xj:=1 to YEffectif do + begin + read(YFitext,YVolume[Xj]); + Ici_TestLecture(YRangLac,0,Xi+2,Xj); + if Xj=1 then + Ici_Controle(YRangLac,YVolume[Xj],0,1e20) + else + Ici_Controle(YRangLac,YVolume[Xj],YVolume[Xj-1]+1/BTresPositif,1e20); + end; + for Xj:=1 to YEffectif do + begin + YVolume[Xj]:=YVolume[Xj]*1e6; + if Xj<YEffectif then + read(YFitext,YDebit[Xj]) + else + readln(YFitext,YDebit[Xj]); + Ici_TestLecture(YRangLac,0,Xi+2,Xj); + Ici_Controle(YRangLac,YDebit[Xj],0,1e20); + end; + end; + case Xi of + 1 : YQVemin[YrangLac]:=XBareme; + 2 : YQVemax[YRangLac]:=XBareme; + 3 : YQVsmin[YrangLac]:=XBareme; + 4 : YQVsmax[YRangLac]:=XBareme; + end; + end; + + {--lecture du volume utile total--} + readln(YFiText,YVtot[YRangLac]); + Ici_TestLecture(YRangLac,0,7,0); + Ici_Controle(YrangLac,YVtot[YRangLac],0,1e20); + YVtot[YRangLac]:=YVtot[YRangLac]*1e6; + YD[YRanglac]:=YD[YRanglac]/24; + YVTotCumul:=YVTotCumul+YVtot[YRangLac]; + + {--Calcul des limites min et max de d‚bit entrant et sortant, pour--} + {--V nul et pour V ‚gal … Vtot --} + YQEmax0[YRangLac]:=P_InterpolBareme(0,YQVemax[YRangLac]); + YQEmin0[YRangLac]:=P_InterpolBareme(0,YQVemin[YRangLac]); + YQSmax0[YRangLac]:=P_InterpolBareme(0,YQVsmax[YRangLac]); + YQSmin0[YRangLac]:=P_InterpolBareme(0,YQVsmin[YRangLac]); + YQEmax1[YRangLac]:=P_InterpolBareme(YVtot[YRangLac],YQVemax[YRangLac]); + YQEmin1[YRangLac]:=P_InterpolBareme(YVtot[YRangLac],YQVemin[YRangLac]); + YQSmax1[YRangLac]:=P_InterpolBareme(YVtot[YRangLac],YQVsmax[YRangLac]); + YQSmin1[YRangLac]:=P_InterpolBareme(YVtot[YRangLac],YQVsmin[YRangLac]); + + {--‚criture sur r‚sum‚ des conditions de calcul--} + if YRangLac=YNblacs then + begin + YResume:=YResume+YNomLac[YRangLac]+'] ; '; + str(YRangPBarrage,XChai8); + YResume:=YResume+' parametres barrages et reseaux : '+XChai8; + str(YRangPReseau,XChai8); + YResume:=YResume+' et '+XChai8+' ; '; + end + else + YResume:=YResume+YNomLac[YRangLac]+', '; + + {--boucle sur les 4 types de d‚bit de r‚f‚rence et r‚serv‚s : --} + {--QRM, QRV, QFM QFV --} + for YTypeDebit:=1 to 4 do + + begin + read(YFiText,YTypeFormule[YRangLac,YTypeDebit],YNbPivot[YRangLac,YTypeDebit]); + Ici_TestLecture(YRanglac,YTypeDebit,9,0); + Ici_ControleEntier(YrangLac,YTypeFormule[YRangLac,YTypeDebit],0,2); + Ici_ControleEntier(YrangLac,YNbPivot[YRangLac,YTypeDebit],1,YNbmaxPivot); + if YTypeFormule[YRangLac,YTypeDebit] <>0 then + begin + {read(YFitext,YBorneGradient[YRangLac,YTypeDebit],YBorneDebit[YRangLac,YTypeDebit]);} + read(YFitext,YBorneGradient[YRangLac,YTypeDebit]); + Ici_TestLecture(YRangLac,YTypeDebit,10,0); + Ici_Controle(YrangLac,YBorneGradient[YRangLac,YTypeDebit],0,1e20); + end; + readln(YFiText); + XPivotAnt:=0; + for XRangPivot:=1 to YNbPivot[YRangLac,YTypeDebit] do + begin + read(YFitext,YQuantPivot[YRangLac,YTypeDebit,XRangPivot]); + Ici_TestLecture(YRangLac,YTypeDebit,11,XRangPivot); + Ici_ControleEntier(YrangLac,YQuantPivot[YrangLac,YTypeDebit,XRangPivot], + XPivotAnt+1,365-YNbPivot[YRangLac,YTypeDebit]+XRangPivot); + XPivotAnt:=YQuantPivot[YRangLac,YTypeDebit,XRangPivot]; + end; + readln(YFitext); + YNbFormule[YRangLac,YTypeDebit]:=0; + for XRangPivot:=1 to YNbPivot[YRangLac,YTypeDebit] do + begin + read(YFitext,YRangFormule[YRangLac,YTypeDebit,XRangPivot]); + Ici_TestLecture(YRangLac,YTypeDebit,12,XRangPivot); + Ici_ControleEntier(YrangLac,YrangFormule[YRangLac,YTypeDebit,XRangPivot],1,YNbPivot[YRangLac,YTypeDebit]); + YNbFormule[YRangLac,YTypeDebit]:=B_maxin(YNbFormule[YRangLac,YTypeDebit], YRangFormule[YRangLac,YTypeDebit,XRangPivot]); - end; - YRangFormule[YRangLac,YTypeDebit,0]:=YRangFormule[YRanglac,YTypeDebit,YNbPivot[YRangLac,YTypeDebit]]; - readln(YFitext); + end; + YRangFormule[YRangLac,YTypeDebit,0]:=YRangFormule[YRanglac,YTypeDebit,YNbPivot[YRangLac,YTypeDebit]]; + readln(YFitext); - {--boucle sur le nombre de formules--} - for XRangFormule:=1 to YNbFormule[YRangLac,YTypeDebit] do + {--boucle sur le nombre de formules--} + for XRangFormule:=1 to YNbFormule[YRangLac,YTypeDebit] do - begin - read(YFiText,YNbSeuil[YRangLac,YTypeDebit,XRangFormule]); - testLecture(YRangLac,YTypeDebit,13,XRangFormule); - ControleEntier(YrangLac,YNbSeuil[YRangLac,YTypeDebit,XRangFormule],1,YNbmaxSeuil); - XseuilAnt:=1e20; - for XRangSeuil:=1 to YNbSeuil[YrangLac,YTypeDebit,XRangFormule] do - begin - read(YFitext,YSeuil[YRangLac,YTypeDebit,XRangFormule,XRangSeuil], - YDebit[YRangLac,YTypeDebit,XRangFormule,XRangSeuil]); - TestLecture(YRangLac,YTypeDebit,13,XRangFormule); - controle(YrangLac,YSeuil[YRangLac,YtypeDebit,XrangFormule,Xrangseuil], - -1e20,XSeuilAnt); - XseuilAnt:=YSeuil[YRangLac,YtypeDebit,XrangFormule,Xrangseuil]; - Controle(YrangLac,YDebit[YRangLac,YtypeDebit,XrangFormule,Xrangseuil],0,1e20); - - end; - readln(YFitext); - - end; {fin de boucle sur le nombre de formules} - - end; {fin de boucle sur les 4 types de d‚bit de r‚f‚rence et r‚serv‚s} - - if YNMalLu=0 then - write(YFicSortie,'AUCUN'); - writeln(YFicSortie); + begin + read(YFiText,YNbSeuil[YRangLac,YTypeDebit,XRangFormule]); + Ici_TestLecture(YRangLac,YTypeDebit,13,XRangFormule); + Ici_ControleEntier(YrangLac,YNbSeuil[YRangLac,YTypeDebit,XRangFormule],1,YNbmaxSeuil); + XseuilAnt:=1e20; + for XRangSeuil:=1 to YNbSeuil[YrangLac,YTypeDebit,XRangFormule] do + begin + read(YFitext,YSeuil[YRangLac,YTypeDebit,XRangFormule,XRangSeuil], + YDebit[YRangLac,YTypeDebit,XRangFormule,XRangSeuil]); + Ici_TestLecture(YRangLac,YTypeDebit,13,XRangFormule); + Ici_Controle(YrangLac,YSeuil[YRangLac,YtypeDebit,XrangFormule,Xrangseuil], + -1e20,XSeuilAnt); + XseuilAnt:=YSeuil[YRangLac,YtypeDebit,XrangFormule,Xrangseuil]; + Ici_Controle(YrangLac,YDebit[YRangLac,YtypeDebit,XrangFormule,Xrangseuil],0,1e20); - end {fin du cas o— le fichier n'est pas vide} + end; + readln(YFitext); - {--cas o— le fichier est vide--} - else - writeln(YFicSortie,'Probleme detecte : lecture impossible dans le fichier ',YNomLac[YRangLac],YSuffixe[1]); + end; {fin de boucle sur le nombre de formules} - close(YFitext); + end; {fin de boucle sur les 4 types de d‚bit de r‚f‚rence et r‚serv‚s} - end {fin du cas d'ouverture correcte du fichier} + if YNMalLu=0 then + write(YFicSortie,'AUCUN'); + writeln(YFicSortie); - {--cas d'ouverture incorrecte du fichier--} - else - writeln(YFicSortie,'Probleme detecte : impossibilite d''ouvrir le fichier ',YNomLac[YRangLac],YSuffixe[1]); + end {fin du cas o— le fichier n'est pas vide} - writeln(YFicSortie); - writeln(YFicSortie); + {--cas o— le fichier est vide--} + else + writeln(YFicSortie,'Probleme detecte : lecture impossible dans le fichier ',YNomLac[YRangLac],YSuffixe[1]); + + close(YFitext); + + end {fin du cas d'ouverture correcte du fichier} - {$i+} + {--cas d'ouverture incorrecte du fichier--} + else + writeln(YFicSortie,'Probleme detecte : impossibilite d''ouvrir le fichier ',YNomLac[YRangLac],YSuffixe[1]); + + writeln(YFicSortie); + writeln(YFicSortie); + + {$i+} + + END; {fin de proc‚dure Ici_LectureRegles} -END; {===========================================================================} -{--Traduction des paramŠtres des lacs en rŠgles de gestion, puis ‚criture --} -{--de ces rŠgles sur fichier de sortie (d‚j… ouvert par prog appelant). --} +{--Pour le r‚servoir de rang YRangLac, ‚criture sur fichier de sortie --} +{--(d‚j… ouvert) des paramŠtres et rŠgles de gestion (volume, contraintes,--} +{--consignes). --} {===========================================================================} -procedure EcritureParametresLacs(var ZFic:text); +procedure Ici_EcritureParametresLacs(var ZFic:text); var XRangSeuil : integer; XrangFormule : integer; XNpivot : integer; + Xi : integer; + Xplur : string[1]; + XCroiss : array[1..4] of boolean; - BEGIN + {--------------------------------------------------------------------------} + + procedure XEcritureBareme(ZBareme : YBareme; var ZCroiss:boolean); + var + Wi : integer; + begin + ZCroiss:=true; + with ZBareme do + begin + for Wi:=1 to YEffectif-1 do + write(ZFic,(YVolume[Wi]*1e-6):10,' ; '); + write(ZFic,(YVolume[YEffectif]*1e-6):10,' -- '); + for Wi:=1 to YEffectif-1 do + write(ZFic,YDebit[Wi]:10,' ; '); + writeln(ZFic,YDebit[YEffectif]:10); + for Wi:=2 to YEffectif do + if YDebit[Wi]<YDebit[Wi-1] then + ZCroiss:=false; + end; + end; {fin de procedure XEcritureBareme} + + {--------------------------------------------------------------------------} + + BEGIN {d‚but de Ici_EcritureParametresLacs} writeln(ZFic,' nom du reservoir : ',YNomReservoir[YRangLac]); - writeln(ZFic,' Qemin',YRangLac,' = ',YQemin[YRangLac],' m3/s (debitance min de la prise)'); - writeln(ZFic,' Qemax',YRangLac,' = ',YQemax[YRangLac],' m3/s (debitance max de la prise)'); - writeln(ZFic,' Qsmin',YRangLac,' = ',YQsmin[YRangLac],' m3/s (debitance min de la restitution)'); - writeln(ZFic,' Qsmax',YRangLac,' = ',YQsmax[YRangLac],' m3/s (debitance max de la restitution)'); + write (ZFic,' bareme de debitance minimale de la prise (V (hm3) -- QEmin (m3/s)) : '); + XEcritureBareme(YQVemin[YRangLac],Xcroiss[1]); + write (ZFic,' bareme de debitance maximale de la prise (V (hm3) -- QEmax (m3/s)) : '); + XEcritureBareme(YQVemax[YRangLac],XCroiss[2]); + write (ZFic,' bareme de debitance minimale de la restitution (V (hm3) -- QSmin (m3/s)) : '); + XEcritureBareme(YQVsmin[YRanglac],XCroiss[3]); + write (ZFic,' bareme de debitance maximale de la restitution (V (hm3) -- QSmax (m3/s)) : '); + XEcritureBareme(YQVsmax[YRangLac],XCroiss[4]); writeln(ZFic,' Vtot',YRangLac,' = ',(YVtot[YRangLac]/1e6),' hm3, ou millions de m3 (volume du reservoir)'); writeln(ZFic,' debits reserves et de reference a l''aval immediat des points de prise (QMres et QMref) ', 'et de restitution (QVres et QVref) :'); @@ -530,7 +831,7 @@ procedure EcritureParametresLacs(var ZFic:text); write(ZFic,' ',YNomDebit[YTypeDebit],YRangLac,' : '); for XNPivot:=1 to YNbPivot[YRangLac,YTypeDebit] do begin - write(ZFic,'si T>= ',Adateclaire(2001,YQuantPivot[YRangLac,YTypeDebit,XNPivot])); + write(ZFic,'si T>= ',B_dateclaire(2001,YQuantPivot[YRangLac,YTypeDebit,XNPivot])); write(ZFic,' : Q',YRangFormule[YRangLac,YTypeDebit,XNPivot]); if XNPivot<YNbPivot[YRangLac,YTypeDebit] then write(ZFic,' ; '); @@ -539,37 +840,42 @@ procedure EcritureParametresLacs(var ZFic:text); for XRangFormule:=1 to YNbFormule[YRangLac,YTypeDebit] do begin Write(ZFic,' Q',XRangFormule,' : '); - for Xrangseuil:=1 to YNbSeuil[YRangLac,YTypeDebit,XRangFormule] do + if (YNbSeuil[YRangLac,YTypeDebit,XRangFormule]=1) + and (YSeuil[YRangLac,YTypeDebit,XRangFormule,1]<0) then + writeln(ZFic,Ydebit[Yranglac,YTypeDebit,XRangFormule,1]:6) + else begin - write(ZFic,'si QMnat > ',YSeuil[YRangLac,YTypeDebit,XRangFormule,XRangSeuil]:6); - write(ZFic,' alors ',Ydebit[Yranglac,YTypeDebit,XRangFormule,XrangSeuil]:6,', sinon, '); + for Xrangseuil:=1 to YNbSeuil[YRangLac,YTypeDebit,XRangFormule] do + begin + write(ZFic,'si QMnat > ',YSeuil[YRangLac,YTypeDebit,XRangFormule,XRangSeuil]:6); + write(ZFic,' alors ',Ydebit[Yranglac,YTypeDebit,XRangFormule,XrangSeuil]:6,', sinon, '); + end; + writeln(ZFic,'QMnat'); end; - writeln(ZFic,'QMnat'); end; if YTypeFormule[YRangLac, YTypeDebit]<>0 then begin write(ZFic,' par ailleurs : '); if YTypeFormule[YRangLac,YTypeDebit]=1 then - writeln(ZFic,YNomDebit[YTypeDebit],YRangLac,'=max[',YNomDebit[YTypeDebit],YRangLac, - ' , QV(T-1)-',YBorneGradient[YRangLac,YTypeDebit],']') + writeln(ZFic,YNomDebit[YTypeDebit],YRangLac,' = max [ ',YNomDebit[YTypeDebit],YRangLac, + ' , QV(T-1)-',YBorneGradient[YRangLac,YTypeDebit],' ]') else - writeln(ZFic,YNomDebit[YTypeDebit],YRangLac,'=min[',YNomDebit[YTypeDebit],YRangLac, - ' , QV(T-1)+',YBorneGradient[YRangLac,YTypeDebit],']'); + writeln(ZFic,YNomDebit[YTypeDebit],YRangLac,' = min [ ',YNomDebit[YTypeDebit],YRangLac, + ' , QV(T-1)+',YBorneGradient[YRangLac,YTypeDebit],' ]'); end; end; - if YNbModif[YrangLac]>1 then + if YNbModif[YrangLac]>0 then begin + XPlur:=''; + if YNbModif[YRangLac]>1 then + XPlur:='s'; writeln(ZFic); - writeln(ZFic,' ATTENTION : ',YNbModif[YrangLac],' valeurs modifiees par ', - 'rapport aux originales (non conformes) pour ce reservoir') - end - else - if YNbModif[YrangLac]>0 then - begin - writeln(ZFic); - writeln(ZFic,' ATTENTION : ',YNbModif[YrangLac],' valeur modifiee par ', - 'rapport a l''originale (non conforme) pour ce reservoir'); - end; + writeln(ZFic,' ATTENTION ATTENTION : ',YNbModif[YrangLac],' valeur',Xplur,' originale',Xplur,' non conforme',Xplur, + ' automatiquement corrigee',XPlur,' pour ce reservoir'); + end; + for Xi:=1 to 4 do + if not XCroiss[Xi] then + writeln(ZFic,' ATTENTION ATTENTION : bareme non croissant pour ',YNomParamLac[Xi+2]); if YNomLac[YRangLac]<>YNomReservoir[YRanglac] then begin writeln(ZFic); @@ -577,160 +883,213 @@ procedure EcritureParametresLacs(var ZFic:text); 'contenu dans le fichier ',YNomFicLacs); end; - END; {fin de EcritureParametresLacs} + END; {fin de Ici_EcritureParametresLacs} -{----------------------------------------------------------------------------} -{--LECTURE DES PARAMETRES DES CONTRAINTES ET CONSIGNES pour tous les lacs, --} -{--et ‚criture sur fichier de sortie, des rŠgles de gestion interpr‚t‚es. --} -{--Evaluation de la part th‚orique et de la part assign‚e … chaque barrage--} -{----------------------------------------------------------------------------} - procedure ContraintesEtConsignesLacs; - var - XAdd : double; - XVRtotcumul : double; - BEGIN +{===========================================================================} +{--LECTURE DES PARAMETRES, CONTRAINTES ET CONSIGNES de gestion pour tous --} +{--les lacs, et ‚criture en clair sur fichier de sortie. Ecriture sur ce --} +{--fichier de la rŠgle adopt‚e pour la r‚partition des tƒches entre --} +{--r‚servoirs --} +{===========================================================================} - {--LECTURE ET ECRITURE DES CONTRAINTES ET CONSIGNES LACS--} - if YCalculPossibl then - begin - for YRangLac:=1 to YNbLacs do - begin - writeln(YFicSortie,'Nom du fichier des contraintes et consignes du reservoir ',YRangLac, - ' (',YNomLac[YRangLac],') : ',YNomLac[YRangLac],YSuffixe[1]); - writeln(YFicSortie); - LectureRegles; - if YOuvertetLu then - EcritureParametresLacs(YFicSortie) - else - YCalculPossibl:=false; - YCalculPossibl:=YCalculPossibl and (YNMalLu=0); - EcritureSeparation; - end; - if Ysaisie then - begin - write('fichiers des contraintes et consignes : '); - if YCalculPossibl then - writeln('corrects.') +procedure P_ContraintesEtConsignesLacs; + var + XAdd : double; + XChai : string; + + BEGIN + + {--LECTURE ET ECRITURE DES PARAMETRES, CONTRAINTES ET CONSIGNES LACS--} + if YCalculPossibl then + begin + for YRangLac:=1 to YNbLacs do + begin + writeln(YFicSortie,'Nom du fichier des contraintes et consignes du reservoir ',YRangLac, + ' : ',YNomRepBarrage,YNomLac[YRangLac],YSuffixe[1]); + writeln(YFicSortie); + Ici_LectureRegles; + if YOuvertetLu then + Ici_EcritureParametresLacs(YFicSortie) + else + YCalculPossibl:=false; + YCalculPossibl:=YCalculPossibl and (YNMalLu=0); + P_EcritureSeparation; + end; + if Ysaisie then + begin + write('fichiers des contraintes et consignes : '); + if YCalculPossibl then + writeln('corrects.') + else + begin + writeln('non corrects. ABANDON du calcul.'); + writeln; + writeln('Consulter le fichier ',YNomFicSortie,'.'); + end; + end; + if not YCalculPossibl then + begin + writeln(YFicSortie); + writeln(YFicSortie,'ABANDON DU CALCUL (probleme dans un (au moins) des fichiers de contraintes et consignes)'); + close(YFicSortie); + end; + end; + + {--Ecriture sur fichier texte de sortie du mode adopt‚ pour la --} + {--r‚partition des taches entre r‚servoirs --} + if YCalculPossibl then + begin + if YNbLacs>1 then + begin + XAdd:=0; + for YRangLac:=1 to YNbLacs do + Xadd:=B_max(Xadd,-YVtot[YrangLac]*(1+YReglage[YRanglac])); + YVRtotCumul:=0; + for YRangLac:=1 to YNbLacs do + begin + YVRtot[YRanglac]:=YVtot[YRanglac]*(1+YReglage[YRanglac])+Xadd; + YVRtotCumul:=YVRtotCumul+YVRtot[YRangLac]; + end; + if YVRTotCumul>0 then + for YRanglac:=1 to YNbLacs do + YVRtot[YRangLac]:=YVRtot[YRanglac]*YVtotCumul/YVRtotCumul + else + for YRanglac:=1 to YNbLacs do + YVRtot[YRangLac]:=YVtot[YRanglac]; + end + else + YVRtot[1]:=YVtot[1]; + for YRanglac:=1 to YNbLacs do + begin + YPartTheorique[YrangLac]:=YVtot[YRanglac]/YVtotCumul; + YPart[YrangLac]:=YVRtot[YRanglac]/YVtotCumul; + end; + writeln(YFicSortie); + write(YFicSortie,'Option choisie : '); + case YOptionRepart of + 1:begin + writeln(YFicSortie,'REPARTITION FIXE des taches entre reservoirs (mode 1), ', + 'en proportion de leur volume fictif VRtot assigne :'); + writeln(YFicSortie); + write (YFicSortie,'volume reel Vtot : '); + for YRanglac:=1 to YNbLacs do + write(YFicSortie,YVtot[YRangLac],' '); + writeln(YFicsortie); + write (YFicSortie,'reglage souhaite Ec : '); + for YRanglac:=1 to YNbLacs do + write(YFicSortie,YReglage[YRangLac],' '); + writeln(YFicsortie); + write (YFicSortie,'volume assigne VRtot : '); + for YRanglac:=1 to YNbLacs do + write(YFicSortie,YVRtot[YRangLac],' '); + writeln(YFicSortie); + write (YFicSortie,'part standard : '); + for YRanglac:=1 to YNbLacs do + write(YFicSortie,YPartTheorique[YRangLac],' '); + writeln(YFicSortie); + write (YFicSortie,'part assignee : '); + for YRanglac:=1 to YNbLacs do + write(YFicSortie,YPart[YRangLac],' '); + end; + 2:writeln(YFicSortie,'REPARTITION VARIABLE des taches entre reservoirs (mode 2), ', + 'tenant compte des volumes d''eau presents et des ', + 'durees potentielles minimales Tpot de reconstitution du volume utilisable maximal'); + 3:writeln(YFicSortie,'REPARTITION VARIABLE des taches entre reservoirs (mode 3), ', + 'visant a equilibrer leurs taux de remplissage'); + 4..5 : begin + write(YFicSortie,'REPARTITION VARIABLE des taches entre reservoirs ', + '(mode ',YOptionRepart,'), visant a equilibrer les durees potentielles minimales '); + if YCodeTpot then + write(YFicSortie,'Tpot1 de reconstitution du volume utilisable maximal') + else + write(YFicSortie,'Tpot2 d''epuisement du volume utilisable'); + if YOptionRepart=4 then + writeln(yFicSortie,', calculees avec des debits constants des cours d''eau aux prises (egaux aux modules)') + else + writeln(YFicSortie,', calculees avec des debits variables des cours d''eau aux prises (f=',YFreqNondep:6:4,')'); + end; + end; + writeln(YFicSortie); + P_EcritureSeparation; + end; + YStandard:=true; + for YRangLac:=1 to YNbLacs do + if YPartTheorique[YRangLac]<>YPart[YRangLac] then + YStandard:=false; + YResume:=YResume+' repartition '; + case YOptionRepart of + 1: begin + YResume:=YResume+'figee '; + if YStandard then + YResume:=YResume+'(1 - proportionnelle a Vtot) : ' else + YResume:=YResume+'(1 - imposee) : '; + for YRanglac:=1 to YNblacs do begin - writeln('non corrects. ABANDON du calcul.'); - writeln; - writeln('Consulter le fichier ',YNomFicSortie,'.'); + str(YPart[YRangLac]:6:4,YChaine); + YResume:=YResume+YChaine+' ' end; end; - if not YCalculPossibl then - begin - writeln(YFicSortie); - writeln(YFicSortie,'ABANDON DU CALCUL (probleme dans un (au moins) des fichiers de contraintes et consignes)'); - close(YFicSortie); + 2: YResume:=YResume+'variable (2 - fonction de V et Tpot(moyen))'; + 3: YResume:=YResume+'variable (3 - visant equilibre V/Vtot)'; + 4: begin + YResume:=YResume+'variable (4 - visant equilibre Tpot'; + if YCodeTpot then + YResume:=YResume+'1' + else + YResume:=YResume+'2'; + YResume:=YResume+'(moyen))'; end; - end; - - {--REPARTITION DES TACHES EN FONCTION DES VOLUMES ET DES REGLAGES--} - if YCalculPossibl then - begin - if YNbLacs>1 then - begin - XAdd:=0; - for YRangLac:=1 to YNbLacs do - Xadd:=Amax(Xadd,-YVtot[YrangLac]*(1+YReglage[YRanglac])); - XVRtotCumul:=0; - for YRangLac:=1 to YNbLacs do - begin - YVRtot[YRanglac]:=YVtot[YRanglac]*(1+YReglage[YRanglac])+Xadd; - XVRtotCumul:=XVRtotCumul+YVRtot[YRangLac]; - end; - if XVRTotCumul>0 then - for YRanglac:=1 to YNbLacs do - YVRtot[YRangLac]:=YVRtot[YRanglac]*YVtotCumul/XVRtotCumul + 5: begin + str(YFreqNonDep:6:4,XChai); + YResume:=YResume+'variable (5 - visant equilibre Tpot'; + if YCodeTpot then + YResume:=YResume+'1' else - for YRanglac:=1 to YNbLacs do - YVRtot[YRangLac]:=YVtot[YRanglac]; - end - else - YVRtot[1]:=YVtot[1]; - for YRanglac:=1 to YNbLacs do - begin - YPartTheorique[YrangLac]:=YVtot[YRanglac]/YVtotCumul; - YPart[YrangLac]:=YVRtot[YRanglac]/YVtotCumul; + YResume:=YResume+'2'; + YResume:=YResume+'(f='+XChai+'))'; end; - writeln(YFicSortie); - writeln(YFicSortie,'Repartition des taches entre reservoirs, en proportion de leur volume exploitable assigne :'); - writeln(YFicSortie); - write (YFicSortie,'volume reel Vtot : '); - for YRanglac:=1 to YNbLacs do - write(YFicSortie,YVtot[YRangLac],' '); - writeln(YFicsortie); - write (YFicSortie,'reglage souhaite Ec : '); - for YRanglac:=1 to YNbLacs do - write(YFicSortie,YReglage[YRangLac],' '); - writeln(YFicsortie); - write (YFicSortie,'volume assigne VRtot : '); - for YRanglac:=1 to YNbLacs do - write(YFicSortie,YVRtot[YRangLac],' '); - writeln(YFicSortie); - write (YFicSortie,'part standard : '); - for YRanglac:=1 to YNbLacs do - write(YFicSortie,YPartTheorique[YRangLac],' '); - writeln(YFicSortie); - write (YFicSortie,'part assignee : '); - for YRanglac:=1 to YNbLacs do - write(YFicSortie,YPart[YRangLac],' '); - writeln(YFicSortie); - EcritureSeparation; - end; - YStandard:=true; - for YRangLac:=1 to YNbLacs do - if YPartTheorique[YRangLac]<>YPart[YRangLac] then - YStandard:=false; - YResume:=YResume+' repartition '; - if YStandard then - YResume:=YResume+'des taches (standard) : ' - else - YResume:=YResume+'des taches (imposee) : '; - for YRanglac:=1 to YNblacs do - begin - str(YPart[YRangLac]:6:4,YChaine); - YResume:=YResume+YChaine+' ' - end; - YResume:=YResume+' ; '; - END; {fin de ContraintesEtConsignesLacs} + end; + YResume:=YResume+' ; '; + flush(YFicSortie); + END; {fin de P_ContraintesEtConsignesLacs} {===========================================================================} {--lecture des paramŠtres de reseau pour chaque r‚servoir --} {===========================================================================} -procedure EntreeReseaux; +procedure Ici_EntreeReseaux; var Xi : integer; XRang : integer; XChai8 : YChai8; + XChaine : string; XSerarien : integer; {---------------------------------------------------------------------------} -procedure XTestLecture (ZRangDonnee,ZRang : integer); - begin - if ioresult<>0 then - begin - writeln(YFicSortie); - YNmallu:=YNmallu+1; - write(YFicSortie,' ',YNomParamReso[ZRangDonnee]); - if ZRang<>0 then - write(YFicSortie,'(',ZRang,')'); - end; - end; + procedure XTestLecture (ZRangDonnee,ZRang : integer); + begin + if ioresult<>0 then + begin + writeln(YFicSortie); + YNmallu:=YNmallu+1; + write(YFicSortie,' ',YNomParamReso[ZRangDonnee]); + if ZRang<>0 then + write(YFicSortie,'(',ZRang,')'); + end; + end; {---------------------------------------------------------------------------} - BEGIN {d‚but de procedure EntreeResaux} + BEGIN {d‚but de procedure Ici_EntreeReseaux} {$i-} {--ouverture du fichier des paramŠtres de r‚seau--} str(YRangLac,YNum); - assign(YFitext,YRepP+YNomLac[YRangLac]+YSuffixe[2]); + assign(YFitext,YNomRepReseau+YNomLac[YRangLac]+YSuffixe[2]); reset(YFitext); YOuvertEtLu:=false; @@ -743,8 +1102,10 @@ procedure XTestLecture (ZRangDonnee,ZRang : integer); if not eof(YFiText) then begin - readln(YFitext); + readln(YFitext,XChaine); XSerarien:=ioresult; + writeln(YFicSortie,'En-tete du fichier : ',XChaine); + writeln(YFicSortie); YNMalLu:=0; readln(YFitext,XChai8); YNomReseau[YRangLac]:=''; @@ -758,8 +1119,8 @@ procedure XTestLecture (ZRangDonnee,ZRang : integer); {--lecture des nombres de stations amont et interm‚diaires--} YNbModif[YRangLac]:=0; readln(YFitext,YNam[YRangLac],YNint[YRangLac]); XTestLecture(1,0); - ControleEntier(YRanglac,YNam[YRangLac],0,2); - ControleEntier(YRanglac,YNint[YRanglac],0,1); + Ici_ControleEntier(YRanglac,YNam[YRangLac],0,2); + Ici_ControleEntier(YRanglac,YNint[YRanglac],0,1); {--lecture des identifiants de stations--} readln(Yfitext,YNomStatAv[YRangLac]); @@ -778,50 +1139,50 @@ procedure XTestLecture (ZRangDonnee,ZRang : integer); begin for Xrang:=1 to YNam[YRangLac] do begin - readln(YFitext,YDV[YRangLac,Xrang]); XTestLecture(8,0); - Controle(YRangLac,YDV[YRangLac,Xrang],0,1e20); + readln(YFitext,YDv[YRangLac,Xrang]); XTestLecture(8,0); + Ici_Controle(YRangLac,YDv[YRangLac,Xrang],0,1e20); end; for Xrang:=1 to YNam[YRangLac] do begin - readln(YFitext,YDM[YRangLac,Xrang]); + readln(YFitext,YDm[YRangLac,Xrang]); XTestLecture(9,Xrang); - Controle(YRangLac,YDM[YRangLac,Xrang],YDV[YRangLac,XRang],1e20); + Ici_Controle(YRangLac,YDm[YRangLac,Xrang],YDv[YRangLac,XRang],1e20); end; for Xrang:=1 to YNam[YRangLac] do begin readln(YFitext,YDam[YRangLac,Xrang]); XTestLecture(10,Xrang); - Controle(YRangLac,YDam[YRangLac,Xrang],YDV[YRangLac,XRang],1e20); + Ici_Controle(YRangLac,YDam[YRangLac,Xrang],YDv[YRangLac,XRang],1e20); end; if YNint[YRangLac]>0 then begin readln(YFitext,YDint[YRangLac]); XTestLecture(11,0); - Controle(YRangLac,YDint[YRangLac],0,1e20); + Ici_Controle(YRangLac,YDint[YRangLac],0,1e20); end; readln(YFitext,YSav[YRangLac]); XTestLecture(12,0); - Controle(YRangLac,YSav[YRangLac],0,1e20); + Ici_Controle(YRangLac,YSav[YRangLac],0,1e20); for Xrang:=1 to YNam[YrangLac] do begin - readln(YFitext,YSV[YrangLac,XRang]); XTestLecture(13,0); - Controle(YRangLac,YSV[YRangLac,XRang],0,YSav[YRangLac]); + readln(YFitext,YSv[YrangLac,XRang]); XTestLecture(13,0); + Ici_Controle(YRangLac,YSv[YRangLac,XRang],0,YSav[YRangLac]); end; for Xrang:=1 to YNam[YRangLac] do begin - readln(YFitext,YSM[YRangLac,Xrang]); + readln(YFitext,YSm[YRangLac,Xrang]); XTestLecture(14,Xrang); - Controle(YRangLac,YSM[YRangLac,Xrang],0,YSav[YRangLac]); + Ici_Controle(YRangLac,YSm[YRangLac,Xrang],0,YSav[YRangLac]); end; for Xrang:=1 to YNam[YRangLac] do begin readln(YFitext,YSam[YRangLac,Xrang]); XTestLecture(15,Xrang); - Controle(YRangLac,YSam[YRangLac,Xrang],0,YSav[YRangLac]); + Ici_Controle(YRangLac,YSam[YRangLac,Xrang],0,YSav[YRangLac]); end; if YNint[YRangLac]>0 then begin readln(YFitext,YSint[YRangLac]); XTestLecture(16,0); - Controle(YRangLac,YSint[YRangLac],0,1e20); + Ici_Controle(YRangLac,YSint[YRangLac],0,1e20); end; end; {fin du cas o— le nombre de stations amont est non nul} @@ -849,16 +1210,17 @@ procedure XTestLecture (ZRangDonnee,ZRang : integer); {$i+} - END; {fin de procedure EntreeReseaux} + END; {fin de procedure Ici_EntreeReseaux} {=============================================================================} {--‚criture des paramŠtres des r‚seaux sur fichier de sortie --} {=============================================================================} -procedure EcritureParametresReseaux(var ZFic:text); +procedure Ici_EcritureParametresReseaux(var ZFic:text); var XRang : integer; + XPlur : string[1]; BEGIN @@ -877,18 +1239,18 @@ procedure EcritureParametresReseaux(var ZFic:text); writeln(ZFic); if YNint[YRangLac]>0 then writeln(ZFic,'identifiant de station intermediaire : ',YNomStatInt[YRangLac]); - write(ZFic,'DV = '); + write(ZFic,'Dv = '); for Xrang:=1 to YNam[YRangLac] do begin - write(ZFic,YDV[YRangLac,Xrang],' '); - YDV[YRangLac,Xrang]:=YDV[YRangLac,XRang]/24; + write(ZFic,YDv[YRangLac,Xrang],' '); + YDv[YRangLac,Xrang]:=YDv[YRangLac,XRang]/24; end; writeln(ZFic,'heures (temps de propagation entre les points de restitution et la station situee a l''aval du reservoir)'); - write(ZFic,'DM = '); + write(ZFic,'Dm = '); for Xrang:=1 to YNam[YrangLac] do begin - write(ZFic,YDM[YRangLac,Xrang],' '); - YDM[YRangLac,XRang]:=YDM[YRangLac,XRang]/24; + write(ZFic,YDm[YRangLac,Xrang],' '); + YDm[YRangLac,XRang]:=YDm[YRangLac,XRang]/24; end; writeln(ZFic,' heures (temps de propagation entre les points de prise et la station situee a l''aval du reservoir)'); write(ZFic,'Dam = '); @@ -907,34 +1269,30 @@ procedure EcritureParametresReseaux(var ZFic:text); end; writeln(ZFic,'Sav = ',YSav[YRangLac],' km2 (superficie du bassin versant a la', ' station situee a l''aval du reservoir)'); - write(ZFic,'SV = '); + write(ZFic,'Sv = '); for Xrang:=1 to YNam[YrangLac] do - write(ZFic,YSV[YRangLac,Xrang],' '); + write(ZFic,YSv[YRangLac,Xrang],' '); writeln(ZFic,' km2 (superficie de bassin versant aux points de restitution)'); - write(ZFic,'SM = '); + write(ZFic,'Sm = '); for Xrang:=1 to YNam[YrangLac] do - write(ZFic,YSM[YRangLac,Xrang],' '); + write(ZFic,YSm[YRangLac,Xrang],' '); writeln(ZFic,' km2 (superficie de bassin versant aux points de prise)'); write(ZFic,'Sam = '); for Xrang:=1 to YNam[YrangLac] do write(ZFic,YSam[YRangLac,Xrang],' '); writeln(ZFic,' km2 (superficie de bassin versant aux stations situees a l''amont des restitutions du reservoir)'); if YNint[YRangLac]>0 then - writeln(ZFic,'Sint = ',YSint[YRangLac],' km2 (superficie de bassin versant a la station intermediaires)'); + writeln(ZFic,'Sint = ',YSint[YRangLac],' km2 (superficie de bassin versant a la station intermediaire)'); end; - if YNbModif[YrangLac]>1 then + if YNbModif[YrangLac]>0 then begin + Xplur:=''; + if YNbModif[YRangLac]>1 then + XPlur:='s'; writeln(ZFic); - writeln(ZFic,' ATTENTION : ',YNbModif[YrangLac],' valeurs modifiees par ', - 'rapport aux originales (non conformes) pour ce reseau') - end - else - if YNbModif[YrangLac]>0 then - begin - writeln(ZFic); - writeln(ZFic,' ATTENTION : ',YNbModif[YrangLac],' valeur modifiee par ', - 'rapport a l''originale (non conforme) pour ce reseau'); - end; + writeln(ZFic,' ATTENTION ATTENTION : ',YNbModif[YrangLac],' valeur',Xplur,' originale',Xplur,' non conforme',Xplur, + ' automatiquement corrigee',XPlur,' pour ce reseau'); + end; if YNomLac[YRangLac]<>YNomReseau[YRanglac] then begin writeln(ZFic); @@ -942,45 +1300,51 @@ procedure EcritureParametresReseaux(var ZFic:text); 'dans le fichier ',YNomFicLacs); end; - END; {fin de procedure EcritureParametresReseaux} + END; {fin de procedure Ici_EcritureParametresReseaux} + +{===========================================================================} +{==Lecture des paramŠtres r‚seaux et ‚criture en clair de ces paramŠtres ==} +{==sur fichier de sortie ==} +{===========================================================================} +procedure P_ParametresReseau; + begin + if YCalculPossibl then + begin + for YRangLac:=1 to YNbLacs do + begin + writeln(YFicSortie,'Nom du fichier des parametres reseau du reservoir ',YRangLac,' : ',YNomRepReseau,YNomLac[YRangLac],YSuffixe[2]); + writeln(YFicSortie); + Ici_EntreeReseaux; + if YOuvertEtLu then + Ici_EcritureParametresReseaux(YFicSortie) + else + YCalculPossibl:=false; + YCalculPossibl:=YCalculPossibl and (YNMalLu=0); + P_EcritureSeparation; + end; + if YSaisie then + begin + write('fichiers des paramŠtres r‚seaux/r‚servoirs : '); + if YCalculPossibl then + writeln('corrects.') + else + begin + writeln('non corrects. ABANDON du calcul.'); + writeln; + writeln('Consulter le fichier ',YNomFicSortie,'.'); + end; + end; + if not YCalculPossibl then + begin + writeln(YFicSortie); + writeln(YFicSortie,'ABANDON DU CALCUL (probleme dans un (au moins) des fichiers de reseau/reservoir)'); + close(YFicSortie); + end; + end; + flush(YFicSortie); + end; {fin de proc‚dure P_ParametresReseau} {============================================================================} - procedure ParametresReseau; - begin - if YCalculPossibl then - begin - for YRangLac:=1 to YNbLacs do - begin - writeln(YFicSortie,'Nom du fichier des parametres reseau du reservoir ',YRangLac,' : ',YNomLac[YRangLac]); - writeln(YFicSortie); - EntreeReseaux; - if YOuvertEtLu then - EcritureParametresReseaux(YFicSortie) - else - YCalculPossibl:=false; - YCalculPossibl:=YCalculPossibl and (YNMalLu=0); - EcritureSeparation; - end; - if YSaisie then - begin - write('fichiers des paramŠtres r‚seaux/r‚servoirs : '); - if YCalculPossibl then - writeln('corrects.') - else - begin - writeln('non corrects. ABANDON du calcul.'); - writeln; - writeln('Consulter le fichier ',YNomFicSortie,'.'); - end; - end; - if not YCalculPossibl then - begin - writeln(YFicSortie); - writeln(YFicSortie,'ABANDON DU CALCUL (probleme dans un (au moins) des fichiers de reseau/reservoir)'); - close(YFicSortie); - end; - end; - end; -{============================================================================} + BEGIN -END. \ No newline at end of file +END. diff --git a/src/REGLAGE.PAS b/src/REGLAGE.PAS new file mode 100644 index 0000000000000000000000000000000000000000..cc839e22a048954e63027a84e1d570455f3c1da5 --- /dev/null +++ b/src/REGLAGE.PAS @@ -0,0 +1,768 @@ +program REGLAGE; + +uses DECLARA, Interfas, Utilit; + +const + XNomRepSuiviOptim = 'SUIVOPTI\'; + XNomFicEtape = 'Etape'; + XNomFicResultEtape0 = 'Result0'; + XNomFicDichoto = 'Dichot'; + XNomFicsuivi = 'Suivi'; + XNomFicParamOptim = 'PAROPT.TXT'; + XseuilDefaut = 0.001; {valeur par d‚faut de XSeuil} + XRelDefaut = 1; {valeur par d‚faut de Xrel } + XPartDefaut = 0.5; {valeur par d‚faut de XPart} + XSensDefaut = 1; {valeur par d‚faut de XSens} + XQuelChronDefaut = 3; {valeur par d‚faut de XQuelChron} + XNomFicFinOptim : array[0..1] of string = ('PasOptim','FinOptim'); + +var + XExistFicReglage : boolean; + + XMessage : string; + XMessageElem : string; + + XRangetape : integer; {nul si l'‚tape concerne l'analyse de sensibilit‚ (classement des r‚servoir par ordre d'influence d‚croissante de leur volume exploitable sur les critŠres)} + XRangReservoir : integer; + XRangLac : integer; + XNombrePoints : integer; + Xmult : integer; {vaut alternativement 1 et -1 dans l'analyse de sensibilit‚} + Xi : integer; + Xj : integer; + XSens : integer; {1 ou 2 : si 1, CritP<=>QXdef et CritS<=>Sollicitation; si 2, CritP<=>Sollicitation et CritS<=>QXdef} + XQuelChron : integer; {1, 2 ou 3 pour critŠres … utiliser, r‚sultant de : calculs en chrono inverse, calcul en chrono normale ou moyenne des deux} + + + + XMinEcartSupPart : double; {min sur les r‚servoirs de 1 - part th‚orique} + XMinEcartInfPart : double; {min sur les r‚servoirs de part th‚orique} + XEcartPart : double; {‚cart par rapport … la part relative standard du r‚servoir en cours d'optimisation (% part globale des non optimis‚s)} + XVtotCumulFige : double; {somme des vol. exploit. r‚els pour les r‚servoirs dont le vol. exp. fictif a d‚j… ‚t‚ optimis‚} + XVRtotCumulFige : double; {somme des vol. exploit. fictifs pour les r‚servoirs dont le vol. exp. fictif a d‚j… ‚t‚ optimis‚} + XVtotCumulLibre : double; {somme des vol. exploit. r‚els pour les r‚servoirs dont le vol. exp. fictif n'est pas encore optimis‚} + XVRtotCumulLibre : double; {somme des vol. exploit. fictifs pour les r‚servoirs dont le vol. exp. fictif n'est pas encore optimis‚} + XRel : double; {plus XRel est petit, plus on ‚largit le champ de test autour du meilleur point} + XEcartPartmin : double; {borne inf. de la fourchette d'‚carts … explorer autour de la part relative standard du res. en cours d'optimisation (% part globale des non optimis‚s)} + XecartPartmax : double; {borne sup. de la fourchette d'‚carts … explorer autour de la part relative standard du res. en cours d'optimisation (% part globale des non optimis‚s)} + XEcartPartMeilleur: double; {meilleure valeur en cours de XEcartPart} + XNouvelEcartPart : double; {nouvelle valeur … tester de XEcartpart} + XPart : double; {part de l'‚cart maximal possible de r‚partition des tƒches, utilis‚e pour le test de sensibilit‚} + XSeuil : double; {seuil de convergence sur l'‚cart de part du r‚servoir en cours d'optimisation, sur l'ensemble des r‚servoirs non encore optimis‚s} + + + XStatutVol : array[1..YNmaxLacs] of integer;{vaut 1 pour les lacs dont le vol. expl. fictif a d‚j… ‚t‚ optimis‚} + XRang : array[1..YNmaxLacs] of integer;{rang des r‚servoirs class‚s par ordre de sensibilit‚ d‚croissante} + XAmeliore : array[0..2] of integer; {am‚lioration de critŠre (1= oui, -1=non, 0= ‚galit‚). 0=global, 1 = 1er critŠre, 2 = 2eme critŠre)} + + XCritere : array[1..2] of double; {valeurs des critŠres principal CRITP et secondaire CRITS} + XCriteremeilleur : array[1..2] of double; {meilleur couple de CRITP et CRITS} + + XCritere0 : array[1..2,1..2] of YTab1; {critŠres pour analyse sensibilit‚. 1er indice =rang calcul, 2eme indice = rang du critŠre, 3eme indice = rang r‚servoir} + XEcart : array[1..2] of YTab1; {‚cart de critŠre pour analyse sensibilit‚ : 1er indice=rang du critŠre, 2eme indice = rang du r‚servoir} + +{-------------------------------------------------------------------------} +{--lecture des paramŠtres d'optimisation --} +{-------------------------------------------------------------------------} +procedure ICI_LectureParamOptim; + var + XXtest : boolean; + begin + XXTest:=false; + assign(YFiText,YRepP+XNomFicParamOptim); + {$i-} + reset(YFiText); + if ioresult=0 then + begin + readln(YFitext,Xpart); + readln(YFitext,XRel); + readln(YFitext,XSeuil); + readln(YFitext,XSens); + readln(YFitext,XQuelChron); + if ioresult<>0 then + XXTest:=true; + close(YFitext); + end + else + XXTest:=true; + {$i+} + if XXTest then + begin + XPart:=XPartDefaut; + XRel:=XRelDefaut; + XSeuil:=XSeuilDefaut; + XSens:=XSensDefaut; + XQuelChron:=XQuelChronDefaut; + end; + XPart :=B_min(0.9,B_max(0.1,XPart)); + XRel :=B_max(1,XRel); + XSeuil:=B_min(0.1,B_max(0.000001,XSeuil)); + XSens :=B_minIn(2,B_maxIn(1,Xsens)); + XQuelChron:=B_minIn(3,B_maxIn(1,XQuelChron)); + end; + +{-------------------------------------------------------------------------} +{--Ecriture de valeurs dans le fichier des r‚glages --} +{-------------------------------------------------------------------------} +procedure Ici_StockageReglage(ZReglage:YTab1); + var + XXRangLac : integer; + begin + assign(YFitext,YRepP+YNomFicReglage); + rewrite(YFitext); + for XXRangLac:=1 to YNmaxlacs do + writeln(YFitext,ZReglage[XXRangLac]); + close(YFitext); + end; + +{-------------------------------------------------------------------------} +{--Stockage du rang de l'‚tape de calcul : --} +{--Zi= 0 : test de la sensibilit‚ du critŠre aux parts des r‚servoirs --} +{--Zi= 1 : phase d'optimisation --} +{--Zj : rang du r‚servoir sur lequel va porter le r‚glage --} +{-------------------------------------------------------------------------} +procedure Ici_StockeEtapeReservoir(Zi,Zj,Zk:integer); + begin + assign(YFitext,YRepT+XNomFicEtape); + rewrite(YFitext); + writeln(YFitext,Zi); + writeln(YFitext,Zj); + if Zi=0 then + writeln(YFitext,Zk); + close(YFitext); + end; + +{-------------------------------------------------------------------------} +{--Lecture du rang de l'‚tape de calcul : --} +{-------------------------------------------------------------------------} +procedure Ici_LectureEtapeReservoir(var Zi,Zj,Zk:integer); + begin + assign(YFitext,YRepT+XNomFicEtape); + reset(YFitext); + readln(YFitext,Zi); + readln(YFitext,Zj); + if Zi=0 then + readln(YFitext,Zk); + close(YFitext); + end; + +{-------------------------------------------------------------------------} +{--Lecture des r‚sultats de Vgest (d‚faillances) --} +{-------------------------------------------------------------------------} +procedure Ici_LectureResultatsVgest(var ZGlop:boolean); + var Xxi : integer; + Xxj : integer; + XSollicitmax : array[1..3] of double; + begin + {$i-} + assign(YFitext,YRepR+YNomFicResult6); + reset(YFitext); + for Xxi:= 1 to 4 do readln(YFitext); + readln(YFitext,YNbLacs); + readln(YFitext); + readln(YFitext,YOptionRepart); + readln(YFitext); + readln(YFitext,YTypeObjectif); + readln(YFiText); + for YRangLac:=1 to YNbLacs do + read(YFitext,YVtot[Yranglac]); + readln(YFitext,YVtotCumul); + if YOptionRepart=1 then + begin + for YRangLac:=1 to YNbLacs do + read(YFitext,YVRtot[Yranglac]); + readln(YFitext,YVRtotCumul); + XMinEcartSupPart:=1; + XMinEcartInfPart:=1; + for YRangLac:=1 to YNbLacs do + begin + read(YFitext,YPartTheorique[Yranglac]); + XMinEcartSupPart:=B_mindouble(XMinEcartSupPart,1-YPartTheorique[YrangLac]); + XMinEcartInfPart:=B_mindouble(XMinEcartInfPart,YPartTheorique[YrangLac]); + end; + readln(YFitext); + for YRangLac:=1 to YNbLacs do + read(YFitext,YPart[Yranglac]); + readln(YFitext); + for YRangLac:=1 to YNbLacs do + read(YFitext,YReglage[Yranglac]); + readln(YFitext); + end + else + for Xxi:=1 to 4 do + readln(YFitext); + for Xxi:=1 to 4 do + readln(YFitext); + for Xxj:=1 to 2 do + begin + for Xxi:=1 to YNbLacs do + read(YFiText,YVobjMoyRel[Xxj,Xxi]); + readln(YFitext); + end; + for Xxi:=1 to 4 do + readln(YFitext); + for Xxj:=1 to 3 do + begin + XSollicitMax[Xxj]:=0; + for Xxi:=1 to YNbLacs do + begin + read(YFitext,YSollicitation[Xxj,Xxi]); + if YSollicitation[Xxj,Xxi]>XSollicitMax[Xxj] then + XSollicitMax[Xxj]:=YSollicitation[Xxj,Xxi]; + end; + readln(YFitext); + end; + for Xxi:=1 to 4 do + readln(YFitext); + readln(YFitext,YVManqueMax[1]); + readln(YFitext,YVManqueMax[2]); + for Xxi:=1 to 15 do + readln(YFitext); + for Xxj:=1 to 3 do + readln(YFitext,YQXdefmoyGlop[2,Xxj],YQXdefmoyGlop[1,Xxj],YQXdefmoyGlop[0,Xxj]); + if XSens=1 then + begin + XCritere[1]:=YQXdefmoyGlop[2,XQuelChron]; + XCritere[2]:=XSollicitMax[XQuelChron]; + end + else + begin + XCritere[2]:=YQXdefmoyGlop[2,XQuelChron]; + XCritere[1]:=XSollicitMax[XQuelChron]; + end; + close(YFitext); + ZGlop:=(ioresult=0); + assign(YFitext,XnomRepSuiviOptim+XNomFicSuivi); + append(YFitext); + if ioresult<>0 then + rewrite(YFitext); + {$i+} + write(YFitext,XCritere[1],' ',XCritere[2],' '); + for YRangLac:=1 to YNbLacs do + write(YFitext,YPart[Yranglac],' '); + for YRangLac:=1 to YNbLacs do + write(YFitext,YReglage[Yranglac],' '); + writeln(YFitext); + flush(YFitext); + close(YFitext); + end; + +{---------------------------------------------------------------------------} +{--Calcul des parts de volume total exploitable sur l'ensemble des --} +{--r‚servoirs, pour les r‚servoirs dont la part a d‚j… ‚t‚ optimis‚e --} +{--(XVtotCumulFige et XVRtotcumulfige) et pour les autres (XVtotLibre et --} +{--XVrtotlibre) --} +procedure Ici_CalculeVolLibreFige; + var + Xxj : integer; + begin + XVtotCumulFige:=0; + XVRtotCumulFige:=0; + for Xxj:=1 to YNbLacs do + if XStatutVol[Xxj]=1 then + begin + XVRtotCumulfige:=XVRtotCumulFige+YVRtot[Xxj]; + XVtotCumulfige:=XVtotCumulFige+YVtot[Xxj]; + end; + XVtotCumulLibre:=YVtotCumul-XVtotCumulFige; + XVRtotCumulLibre:=YVtotCumul-XVRtotCumulFige; + end; + +{---------------------------------------------------------------------------} +{--Calcul des coefficients correcteurs ZReglage (‚quivalents … Ec de --} +{--Vgest) … partir de l'‚cart relatif ZEcartPart appliqu‚ au r‚servoir de --} +{--ZRang pour corriger la part de son volume YVRtot par rapport au cumul --} +{--des YVRtot des r‚servoirs pas encore optimis‚s --} +{---------------------------------------------------------------------------} +procedure Ici_CalculeReglage(ZEcartPart:double; ZRang : integer; var ZReglage : YTab1); + var + XxRangLac : integer; + begin + YVRtot[ZRang]:=YVtot[ZRang]*XVRtotCumulLibre/XVtotCumulLibre+ZEcartPart*XVRtotCumulLibre; + for XxRanglac:=1 to YNbLacs do + if (XStatutVol[XxRangLac]=0) and (XxRanglac<>ZRang) then + YVRtot[Xxranglac]:=YVtot[XxRangLac]*(XVRtotCumulLibre-YVrtot[ZRang])/(XVtotCumulLibre-YVtot[ZRang]); + for XxRangLac:=1 to YNbLacs do + ZReglage[XxRangLac]:=YVRtot[XxRangLac]/YVtot[XxRangLac]-1; + end; + +{---------------------------------------------------------------------------} +{--stockage sur fichier des r‚sultats d'un calcul Vgest lors de la phase --} +{--d'analyse de sensibilit‚ --} +{---------------------------------------------------------------------------} +procedure Ici_StockageCritereEtape0; + begin + assign(YFitext,YRepT+XNomFicResultEtape0); + {$i-} + append(YFitext); + if ioresult<>0 then + rewrite(YFitext); + {$i+} + write (YFitext,XCritere[1],' ',XCritere[2],' '); + for YRanglac:=1 to YNbLacs do + write(YFitext,YPartTheorique[YRangLac],' '); + for YRanglac:=1 to YNbLacs do + write(YFitext,YPart[YRangLac],' '); + writeln(YFitext); + close(YFitext); + end; + +{-------------------------------------------------------------------------} +{--lecture sur fichier de l'ensemble des r‚sultats de Vgest stock‚s --} +{--pendant la phase d'analyse de sensibilit‚ --} +{-------------------------------------------------------------------------} +procedure Ici_LectureCritereEtape0; + begin + assign(YFitext,YRepT+XNomFicResultEtape0); + reset(YFitext); + readln(YFitext,XCritere[1],Xcritere[2]); + for YRanglac:=1 to YNbLacs do + begin + readln(YFitext,XCritere0[1,1,YRangLac],XCritere0[1,2,YRangLac]); + readln(YFitext,XCritere0[2,1,YRangLac],XCritere0[2,2,YRanglac]); + end; + close(YFitext); + end; + +{--------------------------------------------------------------------------} +{--envoi d'un message … l'‚cran, pr‚d‚ d'une ligne de tirets --} +{--------------------------------------------------------------------------} + procedure Ici_MessageEcran; + begin + writeln; + writeln('-------------------------------------------------------------------------------'); + writeln(Xmessage); + end; + +{-------------------------------------------------------------------------} +{--stockage sur de r‚sultats sur fichier pendant la phase d'optimisation--} +{--des parts assign‚es aux r‚servoirs --} +{-------------------------------------------------------------------------} +procedure Ici_StockageResultatDichotomie(ZRangReservoir: integer); + var + Xxi : integer; + XxIndice : string; + begin + str(ZRangReservoir,XxIndice); + assign(YFitext,YRepT+XNomFicDichoto+XxIndice); + rewrite(YFitext); + writeln(YFitext,XNombrePoints); + writeln(YFitext,XEcartPartmin,' ',XEcartPartmax); + writeln(YFitext,XVtotCumulLibre,' ',XVRtotCumulLibre,' ',XVtotCumulFige,' ',XVRtotCumulFige); + for Xxi:=1 to YNbLacs do + write(YFitext,XRang[Xxi],' '); + writeln(YFitext); + for Xxi:=1 to YNbLacs do + write(YFitext,XStatutVol[Xxi],' '); + writeln(YFitext); + writeln(YFitext,XCritereMeilleur[1],' ',XCritereMeilleur[2],' ',XEcartPartMeilleur,' ',XNouvelEcartPart,' '); + close(YFitext); + end; + +{-------------------------------------------------------------------------} +{--lecture sur fichiers des r‚sultats stock‚s pendant la pr‚c‚dente --} +{--ex‚cution du programme, pendant la phase d'optimisation des parts --} +{--assign‚es aux r‚servoirs --} +{-------------------------------------------------------------------------} +procedure Ici_LectureResultatDichotomie(ZRangReservoir:integer); + var + Xxi : integer; + XxIndice:string; + begin + str(ZRangReservoir,XxIndice); + assign(YFitext,YRepT+XNomFicDichoto+XxIndice); + reset(YFitext); + readln(YFitext,XNombrePoints); + readln(YFitext,XEcartPartmin,XEcartPartmax); + readln(YFitext,XVtotCumulLibre,XVRtotCumulLibre,XVtotCumulFige,XVRtotCumulFige); + for Xxi:=1 to YNbLacs do + read(YFitext,XRang[Xxi]); + readln(YFitext); + for Xxi:=1 to YNbLacs do + read(YFitext,XStatutVol[Xxi]); + readln(YFitext); + readln(YFitext,XCritereMeilleur[1],XCritereMeilleur[2],XEcartPartMeilleur,XNouvelEcartPart); + close(YFitext); + end; + +{--------------------------------------------------------------------------} +{--cr‚ation d'un fichier balise pour indiquer au batch appelant de sortir--} +{--de la boucle --} +procedure Ici_SignaleFinProcessus(Zoption : integer); + begin + assign(YFitext,XnomFicFinOptim[ZOption]); + rewrite(YFitext); + close(YFitext); + assign(YFitext,YRepP+YNomFicCalcTri); + rewrite(YFitext); + close(YFitext); + end; + +{-------------------------------------------------------------------------} +{d‚but du programme principal --} +{-------------------------------------------------------------------------} + +BEGIN + + {--lecture des paramŠtres d'optimisation--} + ICI_LectureParamOptim; + + {--test d'existence du fichier reglage.txt--} + {$i-} + assign(Yfitext,YRepP+YNomFicReglage); + reset(YFitext); + XExistFicReglage:=(ioresult=0); + {$i+} + + {--cas o— le fichier reglage.txt n'existe pas : initialisation de celui-ci--} + {--et initialisation du fichier Suivi --} + if not XExistFicReglage then + begin + for YRangLac:=1 to YNmaxLacs do + YReglage[YRangLac]:=0; + Ici_StockageReglage(YReglage); + Ici_StockeEtapeReservoir(0,0,1); + assign(YFitext,XnomRepSuiviOptim+XNomFicSuivi); + rewrite(YFitext); + writeln(YFitext,'Chaque ligne de ce fichier resume les resultats obtenus avec ' + +'une repartition donnee du stockage entre les reservoirs :'); + if XSens=1 then + write(Yfitext,'criteres CRITP (=(moyenne temporelle de (QXdef2^N))^(1/N)) et CRITS (=max sur les reservoirs de (taux de sollicitation moyen quadratique))') + else + write(Yfitext,'criteres CRITP (=max sur les reservoirs de (taux de sollicitation moyen quadratique)) et CRITS (=(moyenne temporelle de (QXdef2^N))^(1/N))'); + case XQuelChron of + 1 : writeln(YFitext,' : valeurs obtenues par les calculs en sens chronologique inverse;'); + 2 : writeln(YFitext,' : valeurs obtenues par les calculs en sens chronologique normal;'); + 3 : writeln(YFitext,' : moyenne des valeurs obtenues par les calculs en sens chronologique inverse et normal'); + end; + writeln(YFitext,'parts des differents lacs (entre 0 et 1, somme=1) ; facteurs correctifs Ec'); + writeln(YFitext); + writeln(YFitext,'Valeurs des parametres de l''optimisation : Part = ', + XPart,' ; Rel = ',XRel,' ; Seuil = ',XSeuil); + writeln(YFitext); + writeln(YFitext,'Phase initiale : tests de sensibilite du critere vis a vis ' + +'des parts respectives des reservoirs, autour de la ' + + 'repartition standard (premiere ligne de resultats)'); + close(YFitext); + XMessage:='Calcul initial : r‚partition standard des tƒches entre r‚servoirs'; + Ici_MessageEcran; + end + + {--cas o— le fichier r‚glage.txt existe--} + else + + begin + + {--fermeture du fichier reglage.txt--} + close(YFitext); + + {--lecture des rangs de l'‚tape de calcul et du r‚servoir analys‚ par--} + {--le dernier calcul de Vgest, et lecture des r‚sultats de Vgest --} + Ici_LectureEtapeReservoir(XrangEtape,XRangReservoir,XMult); + Ici_LectureResultatsVgest(YYaBonResult); + + {--cas o— les r‚sultats de Vgest ont pu ˆtre lus--} + if YYaBonResult then + begin + + {--cas o— l'‚tape de calcul concerne les tests de sensibilit‚--} + if XRangEtape=0 then + + begin + + {--cas o— l'optimisation est inutile (cl‚ de r‚partition variable des--} + {--stockages, ou cl‚ de r‚partition fig‚e mais un seul r‚servoir) --} + if (YOptionRepart<>1) or ((XRangReservoir=0) and (YNbLacs=1)) then + begin + Ici_SignaleFinprocessus(0); + XMessage:='Pas d''optimisation '; + if YOptionRepart<>1 then + XMessage:=XMessage+'pour une cle de repartition variable des stockages' + else + XMessage:=XMessage+'car l''objectif ne concerne qu''un reservoir'; + Ici_MessageEcran; + end + + {--cas o— l'optimisation n'est pas inutile--} + else + + begin + + {--stockage de la valeur de critŠre obtenue avec le dernier calcul de --} + {--Vgest, avec les valeurs utilis‚es de r‚partition des taches --} + Ici_StockageCritereEtape0; + + {--Calcul de l'‚cart fixe de r‚partition des tƒches utilis‚ pour le test de sensibilit‚--} + if XMinEcartSupPart>XMinEcartInfPart then + XEcartPart:=XMinEcartInfPart*XPart + else + XEcartPart:=XMinEcartSupPart*Xpart; + + {--statut impos‚ de valeur non fig‚e du volume pour chaque r‚servoire--} + for YRangLac:=1 to YNbLacs do + XStatutVol[YRangLac]:=0; + + {--cas o— tous les r‚servoirs n'ont pas encore ‚t‚ test‚s--} + if (XRangReservoir<YNbLacs) or ((XRangReservoir=YNbLacs) and (XMult=-1)) then + + begin + + {--Incr‚mentation du rang de r‚servoir analys‚, stockage de celui-ci--} + Xmult:=-Xmult; + if XMult=-1 then + XRangReservoir:=XRangReservoir+1; + Ici_StockeEtapeReservoir(0,XRangReservoir,XMult); + + {--calcul et stockage des nouvelles valeurs de r‚glage--} + Ici_CalculeVolLibreFige; + Ici_CalculeReglage(XMult*XEcartPart,XRangReservoir,YReglage); + Ici_StockageReglage(YReglage); + + {--affichage de message ‚cran--} + Str(XRangReservoir,XMessage); + XMessage:='Test de sensibilit‚ de CRITP et CRITS : part du r‚servoir '+Xmessage; + Ici_MessageEcran; + + end { fin du cas o— tous les r‚servoirs n'ont pas encore ‚t‚ test‚s} + + {--cas o— tous les r‚servoirs ont ‚t‚ test‚s--} + else + + begin + + {--lecture des valeurs de critŠre obtenues avec le r‚glage standart --} + {--et avec le r‚glage modifi‚ de fa‡on fixe pour chacun des --} + {--r‚servoirs de fa‡on successive --} + Ici_LectureCritereEtape0; + + {--calcul des ‚carts obtenus pour chacun des r‚glages modifi‚s par --} + {--rapport au r‚glage standard. Statut non class‚ impos‚ pour chacun--} + {--de ces ‚carts --} + for YRangLac:=1 to YNbLacs do + begin + XEcart[1,YRangLac]:=abs(XCritere0[2,1,YRanglac]-XCritere0[1,1,YRanglac]); + XEcart[2,YRangLac]:=abs(XCritere0[2,2,YRanglac]-XCritere0[1,2,YRanglac]); + end; + + {--classement des r‚servoirs en fonction de la sensibilit‚ des --} + {--d‚faillances vis … vis de leurs volumes respectifs, et stockage--} + {--de ce classement --} + for Xi:=1 to YNbLacs do + begin + XRang[Xi]:=1; + for Xj:=1 to YNbLacs do + if Xj<>Xi then + begin + if XEcart[1,Xi]>XEcart[1,Xj] then + XAmeliore[1]:=-1 + else + if XEcart[1,Xi]=XEcart[1,Xj] then + XAmeliore[1]:=0 + else + XAmeliore[1]:=1; + if XEcart[2,Xi]>XEcart[2,Xj] then + XAmeliore[2]:=-1 + else + if XEcart[2,Xi]=XEcart[2,Xj] then + XAmeliore[2]:=0 + else + XAmeliore[2]:=1; + if XAmeliore[1]<>0 then + XAmeliore[0]:=XAmeliore[1] + else + if XAmeliore[2]<>0 then + XAmeliore[0]:=XAmeliore[2] + else + if Xj<Xj then + XAmeliore[0]:=1; + if XAmeliore[0]=1 then + XRang[Xi]:=XRang[Xi]+1; + end; + end; + + {--affichage de message … l'‚cran--} + XMessage:= 'Rangs des r‚servoirs par sensibilit‚ d‚croissante : '; + for Xi:=1 to YNbLacs do + begin + str(XRang[Xi],XmessageElem); + XMessage:=Xmessage+XMessageElem+' '; + end; + Ici_MessageEcran; + + {--initialisations des fichiers avant premier lancement de Vgest--} + {--concernant l'optimisation des parts attribu‚es aux r‚servoirs--} + {--On impose une diminution de la part du r‚servoir vis … vis --} + {--duquel le critŠre est le plus sensible. --} + XRangReservoir:=1; + XRangLac:=XRang[XRangReservoir]; + Ici_StockeEtapeReservoir(1,XRangReservoir,0); + Ici_CalculeVolLibreFige; + XEcartPartmin:=-YVtot[Xranglac]/XVtotCumulLibre; + XEcartPartmax:=1+XEcartPartmin; + XNombrePoints:=1; + XEcartPartMeilleur:=0; + XCritereMeilleur:=XCritere; + if (-XEcartPartmin)>0.5 then + XNouvelEcartPart:=(XRel*XEcartPartMeilleur+XEcartPartmin)/(1+XRel) + else + XNouvelEcartPart:=(XRel*XEcartPartMeilleur+XEcartPartmax)/(1+XRel); + Ici_StockageResultatDichotomie(XRangReservoir); + Ici_CalculeReglage(XNouvelEcartPart,XRangLac,YReglage); + Ici_StockageReglage(YReglage); + str(XNouvelEcartPart,XMessageElem); + str(XRangLac,XMessage); + XMessage:='Optimisation : part du reservoir '+XMessage; + assign(YFitext,XnomRepSuiviOptim+XNomFicSuivi); + append(YFitext); + writeln(YFitext); + writeln(YFitext,XMessage); + close(YFitext); + XMessage:=XMessage+' ('+XMessageElem+')'; + Ici_MessageEcran; + + + end; {fin du cas o— tous les r‚servoirs ont ‚t‚ test‚s} + + end; {fin du cas o— l'optimisation n'est pas inutile--} + + end {--fin du cas o— l'‚tape de calcul concerne les tests de sensibilit‚--} + + {--cas o— l'‚tape de calcul concerne l'optimisation des parts de tƒches--} + else + + begin + + {--lecture des r‚sultats pr‚c‚dants de l'optimisation pour le r‚servoir--} + {--courant, donnant le meilleur ‚cart obtenu avec ses critŠres, ainsi --} + {--que la fourchette d'‚carts restant … tester --} + Ici_LectureResultatDichotomie(XRangReservoir); + XRanglac:=XRang[XRangReservoir]; + XNombrePoints:=XNombrePoints+1; + + {--comparaison des r‚sultats donn‚s par la derniere r‚partition --} + {--test‚e, avec ceux de la meilleure r‚partition pr‚c‚demment --} + {--d‚termin‚e. Le r‚sultat de la comparaison est plac‚ dans --} + {--XAmeliore[0] : 1 pour meilleurs r‚sultats obtenus et -1 sinon --} + if (XCritere[1]>XCritereMeilleur[1]) then + XAmeliore[1]:=-1 + else + if (XCritere[1]=XCritereMeilleur[1]) then + XAmeliore[1]:=0 + else + XAmeliore[1]:=1; + if (XCritere[2]>XCritereMeilleur[2]) then + XAmeliore[2]:=-1 + else + if (Xcritere[2]=XCritereMeilleur[2]) then + XAmeliore[2]:=0 + else + XAmeliore[2]:=1; + if XAmeliore[1]<>0 then + XAmeliore[0]:=XAmeliore[1] + else + XAmeliore[0]:=XAmeliore[2]; + if XAmeliore[0]=0 then + if abs(XNouvelEcartpart)<abs(XEcartPartMeilleur) then + XAmeliore[0]:=1 + else + XAmeliore[0]:=-1; + + {--cas o— la nouvelle r‚partition donne de moins bons r‚sultats que--} + {--la meilleure des r‚partions pr‚c‚demment test‚es. Cette nouvelle--} + {--r‚partition est alors utilis‚e pour restreindre la fourchette de--} + {--r‚partitions restant … tester --} + if XAmeliore[0]=-1 then + if XNouvelEcartPart>XEcartPartmeilleur then + XECartPartmax:=XNouvelEcartPart + else + XEcartPartmin:=XNouvelEcartPart + + {--cas o— la nouvelle r‚partition donne de meilleurs r‚sultats que --} + {--la meilleure des r‚partions pr‚c‚demment test‚es. Cette nouvelle --} + {--r‚partition devient alors la meilleure et celle qui est d‚tr“n‚e --} + {--est alors utilis‚e pour restreindre la fourchette de r‚partitions--} + {--restant … tester --} + else + begin + if XNouvelEcartPart>XEcartPartMeilleur then + XEcartPartmin:=XEcartPartMeilleur + else + XEcartpartmax:=XEcartPartMeilleur; + XCritereMeilleur:=XCritere; + XEcartpartMeilleur:=XNouvelEcartPart; + end; + + {--d‚termination de la nouvelle r‚partition … tester --} + if (XEcartPartmax-XEcartPartMeilleur)>(XEcartPartMeilleur-XEcartPartmin) then + XNouvelEcartPart:=(XEcartPartmeilleur*XRel+XEcartPartmax)/(1+XRel) + else + XNouvelEcartPart:=(XEcartPartmeilleur*XRel+XEcartPartmin)/(1+XRel); + + {--cas o— l'optimisation de la part du r‚servoir courant a converg‚--} + if abs(XNouvelEcartPart-XEcartPartMeilleur)<XSeuil then + + begin + + {--on retient pour le r‚servoir qui vient d'ˆtre optimis‚, la part--} + {--donnant le meilleur r‚sultat. On fait les initialisations --} + {--n‚cessaires pour l'optimisation du r‚servoir suivant --} + XNouvelEcartPart:=XEcartPartMeilleur; + Ici_CalculeReglage(XNouvelEcartPart,XRangLac,YReglage); + XstatutVol[Xranglac]:=1; + XrangReservoir:=XRangReservoir+1; + XRanglac:=XRang[XRangreservoir]; + Ici_StockeEtapeReservoir(1,XRangReservoir,0); + Ici_CalculeVolLibreFige; + XEcartPartmin:=-YVtot[Xranglac]/XVtotCumulLibre; + XEcartPartmax:=1+XEcartPartmin; + XNombrePoints:=1; + XEcartPartMeilleur:=0; + str(XRangLac,XMessage); + XMessage:='Optimisation : part du reservoir '+XMessage; + assign(YFitext,XnomRepSuiviOptim+XNomFicSuivi); + append(YFitext); + writeln(YFitext); + writeln(YFitext,XMessage); + close(YFitext); + + {--cas o— il reste des r‚servoirs … optimiser--} + if XRangReservoir<YNbLacs then + XNouvelEcartPart:=(XRel*XEcartPartMeilleur+XEcartPartmin)/(1+XRel) + + {--cas o— il ne reste pas de r‚servoir … optimiser--} + else + begin + XNouvelecartPart:=0; + Ici_SignaleFinProcessus(1); + end; + + end; {fin du cas o— l'optimisation du r‚servoir courant a converg‚} + + {--stockage des r‚sultats de l'‚tape de dichotomie, calcul du nouveau--} + {--r‚glage et stockage de celui-ci pour le nouveau calcul de VGEST, --} + {--message ‚cran --} + Ici_StockageResultatDichotomie(XRangReservoir); + Ici_CalculeReglage(XNouvelEcartPart,XRangLac,YReglage); + Ici_StockageReglage(YReglage); + str(XNouvelEcartPart,XMessageElem); + str(XRangLac,XMessage); + XMessage:='Optimisation : part du reservoir '+XMessage+' ('+XMessageElem+')'; + Ici_MessageEcran; + + end; {fin du cas o— l'‚tape de calcul concerne l'optimisation des parts de tƒches} + + end {fin du cas o— les r‚sultats de Vgest ont pu ˆtre lus} + + {--cas o— les r‚sultats de VGest n'ont pas pu ˆtre lus--} + else + + begin + XMessage:='ProblŠme dans la lecture du fichier '+YNomFicResult6 + +'. Consultez le fichier '+YNomFicSortie; + Ici_MessageEcran; + Ici_SignaleFinProcessus(0); + end; + + end; {--fin du cas o— le fichier r‚glage.txt existe--} + + +END. diff --git a/src/UTILIT.PAS b/src/UTILIT.PAS index 4f96423843ca5601ab815a33d98f6e5e2473bfd4..3fc57211a1bc84fc5798e3bf345d8d04492601da 100644 --- a/src/UTILIT.PAS +++ b/src/UTILIT.PAS @@ -8,76 +8,56 @@ INTERFACE USES Dos; type - AChai3 = string[3]; - AChai4 = string[4]; - AChai5 = string[5]; - AChai6 = string[6]; - AEnsemble = set of byte; - APrecis1 = double; - Aprecis2 = double; + BChai4 = string[4]; + BChai5 = string[5]; + BEnsemble = set of byte; + BPrecis1 = double; + Bprecis2 = double; const - ACent = 100; - AHAsec : APrecis1 = -999; - AQHorsBar : APrecis1 = 998000.0; - AHLacune : APrecis1 = 9999; {code des cotes en lacune } - AJour_An = 365; - ALong : array[1..12] of integer =(31,28,31,30,31,30,31,31,30,31,30,31); - Amaxanfin = 2100; {ann‚e maximale pour fin des calculs } - AMille = 1e+3; - AMillion = 1e+6; - Aminandeb = 1901; {ann‚e minimale pour d‚but de calcul } - AMinou : APrecis1 = 1999.1; - ANomBarrage = 'nomstat'; - APlacune : APrecis1 = 999000.0; {lacune de puissance } - AQlacune : APrecis1 = 999000.0; {code des d‚bits en lacune} - ASec_Jour = 86400.0; {nombre de secondes par jour} - ASMois : array[1..12] of string[4]=('janv','fevr','mars','avri','mai ','juin', + BJour_An = 365; + BLong : array[1..12] of integer =(31,28,31,30,31,30,31,31,30,31,30,31); + BSMois : array[1..12] of string[4]=('janv','fevr','mars','avri','mai ','juin', 'juil','aout','sept','octo','nove','dece'); - ATresNegatif= -1e+20; - ATresPositif= 1e+20; + BTresNegatif= -1e+20; + BTresPositif= 1e+20; var - ANom : string; - ANom1 : string; - ANom2 : string; - AMauv : boolean; - ACode : integer; - ACode1 : integer; - ACode2 : integer; - ACode3 : integer; -{ - ADelai : integer; + BNom : string; + BNom1 : string; + BNom2 : string; + BMauv : boolean; + BCode : integer; + BCode1 : integer; + BCode2 : integer; + BCode3 : integer; Ax : integer; Ay : integer; -} - Alst : text; - AMumuch : AChai3; - -procedure ADatation (var Zou:text); -function AMaxExt(ZR1,ZR2:Extended):Extended; -function AMinExt(ZR1,ZR2:Extended):Extended; -function AMax (ZR1,ZR2:Aprecis2):Aprecis2; -function AMin (ZR1,ZR2:Aprecis2):Aprecis2; -function AMaxIn (ZI1,ZI2:integer):integer; -function AMinIn (ZI1,ZI2:integer):integer; -function AMaxLongInt (ZD1,ZD2:Longint):longint; -function AMinLongInt (ZD1,ZD2:longint):longint; -function AMaxDouble (ZD1,ZD2:Aprecis1) :Aprecis1; -function AMinDouble (ZD1,ZD2:Aprecis1) :Aprecis1; -function ALongmois (ZAn,ZMois:integer):integer; -function ADateClaire (ZAnnee,ZQuant:integer):AChai5; {date en clair … partir du quantieme} -function AQuantieme (Zjour,Zmois,ZAnnee:integer):integer; -function ATjour (ZAn,ZMois,ZJour:longint):longint; -function ADate (ZRang:longint):string; -procedure AEfface (ZNomfi:string); + +procedure B_Datation (var Zou:text); +function B_MaxExt(ZR1,ZR2:Extended):Extended; +function B_MinExt(ZR1,ZR2:Extended):Extended; +function B_Max (ZR1,ZR2:Bprecis2):Bprecis2; +function B_Min (ZR1,ZR2:Bprecis2):Bprecis2; +function B_MaxIn (ZI1,ZI2:integer):integer; +function B_MinIn (ZI1,ZI2:integer):integer; +function B_MaxLongInt (ZD1,ZD2:Longint):longint; +function B_MinLongInt (ZD1,ZD2:longint):longint; +function B_MaxDouble (ZD1,ZD2:Bprecis1) :Bprecis1; +function B_MinDouble (ZD1,ZD2:Bprecis1) :Bprecis1; +function B_Longmois (ZAn,ZMois:integer):integer; +function B_DateClaire (ZAnnee,ZQuant:integer):BChai5; {date en clair … partir du quantieme} +function B_Quantieme (Zjour,Zmois,ZAnnee:integer):integer; +function B_QuantiemeNonBiss(ZDate:longint):integer; +function B_Tjour (ZAn,ZMois,ZJour:longint):longint; +function B_Date (ZRang:longint):string; {============================================================================} IMPLEMENTATION -procedure ADatation(var Zou:text); +procedure B_Datation(var Zou:text); var XHeure,XMinute,XSeconde,XSec100,XAnnee,XMois,XJour,XJour_Semaine: word; begin getdate(XAnnee,XMois,XJour,XJour_Semaine); @@ -89,103 +69,143 @@ procedure ADatation(var Zou:text); {----------------------------------------------------------------------------} {----------------------------------------------------------------------------} -function AMaxExt(ZR1,ZR2:Extended):Extended; - begin if ZR1>ZR2 then AMaxExt:=ZR1 else AMaxExt:=ZR2; end; +function B_MaxExt(ZR1,ZR2:Extended):Extended; + begin if ZR1>ZR2 then B_MaxExt:=ZR1 else B_MaxExt:=ZR2; end; -function AMinExt(ZR1,ZR2:Extended):Extended; - begin if ZR1<ZR2 then AMinExt:=ZR1 else AMinExt:=ZR2; end; +function B_MinExt(ZR1,ZR2:Extended):Extended; + begin if ZR1<ZR2 then B_MinExt:=ZR1 else B_MinExt:=ZR2; end; -function AMax(ZR1,ZR2:Aprecis2):Aprecis2; - begin if ZR1>ZR2 then AMax:=ZR1 else AMax:=ZR2; end; +function B_Max(ZR1,ZR2:Bprecis2):Bprecis2; + begin if ZR1>ZR2 then B_Max:=ZR1 else B_Max:=ZR2; end; -function AMin(ZR1,ZR2:Aprecis2):Aprecis2; - begin if ZR1<ZR2 then AMin:=ZR1 else AMin:=ZR2; end; +function B_Min(ZR1,ZR2:Bprecis2):Bprecis2; + begin if ZR1<ZR2 then B_Min:=ZR1 else B_Min:=ZR2; end; -function AMaxIn(ZI1,ZI2:integer):integer; - begin if ZI1>ZI2 then AMaxin:=ZI1 else AMaxin:=ZI2; end; +function B_MaxIn(ZI1,ZI2:integer):integer; + begin if ZI1>ZI2 then B_Maxin:=ZI1 else B_Maxin:=ZI2; end; -function AMinIn(ZI1,ZI2:integer):integer; - begin if ZI1<ZI2 then AMinIn:=ZI1 else AMinIn:=ZI2; end; +function B_MinIn(ZI1,ZI2:integer):integer; + begin if ZI1<ZI2 then B_MinIn:=ZI1 else B_MinIn:=ZI2; end; -function AMaxLongInt(ZD1,ZD2:Longint):longint; - begin if ZD2>ZD1 then AMaxLongInt:=ZD2 else AMaxLongInt:=ZD1; end; +function B_MaxLongInt(ZD1,ZD2:Longint):longint; + begin if ZD2>ZD1 then B_MaxLongInt:=ZD2 else B_MaxLongInt:=ZD1; end; -function AMinLongInt(ZD1,ZD2:longint):longint; - begin if ZD2<ZD1 then AMinLongInt:=ZD2 else AMinLongInt:=ZD1; end; +function B_MinLongInt(ZD1,ZD2:longint):longint; + begin if ZD2<ZD1 then B_MinLongInt:=ZD2 else B_MinLongInt:=ZD1; end; -function AMaxDouble (ZD1,ZD2:Aprecis1) :Aprecis1; - begin if ZD2>ZD1 then AMaxDouble :=ZD2 else AMaxDouble :=ZD1; end; +function B_MaxDouble (ZD1,ZD2:Bprecis1) :Bprecis1; + begin if ZD2>ZD1 then B_MaxDouble :=ZD2 else B_MaxDouble :=ZD1; end; -function AMinDouble (ZD1,ZD2:Aprecis1) :Aprecis1; - begin if ZD2<ZD1 then AMinDouble :=ZD2 else AMinDouble :=ZD1; end; +function B_MinDouble (ZD1,ZD2:Bprecis1) :Bprecis1; + begin if ZD2<ZD1 then B_MinDouble :=ZD2 else B_MinDouble :=ZD1; end; {----------------------------------------------------------------------------} -function ALongmois(ZAn,ZMois:integer):integer; -{donne le nombre de jours du mois Mois de l'annee An} +function B_Longmois(ZAn,ZMois:integer):integer; +{donne le nombre de jours du mois Mois de l'annee An, en tenant compte pour } +{f‚vrier du caractŠre bissextile ou non de l'ann‚e. Une ann‚e est bissextile} +{si elle est multiple de 4 et non divisible par 100, ou bien si elle est } +{multiple de 400. } var XL : integer; begin - XL:=ALong[ZMois]; - if (ZMois=2) and ((ZAn mod 4) = 0) then XL:=XL+1; - ALongMois:=XL; + XL:=BLong[ZMois]; + {if (ZMois=2) and ((ZAn mod 4) = 0) then XL:=XL+1;} + if (ZMois=2) and + ((Zan mod 4) = 0) and + (((Zan mod 100) <> 0) or ((Zan mod 400) = 0)) then + XL:=XL+1; + B_LongMois:=XL; end; {----------------------------------------------------------------------------} -function ADateClaire(ZAnnee,ZQuant:integer):AChai5; -{---Calcul de la date en format jj.mm, … partir du quantiŠme annuel, pour ---} -{---une ann‚e consid‚r‚e bissextile (mod 4 = 0) ou non bissextile ---} +function B_DateClaire(ZAnnee,ZQuant:integer):BChai5; +{---Calcul de la date en format jj.mm … partir du quantiŠme annuel, pour ---} +{---ann‚e bissextile ou non. ---} var XS,Xi:integer; - XC :AChai5; + XC :BChai5; begin XS:=0;Xi:=0; repeat - Xi:=Xi+1; XS:=XS+ALongMois(Zannee,Xi); + Xi:=Xi+1; XS:=XS+B_LongMois(Zannee,Xi); until XS>=ZQuant; - str((ZQuant-XS+ALongMois(ZAnnee,Xi)+Xi/100):5:2,XC); if XC[1]=' ' then XC[1]:='0'; - ADateClaire:=XC; + str((ZQuant-XS+B_LongMois(ZAnnee,Xi)+Xi/100):5:2,XC); if XC[1]=' ' then XC[1]:='0'; + B_DateClaire:=XC; end; {----------------------------------------------------------------------------} -function AQuantieme(Zjour,Zmois,ZAnnee:integer): integer; +function B_Quantieme(Zjour,Zmois,ZAnnee:integer): integer; +{--calcul du quantiŠme … partir du jour, du mois et de l'ann‚e, pour une --} +{--ann‚e bissextile ou non. --} var Xi,XS:integer; begin Xs:=0; - for Xi:=1 to ZMois-1 do Xs:=XS+ALongMois(ZAnnee,Xi); - AQuantieme:=XS+Zjour; + for Xi:=1 to ZMois-1 do Xs:=XS+B_LongMois(ZAnnee,Xi); + B_Quantieme:=XS+Zjour; + end; + +{----------------------------------------------------------------------------} + +function B_QuantiemeNonBiss(ZDate:longint) : integer; +{--en fonction du nombre de jours ZDate ‚coul‚s depuis le 31/12/1599, --} +{--calcule la date jj/mm/aaaa et donne le quantiŠme de jj/mm/2001, c'est--} +{--… dire pour le mˆme jour et le mˆme mois d'une ann‚e non bissextile --} + var + XChaineDate: string; + XJour : integer; + XMois : integer; + XCode : integer; + begin + XChaineDate:=B_Date(ZDate); + val(copy(XChaineDate,1,2),XJour,XCode); + val(copy(XChaineDate,4,2),XMois,XCode); + B_QuantiemeNonBiss:=B_Quantieme(XJour,XMois,2001); end; {----------------------------------------------------------------------------} -function ATjour(ZAn,ZMois,ZJour:longint):longint; -{Calcule le numero du jour compt‚ depuis le 31/12/1899 (1er jour). +function B_Tjour(ZAn,ZMois,ZJour:longint):longint; +{calcul du nombre de jours ‚coul‚s depuis le 31/12/1599 (nombre = 0), … --} +{partir de l'ann‚e, du mois et du jour. le calcul est valable … partir --} +{01/01/1600 (nombre = 1). --} +{--obsolŠte--Calcule le numero du jour compt‚ depuis le 31/12/1899 (1er jour). An est entr‚ en ann‚e sur 4 chiffres. Le calcul est valable de 1901 … 2099. Remarquer que 1900 n'est pas bissextile} -{corrig‚ 2000} +{--obsolŠte--corrig‚ 2000} const XN: array[1..12] of integer = (0,31,59,90,120,151,181,212,243,273,304,334); var XDeb: longint; begin - ZAn:=Zan-1900; - XDeb:= XN[ZMois]+Zjour+1+ZAn*365+ ((ZAn-1) div 4); - if ((ZAn mod 4) = 0) and (ZMois > 2) then XDeb:=XDeb+1; - ATjour := XDeb; + ZAn:=Zan-1600; + {XDeb:= XN[ZMois]+Zjour+1+ZAn*365+ ((ZAn-1) div 4);} + XDeb:= XN[ZMois]+Zjour+ZAn*365 + + (B_maxin(0,ZAn-1)) div 4 + - (B_maxin(0,Zan-1)) div 100 + + (B_maxin(0,Zan-1)) div 400; + if Zan>0 then + XDeb:=Xdeb+1; + if ((ZAn mod 4) = 0) and (ZMois > 2) then + if ( ((Zan mod 100)<>0) or((Zan mod 400)=0) ) then + XDeb:=XDeb+1; + B_Tjour := XDeb; end; {----------------------------------------------------------------------------} -function ADate(ZRang:longint):string; -{ calcul de la date en clair … partir du jour compt‚ depuis le 31/12/1899. - Le calcul est valable … partir de 1901.} +function B_Date(ZRang:longint):string; +{--calcul de la date en clair … partir du nombre de jours ‚coul‚s depuis --} +{--le 31/12/1599 (nombre = 0). --} +{--obsolŠte--calcul de la date en clair … partir du jour compt‚ depuis le 31/12/1899.} +{--obsolŠte--Le calcul est valable … partir de 1901.} -{corrig‚ 2000} +{--obsolŠte--corrig‚ 2000} var Xi,Xj,Xk :integer; - XDat :Aprecis2; + XDat :Bprecis2; XS1,XS2,XS3 : string[4]; XDuree :longint; @@ -193,30 +213,30 @@ function ADate(ZRang:longint):string; function XNombjour(Zi:integer):integer; begin - if (Zi mod 4)=0 then XNombjour:=366 + {if (Zi mod 4)=0 then XNombjour:=366} + if ((Zi mod 4)=0) and (((Zi mod 100)<>0)or((Zi mod 400)=0)) then + XNombjour:=366 else XNombjour:=365; end; {- - - - - - - - - - - - - - - - - - - - - - - -} begin - Xi:=1899; XDuree:= 0; + {Xi:=1899;} + Xi:=1599; + XDuree:= 0; while XDuree< ZRang do begin Xi:=Xi+1; XDuree:=XDuree+XNombjour(Xi); end; - XDuree:=XDuree-XNombjour(Xi); Xj:=0; + XDuree:=XDuree-XNombjour(Xi); + Xj:=0; while XDuree<ZRang do begin - Xj:=Xj+1; XDuree:=XDuree+ALongmois(Xi,Xj); + Xj:=Xj+1; XDuree:=XDuree+B_Longmois(Xi,Xj); end; - XDuree:=XDuree-ALongmois(Xi,Xj); + XDuree:=XDuree-B_Longmois(Xi,Xj); Xk:=ZRang-XDuree; -{ - str(Xk:2,XS1); - str(Xj:2,XS2); - str(Xi:4,XS3); -} str(Xk,XS1); if Xk<10 then XS1:='0'+XS1; @@ -224,23 +244,11 @@ function ADate(ZRang:longint):string; if Xj<10 then XS2:='0'+XS2; str(Xi:4,XS3); - ADate:=XS1+'/'+XS2+'/'+XS3; - end; - -{----------------------------------------------------------------------------} -{---Effacement du fichier portant le nom Nomfi ---} - -procedure AEfface(ZNomfi:string); - var - Xfix:file of boolean; - begin - assign(XFix,ZNomfi); - {$i-}; rewrite(Xfix); {$i+}; - if ioresult=0 then begin close(XFix); erase(Xfix); end; + B_Date:=XS1+'/'+XS2+'/'+XS3; end; {============================================================================} BEGIN END. - \ No newline at end of file + diff --git a/src/VGEST.PAS b/src/VGEST.PAS index 8772759e4d0f267226685463b480bec6d4150b7e..fe8be2a0848d887772ff58738a4b0e1c0324e3c6 100644 --- a/src/VGEST.PAS +++ b/src/VGEST.PAS @@ -1,165 +1,561 @@ -PROGRAM VGEST5; {idem … Vgest3 mais avec extension de p‚riode analys‚e possible de 100 … 250} +PROGRAM VGEST; + +{--JC Bader, nov 2016--} + +uses Utilit,Interfas,DECLARA,ECRAN,PARAM,CALCULS1,CALCULS2,CALCULS3,CALCULS4; + +{--------------------------------------------------------------------------} +{-Effacement des fichiers texte de r‚sultats pr‚c‚dents et incr‚mentation--} +{-du rang de calcul. --} +{--------------------------------------------------------------------------} + +procedure Ici_Effacement; + begin + assign(YFitext,YRepR+YNomFicResult6); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicSortie); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResult1); rewrite(YFitext); close(YFitext); + assign(YFitext,YrepR+YNomFicResult2); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResult4); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResult5[1]); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResult5[2]); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResChr1); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResChr2); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicQuant); rewrite(YFitext); close(YFitext); + for YRangLac:=1 to YNmaxLacs do + begin + str(YRanglac,YNum); + assign(YFitext,YRepR+YNomFicResultVobj+YNum+YExIsofreq); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResultVop+YNum+YExIsofreq); rewrite(YFitext); close(YFitext); + end; + assign(YFitext,YRepR+YNomFicResDef+'0B'+YExIsofreq); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResDef+'1B'+YExIsofreq); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResultM+'A'+YExIsofreq); rewrite(YFitext); close(YFitext); + assign(YFitext,YRepR+YNomFicResultM+'B'+YExIsofreq); rewrite(YFitext); close(YFitext); + assign(YFitext,YNomFicRangCal); + {$i-} {d‚sactive le contr“le des entr‚es-sorties} + reset(YFitext); + if ioresult<>0 then + begin + rewrite(YFitext); + YCompteur:=1; + writeln(YFitext,YCompteur); + end + else + begin + readln(YFitext,YCompteur); + if ioresult=0 then + YCompteur:=YCompteur+1 + else + YCompteur:=1; + rewrite(YFitext); + writeln(YFitext,YCompteur); + end; + close(YFitext); + {$i+} {active le contr“le des entr‚es-sorties} + end; + + {------------------------------------------------------------------------} + {--OUVERTURE DU FICHIER DES SORTIES d‚crivant les paramŠtres du calcul --} + {--et donnant certaines statistiques sur les r‚sultats obtenus. --} + {--PremiŠres ‚critures sur ce fichier. --} + {------------------------------------------------------------------------} + + Procedure Ici_Ecriture_EnTete_CondStat; + begin + assign(YFicSortie,YRepR+YNomFicSortie); + rewrite(YFicSortie); + writeln(YFicSortie,'Rang du calcul : ',YCompteur); + B_Datation(YFicSortie); + writeln(YFicSortie); + writeln(YFicSortie,'Ce fichier contient les informations suivantes :'); + writeln(YFicSortie); + writeln(YFicSortie,'RESUME DES CONDITIONS DU CALCUL : '); + writeln(YFicSortie,'# noms des fichiers de parametres et de donnees choisis'); + writeln(YFicSortie,'# caracteristiques des differents reservoirs (contraintes et consignes de gestion, ', + 'capacite, temps de propagation jusqu''a la station aval du systeme)'); + writeln(YFicSortie,'# mode de repartition entre les reservoirs du debit a stocker pour satisfaire l''objectif aval'); + writeln(YFicSortie,'# stations, superficies de bassin versant et temps de propagation utilises pour le ', + 'calcul des debits naturels aux prises et restitutions'); + writeln(YFicSortie,'# hydrogramme objectif annuel : nature (minimal ou maximal), valeurs de debit et ', + 'localisation a la station aval du systeme'); + writeln(yFicSortie); + writeln(YFicSortie); + writeln(YFicSortie,'STATISTIQUES DE RESULTATS concernant la repartition des debits a stocker : '); + writeln(YFicSortie,'# possibilites de satisfaction de l''objectif'); + writeln(YFicSortie,'# valeurs optimales de debits stockes, preleves et restitues'); + writeln(YFicSortie); + writeln(YFicSortie); + writeln(yFicSortie,'==================================='); + writeln(YFicSortie,'! RESUME DES CONDITIONS DU CALCUL !'); + writeln(yFicSortie,'==================================='); + writeln(YFicSortie); + end; -{--JC Bader, Janvier 2013--} + {--------------------------------------------------------------------------} + {--Si saisie clavier, CHOIX DU TYPE D'OBJECTIF : DEBIT MIN OU MAX A --} + {--RESPECTER. --} + {--Description de l'hyrogramme objectif et de son type dans le fichier --} + {--des paramŠtres et options du calcul. --} + {--------------------------------------------------------------------------} -uses Crt,Interfas,ECRAN,Utilit,DECLARA,PARAM,CALCULS1,CALCULS2,CALCULS3,CALCULS4; + Procedure Ici_ChoixTypeObjectif; + begin + if YSaisie then + E_Saisie2; + write(YFicSortie,'Hydrogramme objectif (debit QXobj) que l''on souhaite '); + if YTypeObjectif=0 then + begin + writeln(YFicSortie,'VOIR TOUJOURS DEPASSE a la station aval du systeme : '); + YResume:=YResume+' (Qmin) ; '; + end + else + begin + writeln(YFicSortie,'NE JAMAIS VOIR DEPASSE a la station aval du systeme : '); + YResume:=Yresume+' (Qmax) ; '; + end; + writeln(YFicSortie); + for Yi:=1 to trunc((YNbQXobj-1)/4)+1 do + begin + write(YFicSortie,'date : '); + for Yj:=(Yi-1)*4+1 to B_minin(4*Yi,YNbQXObj-1) do + write(YFicSortie,' ',B_DateClaire(2001,YDateObj[Yj])); + writeln(YFicSortie); + write(YFicSortie,'debit : '); + for Yj:=(Yi-1)*4+1 to B_minin(4*Yi,YNbQXObj-1) do + write(YFicSortie,' ',YDebitObj[Yj]:14); + writeln(YFicSortie); + writeln(YFicSortie); + end; + writeln(YFicSortie); + flush(YFicSortie) + end; + {-------------------------------------------------------------------} + {--OUVERTURE DU FICHIER TEXTE DE DEBITS NATURELS SYNCHRONISES, et --} + {--‚criture d'en-tˆte sur ce fichier --} + {-------------------------------------------------------------------} + + Procedure Ici_EcritureEntete_QSynchro; + begin + assign(YFicResult2,YRepR+YNomFicResult2); + rewrite(YFicResult2); + writeln(YFicResult2,'Rang du calcul : ',YCompteur,' ; ',YResume); + B_Datation(YFicResult2); + writeln(YFicResult2); + writeln(YFicResult2,'Debits naturels synchronises a la station aval et aux points de prise et de restitution des reservoirs'); + writeln(YFicResult2,'Les valeurs donnees en haut des colonnes de dates sont les parties ', + 'fractionnaires de celles-ci (exprimees en jour)'); + writeln(YFicResult2); + writeln(YFicResult2,'Variables editees :'); + writeln(YFicResult2); + writeln(YFicResult2,'# date aval : date a la station situee a l''aval du systeme (lieu de l''objectif)'); + writeln(YFicResult2,'# code : 1 si debits sans lacune et 0 sinon'); + writeln(YFicResult2,'# QXnat : debit naturel a la station aval, a 12h (date aval)'); + writeln(YFicResult2,'# QXobj : objectif de debit defini a la station aval, a 12h (date aval)'); + writeln(YFicResult2,'# date amont : date aval diminuee du temps de propagation entre le point de ', + 'restitution et la station aval du systeme'); + writeln(YFicResult2,'# QMnat : debit naturel au point de prise (date amont)'); + writeln(YFicResult2,'# QVnat : debit naturel au point de restitution (date amont)'); + writeln(YFicResult2); + write(YFicResult2,' 0.50000 '); + for YRanglac:=1 to YNbLacs do + write(YFicResult2,' ',YDecalDateQ[YRanglac]:8:5, + ' '); + writeln(YFicResult2); + write(YFicResult2,' date aval code QXnat QXobj '); + for YRangLac:=1 to YNbLacs do + write(YFicResult2,'date amont',YRangLac, + ' QMnat',YRanglac, + ' QVnat',YRanglac,' '); + writeln(YFicResult2); + end; -{===========================================================================} -{-- PROGRAMME PRINCIPAL --} -{===========================================================================} -BEGIN + {---------------------------------------------------------------------} + {--‚criture d'en-tˆte sur fichier texte de r‚sultats des chroniques --} + {--de volume --} + {---------------------------------------------------------------------} - {--DETERMINATION DU MODE D'ENTREE DES CHOIX DE CALCUL, PAR SAISIE CLAVIER--} - {--OU LECTURE SUR FICHIER TEXTE --} - ChoixEntreeOptions; - - {--EFFACEMENT DE TOUS LES FICHIERS de r‚sultats pr‚c‚dants, incr‚mentation--} - {--du rang du calcul --} - assign(YFitext,YRepR+YNomFicResult6); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicSortie); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResult1); rewrite(YFitext); close(YFitext); - assign(YFitext,YrepR+YNomFicResult2); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResult3); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResult4); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResult5); rewrite(YFitext); close(YFitext); - for YRangLac:=1 to YNmaxLacs do + Procedure Ici_EcritureEntete_Volumes; begin - str(YRanglac,YNum); - assign(YFitext,YRepR+YNomFicResultVobj+YNum); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResultVop+YNum); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResultM+YNum); rewrite(YFitext); close(YFitext); + assign(YFicResult4,YRepR+YNomFicResult4); + rewrite(YFicResult4); + writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ; ',Yresume); + B_Datation(YFicResult4); + writeln(YFicResult4); + writeln(YFicResult4,'Chroniques de volumes presents dans les reservoirs,', + ' les plus compatibles avec les chroniques de debits stockes objectifs'); + writeln(YFicResult4,'Les valeurs situees en haut des colonnes de date representent leur partie fractionnaire'); + writeln(YFicResult4); + writeln(YFicResult4,'Variables editees :'); + writeln(YFicResult4); + writeln(YFicResult4,'# date aval : date T a laquelle on vise l''objectif de debit a la station situee a l''aval du systeme'); + writeln(YFicResult4,'# date(i) : date aval diminuee du temps de propagation entre le point de ', + 'restitution du reservoir de rang i et la station aval du systeme, plus 12 heures (= T-D(i)+0.5)'); + write(YFicResult4,'# Vobj(i) : '); + if YTypeObjectif=0 then + writeln(YFicResult4,'plus petit volume d''eau present dans le reservoir i, permettant la meilleure satisfaction posterieure possible de l''objectif aval ', + '(un volume superieur ou egal a Vobj permet cette meilleure satisfaction possible dans le futur, mais un volume plus petit implique plus de defaillances futures)') + else + writeln(YFicResult4,'plus grand volume d''eau present dans le reservoir i, permettant la meilleure satisfaction posterieure possible de l''objectif aval ', + '(un volume inferieur ou egal a Vobj permet cette meilleure satisfaction possible dans le futur, mais un volume plus grand implique plus de defaillances futures)'); + write(YFicResult4,'# Vges(i) : '); + if YTypeObjectif=0 then + writeln(YFicResult4,'plus grand volume d''eau pouvant etre present dans le reservoir i, apres la meilleure satisfaction anterieure possible de l''objectif aval ', + '(un volume superieur a Vges, plus favorable a la satisfaction future, implique plus de defaillances anterieures)') + else + writeln(YFicResult4,'plus petit volume d''eau pouvant etre present dans le reservoir i, apres la meilleure satisfaction anterieure possible de l''objectif aval ', + '(un volume inferieur a Vges, plus favorable a la satisfaction future, implique plus de defaillances anterieures)'); + write(YFicResult4,'# Vop(i) : '); + if YTypeObjectif=0 then + writeln(YFicResult4,'plus petit volume d''eau present dans le reservoir i, compatible avec la meilleure satisfaction possible de l''objectif aval,', + ' passee (premiere priorite) et future (seconde priorite) : Vop = min(Vobj ; Vges)') + else + writeln(YFicResult4,'plus grand volume d''eau present dans le reservoir i, compatible avec la meilleure satisfaction possible de l''objectif aval,', + ' passee (premiere priorite) et future (seconde priorite) : Vop = max(Vobj ; Vges)'); + writeln(YFicResult4); + write(YFicResult4,' 0.50000 '); + for YRangLac:=1 to YNbLacs do + write(YFicResult4,' ',YDecalDateQ[YRangLac]:11:8, + ' ', + ' '); + writeln(YFicResult4); + write(YFicResult4,' date aval '); + if YAbsRel=1 then + for YRangLac:=1 to YNbLacs do + write(YFicResult4,' date',YRanglac,' Vobj',YRangLac,'(m3)', + ' Vobj',YRangLac,'(m3) a 24H ', + ' Vges',YRangLac,'(m3) ',' Vop',YRangLac,'(m3) ') + else + for YRangLac:=1 to YNbLacs do + write(YFicResult4,' date',YRanglac,' Vobj',YRangLac,'/Vtot',YRangLac, + ' Vobj',YRangLac,'/Vtot',YRangLac,'(24H) ', + ' Vges',YRangLac,'/VTot',YRangLac,' ',' Vop',YRangLac,'/Vtot',YRangLac,' '); + + writeln(YFicResult4); end; - assign(YFitext,YRepR+YNomFicResDef+'0'); rewrite(YFitext); close(YFitext); - assign(YFitext,YRepR+YNomFicResDef+'1'); rewrite(YFitext); close(YFitext); - assign(YFitext,YNomFicRangCal); - {$i-} - reset(YFitext); - if ioresult<>0 then - begin - rewrite(YFitext); - YCompteur:=1; - writeln(YFitext,YCompteur); - end - else + + {-----------------------------------------------------------------------} + {Ecriture sur fichier texte de r‚sultats concernant les d‚faillances de } + {gestion (volumes manquants Vdef dans les r‚servoirs et d‚faut de d‚bit } + {… la station objectif aval) pour une exploitation visant … optimiser la} + {r‚partition des taches entre r‚servoirs } + {-----------------------------------------------------------------------} + + procedure Ici_EditionBilan; + + var + Xi : integer; + Xj : integer; + XQXdef : array[1..2,1..2] of double; + begin - readln(YFitext,YCompteur); - if ioresult=0 then - YCompteur:=YCompteur+1 + + assign(YFicResult4,YRepR+YNomFicResult6); + rewrite(YFicResult4); + writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ',Yresume); + B_Datation(YFicResult4); + writeln(YFicResult4); + writeln(YFicResult4,YNbLacs,' (nombre de reservoirs)'); + writeln(YFicResult4); + writeln(YFicResult4,YOptionRepart,' (cle de repartition des stockages entre reservoirs : 1 = figee ; autre = variable)'); + writeln(YFicResult4); + writeln(YficResult4,YtypeObjectif,' (type d''objectif : 0 = maintien du debit ', + 'au dessus de Qmin ; autre = maintien du debit ', + 'en dessous de Qmax)'); + writeln(YficResult4); + for YRanglac:=1 to YNbLacs do + write(YFicResult4,YVtot[YRangLac],' '); + writeln(YFicResult4,YVtotCumul,' (volumes exploitables reels Vtot et leur somme (m3))'); + if YOptionRepart=1 then + begin + for YRanglac:=1 to YNbLacs do + write(YFicResult4,YVRtot[YRangLac],' '); + writeln(YFicResult4,YVRtotCumul,' (volumes exploitables fictifs VRtot et leur somme)'); + for YRanglac:=1 to YNbLacs do + write(YFicResult4,YPartTheorique[YRangLac],' '); + writeln(YFicResult4, ' (repartition theorique des taches)'); + for YRanglac:=1 to YNbLacs do + write(YFicResult4,YPart[YRangLac],' '); + writeln(YFicResult4, ' (repartition des taches apres reglage)'); + for YRanglac:=1 to YNblacs do + write(YFicResult4,YReglage[Yranglac],' '); + writeln(YFicResult4,' (coefficients de reglage)'); + end else - YCompteur:=1; - rewrite(YFitext); - writeln(YFitext,YCompteur); + begin + writeln(yFicResult4); + writeln(YFicResult4); + writeln(yFicResult4); + writeln(yFicResult4); + end; + writeln(YFicResult4); + writeln(yFicResult4,'---------------------------------------------------------------------------'); + writeln(yFicResult4); + writeln(YFicResult4,'Valeurs relatives moyennes du volume d''eau present dans chaque reservoir sur la periode de calcul '); + for YRangLac:=1 to YNblacs do + write(YFicResult4,YVobjMoyRel[1,YRangLac],' '); + writeln(YFicResult4,' (sens chronologique inverse : Vobj(24H)/Vtot)'); + for YRangLac:=1 to YNblacs do + write(YFicResult4,YVobjMoyRel[2,YRangLac],' '); + writeln(YFicResult4,' (sens chronologique : Vges/Vtot)'); + writeln(YFicResult4); + writeln(yFicResult4,'---------------------------------------------------------------------------'); + writeln(yFicResult4); + writeln(YFicResult4,'taux moyens quadratiques de sollicitation des reservoirs sur la periode de calcul'); + for YRangLac:=1 to YNblacs do + write(YFicResult4,YSollicitation[1,YRangLac],' '); + write(YFicResult4,' (sens chronologique inverse : '); + if YTypeObjectif=0 then + writeln(YFicResult4,'Vobj/Vtot)') + else + writeln(YFicResult4,'(Vtot-Vobj)/Vtot)'); + for YRangLac:=1 to YNblacs do + write(YFicResult4,YSollicitation[2,YRangLac],' '); + write(YFicResult4,' (sens chronologique : '); + if YTypeObjectif=1 then + writeln(YFicResult4,'Vges/Vtot)') + else + writeln(YFicResult4,'(Vtot-Vges)/Vtot)'); + for YRangLac:=1 to YNblacs do + write(YFicResult4,(YSollicitation[2,YRangLac]+YSollicitation[1,YRangLac])/2,' '); + writeln(YFicResult4,' (moyenne des taux quadratiques moyens des deux sens de calcul)'); + writeln(YFicResult4); + writeln(yFicResult4,'---------------------------------------------------------------------------'); + writeln(yFicResult4); + writeln(YFicResult4,'Valeurs maximales sur la periode de calcul, du volume manquant global Vdef rapporte a la capacite de l''ensemble des reservoirs : '); + writeln(YFicResult4,YVManqueMax[1]/YVTotCumul:26:11,' (sens chronologique inverse)'); + writeln(YFicResult4,YVManqueMax[2]/YVtotCumul:26:11,' (sens chronologique)'); + writeln(YFicResult4); + writeln(yFicResult4,'---------------------------------------------------------------------------'); + writeln(yFicResult4); + write(YFicResult4,'Defaillances correspondant a un '); + if YTypeObjectif=0 then + write(YFicResult4,'manque') + else + write(YFicResult4,'exces'); + writeln(YFicResult4,' de debit (m3/s) par rapport a l''objectif defini a la station aval du systeme :'); + writeln(YFicResult4,' QXdef0 : defaillances inevitables absolues dues aux contraintes physiques et consignes aux prises et restitutions des reservoirs'); + writeln(YFicResult4,' QXdef1 : defaillances dues a la fois aux contraintes physiques et consignes aux prises et restitutions, aux volumes d''eau V presents et aux capacites Vtot des reservoirs'); + writeln(YFicResult4,' QXdef2 : defaillance s''ajoutant a QXdef0, du fait des volumes d''eau V presents et des capacites Vtot des reservoirs (QXdef2=QXdef1-QXdef0)'); + writeln(YFicResult4); + write(YFicResult4,'Effectifs des defaillances selon differentes valeurs du code Succes (cf fichier ',YNomficSortie,'). Le code '); + if YTypeObjectif=0 then + write(YFicResult4,'-1') + else + write(YFicResult4,'1'); + writeln(YFicResult4,' correspond a des defaillances qui auraient pu etre evitees avec une repartition differente du volume global present'); + if YTypeObjectif=0 then + begin + for Xi:=-1 downto -3 do + write(YFicResult4,Xi:9,' '); + writeln(YFicResult4,' (code Succes)'); + for Xi:=-1 downto -3 do + write(YFicResult4,YNSuccesA[Xi]:9,' '); + writeln(YFicResult4,' (sens chronologique inverse)'); + for Xi:=-1 downto -3 do + write(YFicResult4,YNSuccesB[Xi]:9,' '); + writeln(YFicResult4,' (sens chronologique)'); + end + else + begin + for Xi:=1 to 4 do + write(YFicResult4,Xi:9,' '); + writeln(YFicResult4,' (code Succes)'); + for Xi:=1 to 4 do + write(YFicResult4,YNSuccesA[Xi]:9,' '); + writeln(YFicResult4,' (sens chronologique inverse)'); + for Xi:=1 to 4 do + write(YFicResult4,YNSuccesB[Xi]:9,' '); + writeln(YFicResult4,' (sens chronologique)'); + end; + writeln(yFicResult4); + writeln(YFicResult4,'Valeur moyenne de fonction puissance ((moyenne(QXdef^N))^(1/N) avec N = ',YPuiss,') : '); + writeln(YFicResult4,' QXdef2 QXdef1 QXdef0'); + writeln(YFicResult4,YQXdefmoyGlop[2,1]:22,' ',YQXdefmoyGlop[1,1]:22,' ',YQXdefmoyGlop[0,1]:22,' (sens chronologique inverse)'); + writeln(YFicResult4,YQXdefmoyGlop[2,2]:22,' ',YQXdefmoyGlop[1,2]:22,' ',YQXdefmoyGlop[0,2]:22,' (sens chronologique)'); + writeln(YFicResult4,((YQXdefmoyGlop[2,2]+YQXdefmoyGlop[2,1])/2):22,' ',((YQXdefmoyGlop[1,2]+YQXdefmoyGlop[1,1])/2):22,' ', + ((YQXdefmoyGlop[0,2]+YQXdefmoyglop[0,1])/2):22,' (moyenne des valeurs obtenues dans les deux sens de calcul)'); + + {--cas o— on ‚dite les valeurs tri‚es de d‚faillances de d‚bit--} + if YTestCalcTri then + begin + + for Xi:=1 to 2 do {Xi : 1 pour QXdef1 et 2 pour QXdef2} + for Xj:=1 to 2 do {Xj : 1 pour sens pas chrono et 2 pour sens chrono} + begin + assign(YFicQXdef [Xi,Xj],YRepT+YNomFicQXdef [Xj]+YExt[Xi]); + assign(YFicQXdefT[Xi,Xj],YRepT+YNomFicQXdefT[Xj]+YExt[Xi]); + C4_TriChronique(YFicQXdef[Xi,Xj],YFicQXdefT[Xi,Xj],YNbQXdefNul[Xi,Xj],YTouComNul,YQXdefmoy[Xi,Xj],YQXdefmed[Xi,Xj],YQXdefmax[Xi,Xj],YQXdefmin[Xi,Xj],YQXdefrare[Xi,Xj],YQXdeffrequent[Xi,Xj]); + end; + writeln(YFicResult4); + writeln(YFicResult4,'Fonctions de repartition (frequence = (n-YA)/(Effectif+YB) avec n=rang, YA=',YA,' et YB=',YB,') :'); + for Xi:= 1 to 2 do + begin + writeln(YFicResult4,' Repartition de QXdef',Xi); + write(YFicResult4,' Frequence--> Moyenne Maximum '); + for Yi:=1 to YNbFreq do + begin + YFreq:=1/YTpsFreq[Yi]; + write(YFicResult4,' ',Yfreq:7:5,' '); + end; + Yfreq:=0.5; + write(YFicResult4,' ',YFreq:7:5,' '); + for Yi:=1 to YNbFreq do + begin + YFreq:=1-1/YTpsFreq[YNbFreq+1-Yi]; + write(YFicResult4,' ',Yfreq:7:5,' '); + end; + writeln(YFicResult4,' Minimum'); + for Xj:=1 to 2 do + begin + write(YFicResult4,' ',YQXdefmoy[Xi,Xj]:22,' ',YQXdefmax[Xi,Xj]:10:3,' '); + for Yi:=1 to YNbfreq do + write(YFicResult4,YQXdefrare[Xi,Xj,Yi]:10:3,' '); + write(YFicResult4,YQXdefmed[Xi,Xj]:10:3,' '); + for Yi:=1 to YNbfreq do + write(YFicResult4,YQXdeffrequent[Xi,Xj,Yi]:10:3,' '); + write(YFicResult4,YQXdefmin[Xi,Xj]:10:3); + if Xj=1 then + writeln(YFicResult4,' (sens chronologique inverse)') + else + writeln(YFicResult4,' (sens chronologique)'); + end; + end; + writeln(YFicResult4); + writeln(YFicResult4,'valeurs classees :'); + for Xi:=1 to 2 do + for Xj:=1 to 2 do + reset(YFicQXdefT[Xi,Xj]); + writeln(YFicResult4,' QXdef1 QXdef1 QXdef2 QXdef2'); + writeln(YFicResult4,' (chronologie inverse) (sens chronologique) (chronologie inverse) (sens chronologique)'); + while not eof(YFicQXdefT[1,1]) do + begin + for Xi:=1 to 2 do + for Xj:=1 to 2 do + begin + read(YFicQXdefT[Xi,Xj],XQXdef[Xi,Xj]); + write(YFicResult4,' ',XQXdef[Xi,Xj]:22); + end; + writeln(YFicResult4); + end; + for Xi:=1 to 2 do + for Xj:=1 to 2 do + close(YFicQXdefT[Xi,Xj]); + + end; {fin du cas o— on ‚dite les valeurs tri‚es de d‚faillances de d‚bit} + + close(YficResult4); + end; - close(YFitext); - {$i+} + +{===========================================================================} +{-- PROGRAMME PRINCIPAL --} +{===========================================================================} + +BEGIN + + {--CHOIX DU MODE DE PARAMETRAGE DU CALCUL, PAR SAISIE CLAVIER OU LECTURE --} + {--DES PARAMETRES SUR FICHIER TEXTE (et lecture des paramŠtres pour le --} + {--second cas). --} + P_ChoixEntreeOptions; + + {--EFFACEMENT DE TOUS LES FICHIERS texte de r‚sultats pr‚c‚dants,--} + {--incr‚mentation du rang du calcul --} + Ici_Effacement; + if Ysaisie then - YSaisie1; + E_Message1; YCalculPossibl:=true; - {--OUVERTURE DU FICHIER DES SORTIES d‚crivant les paramŠtres du calcul et--} - {--les r‚sultats obtenus. PremiŠres ‚critures sur ce fichier --} - assign(YFicSortie,YRepR+YNomFicSortie); - rewrite(YFicSortie); - writeln(YFicSortie,'Rang du calcul : ',YCompteur); - ADatation(YFicSortie); - writeln(YFicSortie); - writeln(YFicSortie,'Ce fichier contient les informations suivantes :'); - writeln(YFicSortie); - writeln(YFicSortie,'RESUME DES CONDITIONS DU CALCUL : '); - writeln(YFicSortie,'-noms des fichiers de parametres et de donnees choisis'); - writeln(YFicSortie,'-caracteristiques des differents reservoirs (contraintes et consignes de gestion, ', - 'capacite, temps de propagation jusqu''a la station aval du systeme)'); - writeln(YFicSortie,'-stations, superficies de bassin versant et temps de propagation utilises pour le ', - 'calcul des debits naturels aux prises et restitutions'); - writeln(YFicSortie,'-hydrogramme objectif annuel : nature (minimal ou maximal), valeurs de debit et ', - 'localisation a la station aval du systeme'); - writeln(yFicSortie); - writeln(YFicSortie); - writeln(YFicSortie,'STATISTIQUES DE RESULTATS concernant (independamment de l''etat de remplissage des reservoirs) : '); - writeln(YFicSortie,'-les posssibilites de satisfaction de l''objectif'); - writeln(YFicSortie,'-les valeurs optimales de debits stockes, preleves, restitues et ', - 'a l''aval immediat des restitutions'); - writeln(YFicSortie); - writeln(YFicSortie); - writeln(yFicSortie,'==================================='); - writeln(YFicSortie,'! RESUME DES CONDITIONS DU CALCUL !'); - writeln(yFicSortie,'==================================='); - writeln(YFicSortie); - - {--LECTURE DES PARAMETRES DE STATION AVAL et ‚criture sur fichier de sortie--} - StationAval; - - {--LECTURE DES PARAMETRES DES CONTRAINTES ET CONSIGNES, et ‚criture sur--} - {--fichier de sortie, des rŠgles de gestion interpr‚t‚es --} - ContraintesEtConsignesLacs; - + {--OUVERTURE DU FICHIER DES SORTIES (YNomFicSortie = 'Condstat') d‚crivant--} + {--les paramŠtres et options du calcul et donnant certaines statistiques --} + {--de r‚sultats obtenus. PremiŠres ‚critures sur ce fichier. --} + Ici_Ecriture_EnTete_Condstat; + + {--Si saisie clavier : saisie du nom de station aval --} + {--Lecture du fichier de paramŠtres de station aval --} + {--Lecture des r‚glages (ne sert que pour mode de r‚partition fig‚) --} + {--Si saisie clavier : saisie du rang de paramŠtres lacs --} + {--si saisie clavier : saisie du rang de paramŠtres r‚seaux --} + {--‚criture sur fichier de sortie et r‚sum‚ : station aval --} + {--‚criture sur fichier de sortie : r‚servoirs --} + P_StationAval; + + {--Si saisie clavier : choix de la m‚thode de r‚partition et du type--} + {--d'‚dition des volumes --} + if Ysaisie then + E_saisie7; + + {--Dans le cas de l'option 5 concernant la r‚partition des objectifs --} + {--entre r‚servoirs, lecture de la fr‚quence de non d‚passement --} + {--souhait‚e pour les valeurs de d‚bits QMN aux droit des prises … --} + {--utiliser dans les calculs d'‚quilibrage des dur‚es potentielles --} + {--de remplissage. --} + if YOptionRepart=5 then + C2_LectureFreqNonDep; + + {--LECTURE DES PARAMETRES DES CONTRAINTES ET CONSIGNES, calcul des YVrtot --} + {--(utiles seulement pour mode de r‚partition 1) et ‚criture des rŠgles de--} + {--gestion interpr‚t‚e sur fichier de sortie, ‚criture des noms de --} + {--r‚servoirs et des rangs de paramŠtres r‚servoirs et r‚seaux sur r‚sum‚,--} + {--‚criture du mode de r‚partition des stockages sur fichier de sortie et --} + {--r‚sum‚. --} + P_ContraintesEtConsignesLacs; {--LECTURE DES PARAMETRES DE RESEAUX et ‚criture de ces paramŠtres sur --} {--fichier de sortie --} - ParametresReseau; - -{--LECTURE DES DEBITS NATURELS AUX STATIONS et calcul des d‚bits --} -{--correspondants … la station aval du systŠme et aux prises et restitutions--} + P_ParametresReseau; + + {--calcul des norme d'‚dition des volumes--} + for YRangLac:=1 to YnbLacs do + if YAbsRel=1 then + YNorme[YRangLac]:=1 + else + YNorme[YRangLac]:=YVtot[YRangLac]; + if YAbsRel=1 then + YNorme[0]:=1 + else + YNorme[0]:=YVtotCumul; + + {--Si saisie clavier, choix du fichier texte des d‚bits naturels --} + {--LECTURE DES DEBITS NATURELS AUX STATIONS, calcul des d‚bits correspon --} + {--dants … la station aval du systŠme et aux prises et restitutions, et --} + {--Ecriture de ceux-ci sur fichier texte (YNomFicResult1 = 'Qobs-P-R.txt')--} + {--‚criture du nom de fichier des apports naturel sur fichier de sortie et--} + {--r‚sum‚ --} if YCalculPossibl then begin - CalculeQPriseQrestitution; + C1_CalculeQPriseQrestitution; YCalculPossibl:=YGlopGlopDebit; if YCalculPossibl then - EcritureSeparation + P_EcritureSeparation else close(YFicSortie); end; - {--CHOIX DU FICHIER DES DEBITS OBJECIFS, lecture de ceux-ci et calcul des--} - {--d‚bits objectif pour chaque jour de l'ann‚e --} + {--Si saisie clavier, CHOIX DU FICHIER DES DEBITS OBJECIFS. --} + {--Lecture des d‚bits objectifs pivots et calcul des d‚bits objectif--} + {--pour chaque jour de l'ann‚e --} + {--‚criture du nom de fichier d'objectif sur fichier texte et r‚sum‚--} if YCalculPossibl then begin - LectureObjectif; - if YNbQobj<=0 then + C1_LectureObjectif; + if YNbQXobj<=0 then begin YCalculPossibl:=false; close(YFicSortie); end; end; - {--CHOIX DU TYPE D'OBJECTIF : DEBIT MIN OU MAX A RESPECTER. Description de--} - {--l'hyrogramme objectif et de son type dans le fichier des paramŠtres et --} - {--options du calcul. --} + {--Si saisie clavier CHOIX DU TYPE D'OBJECTIF A RESPECTER (Qmin ou Qmax --} + {--Description de l'hyrogramme objectif et de son type dans le fichier de--} + {--sortie des paramŠtres et options du calcul. Description du type de --} + {--l'objectif dans le resum‚ --} if YCalculPossibl then - begin - if YSaisie then - YSaisie2; - - write(YFicSortie,'Hydrogramme objectif que l''on souhaite '); - if YTypeObjectif=0 then - begin - writeln(YFicSortie,'VOIR TOUJOURS DEPASSE a la station aval du systeme : '); - YResume:=YResume+' (Qmin) ; '; - end - else - begin - writeln(YFicSortie,'NE JAMAIS VOIR DEPASSE a la station aval du systeme : '); - YResume:=Yresume+' (Qmax) ; '; - end; - writeln(YFicSortie); - for Yi:=1 to trunc((YNbQobj-1)/4)+1 do - begin - write(YFicSortie,'date : '); - for Yj:=(Yi-1)*4+1 to Aminin(4*Yi,YNbQObj-1) do - write(YFicSortie,' ',ADateClaire(2001,YDateObj[Yj])); - writeln(YFicSortie); - write(YFicSortie,'debit : '); - for Yj:=(Yi-1)*4+1 to Aminin(4*Yi,YNbQObj-1) do - write(YFicSortie,' ',YDebitObj[Yj]:14); - writeln(YFicSortie); - writeln(YFicSortie); - end; - writeln(YFicSortie); - end; + Ici_ChoixTypeObjectif; {--CAS OU PARAMETRES ET DONNEES RENDENT LES CALCULS POSSIBLES--} if YCalculPossibl then @@ -170,363 +566,160 @@ BEGIN assign(YFicResult1,YRepR+YNomFicResult1); reset(YFicResult1); - {--INITIALISATION DES STATISTIQUES de calcul de r‚partition--} - {$R+} - YNTestNul:=0; - YNItermax:=0; - for YrangLac:=1 to YNbLacs do - begin - for Yi:=-2 to 3 do - YNCodeRepart[YRanglac,Yi]:=0; - for Yi:=-3 to 2 do - YNCodeAval[YRanglac,Yi]:=0; - for Yi:=-3 to 3 do - YNCodePrise[YrangLac,Yi]:=0; - for Yi:=-2 to 1 do - YNCodeRestit[YRangLac,Yi]:=0; - end; - for Yi:=-3 to 2 do - YNSucces[Yi]:=0; + {$R+} {active le contr“le de validit‚ d'intervalle} - {--REMPLISSAGE INITIAL DU TABLEAU DES DEBITS NATURELS aval, prises et --} - {--restitutions, entre indices YDelaimin et Ydelaimax-1 --} + {--REMPLISSAGE INITIAL DU TABLEAU DES DATES (YDate) ET DEBITS NATURELS, --} + {--(YQ) aval, prises et restitutions, d'indices YDelaimin … Ydelaimax-1,--} + {--lus dans fichier texte des d‚bits aux prises et restitutions --} for YRangDelai:=1 to 7 do readln(YFicResult1); for YRangDelai:=YDelaimin to YDelaimax-1 do {--lecture de YDate[YRangDelai] et YQ[YRangdelai]--} - LectureQAvalPriseRestit (YrangDelai); + C1_LectureQAvalPriseRestit(YrangDelai); {--CALCUL DES DATES CRUCIALES : date associ‚e … l'indice 0 du tableau --} {--des d‚bits pour la station aval, et dates correspondantes pour les --} {--restitutions (d‚cal‚es en arriŠre selon les temps de propagation --} + {--La date du d‚bit … une restitution correspond … la date du d‚bit … --} + {--la station aval (affect‚e … midi), d‚cal‚e du temps de propagation.--} + {--Elle est constitu‚e d'une partie entiŠre (YDateEnJour) et d'une --} + {--partie fractionnaire (YDecalDateQ). --} val(copy(YDate[0],1,4),YAn,YCode); - val(copy(YDate[0],5,2),YMois,YCode); - val(copy(YDate[0],7,2),YJour,YCode); - YDAteEnJour[0]:=ATjour(YAn,YMois,YJour); + val(copy(YDate[0],5,2),YMois[0],YCode); + val(copy(YDate[0],7,2),YJour[0],YCode); + YDeb2.YDAteEnJour[0]:=B_Tjour(YAn,YMois[0],YJour[0]); for YrangLac:=1 to YNbLacs do begin - YDateEnJour[YrangLac]:=trunc(YDateEnJour[0]+0.5-YD[YRangLac]); - YDecalDateQ[YRanglac]:=frac(YDateEnJour[0]+0.5-YD[YRangLac]); - YQVVeille[YRanglac]:=YLacune; + YDeb2.YDateEnJour[YrangLac]:=trunc(YDeb2.YDateEnJour[0]+0.5-YD[YRangLac]); + YDecalDateQ[YRanglac]:=frac(YDeb2.YDateEnJour[0]+0.5-YD[YRangLac]); end; - {--OUVERTURE DU FICHIER TYPE DES DEFAILLANCES INEVITABLES DE DEBIT--} - assign(YFicQdef[0],YRepT+YNomFicQdef+'0'); - rewrite(YFicQdef[0]); - - {--OUVERTURE DU PREMIER FICHIER DE RESULTATS DETAILLES pour les d‚bits--} - {--naturels d‚cal‚s ainsi que les d‚bits r‚serv‚s et de r‚f‚rence aux --} - {--points de prise et restitution ; les d‚bits objectifs … l'aval des --} - {--restitutions et dans les canaux de prise et de restitution ; les --} - {--codes caract‚risant les d‚bits calcul‚s ; les d‚faillances de d‚bit--} - {--stock‚ in‚vitables du fait de d‚bits non contr“l‚s et des contr. et--} - {--consignes aux r‚servoirs. Ouverture aussi du fichier typ‚ des --} - {--d‚faillances de stockage de d‚bit --} - assign(YFicResult2,YRepR+YNomFicResult2); - rewrite(YFicResult2); - writeln(YFicResult2,'Rang du calcul : ',YCompteur,' ; ',YResume); - ADatation(YFicResult2); - writeln(YFicResult2); - writeln(YFicResult2,'Detail des resultats : chronique des debits ideaux (calcules independamment de l''etat ', - 'de remplissage des reservoirs), qui permettent d''obtenir le plus frequemment possible, ', - 'a la station aval, un debit egal a l''objectif'); - writeln(YFicResult2,'Les valeurs donnes en haut des colonnes de dates sont les parties ', - 'fractionnaires de celles-ci (exprimees en jour)'); - writeln(YFicResult2); - writeln(YFicResult2,'Variables editees :'); - writeln(YFicResult2); - writeln(YFicResult2,'-date aval : date a la station situee a l''aval du systeme'); - writeln(YFicResult2,'-Qnat : debit naturel a la station aval, a 12h (date aval)'); - writeln(YFicResult2,'-Qobj : objectif de debit defini a la station aval, a 12h (date aval)'); - writeln(YFicResult2,'-date amont : date aval diminuee du temps de propagation entre le point de ', - 'restitution et la station aval du systeme'); - writeln(YFicResult2,'-QMnat : debit naturel au point de prise (date amont)'); - writeln(YFicResult2,'-QVnat : debit naturel au point de restitution (date amont)'); - writeln(YFicResult2,'-QMref : debit de reference (qu''on souhaite ne pas voir depasse) a l''aval ', - 'immediat de la prise (date amont)'); - writeln(YFicResult2,'-QMres : debit reserve (qu''on souhaite voir depasse) a l''aval ', - 'immediat de la prise (date amont)'); - writeln(YFicResult2,'-QVref : debit de reference a l''aval immediat de la restitution (date amont)'); - writeln(YFicResult2,'-QVres : debit reserve a l''aval immediat de la restitution (date amont)'); - writeln(YFicResult2,'-A, B, C et D : codes definis dans le fichier ',YNomFicSortie); - writeln(YFicResult2,'-QV : debit ideal a l''aval immediat de la restitution (date amont) pour satisfaire au mieux ', - 'l''objectif aval, compte tenu de la repartition des debits naturels et des contraintes et ', - 'consignes aux prises et restitutions'); - writeln(YFicResult2,'-Qe : debit ideal dans le canal de prise (date amont) pour satisfaire au mieux l''objectif aval,', - ' compte tenu de la repartition des debits naturels et des contraintes et consignes aux prises et ', - 'restitutions'); - writeln(YFicResult2,'-Qs : debit ideal dans le canal de restitution (date amont) pour satisfaire au mieux l''objectif ', - 'aval, compte tenu de la repartition des debits naturels et des contraintes et consignes aux prises ', - 'et restitutions'); - writeln(YFicResult2,'-QST0 : norme du debit a stocker a repartir entre les reservoirs, si possible proportionnellement ', - 'a leurs volumes respectifs'); - if YTypeObjectif=0 then - write(YFicResult2,'-Qdef0 : manque') - else - write(YFicResult2,'-Qdef0 : exces'); - writeln(YFicResult2,'inevitable de debit par rapport a l''objectif a la station aval du systeme, du fait de la repartion ', - 'des apports naturels et des contraintes et consignes de gestion aux prises et restitutions'); - writeln(YFicResult2,'-Succes : code defini dans le fichier ',YNomFicSortie); - writeln(YFicResult2,'-Iter : nombre d''iterations effectuees pour calculer QS0 par encadrements successifs'); - writeln(YFicResult2,'-Test : egal a 1 si le debit total stocke croit comme il se doit avec QS0 dans le calcul ', - 'iteratif de QS0'); - writeln(YFicResult2); - write(YFicResult2,' 0.50000 '); - for YRanglac:=1 to YNbLacs do - write(YFicResult2,' ',YDecalDateQ[YRanglac]:8:5,' ', - ' ', - ' '); - writeln(YFicResult2); - write(YFicResult2,' date aval Qnat Qobj '); - for YRangLac:=1 to YNbLacs do - write(YFicResult2,'date amont',YRangLac,' QMnat',YRanglac,' ', - 'QVnat',YRanglac,' ','QMref',YRanglac,' ', - 'QMres',YRanglac,' ','QVref',YRanglac,' ', - 'QVres',YRanglac,' ',' A',YRanglac,' ','QV',YRanglac, - ' ',' B',YRanglac,' ',' C',YRanglac,' ',' D',YRanglac, - ' ',' Qe',YRanglac,' ',' Qs',YRanglac,' '); - writeln(YFicResult2,' QST0 ',' Qdef0 ',' Succes Iter Test'); - - {--OUVERTURE DU SECOND FICHIER DE RESULTATS DETALLES pour les d‚bits --} - {--stock‚s min, max et obtenus, avec les codes. --} - assign(YFicResult3,YRepR+YNomFicResult3); - rewrite(YFicResult3); - writeln(YFicResult3,'Rang du calcul : ',YCompteur,' ; ',YResume); - ADatation(YFicResult3); - writeln(YFicResult3); - writeln(YFicResult3,'Detail des resultats : chronique des debits ideaux (calcules independamment de l''etat ', - 'de remplissage des reservoirs), qui permettent d''obtenir le plus frequemment possible, ', - 'a la station aval, un debit egal a l''objectif'); - writeln(YFicResult3,'Les valeurs donnes en haut des colonnes de dates sont les parties ', - 'fractionnaires de celles-ci (exprimees en jour)'); - writeln(YFicResult3); - writeln(YFicResult3,'Variables editees :'); - writeln(YFicResult3); - writeln(YFicResult3,'-date : date a laquelle on vise l''objectif de debit a la station situee a l''aval du systeme'); - writeln(YFicResult3,'-date(i) : date de l''objectif aval, diminuee du temps de propagation entre le point de ', - 'restitution du reservoir de rang i et la station aval du systeme'); - writeln(YFicResult3,'-QST(i) : debit stocke ideal dans le reservoir de rang i (date(i)) pour satisfaire au mieux ', - 'l''objectif aval, compte tenu de la repartition des debits naturels et des contraintes et ', - 'consignes aux prises et restitutions'); - writeln(YFicResult3,'-QSTmin(i) : valeur minimale du debit stockable dans le reservoir de rang i (date(i)), compte ', - 'tenu des debits naturels, des contraintes et des consignes a la prise et a la restitution de ce ', - 'reservoir'); - writeln(YFicResult3,'-QSTmax(i) : valeur maximale du debit stockable dans le reservoir de rang i (date(i)), compte ', - 'tenu des debits naturels, des contraintes et des consignes a la prise et a la restitution de ce ', - 'reservoir'); - writeln(YFicResult3,'-A, B, C et D : codes definis dans le fichier ',YNomFicSortie); - writeln(YFicResult3); - write(YFicResult3,' 0.50000 '); - for YRanglac:=1 to YNbLacs do - write(YFicResult3,' ',YDecalDateQ[YRanglac]:8:5,' ', - ' '); - writeln(YFicResult3); - write(YFicResult3,' date '); - for YRangLac:=1 to YNbLacs do - write(YFicResult3,' date',YRangLac,' QST',YRanglac,' QSTmin', - YRangLac,' QSTmax',YRangLac,' A',YRangLac,' B',YRangLac,' C', - YRangLac,' D',YRangLac,' '); - writeln(YFicResult3); + {--Ouverture du fichier typ‚ temporaire d'enregistrements YDeb2 --} + {--contenant l'objectif global de d‚bit … stocker (YQXsous) et les --} + {--variables suivantes aux diff‚rents r‚servoirs: date (YDateEnJour), --} + {--d‚bit naturel … la prise (YQMnat) et d‚bit naturel … la restitution --} + {(YQVnat). --} + assign(YFicDebTemp,YRepT+YNomFicDebTemp); + rewrite(YFicDebTemp); - {--BOUCLE SUR TOUTES LES LIGNES A LIRE dans le fichier des d‚bits --} - {--naturels (station aval, prises et restitutions) --} + {--Ouverture du fichier texte destin‚ aux d‚bits synchronis‚s, et --} + {--‚criture d'en tˆte sur ce fichier --} + Ici_EcritureEntete_QSynchro; + + {--BOUCLE SUR TOUTES LES LIGNES A LIRE dans le fichier texte des--} + {--d‚bits naturels (station aval, prises et restitutions) --} YNbPbBornes:=0; for YrangLu:=YDelaimax-YDelaimin+1 to YNbEcrit do + with YDeb2 do - begin - - YJJ_MM_AAAA:=ADate(YDateEnJour[0]); - val(copy(YJJ_MM_AAAA,4,2),YMois,YCode); - val(copy(YJJ_MM_AAAA,1,2),YJour,YCode); - YQuantieme:=AQuantieme(YJour,YMois,2001); - if YSaisie then - YSaisie3; - - - {--LECTURE DES DEBITS NATURELS pour l'indice YDelaimax--} - LectureQavalPriseRestit(Ydelaimax); + BEGIN - {--POUR CHAQUE LAC, CALCUL DES DEBITS NATURELS … la prise et … la --} - {--restitution, d‚cal‚s en arriŠre par rapport au d‚bit aval d'indice--} - {--nul, selon les temps de propagation entre restitution et aval. --} - {--Calcul des d‚bits de r‚f‚rence et r‚serv‚ … la restitution et … --} - {--la prise --} - YQAntMin:=1e20; - for YRangLac:=1 to YnbLacs do - begin - YQVnat[YrangLac]:=Qinter(2*YrangLac,-YD[Yranglac]); - YQMnat[YrangLac]:=Qinter(2*YrangLac-1,-YD[Yranglac]); - YQAntMin:=Amin(YQAntMin,YQVnat[YRangLac]); - YQAntMin:=Amin(YQAntMin,YQMnat[YRangLac]); + YJJ_MM_AAAA[0]:=B_Date(YDateEnJour[0]); + val(copy(YJJ_MM_AAAA[0],4,2),YMois[0],YCode); + val(copy(YJJ_MM_AAAA[0],1,2),YJour[0],YCode); + YQuantieme:=B_Quantieme(YJour[0],YMois[0],2001); - {--cas o— le d‚bit naturel d‚cal‚ … prise et restit est non lacune--} - if (YQMnat[YRangLac]>=0) and (YQVnat[YRanglac]>=0) then - begin - QRefRes(2,YRangLac,YDateEnJour[YRangLac],YQMnat[YRangLac],YQVVeille[YRangLac], - YChaiDate[YRangLac],YQVRef[YrangLac],YQVRes[YRangLac]); - QRefRes(1,YRangLac,YDateEnJour[YRangLac],YQMnat[YRangLac],YQVVeille[YRangLac], - YChaiDate[YRangLac],YQMRef[YrangLac],YQMRes[YRangLac]); - end + {--LECTURE DES DEBITS NATURELS pour l'indice YDelaimax--} + C1_LectureQavalPriseRestit(Ydelaimax); - {--Cas o— le d‚bit naturel d‚cal‚ … la prise est en lacune--} - else - begin - YQVRef[YrangLac]:=YLacune; - YQVRes[YRanglac]:=YLacune; - YQMRef[YrangLac]:=YLacune; - YQMRes[YRanglac]:=YLacune; - end; - - end; {fin du calc des Q nat. d‚cal‚s, ref. et r‚s. prises et rest.--} - - {--CAS OU EXISTE DEBIT aval syst. et Q prise et rest. correspondants.--} - {--CALCUL DE REPARTITION DU DEBIT A PRELEVER, et des d‚bits limites --} - {--id‚aux aux restitution pour atteindre l'objectif --} - if (YQAntMin>=0) and (YQ[0,0]>=0) then - Repartition (YQ[0,0]-YQObj[YQuantieme],YQVnat,YQMnat,YQVRes,YQVRef,YQMRes,YQMRef,YTypeObjectif,YSuccesRepart, - YcodeRepart,YCodeAval,YCodePrise,YCodeRestit,YQST0,YQdef0,YQV,YQe,YQs,YQST,YQSTmin,YQSTmax, - YNIter,YTest) - - {--CAS OU DES LACUNES DE DEBIT EMPECHENT le calcul de r‚partition--} - else - begin - YSuccesRepart:=-3; - YQST0:= YLacune; - YTest:=1; - YNIter:=0; - for YrangLac:=1 to YNbLacs do - begin - YQV[YRangLac]:=Ylacune; - YQs[YrangLac]:=Ylacune; - YQe[YrangLac]:=YLacune; - YQST[YRangLac]:=YLacune; - YQSTmin[YRangLac]:=YLacune; - YQSTmax[YrangLac]:=YLacune; - YQdef0:=YLacune; - YCodeRepart[YRangLac]:=-2; - YCodePrise[YRangLac]:=-3; - YCodeRestit[YRangLac]:=-2; - YCodeAval[YRangLac]:=-3; - end; - end; - - {--MISE A JOUR DES STATS du calcul de r‚partition des Q stock‚s entre--} - {--r‚servoirs --} - if YTest=0 then - YNTestNul:=YNTestNul+1; - YNItermax:=AmaxIn(YNItermax,YNIter); - for YRanglac:=1 to YNbLacs do - begin - YNCodeRepart[YRangLac,YCodeRepart[YRangLac]]:=YNCodeRepart[YRangLac,YCodeRepart[YRangLac]]+1; - YNCodePrise[YRangLac,YCodePrise[YRangLac]]:=YNCodePrise[YRangLac,YCodePrise[YRangLac]]+1; - YNCodeRestit[YRangLac,YCodeRestit[YRangLac]]:=YNCodeRestit[YRangLac,YCodeRestit[YRangLac]]+1; - YNCodeAval[YRangLac,YCodeAval[YRangLac]]:=YNCodeAval[YRangLac,YCodeAval[YRangLac]]+1; - end; - YNSucces[YSuccesRepart]:=YNSucces[YSuccesRepart]+1; - - {--ECRITURE SUR PREMIER FICHIER DES RESULTATS DETAILLES--} - write(YFicResult2,ADate(YdateEnJour[0]),' ',YQ[0,0]:24:15,' ',YQObj[YQuantieme]:19:10,' '); - for YRangLac:=1 to YNbLacs do - write(YFicResult2,YChaiDate[YRangLac],' ',YQMnat[YrangLac]:21:12,' ',YQVnat[YrangLac]:21:12, - ' ',YQMRef[YRanglac]:19:10,' ',YQMRes[YRangLac]:19:10, - ' ',YQVRef[YRanglac]:19:10,' ',YQVRes[YRangLac]:19:10,' ', - YCodeRepart[YRangLac]:3,' ',YQV[YRangLac]:21:12,' ', - YCodePrise[YrangLac]:3,' ',YCodeRestit[YrangLac]:3,' ', - YCodeAval[YrangLac]:3,' ',YQe[YRanglac]:21:12,' ',YQs[YRangLac]:21:12,' '); - writeln(YFicResult2,YQST0:21:12,' ',YQdef0:21:12,' ',YSuccesRepart:3,' ',YNIter:3,' ',YTest:2); - - {--ECRITURE DE LA DEFAILLANCE INEVITABLE DE DEBIT SUR FICHIER TYPE--} - write(YFicQdef[0],YQdef0); - - {--ECRITURE SUR SECOND FICHIER DES RESULTATS DETAILLES--} - write(YFicResult3,ADate(YdateEnJour[0])); - for YRangLac:=1 to YNbLacs do - write(YFicResult3,' ',YChaiDate[YRangLac],YQST[YRangLac]:19:10,' ',YQSTmin[YRanglac]:19:10,' ', - YQSTmax[YRangLac]:19:10,' ',YCodeRepart[YRangLac]:3,' ',YCodePrise[YRanglac]:3, - ' ',YCodeRestit[YRangLac]:3,' ',YCodeAval[YRangLac]:3); - writeln(YFicResult3); - - {--DECALAGE D'UN PAS DE TEMPS de toutes les valeurs dans le tableau --} - {--des d‚bits naturels aval, prises et restitutions --} - for YRangDelai:=Ydelaimin to Ydelaimax-1 do - begin - for YrangLac:=0 to 2*YNbLacs do - YQ[YRangLac,YRangDelai]:=YQ[Yranglac,YRangDelai+1]; - YDate[YRangDelai]:=YDate[YRangDelai+1]; - end; - - {--DECALAGE D'UN PAS DE TEMPS de toutes les dates cruciales--} - YDateEnJour[0]:=YDateEnJour[0]+1; - for YRangLac:=1 to YNbLacs do - begin - YDateEnJour[YrangLac]:=YDateEnJour[YrangLac]+1; - YQVVeille[YrangLac]:=YQV[YRanglac]; - end; + {--POUR CHAQUE LAC, CALCUL DES DEBITS NATURELS … la prise et … la --} + {--restitution, d‚cal‚s en arriŠre par rapport au d‚bit aval d'indice--} + {--nul, selon les temps de propagation entre restitution et aval. --} + YQAntMin:=1e20; + for YRangLac:=1 to YnbLacs do + begin + YQVnat[YrangLac]:=C1_Qinter(2*YrangLac,-YD[Yranglac]); + YQMnat[YrangLac]:=C1_Qinter(2*YrangLac-1,-YD[Yranglac]); + YQAntMin:=B_min(YQAntMin,YQVnat[YRangLac]); + YQAntMin:=B_min(YQAntMin,YQMnat[YRangLac]); + end; {fin du calc des Q nat. d‚cal‚s.--} + + {--Calcul de l'objectif de d‚bit … stocker --} + if (YQAntMin>=0) and (YQ[0,0]>=0) then + begin + YComplet:=1; + YQXsous:=YQ[0,0]-YQXobj[YQuantieme]; + end + else + begin + YComplet:=0; + YQXsous:=YLacune; + end; + + {--ECRITURE SUR FICHIER DES DEBITS SYNCHRONISES--} + write(YFicResult2,B_Date(YdateEnJour[0]),' ',YComplet:4,' ',YQ[0,0]:24:15,' ',YQXObj[YQuantieme]:19:10,' '); + for YRangLac:=1 to YNbLacs do + write(YFicResult2,B_Date(YDateEnJour[YRangLac]),' ',YQMnat[YrangLac]:21:12,' ', + YQVnat[YrangLac]:21:12,' '); + writeln(YFicResult2); + + {--Ecriture sur fichier temporaire d'objectif de d‚bit stock‚ et des--} + {--d‚bits nat, res et ref aux prises et restitutions --} + write(YFicDebTemp,YDeb2); + + {--DECALAGE D'UN PAS DE TEMPS de toutes les valeurs dans le tableau --} + {--des d‚bits naturels aval, prises et restitutions --} + for YRangDelai:=Ydelaimin to Ydelaimax-1 do + begin + for YrangLac:=0 to 2*YNbLacs do + YQ[YRangLac,YRangDelai]:=YQ[Yranglac,YRangDelai+1]; + YDate[YRangDelai]:=YDate[YRangDelai+1]; + end; + + {--DECALAGE D'UN PAS DE TEMPS de toutes les dates cruciales--} + YDateEnJour[0]:=YDateEnJour[0]+1; + for YRangLac:=1 to YNbLacs do + begin + YDateEnJour[YrangLac]:=YDateEnJour[YrangLac]+1; + YQVVeille[YrangLac]:=YQV[YRanglac]; + end; - end; {fin de boucle sur les lignes … lire dans le fichier des d‚bits naturels} + END; {fin de boucle sur les lignes … lire dans le fichier des d‚bits naturels} - {--FERMETURE DU FICHIER des d‚bits naturels aux prises et restitutions,--} - {--et des fichier des r‚sultats d‚taill‚s concernant les d‚bits pris et--} - {--restitu‚s, n‚cessit‚s par l'objectif aval. Message de fin de calcul --} + {--FERMETURE DES FICHIERS texte des d‚bits naturels aux prises et --} + {--restitutions, et des d‚bits synchronis‚s --} close(YFicResult1); close(YFicResult2); - close(YFicQdef[0]); - close(YFicResult3); - - if Ysaisie then - YSaisie4; - - - {--ECRITURE DES STATISTIQUES DE DEBIT SUR FICHIER DE RESULTATS--} - - writeln(yFicSortie,'================================================================================='); - writeln(YFicSortie,'! STATISTIQUES DE RESULTATS EVALUEES SUR TOUTE LA PERIODE DES DONNEES OBSERVEES !'); - writeln(yFicSortie,'================================================================================='); - writeln(YFicSortie); - writeln(YFicSortie,'Ces resultats ne dependent aucunement de l''etat de remplissage des reservoirs'); - writeln(YFicSortie); - Ecriture_Stats; - close(YFicSortie); - - {--RECHERCHE DE PLUS LONGUE PERIODE DE RESULTATS SANS LACUNE--} - reset(YFicResult3); - {--ACHTUNG LECTURE EN-TETE--} - for Yi:=1 to 18 do - readln(YFicResult3); - readln(YFicResult3,YJJ_MM_AAAA,YChaine93); - val(copy(YJJ_MM_AAAA,7,4),YAn,YCode); - val(copy(YJJ_MM_AAAA,4,2),YMois,YCode); - val(copy(YJJ_MM_AAAA,1,2),YJour,YCode); - YDAteEnJour[0]:=ATjour(YAn,YMois,YJour); - YDateInitiale:=YDateEnJour[0]; - val(copy(YChaine93,76,3),YCodeRepart[1],YCode); - if YCodeRepart[1]=-2 then + close(yFicDebTemp); + + {--RECHERCHE DE PLUS LONGUE PERIODE DE DEBITS SANS LACUNE--} + + reset(YFicResult2); + {--Achtung : lecture d'en-tˆte} + for Yi:=1 to 19 do + readln(YFicResult2); + readln(YFicResult2,YJJ_MM_AAAA[0],YComplet); + val(copy(YJJ_MM_AAAA[0],7,4),YAn,YCode); + val(copy(YJJ_MM_AAAA[0],4,2),YMois[0],YCode); + val(copy(YJJ_MM_AAAA[0],1,2),YJour[0],YCode); + YDeb2.YDAteEnJour[0]:=B_Tjour(YAn,YMois[0],YJour[0]); + YDateInitiale:=YDeb2.YDateEnJour[0]; + if YComplet=0 then begin YDernierLuGlop:=false; - YDateFin:=YDateEnJour[0]-1; + YDateFin:=YDeb2.YDateEnJour[0]-1; end else begin YdernierLuGlop:=true; - YDateDebut:=YDateEnJour[0]; + YDateDebut:=YDeb2.YDateEnJour[0]; end; YPlusLongDuree:=0; repeat - readln(YFicResult3,YJJ_MM_AAAA,YChaine93); - YDateEnJour[0]:=YdateEnJour[0]+1; - val(copy(YChaine93,76,3),YCodeRepart[1],YCode); + readln(YFicResult2,YJJ_MM_AAAA[0],YComplet); + YDeb2.YDateEnJour[0]:=YDeb2.YdateEnJour[0]+1; if not YDernierLuGlop then begin - if YCodeRepart[1]>-2 then + if YComplet=1 then begin - YDateDebut:=YdateEnJour[0]; + YDateDebut:=YDeb2.YdateEnJour[0]; YDernierLuGlop:=true; end end else - if YCodeRepart[1]=-2 then + if YComplet=0 then begin - YDateFin:=YDateEnJour[0]-1; + YDateFin:=YDeb2.YDateEnJour[0]-1; YdernierLuGlop:=false; if (YDateFin-YDateDebut+1)>=YPlusLongDuree then begin @@ -535,10 +728,10 @@ BEGIN YMeilleurFin:=YDateFin; end; end; - until eof(YFicResult3); + until eof(YFicResult2); if YDernierLuGlop then begin - YDateFin:=YDateEnJour[0]; + YDateFin:=YDeb2.YDateEnJour[0]; if (YDateFin-YDateDebut+1)>=YPlusLongDuree then begin YPlusLongDuree:=YDateFin-YDateDebut+1; @@ -547,129 +740,114 @@ BEGIN end; end; - if Ysaisie then - YSaisie5; - - - {--CAS OU LES RESULTATS DE DEBIT DEPASSENT 3 ANS D'AFFILE SANS LACUNE.--} - {--CHOIX DE LA PERIODE DE CALCUL --} + {--CAS OU LES RESULTATS DE DEBIT DEPASSENT 3 ANS D'AFFILE SANS LACUNE. --} + {--Si saisie clavier, choix de la p‚riode … analyser au sein de la plus--} + {--longue p‚riode de donn‚es sans lacunes, sinon utilisation des dates --} + {--lues sur fichier pour d‚finir la p‚riode d'analyse au sein de cette --} + {--p‚riode sans lacune. --} + {--Ecriture de la p‚riode d'analyse sur le r‚sum‚ --} if YPlusLongDuree>(3*365) then begin if YSaisie then - YSaisie6 - + E_Saisie6 else - DatesLuesSurFichier; - YResume:=YResume+' periode de calcul = '+ADate(YDateDebut)+' au '+ADate(YDateFin); - end {fin du cas o— les r‚sultats de d‚bit d‚passent 3 ans cons‚cutifs sans lacune} + P_DatesLuesSurFichier; + YResume:=YResume+B_Date(YDateDebut)+'-'+B_Date(YDateFin); + end {--cas o— la p‚riode de r‚sultats sans lacune est trop courte} else begin YcalculPossibl:=false; if YSaisie then - YSaisie7; - + E_Message7; end; end; {fin du cas o— paramŠtres et donn‚es rendent les calculs possibles} + {--CAS OU ON FAIT LES CALCULS--} if YCalculPossibl then begin - {--REMPLISSAGE DU FICHIER DES DEFAILLANCES AVEC LES VALEURS des --} - {--d‚faillances in‚vitables --} - reset(YFicQdef[0]); - assign(YFicQdef[1],YRepT+YNomFicQdef+'1'); - rewrite(YFicQdef[1]); - seek(YFicQdef[0],YDateDebut-YdateInitiale); + {==CONSTITUTION D'UN FICHIER TYPE DES OBJECTIFS DE DEBIT STOCKE ET DES==} + {==DEBITS NAT, RES ET REF AUX PRISES ET RESTITUTIONS, SUR LA PERIODE ==} + {==CHOISIE POUR LES TRAITEMENTS ==} + + {--remplissage du fichier avec des lacunes--} + with YDeb2 do + begin + YQXsous:=YLacune; + for YRangLac:=1 to YNbLacs do + begin + YDateEnJour[YRangLac]:=0; + YQMnat[YRangLac]:=YLacune; + end; + end; + assign(YFicDeb,YRepT+YNomFicDeb); + rewrite(YFicDeb); + for Yi:=YDateDebut to YdateFin do + write(YFicDeb,YDeb2); + + {--copie des enregistrements sur le fichier typ‚ ‚tendu sur toute la --} + {--p‚riode, et collage sur le fichier typ‚ limit‚ … la p‚riode choisie--} + {--pour les traitements. Calcul des d‚bits moyens des cours d'eau aux --} + {--prises. --} + for YrangLac:=1 to YNbLacs do + YQMmoyen[YRanglac]:=0; + reset(YFicDebTemp); + seek(YFicDebTemp,YDateDebut-YDateInitiale); for Yi:=YDateDebut to YDateFin do begin - read(YFicQdef[0],YQdef0); - write(YFicQdef[1],YQdef0); + read(YFicDebTemp,YDeb2); + seek(YFicDeb,filepos(YFicDeb)-1); + write(YFicDeb,YDeb2); + seek(YFicDeb,filepos(YFicDeb)-1); + if Yi>(-YDelaimin) then + for YRanglac:=1 to YNbLacs do + YQMmoyen[YRangLac]:=YQMmoyen[YRangLac]+YDeb2.YQMnat[YRangLac]; end; - close(YFicQdef[0]); - close(YFicQdef[1]); - - - {==ECRITURE DES DEBITS STOCKES IDEAUX SUR FICHIERS TYPES : lecture ==} - {==sur le second fichier de r‚sultats d‚taill‚s, et ‚criture sur un==} - {==fichier typ‚ par station, dans le sens chronologique inverse ==} - {==et sur la p‚riode choisie. ==} + close(YFicDebTemp); + close(YFicDeb); + for YrangLac:=1 to YNbLacs do + YQMmoyen[YRangLac]:=YQMmoyen[YRangLac]/(YDateFin-YDateDebut+1); - {--boucle sur les lacs--} + {==ASSIGNATION DES FICHIERS TYPES DE VOLUME ET MANQUE DE CAPACITE==} for YRangLac:=1 to YNbLacs do begin - - {assignation des fichiers typ‚s de volume, d‚bit et manque de capacit‚--} str(YRangLac,Yextension); - assign(YFicQST[YrangLac],YRepT+YNomFicQST+YExtension); assign(YFicVobj[YRangLac],YRepT+YNomFicV+YExtension); - assign(YFicVobj0[YRangLac],YRepT+YNomFicVobj0+YExtension); - assign(YFicVdef[YRangLac],YRepT+YNomFicVdef+Yextension); assign(YFicVges[YRangLac],YRepT+YNomFicVges+YExtension); assign(YFicVop[YRangLac],YRepT+YNomFicVop+YExtension); + end; + assign(YFicVdef[1],YRepT+YNomFicVdef+'1'); + assign(YFicVdef[2],YRepT+YNomFicVdef+'2'); - {--remplissage du fichier typ‚ de d‚bit avec des lacunes--} - rewrite(YFicQST[YRangLac]); - YQST[YRangLac]:=YLacune; - for Yi:=YDateDebut to YdateFin do - write(YFicQST[YRangLac],YQST[YrangLac]); - - end; {fin de boucle sur les lacs} - - {--ouverture du fichier texte des r‚sultats de d‚bit stock‚ id‚al, --} - {--et lecture des premiŠres lignes inutiles (en-tˆte, titres et dates--} - {--ant‚rieures … la p^‚riode choisie --} - reset(YFicResult3); -{ACHTUNG LECTURE EN-TETE--} - for Yi:=1 to 18+YDateDebut-YDateInitiale do - readln(YFicResult3,YJJ_MM_AAAA); - - {--boucle sur le temps, sur la p‚riode choisie--} - for Yi:=YDateDebut to YDateFin do - - begin - - {--lecture de la date aval sur le fichier texte--} - read(YFicResult3,YJJ_MM_AAAA); - - {--pour chaque lac, lecture sur le fichier texte des r‚sultats --} - {--correspondants et extraction du d‚bit stock‚, puis ‚criture --} - {--de celui-ci sur fichier typ‚ en chrono inverse --} - for YrangLac:=1 to YNbLacs do - begin - read(YFicResult3,YChaine93); - val(copy(YChaine93,14,19),YQST[YRanglac],YCode); - seek(YFicQST[YRangLac],filepos(YFicQST[YRangLac])-1); - write(YFicQST[YRangLac],YQST[YRangLac]); - seek(YFicQST[YRangLac],filepos(YFicQST[YRangLac])-1); - end; - readln(YFicResult3); + {--Lecture des paramŠtres YA et YB de formule de fr‚quence, ainsi que--} + {--des temps de retour sur fichier idoine, ou valeurs par d‚faut le --} + {--cas ‚ch‚ant. --} + C2_LectureParametresStat; - end; {fin de boucle sur le temps, sur la p‚riode chosie} + {--Lecture du facteur puissance qui sera utilis‚ pour le calcul de la--} + {--d‚faillance moyenne QXdef, ou valeur 2 par d‚faut (pour moyenne --} + {--quadratique --} + C2_LecturePuissanceQXdef_DecideTri; - {--fermeture du fichier texte des r‚sultats de d‚bit stock‚ et des--} - {--fichiers typ‚s de d‚bit stock‚ --} - close(YFicResult3); - for YRangLac:=1 to YNbLacs do - close(YFicQST[YRangLac]); - {--message ‚cran--} - if YSaisie then - Ysaisie8; - - - {--BOUCLE SUR LES RESERVOIRS POUR CALCUL DES VOLUMES LIMITES--} - CalculChroniquesVolume; + {--COEUR DU PROGRAMME : CALCULS EN SENS CHRONO INVERS PUIS EN SENS --} + {--CHRONO, DE LA REPARTITION DES DEBITS A STOCKER ET DE L'EVOLUTION --} + {--DU NIVEAU DANS LES RESERVOIRS --} + C3_CalculChroniquesVolume; + close(YFicSortie); {--CALCUL DE LA PARTIE FRACTIONNAIRE DES DATES DE VOLUME, pour chaque--} - {--lac. Ces dates sont d‚cal‚es de +12 h par rapport aux dates --} - {--des d‚bits. A cet instant dans le programme, les volumes pr‚sents --} - {--dans les fichiers typ‚s de r‚sultats (stock‚s juste avant), --} - {--correspondent … ces dates fractionnaires --} + {--lac. Par rapport aux dates des d‚bits aval, ces dates de volume --} + {--d‚cal‚es de YdecalDateQ+0.5. A cet instant dans le programme, les --} + {--volumes pr‚sents dans les fichiers typ‚s de r‚sultats (stock‚s --} + {--juste avant, par C3_CalculChroniquesVolume), correspondent … ces --} + {--dates fractionnaires allant de YDateDebut+0.5+YdecalDateQ+0.5 … --} + {--YdateFin+0.5+YdecalDateQ+0.5. --} for YRangLac:=1 to YNbLacs do begin YDecalDateQ[YRanglac]:=YDecalDateQ[YrangLac]+0.5; @@ -680,66 +858,24 @@ BEGIN end; end; - {==A PARTIR DES FICHIERS TYPES DE VOLUME A DATE FRACTIONNAIRE ET DE ==} - {==MANQUE DE CAPACITE, CALCUL DES VOLUMES A 24H ET ECRITURE DE CEUX-CI==} - {==SUR LES MEMES FICHIERS TYPES, ET ECRITURE DES RESULTATS SUR ==} - {==FICHIER TEXTE DES VOLUMES ET DEBITS DEFAILLANTS ==} + {==A PARTIR DES FICHIERS TYPES DE VOLUME A DATE FRACTIONNAIRE, CALCUL==} + {==DES VOLUMES A 24H ET ECRITURE DE CEUX-CI SUR LES MEMES FICHIERS ==} + {==TYPES, ET ECRITURE DES RESULTATS SUR FICHIER TEXTE DES VOLUMES ==} {--‚criture d'en-tˆte sur fichier texte de r‚sultats des chroniques --} - {--de volume et d‚bits d‚faillants --} - assign(YFicResult4,YRepR+YNomFicResult4); - rewrite(YFicResult4); - writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ; ',Yresume); - ADatation(YFicResult4); - writeln(YFicResult4); - writeln(YFicResult4,'Chroniques de volumes presents dans les reservoirs,', - ' les plus compatibles avec les chroniques de debits stockes objectifs'); - writeln(YFicResult4,'Les valeurs situees en haut des colonnes de date representent leur partie fractionnaire'); - writeln(YFicResult4); - writeln(YFicResult4,'Variables editees :'); - writeln(YFicResult4); - writeln(YFicResult4,'-date : date a laquelle on vise l''objectif de debit a la station situee a l''aval du systeme'); - writeln(YFicResult4,'-date(i) : date de l''objectif aval, diminuee du temps de propagation entre le point de ', - 'restitution du reservoir de rang i et la station aval du systeme'); - writeln(YFicResult4,'-Vdef(i) : supplement de capacite du reservoir de rang i ', - '(par rapport a l''existant), qui permettrait de satisfaire l''objectif ', - 'en permanence (sauf echecs inevitables dus a la repartition des apports naturels et aux ', - 'consignes et contraintes des prises et restitutions)'); - writeln(YFicResult4,'-Vobj(i) : volume dans le reservoir i (calcule a rebours), permettant la meilleure satisfaction ', - 'possible de l''objectif aval dans le futur (compte tenu des echecs inevitables et des limites ', - ' de capacite des reservoirs)'); - writeln(YFicResult4,'-Vobj0(i) : volume fictif dans le reservoir i (calcule a rebours), permettant la meilleure ', - 'satisfaction possible de l''objectif aval dans le futur (compte tenu des echecs inevitables mais', - ' sans limitation de capacite des reservoirs)'); - writeln(YFicResult4,'-Vges(i) : volume dans le reservoir i (calcule en chronologie normale), simulant une gestion ', - 'preoccupee de la satisfaction immediate, si possible (compte tenu des echecs inevitables ', - 'et des limites de capacite des reservoirs), de l''objectif aval'); - writeln(YFicResult4,'-Vop(i) : volume dans le reservoir, combinaison de Vobj et Vges : Vop = min(Vobj,Vges) pour ', - 'objectif de soutien de debit ; Vop = max(Vobj,Vges) pour ojectif de laminage de debit'); - writeln(YFicResult4); - write(YFicResult4,' 0.50000 '); - for YRangLac:=1 to YNbLacs do - write(YFicResult4,' ',YDecalDateQ[YRangLac]:11:8, - ' ', - ' '); - writeln(YFicResult4); - write(YFicResult4,' date aval '); - for YRangLac:=1 to YNbLacs do - write(YFicResult4,' date',YRanglac,' Vdef',YRangLac,' (m3) Vobj',YRangLac,'(m3) ', - ' Vobj0',YRangLac,'(m3) Vobj',YRangLac,'(m3) a 24H ', - ' Vges',YRangLac,'(m3) ',' Vop',YRangLac,'(m3) '); - writeln(YFicResult4); - - YVdefsommax:=0; + {--de volume --} + Ici_EcritureEntete_Volumes; {--ouverture des fichiers typ‚s de volume et de manque de capacit‚ pour --} - {--chaque lac, et premiŠre lecture de volume … date fractionnaire --} + {--chaque lac, et premiŠre lecture de volume Vobj … date fractionnaire --} for YRangLac:=1 to YNbLacs do begin reset(YFicVobj[YRangLac]); - reset(YFicVobj0[YRangLac]); reset(YFicVges[YRangLac]); + reset(YFicVop[YRangLac]); read(YFicVobj[YRanglac],YVobjAnt[YrangLac]); + YVobjMoyrel[1,YRangLac]:=0; + YVobjMoyrel[2,YRangLac]:=0; end; {--boucle sur les temps, sur la p‚riode choisie--} @@ -748,9 +884,7 @@ BEGIN begin {--‚criture sur fichier texte de date … la station aval--} - write(YFicResult4,ADate(Yi-1),' '); - - YVdefsom:=0; + write(YFicResult4,B_Date(Yi-1),' '); {--boucle sur les lacs--} for YRangLac:=1 to YNbLacs do @@ -766,46 +900,48 @@ BEGIN {--CALCUL DU VOLUME A 24h par interpolation lin‚aire et --} {--‚criture de celui-ci sur mˆme fichier typ‚ --} read(YFicVobj[YRangLac],YVobjNouv[Yranglac]); - YVobj:=YVobjAnt[YrangLac]+(YVobjNouv[YRanglac]-YVobjAnt[Yranglac])*(1-YDecalDateQ[YRangLac]); + YVobj[YRangLac]:=YVobjAnt[YrangLac]+(YVobjNouv[YRanglac]-YVobjAnt[Yranglac])*(1-YDecalDateQ[YRangLac]); seek(YFicVobj[YRangLac],filepos(YFicVobj[YRangLac])-2); - write(YFicVobj[YRanglac],YVobj); + write(YFicVobj[YRanglac],YVobj[YRangLac]); seek(YficVobj[YRangLac],filepos(YficVobj[Yranglac])+1); - + YVobjMoyRel[1,YRangLac]:=YVobjMoyRel[1,YRangLac]+YVobj[YRangLac]; end {--cas o— on est arriv‚ … la fin du fichier typ‚ de volume--} else begin YVobjNouv[YRanglac]:=Ylacune; - YVobj:=YLacune; + YVobj[YRangLac]:=YLacune; end; - {--lecture de volume de gestion et de volume objectif id‚al sur--} - {--fichiers typ‚s --} - read(YFicVges[YRangLac],YVges); - read(YFicVobj0[YRangLac],YVobj0); - - {--calcul du manque de capacit‚ de r‚servoir--} - if YTypeObjectif=0 then - YVdef:=amax(0,YVobj0-YVtot[YRanglac]) - else - YVdef:=amax(0,-YVobj0); - - YVdefsom:=YVdefSom+YVdef; + {--lecture de volume de gestion Vobj sur fichier typ‚--} + read(YFicVges[YRangLac],YVges[YRangLac]); + read(YFicVop[YRangLac],YVop[YRangLac]); + YVobjMoyRel[2,YRangLac]:=YVobjMoyRel[2,YRangLac]+YVges[YRangLac]; - {--calcul du volume op‚rationnel Vop--} - if YTypeObjectif=0 then - YVop:=amin(YVobjAnt[YRanglac],YVges) + {--‚criture sur fichier texte de la date lac, du volume Vobj … date--} + {--fractionnaire et … 24h, des volumes Vges et Vop … date --} + {--fractionnaire --} + if YAbsRel=1 then + begin + write(YFicResult4,B_Date(Yi-1+YDateFinLac[YRanglac]-YDateFin),' ', + YVobjAnt[YRanglac]:15:2,' '); + if YVobj[YRangLac]<>YLacune then + write(YFicResult4,YVobj[YRangLac]:15:2) + else + write(YFicResult4,' '); + write(YFicResult4,' ',YVges[YRangLac]:15:2,' ',YVop[YRangLac]:15:2,' '); + end else - YVop:=amax(YVobjAnt[YRangLac],YVges); - - {--‚criture sur fichier texte de la date lac, du d‚bit d‚faillant,--} - {--du volume Vobj … date fractionnaire et … 24h, des volumes Vobj0--} - {--Vges et Vop … date fractionnaire --} - write(YFicResult4,ADate(Yi-1+YDateFinLac[YRanglac]-YDateFin),' ',YVdef:15:2,' ', - YVobjAnt[YRanglac]:15:2,' ',YVobj0:15:2,' ',YVobj:15:2, - ' ',YVges:15:2,' ',YVop:15:2,' '); - + begin + write(YFicResult4,B_Date(Yi-1+YDateFinLac[YRanglac]-YDateFin),' ', + (YVobjAnt[YRanglac]/YVtot[YRangLac]):15:13,' '); + if YVobj[YRangLac]<>YLacune then + write(YficResult4,(YVobj[YRangLac]/YVtot[YRangLac]):15:13) + else + write(YFicResult4,' '); + write(YFicResult4,' ',(YVges[YRangLac]/YVtot[YRangLac]):15:13,' ',(YVop[YRangLac]/YVtot[YRangLac]):15:13,' '); + end; {--incr‚mentation du volume … date fractionnaire--} YVobjAnt[YRanglac]:=YVobjNouv[YRangLac]; @@ -814,8 +950,6 @@ BEGIN {--passage … la ligne suivante dans le fichier texte de r‚sultats--} writeln(YFicResult4); - YVdefsommax:=amax(YVdefsommax,YVdefsom); - end; {fin de boucle sur les temps} {--fermeture des fichiers typ‚s de volume et de manque de capacit‚, --} @@ -823,8 +957,9 @@ BEGIN for Yranglac:=1 to yNbLacs do begin close(YFicVobj[YRangLac]); - close(YFicVobj0[YRanglac]); close(YFicVges[YRanglac]); + YVobjMoyRel[1,YRangLac]:=YVobjMoyRel[1,YRangLac]/(YVtot[YrangLac]*(YdateFin-YDateDebut)); + YVobjMoyRel[2,YRangLac]:=YVobjMoyRel[2,YRangLac]/(YVtot[YrangLac]*(YdateFin-YDateDebut+1)); end; close(YFicResult4); @@ -837,139 +972,24 @@ BEGIN for Yi:=YDateDebut+1 to YDateFin do begin read(YFicVop[YRangLac],YVopNouv); - YVop:=YVopAnt+(YVopNouv-YVopAnt)*(1-YDecalDateQ[YRangLac]); + YVop[YRangLac]:=YVopAnt+(YVopNouv-YVopAnt)*(1-YDecalDateQ[YRangLac]); seek(YFicVop[YRangLac],filepos(YFicVop[YRangLac])-2); - write(YFicVop[YRanglac],YVop); + write(YFicVop[YRanglac],YVop[YRangLac]); seek(YficVop[YRangLac],filepos(YficVop[Yranglac])+1); YVopAnt:=YVopNouv; end; close(YFicVop[Yranglac]); end; - {--LECTURE DES PARAMETRES YA ET YB DE FORMULE DE FREQUENCE, AINSI QUE --} - {--DES TEMPS DE RETOUR SUR FICHIER IDOINE, OU VALEURS PAR DEFAUT LE CAS--} - {--ECHEANT --} - LectureParametresStat; - - {--sortie sur fichier texte des ‚checs de d‚bit … la station aval --} - assign(YFicResult4,YRepR+YNomFicResult5); - rewrite(YFicResult4); - writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ',Yresume); - ADatation(YFicResult4); - writeln(YFicResult4); - write(YFicResult4,'Chroniques des echecs de satisfaction de l''objectif defini a la station aval : '); - if YTypeObjectif=0 then - write(YFicResult4,'manque') - else - write(YFicresult4,'exces'); - writeln(YFicResult4,' de debit par rapport a l''hydrogramme objectif'); - writeln(YFicResult4); - writeln(YFicResult4,'Variables editees :'); - writeln(YFicResult4); - writeln(YFicResult4,'-date aval : date a laquelle on vise l''objectif de debit a la station situee a l''aval du systeme'); - write(YFicResult4,'-Qdef0 : echec inevitable absolu, du a la repartition des debits naturels, a la localisation des ', - 'reservoirs et aux contraintes et consignes aux prises et restitutions. La capacite ', - 'limitee des reservoirs n''est pas en cause dans ce type d''echec, que meme un debit stocke net '); - if YtypeObjectif=0 then - write(YFicResult4,'minimal') - else - write(YFicResult4,'maximal'); - writeln(YFicResult4,' dans tous les reservoirs ne peut eviter'); - write(YFicResult4,'-Qdef : echec inevitable, du au manque de capacite des reservoirs '); - if YTypeObjectif=0 then - writeln(YFicResult4,'(destockage net de debit impossible dans des reservoirs vides)') - else - writeln(YFicResult4,'(stockage net de debit impossible dans des reservoirs pleins)'); - writeln(YFicResult4,'-Qdef1 : echec inevitable cumulant les echecs absolus et les echecs supplementaires dus au manque', - ' de capacite des reservoirs'); - writeln(YFicResult4); - writeln(YFicResult4,' date aval ',' Qdef0 (m3/s) ',' Qdef (m3/s) ',' Qdef1 (m3/s) '); - reset(YFicQdef[0]); - seek(YFicQdef[0],YDateDebut-YDateInitiale); - reset(YFicQdef[1]); - assign(YFicQdef[2],YRepT+YNomFicQdef); - rewrite(YFicQdef[2]); - YNbQdefNul:=0; - for Yi:=YDateDebut to YDateFin do - begin - write(YFicResult4,ADate(Yi),' '); - read(YFicQdef[0],YQdef0); - read(YFicQdef[1],YQdef1); - YQdef:=YQdef1-YQdef0; - if YQdef<=YTouComNul then - YNbQdefNul:=YNbQdefNul+1; - write(YFicQdef[2],YQdef); - writeln(YFicResult4,YQdef0:23:3,' ',YQdef:23:3,' ',YQdef1:23:3); - end; - close(YFicQdef[0]); - close(YFicQdef[1]); - close(YFicQdef[2]); - close(YFicResult4); - TriChronique(YFicQdef[2],YNbQdefNul,YTouComNul,YQdefmoy,YQdefmed,YQdefmax,YQdefmin,YQdefrare,YQdeffrequent); - assign(YFicResult4,YRepR+YNomFicResult6); - rewrite(YFicResult4); - writeln(YFicResult4,'Rang du calcul : ',YCompteur,' ',Yresume); - ADatation(YFicResult4); - writeln(YFicResult4); - write(YFicResult4,'Valeurs maximales (m3) sur la periode de calcul, du volume manquant Vdef : '); - writeln(YFicResult4,'somme sur les reservoirs ; maximum sur les reservoirs ; valeur par reservoir'); - writeln(YFicResult4); - write(YficResult4,' somme (reservoirs) ',' maximum (reservoirs) '); - YVdef:=0; - for YRangLac:=1 to YNbLacs do - begin - YVdef:=amax(YVdef,YVdefmax[YRangLac]); - write(YFicResult4,' reservoir',YRangLac,' '); - end; - writeln(YFicResult4); - write(YFicResult4,' ',YVdefsommax:15:2,' ',YVdef:15:2,' '); - for YrangLac:=1 to YNbLacs do - write(YFicResult4,YVdefmax[YRangLac]:15:2,' '); - writeln(YFicResult4); - writeln(YFicResult4); - if YTypeObjectif=0 then - write(YFicResult4,'Manque') - else - write(YFicResult4,'Exces'); - write(YFicResult4,' inevitable de debit Qdef (m3/s) par rapport a l''objectif a la station aval du systeme, '); - writeln(YFicResult4,'du au manque de capacite des reservoirs'); - writeln(YFicResult4); - writeln(YFicResult4,' Statistiques (frequence = (n-YA)/(Effectif+YB) avec n=rang, YA=',YA,' et YB=',YB,') :'); - write(YFicResult4,' Frequence--> Moyenne Maximum '); - for Yi:=1 to YNbFreq do - begin - YFreq:=1/YTpsFreq[Yi]; - write(YFicResult4,' ',Yfreq:7:5,' '); - end; - Yfreq:=0.5; - write(YFicResult4,' ',YFreq:7:5,' '); - for Yi:=1 to YNbFreq do - begin - YFreq:=1-1/YTpsFreq[YNbFreq+1-Yi]; - write(YFicResult4,' ',Yfreq:7:5,' '); - end; - writeln(YFicResult4,' Minimum'); - write(YFicResult4,' ',YQdefmoy:10:3,' ',YQdefmax:10:3,' '); - for Yi:=1 to YNbfreq do - write(YFicResult4,YQdefrare[Yi]:10:3,' '); - write(YFicResult4,YQdefmed:10:3,' '); - for Yi:=1 to YNbfreq do - write(YFicResult4,YQdeffrequent[Yi]:10:3,' '); - writeln(YFicResult4,YQdefmin:10:3); - writeln(YFicResult4); - writeln(YFicResult4,' valeurs classees :'); - reset(YFicQdef[2]); - while not eof(YFicQdef[2]) do - begin - read(YFicQdef[2],YQdef); - writeln(YFicResult4,' ',YQdef); - end; - close(YFicQdef[2]); - close(YficResult4); + {Ecriture sur fichier texte de r‚sultats concernant les d‚faillances de } + {gestion (volumes manquants Vdef dans les r‚servoirs et d‚faut de d‚bit } + {… la station objectif aval) pour une exploitation visant … optimiser la} + {r‚partition des taches entre r‚servoirs } + E_Message12; + Ici_EditionBilan; {--message ‚cran--} - if YSaisie then - YSaisie9; + E_Message9; {==EDITION DES RESULTATS CLASSES ET ISOFREQUENCE DE VOLUME ET DE ==} {==DEBIT DEFAILLANT ==} @@ -991,83 +1011,134 @@ BEGIN {--calcul et ‚criture sur fichier texte des r‚sultats isofr‚quence --} {--des volumes limites Vobj (… 24 H) … respecter dans le r‚servoir --} - assign(YFicResult4,YRepR+YNomFicResultVobj+YExtension); + assign(YFicResult4,YRepR+YNomFicResultVobj+YExtension+YExIsofreq); if YTypeObjectif=0 then - YChaine:='minimale' + begin + YChaine:='Volume d''eau minimal Vobj'; + if YAbsRel=1 then + YChaine:=YChaine+' (m3)' + else + YChaine:=YChaine+'/Vtot'; + YChaine:=YChaine+' en dessous duquel il ne faut pas descendre' + end else - YChaine:='maximale'; - YChaine:='Valeur '+YChaine+' Vobj du volume a conserver (a 24h) dans le reservoir '+YNomLac[YRangLac] - +' (m3) pour garantir du mieux possible la satisfaction a venir de l''objectif aval ' - +'(en evitant les defaillances causees par un stock '; + begin + YChaine:='Volume d''eau maximal Vobj'; + if YAbsRel=1 then + YChaine:=YChaine+' (m3)' + else + YChaine:=YChaine+'/Vtot'; + YChaine:=YChaine+' qu''il ne faut pas depasser'; + end; + YChaine:=YChaine+' (a 24h) dans le reservoir '+YNomLac[YRangLac] + +' pour pouvoir satisfaire du mieux possible l''objectif aval par la suite' + +' (en evitant au maximum les defaillances causees par un stock '; if YTypeObjectif=0 then - YChaine:=YChaine+'vide' + YChaine:=YChaine+'trop vide)' else - YChaine:=YChaine+'plein'; - YChaine:=YChaine+', cf rapport)'; - ISOFREQ(YdateDebutV,YDateDebutV,YDateFinV,YFicVobj[YRangLac],Ychaine); + YChaine:=YChaine+'trop plein)'; + C2_ISOFREQ(YdateDebutV,YDateDebutV,YDateFinV,YFicVobj[YRangLac],Ychaine,YNorme[YRangLac],YAbsRel); {--calcul et ‚criture sur fichier texte des r‚sultats isofr‚quence --} {--des volumes limites Vop (… 24H) … respecter dans le r‚servoir --} - assign(YFicResult4,YRepR+YNomFicResultVop+YExtension); + assign(YFicResult4,YRepR+YNomFicResultVop+YExtension+YExIsofreq); if YTypeObjectif=0 then YChaine:='minimale' else YChaine:='maximale'; - YChaine:='Valeur '+YChaine+' Vop du volume dans le reservoir '+YNomLac[YRangLac]+' (m3 a 24h), ' - +'produit par une gestion visant prioritairement la meilleure satisfaction possible de ' - +'l''objectif commun dans l''immediat, et secondairement sa meilleure satisfaction possible ' - +'par la suite'; - ISOFREQ(YdateDebutV,YDateDebutV,YDateFinV,YFicVop[YRangLac],Ychaine); - - {--calcul et ‚criture sur fichier texte des r‚sultats isofr‚quence --} - {--des manques de capacit‚ dans le r‚servoir --} - assign(YFicResult4,YRepR+YNomFicResultM+Yextension); - YChaine:='Manque Vdef de capacite dans le reservoir '+YNomLac[YRangLac]+' (m3), pour pouvoir limiter ' - +'les defaillances de satisfaction de l''objectif aval aux seuls echecs inevitables absolus (= volume' - +' supplementaire dont il faudrait disposer '; - if YTypeObjectif=0 then - YChaine:=YChaine+'au dessus du niveau crete)' + YChaine:='Valeur '+YChaine+' Vop'; + if YAbsRel=1 then + YChaine:=YChaine+' (m3)' else - YChaine:=YChaine+'en dessous du niveau du fond)'; - ISOFREQ(YdateDebutV,YDateDebutV,YDateFinV+1,YFicVdef[YRangLac],YChaine); + YChaine:=YChaine+'/Vtot'; + YChaine:=YChaine+' du volume dans le reservoir '+YNomLac[YRangLac]+' (a 24h), ' + +'pouvant etre produit quand on vise d''abord la meilleure satisfaction possible de ' + +'l''objectif commun dans l''immediat, puis sa meilleure satisfaction possible ' + +'par la suite'; + C2_ISOFREQ(YdateDebutV,YDateDebutV,YDateFinV,YFicVop[YRangLac],Ychaine,YNorme[YRangLac],YAbsRel); end; {fin de boucle sur les r‚servoirs} + {--calcul et ‚criture sur fichier texte des r‚sultats isofr‚quence --} + {--des manques globaux de capacit‚ dans les r‚servoirs, calcul‚s en --} + {--chrono inverse --} + assign(YFicResult4,YRepR+YNomFicResultM+'A'+YExIsofreq); + YChaine:='Manque global Vdef'; + if YAbsRel=2 then + YChaine:=YChaine+'/somme(Vtot)'; + YChaine:=YChaine+' de capacite des reservoirs ('; + if YabsRel=1 then + YChaine:=YChaine+'m3, '; + yChaine:=YChaine+'date aval, calcul en chronologie inverse), responsable ' + +'de defaillances QXdef2 futures s''ajoutant aux inevitables absolues QXdef0 : capacite supplementaire necessaire '; + if YTypeObjectif=0 then + YChaine:=YChaine+'au dessus de la crete' + else + YChaine:=YChaine+'en dessous du fond'; + if YAbsRel=1 then + C2_ISOFREQ(YdateDebut,YDateDebut,YDateFin,YFicVdef[1],YChaine,YNorme[0],1) + else + C2_ISOFREQ(YdateDebut,YDateDebut,YDateFin,YFicVdef[1],YChaine,YNorme[0],4); + + {--calcul et ‚criture sur fichier texte des r‚sultats isofr‚quence --} + {--des manques globaux de capacit‚ dans les r‚servoirs, calcul‚s en --} + {--sens chronologique --} + assign(YFicResult4,YRepR+YNomFicResultM+'B'+YExIsofreq); + YChaine:='Manque global Vdef'; + if YAbsRel=2 then + YChaine:=YChaine+'/somme(Vtot)'; + YChaine:=YChaine+'de capacite des reservoirs ('; + if YAbsRel=1 then + YChaine:=YChaine+'m3, '; + YChaine:=YChaine+'date aval, calcul en sens chronologique), responsable ' + +'de defaillances QXdef2 passees s''ajoutant aux inevitables absolues QXdef0 : capacite supplementaire necessaire '; + if YTypeObjectif=0 then + YChaine:=YChaine+'en dessous du fond' + else + YChaine:=YChaine+'au dessus de la crete'; + if YAbsRel=1 then + C2_ISOFREQ(YdateDebut,YDateDebut,YDateFin,YFicVdef[2],YChaine,YNorme[0],1) + else + C2_ISOFREQ(YdateDebut,YDateDebut,YDateFin,YFicVdef[2],YChaine,YNorme[0],4); + {--r‚sultats de d‚faillances de d‚bit in‚vitables absolus (mˆme avec des--} {--capacit‚s de r‚servoirs sans limite --} - assign(YFicResult4,YRepR+YNomFicResDef+'0'); + assign(YFicResult4,YRepR+YNomFicResDef+'0B'+YExIsofreq); if YTypeObjectif=0 then YChaine:='Manque' else YChaine:='Exces'; - YChaine:=YChaine+' de debit inevitable absolu Qdef0 a la station aval du systeme (m3/s) par rapport a ' - +'l''hydrogramme objectif (du fait des debits naturels, de la localisation des reservoirs et ' - +'des consignes et contraintes aux prises et restitutions)'; - ISOFREQ(YDateInitiale,YDateDebut,YDateFin,YficQdef[0],YChaine); + YChaine:=YChaine+' de debit inevitable absolu QXdef0 a la station aval du systeme (m3/s, date aval, calcul en sens chronologique) par rapport a ' + +'l''hydrogramme objectif (du aux contraintes physiques et ' + +'consignes de gestion aux prises et restitutions des reservoirs)'; + C2_ISOFREQ(YDateDebut,YDateDebut,YDateFin,YficQXdef[0,2],YChaine,1,3); {--r‚sultats de d‚faillances de d‚bit in‚vitables --} - assign(YFicResult4,YRepR+YNomFicResDef+'1'); + assign(YFicResult4,YRepR+YNomFicResDef+'1B'+YExIsofreq); if YTypeObjectif=0 then YChaine:='Manque' else YChaine:='Exces'; - YChaine:=YChaine+' inevitable de debit Qdef1 a la station aval du systeme (m3/s) par rapport a l''objectif ' - +'(du fait de la repartition des debits, de la localisation des reservoirs, des consignes et ' - +'contraintes aux prises et restitutions et du manque de capacite des reservoirs)'; - ISOFREQ(YDateDebut,YDateDebut,YDateFin,YficQdef[1],YChaine); + YChaine:=YChaine+' de debit QXdef1 a la station aval du systeme (m3/s, date aval, calcul en sens chronologique) par rapport a l''objectif ' + +'(du a la fois aux contraintes physiques et consignes aux prises et restitutions, et au manque de capacite des reservoir)'; + C2_ISOFREQ(YDateDebut,YDateDebut,YDateFin,YficQXdef[1,2],YChaine,1,3); {--message ‚cran et stat du calcul--} assign(YFicSortie, YRepR+YNomFicSortie); append(YFicSortie); writeln(YFicSortie); - EcritureSeparation; + P_EcritureSeparation; writeln(YFicSortie,'FIN DU CALCUL (LES ETAPES SUCCESSIVES SE SONT DEROULEES NORMALEMENT)'); close(YFicSortie); - if YSaisie then - YSaisie10; + E_Message10; + + end {fin du cas o— on fait les calculs} - end; {fin du cas o— on fait les calculs} + else {cas o— les calculs n'ont pas pu ˆtre faits} + if YSaisie then + E_Message11; + {cr‚ation du fichier marquant la fin programme} assign(YFitext,YNomFicFin); rewrite(YFitext); close(YFitext);