SURFEX v7.3
General documentation of Surfex
|
00001 C Jan-2011 P. Marguinaud Thread-safe LFI 00002 SUBROUTINE LFIOUV_MT (LFI, KREP, KNUMER, LDNOMM, CDNOMF, 00003 S CDSTTO, LDERFA, 00004 S LDIMST, KNIMES, KNBARP, KNBARI ) 00005 USE LFIMOD, ONLY : LFICOM 00006 USE PARKIND1, ONLY : JPRB 00007 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00008 C**** 00009 C SOUS-PROGRAMME D'OUVERTURE D'UNE UNITE LOGIQUE DEVANT ETRE 00010 C TRAITEE COMME UN FICHIER INDEXE, PAR LE LOGICIEL LFI. 00011 C** 00012 C ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME; 00013 C KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE; 00014 C LDNOMM (ENTREE) ==> VRAI SI L'UNITE LOGIQUE DOIT ETRE 00015 C ASSOCIEE A UN NOM DE FICHIER EXP- 00016 C LICITE LORS DE L'"OPEN" FORTRAN; 00017 C CDNOMF (ENTREE) ==> NOM DE FICHIER EXPLICITE, SI 00018 C *LDNOMM* EST VRAI - MEME SI CE 00019 C N'EST PAS LE CAS, CE *DOIT* ETRE 00020 C UN OBJET DE TYPE "CHARACTER" . 00021 C CDSTTO (ENTREE) ==> "STATUS" POUR L'"OPEN" FORTRAN 00022 C ('OLD','NEW','UNKNOWN','SCRATCH') 00023 C PAR DEFAUT, METTRE 'UNKNOWN'; 00024 C LDERFA (ENTREE) ==> OPTION D'ERREUR FATALE; 00025 C LDIMST (ENTREE) ==> OPTION IMPRESSION DE STATISTIQUES 00026 C AU MOMENT DE LA FERMETURE; 00027 C KNIMES (ENTREE) ==> NIVEAU DE LA MESSAGERIE (0,1 OU 2) 00028 C ( 0==>RIEN, 2==>TOUT ) 00029 C KNBARP (ENTREE) ==> NOMBRE D'ARTICLES LOGIQUES PREVUS, 00030 C CE QUI N'EST UTILISE QUE LORS DE 00031 C LA CREATION DU FICHIER, 00032 C ET QUI N'EMPECHE QUAND MEME PAS 00033 C D'AVOIR PLUS D'ARTICLES LOGIQUES; 00034 C KNBARI (SORTIE) ==> NOMBRE D'ARTICLES LOGIQUES DE DON- 00035 C NEES SUR LE FICHIER, INITIALEMENT. 00036 C (ZERO SI CREATION) 00037 CHARACTER CPNOMD*(*) 00038 PARAMETER ( CPNOMD='%%%%% FICHIER SANS NOM %%%%%' ) 00039 C 00040 C Modifications: 00041 C 00042 C 02/06/97, Jean Clochard. 00043 C 00044 C -Modification des impressions pour que l'annee puisse 00045 C etre imprimee avec 4 chiffres. 00046 C 00047 #ifndef f77 00048 #include "precision.h" 00049 #endif 00050 C 00051 TYPE(LFICOM) :: LFI 00052 INTEGER KREP, KNUMER, KNIMES, KNBARP, KNBARI 00053 #ifndef f77 00054 INTEGER (KIND=JPDBLE) IDATE, IHEURE 00055 #else 00056 INTEGER IDATE, IHEURE 00057 #endif 00058 INTEGER ILSTTU, IREPX, IRANG, IRANMS, INBARI, IDECBL, IPOSBL, J 00059 INTEGER ILNOMF, INLNOM, INIMES, IREP, ILNOMS, IFACTM, ILSTTO, IJ 00060 INTEGER IRANFM, ILACTI, ICOMPT, ITAILS, ICRITS, IPOFIN, ICRITG 00061 INTEGER ICRITD, ICRITR, IPOSCA, INREAD, INWRIT, IBASE, ILOREC 00062 INTEGER INAPHY, JREC, ILARPH, INALPP, IFACPH, IFACPP, INBPIR 00063 INTEGER IRANGD, IREC, INBALO, ILUTIL, IRGPIF, IRETIN 00064 C 00065 LOGICAL LDNOMM, LDERFA, LDIMST, LLEXFI, LLNOUF, LLNOMS 00066 LOGICAL LLVERG, LLEXUL 00067 C 00068 CHARACTER CDNOMF*(*), CDSTTO*(*) 00069 CHARACTER*(LFI%JPLSTX) CLSTTO 00070 CHARACTER*(LFI%JPLFTX) CLNOMF, CLNOMS 00071 C 00072 #include "lficom2.h" 00073 #include "lficom_mt.h" 00074 C 00075 C 1. - CONTROLES DIVERS, ET INITIALISATIONS. 00076 C----------------------------------------------------------------------- 00077 C* 00078 C 1.0 - PARTIE "ELEMENTAIRE". 00079 C----------------------------------------------------------------------- 00080 C 00081 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00082 IF (LHOOK) CALL DR_HOOK('LFIOUV_MT',0,ZHOOK_HANDLE) 00083 ILSTTU=MIN0 (LEN (CLSTTO), LEN (CDSTTO)) 00084 IREPX=0 00085 IRANG=0 00086 IRANMS=0 00087 INBARI=0 00088 LLVERG=.FALSE. 00089 C 00090 C Appel legerement anticipe a LFINUM, permettant une initialisa- 00091 C tion des variables globales du logiciel a la 1ere utilisation. 00092 C 00093 CALL LFINUM_MT (LFI, KNUMER,IRANG) 00094 C 00095 IF (LDNOMM) THEN 00096 C 00097 C Recherche de la longueur "utile" du nom de fichier specifie. 00098 C (c'est-a-dire sans tenir compte des blancs terminaux eventuels) 00099 C 00100 IDECBL=0 00101 C 00102 101 CONTINUE 00103 IPOSBL=IDECBL+INDEX (CDNOMF(IDECBL+1:),' ') 00104 C 00105 IF (IPOSBL.LE.IDECBL) THEN 00106 ILNOMF=LEN (CDNOMF) 00107 ELSEIF (CDNOMF(IPOSBL:).EQ.' ') THEN 00108 ILNOMF=MAX0 (IPOSBL-1,1) 00109 ELSE 00110 IDECBL=IPOSBL 00111 GOTO 101 00112 ENDIF 00113 C 00114 IF (ILNOMF.GT.LFI%JPLFTX) THEN 00115 INLNOM=LFI%JPLFTX 00116 INIMES=LFI%NIMESG 00117 C 00118 IF (INIMES.GE.1) THEN 00119 C 00120 C Message preventif, car le controle de non ouverture d'un meme 00121 C fichier via deux unites logiques differentes risque de "sauter" 00122 C artificiellement... et pas forcement a cet appel. 00123 C 00124 C Le code-reponse ci-dessous est bidon, mais permet de mettre 00125 C en relief le message via LFIEMS. 00126 C 00127 IREP=LFI%JPNIL 00128 CLNSPR='LFIOUV' 00129 C 00130 IF (LFI%LFRANC) THEN 00131 WRITE (UNIT=CLMESS,FMT= 00132 S '(''ATTENTION: NOM DE FICHIER TRONQUE A' 00133 ',I4, S '' CARACTERES...'')') LFI%JPLFTX 00134 ELSE 00135 WRITE (UNIT=CLMESS,FMT= 00136 S '(''WARNING: FILE NAME TRUNCATED TO ONLY' 00137 ',I4, S '' CHARACTERS...'')') LFI%JPLFTX 00138 ENDIF 00139 C 00140 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00141 S CLMESS,CLNSPR, 00142 S CLACTI) 00143 ENDIF 00144 C 00145 ELSE 00146 INLNOM=ILNOMF 00147 ENDIF 00148 C 00149 CLNOMF=CDNOMF(:INLNOM) 00150 ELSE 00151 ILNOMF=LEN (CPNOMD) 00152 CLNOMF=CPNOMD 00153 INLNOM=ILNOMF 00154 ENDIF 00155 C 00156 C Ci-dessous, initialisations destinees a forcer l'impression 00157 C du nom du fichier en cas de problemes. 00158 C 00159 CLNOMS=CLNOMF 00160 ILNOMS=INLNOM 00161 IFACTM=0 00162 C 00163 C Controle de validite FORTRAN du Numero d'Unite Logique. 00164 C 00165 INQUIRE (UNIT=KNUMER,EXIST=LLEXUL,ERR=901,IOSTAT=IREP) 00166 C 00167 IF (.NOT.LLEXUL) THEN 00168 IREP=-30 00169 GOTO 1001 00170 ENDIF 00171 C 00172 C CONTROLE DE L'ARGUMENT D'APPEL "KNIMES" 00173 C 00174 IF (KNIMES.LT.0.OR.KNIMES.GT.2) THEN 00175 IREP=-2 00176 GOTO 1001 00177 ENDIF 00178 C 00179 C CONTROLE DE L'ARGUMENT D'APPEL "CDSTTO" 00180 C 00181 DO 103 J=1,LFI%JPNBST 00182 IF (CDSTTO.EQ.LFI%LFIOUV_CLSTEX(J)) GOTO 104 00183 103 CONTINUE 00184 C 00185 ILACTI=MIN0 (LEN (CDSTTO),LEN (CLACTI)) 00186 CLACTI=CDSTTO(:ILACTI) 00187 IREP=-7 00188 GOTO 1001 00189 C 00190 104 CONTINUE 00191 ILSTTO=INDEX (CDSTTO,' ')-1 00192 IF (ILSTTO.GT.0) ILSTTU=ILSTTO 00193 CLSTTO=CDSTTO(:ILSTTU) 00194 C 00195 C CONTROLE DE NON-OUVERTURE PREALABLE. 00196 C 00197 IF (IRANG.NE.0) THEN 00198 IREP=-5 00199 GOTO 1001 00200 ENDIF 00201 C 00202 IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERGLA,'ON') 00203 LLVERG=LFI%LMULTI 00204 C 00205 C Recherche d'un eventuel facteur multiplicatif predefini pour 00206 C l'unite logique en question. 00207 C 00208 CALL LFIFMP_MT (LFI, KNUMER,IRANFM) 00209 IFACTM=LFI%MFACTU(IRANFM) 00210 C 00211 IF (LDNOMM) THEN 00212 C 00213 C SI LE FICHIER EST NOMME, ON VERIFIE QU'IL N'A PAS ETE 00214 C DEJA OUVERT POUR UNE AUTRE UNITE LOGIQUE. 00215 C 00216 DO 105 J=1,LFI%NBFIOU 00217 IJ=LFI%NUMIND(J) 00218 C 00219 IF (CLNOMF.EQ.LFI%CNOMFI(IJ)(:MIN0 (LFI%JPLFTX,LFI%NLNOMF(IJ)))) 00220 S THEN 00221 ILACTI=MIN0(LEN (CLNOMF),LEN (CLACTI)) 00222 CLACTI=CLNOMF(:ILACTI) 00223 IRANMS=IJ 00224 IREP=-13 00225 GOTO 1001 00226 ENDIF 00227 C 00228 105 CONTINUE 00229 C 00230 ENDIF 00231 C 00232 110 CONTINUE 00233 C* 00234 C 1.1 - RECHERCHE D'UN EMPLACEMENT DISPONIBLE DANS LA TABLE DES 00235 C NUMEROS D'UNITES LOGIQUES *LFI%NUMERO* . 00236 C (Il faut IFACTM emplacements CONSECUTIFS) 00237 C----------------------------------------------------------------------- 00238 C 00239 IF ((LFI%NFACTM+IFACTM).GT.LFI%JPNXFI) THEN 00240 IREP=-6 00241 GOTO 1001 00242 ENDIF 00243 C 00244 ICOMPT=0 00245 ITAILS=LFI%JPNXFI+1 00246 ICRITS=0 00247 C 00248 DO 111 J=1,LFI%JPNXFI 00249 C 00250 IF (LFI%NUMERO(J).EQ.LFI%JPNIL) THEN 00251 ICOMPT=ICOMPT+1 00252 IF (J.NE.LFI%JPNXFI.OR.ICOMPT.LT.IFACTM.OR.ICOMPT.GT.ITAILS) 00253 S GOTO 111 00254 IPOFIN=LFI%JPNXFI 00255 ELSEIF (ICOMPT.LT.IFACTM.OR.ICOMPT.GT.ITAILS) THEN 00256 ICOMPT=0 00257 C 00258 IF ((LFI%JPNXFI-J).LT.IFACTM) THEN 00259 GOTO 112 00260 ELSE 00261 GOTO 111 00262 ENDIF 00263 C 00264 ELSE 00265 IPOFIN=J-1 00266 ENDIF 00267 C 00268 C Les lignes qui suivent sont atteintes si on a trouve un espace 00269 C contigu suffisant dans la table LFI%NUMERO, et de taille inferieure 00270 C ou egale a ce qu'on aurait pu trouver precedemment. 00271 C On calcule alors un critere de cadrage (a gauche ou a droite) 00272 C dans cet espace, en privilegiant une occupation decentree. 00273 C 00274 ICRITG=IABS (LFI%JPNXFI+1-2*(IPOFIN-ICOMPT+1)) 00275 ICRITD=IABS (LFI%JPNXFI+1-2*IPOFIN) 00276 C 00277 IF (ICRITG.GE.ICRITD) THEN 00278 ICRITR=ICRITG 00279 IPOSCA=IPOFIN-ICOMPT+1 00280 ELSE 00281 ICRITR=ICRITD 00282 IPOSCA=IPOFIN-IFACTM+1 00283 ENDIF 00284 C 00285 C On retient l'espace trouve s'il est plus petit que ce qu'on 00286 C avait pu trouver precedemment, ou en cas d'egalite de taille 00287 C s'il est plus decentre. 00288 C 00289 IF (ICOMPT.LT.ITAILS.OR.ICRITR.GT.ICRITS) THEN 00290 ITAILS=ICOMPT 00291 IRANG=IPOSCA 00292 ICRITS=ICRITR 00293 ENDIF 00294 C 00295 ICOMPT=0 00296 IF ((LFI%JPNXFI-J).LT.IFACTM) GOTO 112 00297 C 00298 111 CONTINUE 00299 C 00300 112 CONTINUE 00301 C 00302 IF (ITAILS.GT.LFI%JPNXFI) THEN 00303 C 00304 C On n'a pas trouve d'espace ad hoc. 00305 C 00306 IF (IFACTM.GT.1) THEN 00307 IREP=-27 00308 ELSE 00309 IREP=-16 00310 ENDIF 00311 C 00312 GOTO 1001 00313 C 00314 ENDIF 00315 C 00316 IRANMS=IRANG 00317 IF (LFI%LMISOP) WRITE (UNIT=LFI%NULOUT,FMT=*) 00318 S '====> LFIOUV - IRANG = ',IRANG, ', IFACTM = ',IFACTM 00319 LFI%LERFAT(IRANG)=LDERFA 00320 LFI%NIVMES(IRANG)=KNIMES 00321 INREAD=0 00322 INWRIT=0 00323 C 00324 C CETTE INITIALISATION QUI PEUT PARAITRE BIEN COMPLIQUEE SERT 00325 C DE PARADE AU MAUVAIS COMPORTEMENT DU "READ" SUR UN FICHIER VIDE, 00326 C sur CRAY-2 sous UNICOS 4.0 et 5.0... ( Debut ) 00327 C 00328 CALL LFIDAH_MT (LFI, IDATE,IHEURE) 00329 IBASE=IHEURE+LFI%JPNIL 00330 C 00331 DO 113 J=1,LFI%JPLDOC 00332 LFI%MDES1D(IXM(J,IRANG))=IBASE-J 00333 113 CONTINUE 00334 C** 00335 C 2. - OUVERTURE DU FICHIER AU SENS FORTRAN DU TERME (*OPEN*). 00336 C----------------------------------------------------------------------- 00337 C 00338 ILOREC=LFI%JPRECL*IFACTM 00339 C 00340 IF (LDNOMM) THEN 00341 C* 00342 C 2.1 - CAS OU L'UNITE LOGIQUE DOIT ETRE ASSOCIEE A UN FICHIER 00343 C DONT LE NOM EST EXPLICITEMENT DONNE. 00344 C----------------------------------------------------------------------- 00345 C 00346 INQUIRE (FILE=CDNOMF,EXIST=LLEXFI,IOSTAT=IREP,ERR=901) 00347 C 00348 IF (LLEXFI.AND.CLSTTO.EQ.'NEW' 00349 S .OR..NOT.LLEXFI.AND.CLSTTO.EQ.'OLD') THEN 00350 CLACTI=CLSTTO 00351 IREP=-9 00352 IRANG=0 00353 IRANMS=0 00354 GOTO 1001 00355 ENDIF 00356 C 00357 LLNOUF=CLSTTO.EQ.'NEW'.OR.CLSTTO.EQ.'SCRATCH'.OR..NOT.LLEXFI 00358 C 00359 C APRES TOUS CES CONTROLES DE BASE, ON TENTE L'"OPEN" DU FICHIER . 00360 C 00361 OPEN (UNIT=KNUMER,FILE=CDNOMF,STATUS=CLSTTO,ERR=902, 00362 S FORM='UNFORMATTED',ACCESS='DIRECT',RECL=ILOREC,IOSTAT=IREP) 00363 C 00364 ELSE 00365 C* 00366 C 2.2 - CAS OU L'UNITE LOGIQUE N'A PAS DE NOM DE FICHIER ASSOCIE 00367 C EXPLICITE; ON TENTE DIRECTEMENT L'"OPEN" . 00368 C----------------------------------------------------------------------- 00369 C 00370 IF (CLSTTO.NE.'OLD'.AND.CLSTTO.NE.'NEW') THEN 00371 OPEN (UNIT=KNUMER,STATUS=CLSTTO,FORM='UNFORMATTED', 00372 S ACCESS='DIRECT',RECL=ILOREC,ERR=902,IOSTAT=IREP) 00373 ELSE 00374 OPEN (UNIT=KNUMER,FORM='UNFORMATTED', 00375 S ACCESS='DIRECT',RECL=ILOREC,ERR=902,IOSTAT=IREP) 00376 ENDIF 00377 C 00378 LLNOUF=CLSTTO.EQ.'SCRATCH' 00379 C 00380 ENDIF 00381 C* 00382 C 2.3 - L'"OPEN" S'EST BIEN PASSE... ON ESSAIE DE RECUPERER LE NOM 00383 C *SYSTEME* EVENTUEL ASSOCIE A L'UNITE LOGIQUE. 00384 C----------------------------------------------------------------------- 00385 C 00386 INQUIRE (UNIT=KNUMER,NAMED=LLNOMS,NAME=CLNOMS,ERR=901, 00387 S IOSTAT=IREP) 00388 C 00389 IF (LLNOMS) THEN 00390 C 00391 C Recherche de la longueur "utile" du nom systeme du fichier. 00392 C (c'est-a-dire sans tenir compte des blancs terminaux eventuels) 00393 C 00394 IDECBL=0 00395 C 00396 231 CONTINUE 00397 IPOSBL=IDECBL+INDEX (CLNOMS(IDECBL+1:),' ') 00398 C 00399 IF (IPOSBL.LE.IDECBL) THEN 00400 ILNOMS=LEN (CLNOMS) 00401 ELSEIF (CLNOMS(IPOSBL:).EQ.' ') THEN 00402 ILNOMS=MAX0 (IPOSBL-1,1) 00403 ELSE 00404 IDECBL=IPOSBL 00405 GOTO 231 00406 ENDIF 00407 C 00408 IF (.NOT.LDNOMM) THEN 00409 ILNOMF=ILNOMS 00410 INLNOM=ILNOMS 00411 CLNOMF=CLNOMS 00412 ENDIF 00413 C 00414 DO 233 J=1,LFI%NBFIOU 00415 IJ=LFI%NUMIND(J) 00416 C 00417 IF (CLNOMS.EQ.LFI%CNOMSY(IJ)(:LFI%NLNOMS(IJ))) THEN 00418 ILACTI=MIN0(LEN (CLNOMS),LEN (CLACTI)) 00419 CLACTI=CLNOMS(:ILACTI) 00420 IREP=-13 00421 IRANG=0 00422 IRANMS=0 00423 GOTO 1001 00424 ENDIF 00425 C 00426 233 CONTINUE 00427 C 00428 ELSE 00429 ILNOMS=LEN (CPNOMD) 00430 CLNOMS=CPNOMD 00431 ENDIF 00432 C 00433 IF (CLSTTO.EQ.'OLD'.OR..NOT.LLNOUF) THEN 00434 C** 00435 C 3. - DANS LE CAS OU LE FICHIER DEVAIT OU POUVAIT EXISTER AVANT 00436 C OUVERTURE, ON ESSAIE DE LIRE LES PREMIERS ARTICLES. 00437 C----------------------------------------------------------------------- 00438 C ( L'ARTICLE DOCUMENTAIRE ET UNE PAIRE D'ARTICLES D'INDEX; 00439 C ON COMMENCE PAR L'ARTICLE NO. 3 CAR IL Y A PLUS DE CHANCES 00440 C D'AVOIR UNE MAUVAISE LECTURE POUR CELUI-CI ) 00441 C 00442 C DANS LE CAS DU "STATUS" 'UNKNOWN', IL S'AGIT DE LEVER 00443 C L'AMBIGUITE: FICHIER DEJA ECRIT PAR LE LOGICIEL, OU DEVANT ETRE 00444 C CREE PAR LUI ? 00445 C 00446 DO 301 JREC=3,1,-2 00447 INAPHY=JREC 00448 CALL LFILDO_MT (LFI, IREP,KNUMER,JREC,LFI%MDES1D(IXM(1,IRANG)), 00449 S INREAD,IFACTM,IRETIN) 00450 C 00451 IF (IRETIN.NE.0) THEN 00452 GOTO 302 00453 ENDIF 00454 C 00455 301 CONTINUE 00456 C 00457 302 CONTINUE 00458 C 00459 IF (IREP.EQ.0) THEN 00460 C 00461 C LECTURE OK... ON CONTROLE QUELQUES VALEURS "DOCUMENTAIRES" 00462 C 00463 C Fin de la parade sur CRAY2, sous UNICOS 4.0 et 5.0 . 00464 C 00465 DO 303 J=1,LFI%JPLDOC 00466 IF (LFI%MDES1D(IXM(J,IRANG)).NE.(IBASE-J)) GOTO 304 00467 303 CONTINUE 00468 C 00469 LLNOUF=.TRUE. 00470 GOTO 390 00471 C 00472 304 CONTINUE 00473 LLNOUF=.FALSE. 00474 ILARPH=LFI%MDES1D(IXM(LFI%JPLPAR,IRANG)) 00475 INALPP=LFI%MDES1D(IXM(LFI%JPXAPI,IRANG)) 00476 IFACPH=ILARPH/LFI%JPLARD 00477 IFACPP=INALPP/LFI%JPNAPP 00478 C 00479 IF (MIN0 (ILARPH,INALPP).LE.0.OR.MOD (ILARPH,LFI%JPLARD).NE.0 00480 S .OR.LFI%MDES1D(IXM(LFI%JPLMNA,IRANG)).NE.LFI%JPNCPN 00481 S .OR.LFI%MDES1D(IXM(LFI%JPLLDO,IRANG)).NE.LFI%JPLDOC 00482 S .OR.MOD (INALPP,LFI%JPNAPP).NE.0.OR.IFACPP.NE.IFACPH) THEN 00483 IREP=-10 00484 IRANG=0 00485 IRANMS=0 00486 GOTO 1001 00487 ELSEIF (LFI%MDES1D(IXM(LFI%JPFEAM,IRANG)).NE.0) THEN 00488 IREP=-11 00489 LLFATA=LLMOER (IREP,IRANG) 00490 C 00491 IF (LLFATA) THEN 00492 IRANG=0 00493 IRANMS=0 00494 GOTO 1001 00495 ENDIF 00496 C 00497 C SI L'ERREUR (-11) N'A PAS ETE FATALE, ON DONNE LA POSSIBILITE 00498 C DE TRAITER LE FICHIER DONT LA DERNIERE MODIFICATION N'A PAS ETE 00499 C "ENREGISTREE" . MAIS SANS AUCUNE GARANTIE ... 00500 C 00501 ENDIF 00502 C 00503 IF (IFACPH.NE.IFACTM) THEN 00504 C 00505 C Messagerie de Niveau 1 pour prevenir de l'incident... 00506 C 00507 INIMES=IXNIMS (IRANMS) 00508 C 00509 IF (INIMES.GE.1) THEN 00510 CLNSPR='LFIOUV' 00511 C 00512 IF (LFI%LFRANC) THEN 00513 WRITE (UNIT=CLMESS,FMT='(''Unite logique' 00514 ',I3, S '', facteur multiplicatif lu sur fichier='',I3,'', attendu=' 00515 ', S I3)')KNUMER,IFACPH,IFACTM 00516 ELSE 00517 WRITE (UNIT=CLMESS,FMT='(''Logical Unit' 00518 ',I3, S '', multiply factor read on file='',I3,'', expected='',I3)') 00519 S KNUMER,IFACPH,IFACTM 00520 ENDIF 00521 C 00522 IREPX=IREP 00523 IREP=0 00524 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00525 S CLMESS,CLNSPR,CLACTI) 00526 C 00527 IF (LFI%LFRANC) THEN 00528 ILUTIL=MIN0 (INLNOM,LFI%JPLFIX,LEN (CLMESS)-6) 00529 CLMESS='Nom='''//CLNOMF(:ILUTIL)//'''' 00530 ELSE 00531 ILUTIL=MIN0 (INLNOM,LFI%JPLFIX,LEN (CLMESS)-7) 00532 CLMESS='Name='''//CLNOMF(:ILUTIL)//'''' 00533 ENDIF 00534 C 00535 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00536 S CLMESS,CLNSPR,CLACTI) 00537 C 00538 IF (LDNOMM.AND.CLNOMS.NE.CLNOMF) THEN 00539 C 00540 IF (LFI%LFRANC) THEN 00541 ILUTIL=MIN0 (ILNOMS,LFI%JPLFIX,LEN (CLMESS)-14) 00542 CLMESS='Nom SYSTEME='''//CLNOMS(:ILUTIL)//'''' 00543 ELSE 00544 ILUTIL=MIN0 (ILNOMS,LFI%JPLFIX,LEN (CLMESS)-14) 00545 CLMESS='SYSTEM Name='''//CLNOMS(:ILUTIL)//'''' 00546 ENDIF 00547 C 00548 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00549 S CLMESS,CLNSPR,CLACTI) 00550 ENDIF 00551 C 00552 IF (LFI%LFRANC) THEN 00553 CLMESS='On essaie de s''adapter au facteur ' 00554 S //'multiplicatif lu sur le fichier...' 00555 ELSE 00556 CLMESS='One tries to adapt to multiply ' 00557 S //'factor read on the file...' 00558 ENDIF 00559 C 00560 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00561 S CLMESS,CLNSPR,CLACTI) 00562 IREP=IREPX 00563 ENDIF 00564 C 00565 C On va essayer de traiter le fichier avec la longueur d'Article 00566 C Physique lue sur le fichier. Pour cela, on doit d'abord le fermer, 00567 C puis on va recommencer le traitement depuis le paragraphe 1.1 . 00568 C 00569 IRANG=0 00570 IRANMS=0 00571 CLOSE (UNIT=KNUMER,STATUS='KEEP',ERR=905,IOSTAT=IREP) 00572 C 00573 IF (IFACPH.GT.LFI%JPFACX) THEN 00574 IREP=-28 00575 GOTO 1001 00576 ENDIF 00577 C 00578 IFACTM=IFACPH 00579 GOTO 110 00580 ENDIF 00581 C 00582 ELSEIF (CLSTTO.EQ.'OLD') THEN 00583 IREP=-12 00584 IRANG=0 00585 IRANMS=0 00586 GOTO 1001 00587 ELSE 00588 IREP=0 00589 LLNOUF=.TRUE. 00590 ENDIF 00591 C 00592 ENDIF 00593 C 00594 390 CONTINUE 00595 C 00596 C Controle ultime avant le paragraphe suivant, dans la mesure 00597 C ou, contrairement au FORTRAN, on autorise les "STATUS" 'OLD' 00598 C et 'NEW' pour une unite logique sans nom de fichier explicite... 00599 C puisque le logiciel a sa propre mecanique de discrimination entre 00600 C un fichier "existant" ou "en mode creation". 00601 C 00602 IF (LLNOUF.AND.CLSTTO.EQ.'OLD' 00603 S .OR..NOT.LLNOUF.AND.CLSTTO.EQ.'NEW') THEN 00604 CLACTI=CLSTTO 00605 IREP=-9 00606 IRANG=0 00607 IRANMS=0 00608 GOTO 1001 00609 ENDIF 00610 C** 00611 C 4. - L'OUVERTURE FORTRAN EST OK, ON SAIT SI ON EST EN MODE 00612 C CREATION DU FICHIER INDEXE OU NON... ON COMMENCE A GARNIR 00613 C LES VARIABLES EN COMMON, MAIS SANS INCREMENTER *LFI%NBFIOU* 00614 C CAR ON PEUT ENCORE AVOIR DE (MAUVAISES) SURPRISES. 00615 C----------------------------------------------------------------------- 00616 C 00617 IREPX=IREP 00618 LFI%CNOMFI(IRANG)=CLNOMF 00619 LFI%NLNOMF(IRANG)=ILNOMF 00620 LFI%CNOMSY(IRANG)=CLNOMS 00621 LFI%NLNOMS(IRANG)=ILNOMS 00622 LFI%NDEROP(IRANG)=0 00623 LFI%CSTAOP(IRANG)=CLSTTO 00624 LFI%LNOUFI(IRANG)=LLNOUF 00625 LFI%LMODIF(IRANG)=.FALSE. 00626 LFI%NDERCO(IRANG)=IREP 00627 LFI%NTRULZ(IRANG)=0 00628 LFI%NRFPTZ(IRANG)=0 00629 LFI%NRFDTZ(IRANG)=0 00630 LFI%NBMOLU(IRANG)=0 00631 LFI%NBMOEC(IRANG)=0 00632 LFI%NDERGF(IRANG)=LFI%JPNIL 00633 LFI%CNDERA(IRANG)=' ' 00634 LFI%MFACTM(IRANG)=IFACTM 00635 LFI%NSUIVF(IRANG)=LFI%JPNIL 00636 LFI%NPRECF(IRANG)=LFI%JPNIL 00637 C 00638 C N.B.: LES PAGES D'INDEX DE RANG "IRANG" SONT AUTOMATIQUEMENT 00639 C "AFFECTEES" A L'UNITE LOGIQUE AYANT CE RANG, ET SERVENT 00640 C A Y STOCKER LA PREMIERE P.A.I. EN RANG DANS LE FICHIER. 00641 C 00642 C ( LES PAGES D'INDEX DE RANG "IRANG+(J-1)*LFI%JPNXFI" OU J VARIE 00643 C DE 1 A LFI%JPNPIA, SONT AUTOMATIQUEMENT AFFECTEES A L'UNITE 00644 C LOGIQUE DE RANG "IRANG" ) 00645 C 00646 LFI%NBLECT(IRANG)=0 00647 LFI%NBNECR(IRANG)=0 00648 LFI%NREESP(IRANG)=0 00649 LFI%NREECO(IRANG)=0 00650 LFI%NREELO(IRANG)=0 00651 LFI%NBTROU(IRANG)=0 00652 LFI%NBRENO(IRANG)=0 00653 LFI%NBSUPP(IRANG)=0 00654 LFI%LISTAT(IRANG)=LDIMST 00655 LFI%LMIMAL(IRANG)=.FALSE. 00656 IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'ASGN') 00657 C 00658 IF (LLNOUF) THEN 00659 C* 00660 C 4.1 - CAS DE CREATION DU FICHIER INDEXE - INITIALISATIONS DIVERSES 00661 C----------------------------------------------------------------------- 00662 C 00663 ILARPH=LFI%JPLARD*IFACTM 00664 INALPP=LFI%JPNAPP*IFACTM 00665 C 00666 DO 412 J=1,ILARPH 00667 LFI%MLGPOS(IXM(J,IRANG))=0 00668 412 CONTINUE 00669 C 00670 DO 413 J=1,LFI%JPNXNA 00671 LFI%CNOMAR(IXC(J,IRANG))=' ' 00672 413 CONTINUE 00673 C 00674 DO 414 J=1,ILARPH 00675 LFI%MDES1D(IXM(J,IRANG))=0 00676 414 CONTINUE 00677 C 00678 C NOMBRE DE PAIRES D'ARTICLES D'INDEX RESERVES, 00679 C (ELLES OCCUPERONT LES ARTICLES 2 A (2*INBPIR+1) DU FICHIER) 00680 C ET REMPLISSAGE DE CERTAINS MOTS DE L'ARTICLE DOCUMENTAIRE. 00681 C 00682 INBPIR=MAX0 (1,MIN0 (LFI%JPNXPR,1+(KNBARP-1)/INALPP)) 00683 LFI%MDES1D(IXM(LFI%JPNPIR,IRANG))=INBPIR 00684 LFI%MDES1D(IXM(LFI%JPNAPH,IRANG))=1+2*INBPIR 00685 LFI%MDES1D(IXM(LFI%JPLPAR,IRANG))=ILARPH 00686 LFI%MDES1D(IXM(LFI%JPLMNA,IRANG))=LFI%JPNCPN 00687 LFI%MDES1D(IXM(LFI%JPLLDO,IRANG))=LFI%JPLDOC 00688 LFI%MDES1D(IXM(LFI%JPXAPI,IRANG))=INALPP 00689 LFI%MDES1D(IXM(LFI%JPFEAM,IRANG))=1 00690 LFI%NPODPI(IRANG)=1 00691 LFI%NALDPI(IRANG)=0 00692 LFI%NPPIMM(IRANG)=1 00693 IRANGD=IRANG 00694 CALL LFIDAH_MT (LFI, LFI%MDES1D(IXM(LFI%JPDCRE,IRANG)), 00695 S LFI%MDES1D(IXM(LFI%JPHCRE,IRANG))) 00696 C 00697 C ECRITURE DU PREMIER ARTICLE (DESCRIPTIF) 00698 C 00699 IREC=1 00700 INAPHY=IREC 00701 CALL LFIEDO_MT (LFI, IREP,KNUMER,IREC,LFI%MDES1D(IXM(1,IRANG)), 00702 S INWRIT,IFACTM,IRETIN) 00703 C 00704 IF (IRETIN.NE.0) THEN 00705 GOTO 904 00706 ENDIF 00707 C 00708 C 00709 C Remise a zero du descripteur en vue d'une fermeture normale. 00710 C 00711 LFI%MDES1D(IXM(LFI%JPFEAM,IRANG))=0 00712 C 00713 C ECRITURE DES ARTICLES CONTENANT LES PAIRES D'ARTICLES D'INDEX 00714 C "RESERVES". 00715 C 00716 DO 415 J=1,INBPIR 00717 IREC=IREC+1 00718 INAPHY=IREC 00719 CALL LFIECC_MT (LFI, IREP,KNUMER,IREC,LFI%CNOMAR(IXC(1,IRANG)), 00720 S INWRIT,IFACTM,IRETIN) 00721 C 00722 IF (IRETIN.NE.0) THEN 00723 GOTO 903 00724 ENDIF 00725 C 00726 IREC=IREC+1 00727 INAPHY=IREC 00728 CALL LFIEDO_MT (LFI, IREP,KNUMER,IREC,LFI%MLGPOS(IXM(1,IRANG)), 00729 S INWRIT,IFACTM,IRETIN) 00730 C 00731 IF (IRETIN.NE.0) THEN 00732 GOTO 904 00733 ENDIF 00734 C 00735 415 CONTINUE 00736 C 00737 ELSE 00738 C* 00739 C 4.2 - LE FICHIER EXISTAIT DEJA... ON LIT LA 1ERE PAIRE D'ARTICLES 00740 C D'INDEX ( + LA DERNIERE S'IL Y EN A AU MOINS 2 *UTILISEES* ) 00741 C----------------------------------------------------------------------- 00742 C 00743 INBALO=LFI%MDES1D(IXM(LFI%JPNALO,IRANG)) 00744 INBPIR=LFI%MDES1D(IXM(LFI%JPNPIR,IRANG)) 00745 IREC=2 00746 INAPHY=IREC 00747 CALL LFILCC_MT (LFI, IREP,KNUMER,IREC,LFI%CNOMAR(IXC(1,IRANG)), 00748 S INREAD,IFACTM,IRETIN) 00749 C 00750 IF (IRETIN.NE.0) THEN 00751 GOTO 904 00752 ENDIF 00753 C 00754 IREC=3 00755 INAPHY=IREC 00756 CALL LFILDO_MT (LFI, IREP,KNUMER,IREC,LFI%MLGPOS(IXM(1,IRANG)), 00757 S INREAD,IFACTM,IRETIN) 00758 C 00759 IF (IRETIN.NE.0) THEN 00760 GOTO 904 00761 ENDIF 00762 C 00763 IF (INBALO.LE.INALPP) THEN 00764 LFI%NALDPI(IRANG)=INBALO 00765 LFI%NPODPI(IRANG)=1 00766 LFI%NPPIMM(IRANG)=1 00767 IRANGD=IRANG 00768 ELSE 00769 C 00770 C CAS OU IL Y A AU MOINS 2 PAIRES D'ARTICLES D'INDEX UTILISEES. 00771 C 00772 IRGPIF=1+(INBALO-1)/INALPP 00773 CALL LFIREC_MT (LFI, IRGPIF,IRANG,IREC) 00774 IRANGD=IRANG+LFI%JPNXFI 00775 INAPHY=IREC 00776 CALL LFILCC_MT (LFI, IREP,KNUMER,IREC, 00777 S LFI%CNOMAR(IXC(1,IRANGD)), 00778 S INREAD,IFACTM,IRETIN) 00779 C 00780 IF (IRETIN.NE.0) THEN 00781 GOTO 904 00782 ENDIF 00783 C 00784 IREC=IREC+1 00785 INAPHY=IREC 00786 CALL LFILDO_MT (LFI, IREP,KNUMER,IREC, 00787 S LFI%MLGPOS(IXM(1,IRANGD)), 00788 S INREAD,IFACTM,IRETIN) 00789 C 00790 IF (IRETIN.NE.0) THEN 00791 GOTO 904 00792 ENDIF 00793 C 00794 LFI%NALDPI(IRANG)=1+MOD (INBALO-1,INALPP) 00795 LFI%NPODPI(IRANG)=2 00796 LFI%NPPIMM(IRANG)=2 00797 LFI%MRGPIM(2,IRANG)=IRANGD 00798 LFI%MRGPIF(IRANGD)=IRGPIF 00799 ENDIF 00800 C 00801 ENDIF 00802 C** 00803 C 5. - L'OUVERTURE AU SENS DU LOGICIEL DE FICHIERS INDEXES LFI 00804 C EST COMPLETE; ON MET DONC A JOUR LES DERNIERES VARIABLES 00805 C EN COMMON, DONT *LFI%NBFIOU*. 00806 C----------------------------------------------------------------------- 00807 C 00808 C REMARQUE: LA PREMIERE ET LA DERNIERE P.P.I. SONT TOUJOURS 00809 C "PHASEES". 00810 C 00811 DO 501 J=IRANG,IRANGD,LFI%JPNXFI 00812 LFI%LECRPI(J,1)=.FALSE. 00813 LFI%LECRPI(J,2)=.FALSE. 00814 LFI%LPHASP(J)=.TRUE. 00815 501 CONTINUE 00816 C 00817 DO 502 J=0,LFI%JPNPDF-1 00818 LFI%NUMAPD(J,IRANG)=LFI%JPNIL 00819 LFI%NLONPD(J,IRANG)=0 00820 LFI%LECRPD(J,IRANG)=.FALSE. 00821 502 CONTINUE 00822 C 00823 DO 503 J=1,IFACTM 00824 LFI%NUMERO(IRANG+J-1)=KNUMER 00825 503 CONTINUE 00826 C 00827 LFI%NDERPD(IRANG)=LFI%JPNPDF-1 00828 LFI%NBFIOU=LFI%NBFIOU+1 00829 LFI%NFACTM=LFI%NFACTM+IFACTM 00830 LFI%NUMIND(LFI%NBFIOU)=IRANG 00831 INBARI=LFI%MDES1D(IXM(LFI%JPNALO,IRANG))- 00832 S LFI%MDES1D(IXM(LFI%JPNTRU,IRANG)) 00833 LFI%NBREAD(IRANG)=INREAD 00834 LFI%NBWRIT(IRANG)=INWRIT 00835 LFI%LTAMPL(IRANG)=LFI%LTAMLG 00836 LFI%LTAMPE(IRANG)=LFI%LTAMEG 00837 LFI%NEXPOR(IRANG)=LFI%JPNIL 00838 LFI%NIMPOR(IRANG)=LFI%JPNIL 00839 C 00840 IREP=IREPX 00841 GOTO 1001 00842 C** 00843 C 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S. 00844 C----------------------------------------------------------------------- 00845 C 00846 901 CONTINUE 00847 CLACTI='INQUIRE' 00848 INAPHY=0 00849 GOTO 909 00850 C 00851 902 CONTINUE 00852 CLACTI='OPEN' 00853 IRANG=0 00854 IRANMS=0 00855 INAPHY=0 00856 GOTO 909 00857 C 00858 903 CONTINUE 00859 CLACTI='WRITE' 00860 GOTO 909 00861 C 00862 904 CONTINUE 00863 CLACTI='READ' 00864 GOTO 909 00865 C 00866 905 CONTINUE 00867 CLACTI='CLOSE' 00868 INAPHY=0 00869 C 00870 909 CONTINUE 00871 C 00872 C AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF. 00873 C 00874 IREP=IABS (IREP) 00875 LFI%NUMAPH(IRANG)=INAPHY 00876 IF (IRANG.EQ.0) LFI%MFACTM(0)=IFACTM 00877 C** 00878 C 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL, 00879 C VIA LE SOUS-PROGRAMME "LFIEMS" . 00880 C----------------------------------------------------------------------- 00881 C 00882 1001 CONTINUE 00883 KREP=IREP 00884 KNBARI=INBARI 00885 LLFATA=LLMOER (IREP,IRANG) 00886 C 00887 IF (LLFATA) THEN 00888 INIMES=2 00889 ELSE 00890 INIMES=IXNIMS (IRANMS) 00891 ENDIF 00892 C 00893 IF (LFI%LMULTI.AND.LLVERG) CALL LFIVER_MT (LFI, LFI%VERGLA,'OFF') 00894 C 00895 IF (.NOT.LLFATA.AND.INIMES.EQ.0) THEN 00896 IF (LHOOK) CALL DR_HOOK('LFIOUV_MT',1,ZHOOK_HANDLE) 00897 RETURN 00898 ENDIF 00899 C 00900 CLNSPR='LFIOUV' 00901 C 00902 IF (INIMES.GE.1) THEN 00903 C 00904 C Impression du nom du fichier. 00905 C 00906 IF (LFI%LFRANC) THEN 00907 ILUTIL=MIN0 (INLNOM,LFI%JPLFIX,LEN (CLMESS)-6) 00908 CLMESS='Nom='''//CLNOMF(:ILUTIL)//'''' 00909 ELSE 00910 ILUTIL=MIN0 (INLNOM,LFI%JPLFIX,LEN (CLMESS)-7) 00911 CLMESS='Name='''//CLNOMF(:ILUTIL)//'''' 00912 ENDIF 00913 C 00914 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00915 S CLMESS,CLNSPR,CLACTI) 00916 C 00917 IF (LDNOMM.AND.CLNOMS(:ILNOMS).NE.CLNOMF(:INLNOM)) THEN 00918 C 00919 IF (LFI%LFRANC) THEN 00920 ILUTIL=MIN0 (ILNOMS,LFI%JPLFIX,LEN (CLMESS)-14) 00921 CLMESS='Nom SYSTEME='''//CLNOMS(:ILUTIL)//'''' 00922 ELSE 00923 ILUTIL=MIN0 (ILNOMS,LFI%JPLFIX,LEN (CLMESS)-14) 00924 CLMESS='SYSTEM Name='''//CLNOMS(:ILUTIL)//'''' 00925 ENDIF 00926 C 00927 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00928 S CLMESS,CLNSPR,CLACTI) 00929 ENDIF 00930 C 00931 ENDIF 00932 C 00933 IF (INIMES.EQ.2) THEN 00934 WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER=' 00935 ',I3, S '', LDNOMM= '',L1,'', CDSTTO='''''',A,'''''', LDERFA= ' 00936 ',L1, S '', LDIMST= ' 00937 ',L1, S '', KNIMES='',I2,'', KNBARP='',I6,'' KNBARI='',I6)') 00938 S KREP,KNUMER,LDNOMM,CDSTTO(:ILSTTU),LDERFA,LDIMST,KNIMES,KNBARP, 00939 S KNBARI 00940 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,LLFATA, 00941 S CLMESS,CLNSPR,CLACTI) 00942 ENDIF 00943 C 00944 C LA MESSAGERIE QUI SUIT N'EST PAS EMISE EN CAS D'ERREUR FATALE. 00945 C 00946 IF (INIMES.GE.1.AND.(IREP.EQ.0.OR.IREP.EQ.-11)) THEN 00947 C 00948 IF (LLNOUF) THEN 00949 C 00950 IF (LFI%LFRANC) THEN 00951 WRITE (UNIT=CLMESS,FMT='(''Unite' 00952 ',I3, S '' OUVERTE, CREATION de Fichier,'',I7,'' Articles prevus,' 00953 ',I7, S '' Articles gerables sans debordement'')') 00954 S KNUMER,KNBARP,INALPP*INBPIR 00955 ELSE 00956 WRITE (UNIT=CLMESS,FMT='(''Unit' 00957 ',I3, S '' OPENED, File CREATION,'',I7,'' expected Records,' 00958 ',I7, S '' Records may be handled without overflow'')') 00959 S KNUMER,KNBARP,INALPP*INBPIR 00960 ENDIF 00961 C 00962 ELSE 00963 C 00964 IF (LFI%LFRANC) THEN 00965 WRITE (UNIT=CLMESS,FMT='(''Unite' 00966 ',I3, S '' OUVERTE, derniere Modification OK a'',I9.6,''_' 00967 ',I6.6, S '','',I7,'' Articles de donnees,'',I9,'' mots en tout'')') 00968 S KNUMER,LFI%MDES1D(IXM(LFI%JPDDMG,IRANG)), 00969 S LFI%MDES1D(IXM(LFI%JPHDMG,IRANG)), 00970 S KNBARI,ILARPH*LFI%MDES1D(IXM(LFI%JPNAPH,IRANG)) 00971 ELSE 00972 WRITE (UNIT=CLMESS,FMT='(''Unit' 00973 ',I3, S '' OPENED, last Modification OK at'',I9.6,''_' 00974 ',I6.6, S '','',I7,'' data Records,'',I9,'' words in file'')') 00975 S KNUMER,LFI%MDES1D(IXM(LFI%JPDDMG,IRANG)), 00976 S LFI%MDES1D(IXM(LFI%JPHDMG,IRANG)), 00977 S KNBARI,ILARPH*LFI%MDES1D(IXM(LFI%JPNAPH,IRANG)) 00978 ENDIF 00979 C 00980 ENDIF 00981 C 00982 CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,.FALSE., 00983 S CLMESS,CLNSPR,CLACTI) 00984 ENDIF 00985 C 00986 IF (LHOOK) CALL DR_HOOK('LFIOUV_MT',1,ZHOOK_HANDLE) 00987 END 00988