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);