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/src/CALCULS1.PAS b/src/CALCULS1.PAS index abf78e1b747c583acf9a2d29d47e9901c06f3e31..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,29); + 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,42); + 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 d476a23fbb484915524ee2596e31e9ec8117144b..02a991916af1876b472bd7b9857d64b538229225 100644 --- a/src/DECLARA.PAS +++ b/src/DECLARA.PAS @@ -2,88 +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; - YNbmaxVersion = 25; {nombre max de versions de paramŠtres barrages et r‚seaux} + 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'); - YRepB ='BARRAGES\'; - YRepR ='RESULTAT\'; - YRepD ='DONNEES\'; - YRepO ='OBJECTIF\'; - YRepP ='PARAMETR\'; - YRepS ='RESEAUX\'; - 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} @@ -91,65 +127,78 @@ 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; + YFicDeb : file of YTypDeb2; + YFicDebTemp : file of YTypDeb2; + +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]; - 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; + 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} @@ -161,156 +210,226 @@ var 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 c03f0afcc88827c5ed112f9e87909ebf45e14a47..4c9df477a53a3144d97b9b034a458b638f177ebb 100644 --- a/src/ECRAN.PAS +++ b/src/ECRAN.PAS @@ -2,124 +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; -procedure YSaisie11; +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 Ysaisie11; + procedure E_Message11; begin - Awindow1; + A_window1; clrscr; - ATitre; + A_Titre; writeln; writeln; writeln('ECHEC DU PROGRAMME'); - Atapez; + 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 6de1777f2f754ad0d426275967aa2a08c61258e7..1ae500743148938489874855ff3517a08337090a 100644 --- a/src/INTERFAS.PAS +++ b/src/INTERFAS.PAS @@ -14,12 +14,6 @@ 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)); @@ -31,145 +25,87 @@ var ALignmaxEcran : integer; Ax : integer; Ay : integer; - ADelai : integer; - AMotDepasse : AChai4; - ADestin : integer; {1:impression, 2:fichier, 3:‚cran} Alst : text; -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; +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 A_Titre; begin A_Couleur(0,15); end; -procedure ASouligne(Zn:integer); - var Xk:integer; begin for Xk:=1 to Zn do write(Alst,'-'); writeln(Alst); end; +procedure A_Texte; begin A_Couleur(0,12); end; -procedure ADoubleSoulignSCr(Zn:integer); - var Xk:integer; begin for Xk:=1 to Zn do write('='); writeln; end; +procedure A_Propo; begin A_Couleur(0,2); end; -procedure ASoulignScr(Zn:integer); - var Xk:integer; begin for Xk:=1 to Zn do write(chr(196)); writeln; end; +procedure A_Sulad; begin A_Couleur(0,10+blink); end; -procedure AAlerte; begin {sound(50);} delay(ADelai); nosound; end; +procedure A_Choix; begin A_Couleur(4,14); end; -procedure ABruit ; begin {sound(100);} delay(ADelai); nosound; end; +procedure A_Quest; begin A_Couleur(0,11); 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 APropo; begin ACouleur(0,2); end; - -procedure ASulad; begin ACouleur(0,10+blink); end; - -procedure AChoix; begin ACouleur(4,14); end; - -procedure AQuest; begin ACouleur(0,11); end; - -procedure AClign; begin ACouleur(0,31); 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 while keypressed do Xch:=readkey; - ASautscr(2);write('tapez une touche'); - Abruit; 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; + writeln; writeln; write('tapez une touche'); + repeat until keypressed; while keypressed do XCh:=readkey; 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; @@ -179,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; @@ -188,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 @@ -224,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 @@ -239,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; @@ -335,52 +267,48 @@ 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=ALignemax then Ay:=ALignemax-1; end; until XBon @@ -388,55 +316,40 @@ procedure ASaisidate(var Zjour,Zmois,Zan:integer; var ZDada:string; ZDadamin,ZDa end; {----------------------------------------------------------------------------} -procedure AWindow(C1,L1,C2,L2:integer); begin; window(C1,L1,C2,L2); Alignemax:=L2-L1+1; end; - -procedure Awindow1; begin ; window(1,1,80,ALignmaxEcran); ALignemax:=ALignmaxEcran; end; +procedure A_Window(C1,L1,C2,L2:integer); begin; window(C1,L1,C2,L2); Alignemax:=L2-L1+1; end; -procedure Awindow15;begin ; window(1,2,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-1; end; +procedure A_window1; begin ; window(1,1,80,ALignmaxEcran); ALignemax:=ALignmaxEcran; end; -procedure Awindow2; begin ; window(1,3,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-2; end; +procedure A_window15;begin ; window(1,2,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-1; end; -procedure Awindow25;begin ; window(1,4,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-3; end; +procedure A_window2; begin ; window(1,3,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-2; end; -procedure Awindow3; begin ; window(1,5,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-4; end; +procedure A_window25;begin ; window(1,4,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-3; end; -procedure Awindow35;begin ; window(1,6,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-5; end; +procedure A_window3; begin ; window(1,5,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-4; end; -procedure Awindow355; begin ; window(1,7,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-6; end; +procedure A_window35;begin ; window(1,6,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-5; end; -procedure Awindow4; begin ; window(1,8,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-7; end; +procedure A_window355; begin ; window(1,7,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-6; end; -procedure Awindow45;begin ; window(1,10,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-9; end; +procedure A_window4; begin ; window(1,8,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-7; end; -procedure Awindow451;begin ; window(1,11,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-10; end; +procedure A_window45;begin ; window(1,10,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-9; end; -procedure Awindow455;begin ; window(1,12,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-11; end; +procedure A_window451;begin ; window(1,11,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-10; end; -procedure Awindow4555; begin ; window(1,13,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-12; end; +procedure A_window455;begin ; window(1,12,80,ALignmaxEcran); ALigneMax:=ALignmaxEcran-11; end; -procedure Awindow5; begin ; window(1,14,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-13; end; +procedure A_window4555; begin ; window(1,13,80,ALignmaxEcran); ALignemax:=ALignmaxEcran-12; end; -procedure Awindow55; begin ; window(1,15,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-14; end; +procedure A_window5; begin ; window(1,14,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-13; end; -procedure Awindow6; begin ; window(1,16,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-15; end; +procedure A_window55; begin ; window(1,15,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-14; end; -procedure Awindow7; begin ; window(1,18,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-17; end; +procedure A_window6; begin ; window(1,16,80,ALignmaxEcran); Alignemax:=ALignmaxEcran-15; end; -{----------------------------------------------------------------------------} - -procedure AFrein; - var idelai :longint; - begin for idelai:=1 to Adelai do delay(10); 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 diff --git a/src/PARAM.PAS b/src/PARAM.PAS index 4f1be0ee864e15d7698d60bfea81786702e6ee1a..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'); @@ -62,73 +86,98 @@ procedure ChoixEntreeOptions; 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} -procedure DatesLuesSurFichier; +{========================================================================} +{--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 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 @@ -142,14 +191,14 @@ 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; @@ -166,48 +215,55 @@ procedure EntreesLac; {--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; 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 les temps de propagation entre ceux-ci et l''objectif'); 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; writeln(YRepO,' : '); writeln(' -un fichier d‚finissant l''hydrogramme objectif annuel … la station aval'); writeln; write('Les r‚sultats sont ‚dit‚s en fichiers texte dans le r‚pertoire ',YRepR); - ATapez; - atexte; + A_Tapez; + a_texte; clrscr; - Aquest; + A_quest; write('nom du fichier localisant l''objectif de gestion (station aval) ? '); - Alecture_xy; - AReponse(YNomFicLacs,14); + A_lecture_xy; + A_Reponse(YNomFicLacs,14); end; writeln(YFicSortie,'Nom du fichier localisant l''objectif aval, listant les reservoirs ', - 'situes a l''amont et donnant les temps de propagation : ',YNomFicLacs); + 'situes a l''amont et donnant les temps de propagation : ',YRepP,YRepStations,YNomFicLacs); writeln(YFicSortie); YResume:='systeme = '+YNomFicLacs+'['; {--ouverture du fichier des paramŠtres de station aval--} {$i-} - assign(YFitext,YRepP+YNomFicLacs); + assign(YFitext,YRepP+YRepStations+YNomFicLacs); YOuvertEtLu:=false; reset(YFitext); @@ -229,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 @@ -248,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); @@ -262,7 +318,7 @@ procedure EntreesLac; writeln(YFicSortie); {--lecture ‚ventuelle des r‚glages--} - assign(YFitext,YNomFicReglage); + assign(YFitext,YRepP+YNomFicReglage); reset(YFitext); if (ioresult=0) then begin @@ -291,7 +347,7 @@ procedure EntreesLac; {--de chaque r‚servoir. --} if YSaisie then begin - ATitre; + A_Titre; writeln; writeln('versions disponibles pour les contraintes et consignes de r‚servoirs :'); XNbVersion:=0; @@ -307,9 +363,9 @@ procedure EntreesLac; if IOResult=0 then begin XNbVersion:=XNbVersion+1; - APropo; + A_Propo; write(XNbVersion:2); - ATitre; + A_Titre; writeln(' : [',Xi:2,'] ',XEntete); XRangVersion[XNbVersion]:=Xi; end; @@ -320,7 +376,7 @@ procedure EntreesLac; begin YRangPBarrage:=0; writeln('Liste vide. Calcul impossible'); - ATapez; + A_Tapez; end else begin @@ -331,9 +387,9 @@ procedure EntreesLac; end else begin - AQuest; + A_Quest; write('version de paramŠtres … utiliser (entre 1 et ',XNbVersion,') ? '); - ASaisiInt(Xi,1,XNbVersion,2); + A_SaisiInt(Xi,1,XNbVersion,2); end; YRangPBarrage:=XRangVersion[Xi]; end; @@ -363,7 +419,7 @@ procedure EntreesLac; begin if YSaisie then begin - ATitre; + A_Titre; writeln('versions disponibles pour les r‚seaux de stations associ‚s aux r‚servoirs :'); XNbVersion:=0; for Xi:=1 to YNbMaxVersion do @@ -378,9 +434,9 @@ procedure EntreesLac; if IOResult=0 then begin XNbVersion:=XNbVersion+1; - APropo; + A_Propo; write(XNbVersion:2); - ATitre; + A_Titre; writeln(' : [',Xi:2,'] ',XEntete); XRangVersion[XNbVersion]:=Xi; end; @@ -391,7 +447,7 @@ procedure EntreesLac; begin YRangPReseau:=0; writeln('Liste vide. Calcul impossible'); - Atapez; + A_tapez; end else begin @@ -402,9 +458,9 @@ procedure EntreesLac; end else begin - AQuest; + A_Quest; write('version de paramŠtres … utiliser (entre 1 et ',XNbVersion,') ? '); - ASaisiInt(Xi,1,XNbVersion,2); + A_SaisiInt(Xi,1,XNbVersion,2); end; YRangPReseau:=XRangVersion[Xi]; end; @@ -435,7 +491,10 @@ procedure EntreesLac; {--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 des paramŠtres de station aval} @@ -453,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)') @@ -468,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 @@ -495,193 +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; - XChaine : string; + 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-} + + {--ouverture du fichier des contraintes et consignes--} + assign(YFitext,YNomRepBarrage+YNomLac[YRangLac]+YSuffixe[1]); + reset(YFitext); + YOuvertEtLu:=false; - {$i-} + {--cas d'ouverture correcte du fichier des contraintes et consignes--} + if ioresult=0 then - {--ouverture du fichier des contraintes et consignes--} - assign(YFitext,YNomRepBarrage+YNomLac[YRangLac]+YSuffixe[1]); - reset(YFitext); - YOuvertEtLu:=false; + begin - {--cas d'ouverture correcte du fichier des contraintes et consignes--} - if ioresult=0 then + {--cas o— le fichier n'est pas vide--} + if not eof(YFiText) then - begin + 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],' : '); - {--cas o— le fichier n'est pas vide--} - if not eof(YFiText) then + {--lecture des contraintes de gestion des canaux (prise et restitution)} - 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 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]+', '; - str(YRangPBarrage,XChai8); - YResume:=YResume+' Versions parametres barrages et reseaux : '+XChai8; - str(YRangPReseau,XChai8); - YResume:=YResume+' et '+XChai8+' ; '; - - {--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], + 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]); - {$i+} + close(YFitext); + + end {fin du cas d'ouverture correcte du fichier} + + {--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) :'); @@ -690,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,' ; '); @@ -716,26 +857,25 @@ procedure EcritureParametresLacs(var ZFic:text); 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); @@ -743,130 +883,182 @@ 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; @@ -877,21 +1069,21 @@ procedure EntreeReseaux; {---------------------------------------------------------------------------} -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-} @@ -927,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]); @@ -947,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} @@ -1018,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 @@ -1046,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 = '); @@ -1076,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); @@ -1111,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. 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 2e823ff4f54232eb913f26dacdd8df5045077757..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,22 +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. + diff --git a/src/VGEST.PAS b/src/VGEST.PAS index cb28740a012247a00139e091241fd6d25f390aaa..fe8be2a0848d887772ff58738a4b0e1c0324e3c6 100644 --- a/src/VGEST.PAS +++ b/src/VGEST.PAS @@ -1,165 +1,561 @@ -PROGRAM VGEST; {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); - - end; {fin de boucle sur le temps, sur la p‚riode chosie} - - {--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]); + {--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; - {--message ‚cran--} - if YSaisie then - Ysaisie8; + {--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; - {--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,86 +1011,132 @@ 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} else {cas o— les calculs n'ont pas pu ˆtre faits} if YSaisie then - YSaisie11; + E_Message11; {cr‚ation du fichier marquant la fin programme} assign(YFitext,YNomFicFin);