SURFEX v8.1
General documentation of Surfex
lfiouv.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe LFI
3 ! Sep-2012 P. Marguinaud Fix uninitialized variables
4 
5 SUBROUTINE lfiouv_fort &
6 & (lfi, krep, knumer, ldnomm, cdnomf, &
7 & cdstto, lderfa, &
8 & ldimst, knimes, knbarp, knbari )
9 USE lfimod, ONLY : lficom, lficrw
10 USE parkind1, ONLY : jprb, jpia, jpim, jpib
11 USE yomhook , ONLY : lhook, dr_hook
12 USE lfi_precision
13 IMPLICIT NONE
14 !****
15 ! SOUS-PROGRAMME D'OUVERTURE D'UNE UNITE LOGIQUE DEVANT ETRE
16 ! TRAITEE COMME UN FICHIER INDEXE, PAR LE LOGICIEL LFI.
17 !**
18 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
19 ! KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
20 ! LDNOMM (ENTREE) ==> VRAI SI L'UNITE LOGIQUE DOIT ETRE
21 ! ASSOCIEE A UN NOM DE FICHIER EXP-
22 ! LICITE LORS DE L'"OPEN" FORTRAN;
23 ! CDNOMF (ENTREE) ==> NOM DE FICHIER EXPLICITE, SI
24 ! *LDNOMM* EST VRAI - MEME SI CE
25 ! N'EST PAS LE CAS, CE *DOIT* ETRE
26 ! UN OBJET DE TYPE "CHARACTER" .
27 ! CDSTTO (ENTREE) ==> "STATUS" POUR L'"OPEN" FORTRAN
28 ! ('OLD','NEW','UNKNOWN','SCRATCH')
29 ! PAR DEFAUT, METTRE 'UNKNOWN';
30 ! LDERFA (ENTREE) ==> OPTION D'ERREUR FATALE;
31 ! LDIMST (ENTREE) ==> OPTION IMPRESSION DE STATISTIQUES
32 ! AU MOMENT DE LA FERMETURE;
33 ! KNIMES (ENTREE) ==> NIVEAU DE LA MESSAGERIE (0,1 OU 2)
34 ! ( 0==>RIEN, 2==>TOUT )
35 ! KNBARP (ENTREE) ==> NOMBRE D'ARTICLES LOGIQUES PREVUS,
36 ! CE QUI N'EST UTILISE QUE LORS DE
37 ! LA CREATION DU FICHIER,
38 ! ET QUI N'EMPECHE QUAND MEME PAS
39 ! D'AVOIR PLUS D'ARTICLES LOGIQUES;
40 ! KNBARI (SORTIE) ==> NOMBRE D'ARTICLES LOGIQUES DE DON-
41 ! NEES SUR LE FICHIER, INITIALEMENT.
42 ! (ZERO SI CREATION)
43 CHARACTER CPNOMD*(*)
44 parameter( cpnomd='%%%%% FICHIER SANS NOM %%%%%' )
45 !
46 ! Modifications:
47 !
48 ! 02/06/97, Jean Clochard.
49 !
50 ! -Modification des impressions pour que l'annee puisse
51 ! etre imprimee avec 4 chiffres.
52 !
53 !
54 TYPE(lficom) :: LFI
55 INTEGER (KIND=JPLIKB) KREP, KNUMER, KNIMES, KNBARP, KNBARI
56 INTEGER (KIND=JPLIKB) IDATE, IHEURE
57 INTEGER (KIND=JPLIKB) ILSTTU, IREPX, IRANG, IRANMS, INBARI
58 INTEGER (KIND=JPLIKB) IDECBL, IPOSBL, J
59 INTEGER (KIND=JPLIKB) ILNOMF, INLNOM, INIMES, IREP, ILNOMS
60 INTEGER (KIND=JPLIKB) IFACTM, ILSTTO, IJ
61 INTEGER (KIND=JPLIKB) IRANFM, ILACTI, ICOMPT, ITAILS, ICRITS
62 INTEGER (KIND=JPLIKB) IPOFIN, ICRITG
63 INTEGER (KIND=JPLIKB) ICRITD, ICRITR, IPOSCA, INREAD, INWRIT
64 INTEGER (KIND=JPLIKB) IBASE, ILOREC
65 INTEGER (KIND=JPLIKB) INAPHY, JREC, ILARPH, INALPP, IFACPH
66 INTEGER (KIND=JPLIKB) IFACPP, INBPIR
67 INTEGER (KIND=JPLIKB) IRANGD, IREC, INBALO, ILUTIL, IRGPIF
68 INTEGER (KIND=JPLIKB) IRETIN
69 type(lficrw) ylfic
70 INTEGER (KIND=JPIB) IISLEN
71 !
72 LOGICAL LDNOMM, LDERFA, LDIMST, LLEXFI, LLNOUF, LLNOMS
73 LOGICAL LLVERG, LLEXUL
74 LOGICAL LLISLE
75 LOGICAL LLRQLE
76 !
77 CHARACTER CDNOMF*(*), CDSTTO*(*)
78 CHARACTER*(LFI%JPLSTX) CLSTTO
79 CHARACTER*(LFI%JPLFTX) CLNOMF, CLNOMS
80 
81 !
82 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
83 CHARACTER(LEN=LFI%JPLMES) CLMESS
84 CHARACTER(LEN=LFI%JPLFTX) CLACTI
85 CHARACTER(LEN=32) CLENDI
86 LOGICAL LLFATA
87 
88 !
89 ! 1. - CONTROLES DIVERS, ET INITIALISATIONS.
90 !-----------------------------------------------------------------------
91 !*
92 ! 1.0 - PARTIE "ELEMENTAIRE".
93 !-----------------------------------------------------------------------
94 !
95 REAL(KIND=JPRB) :: ZHOOK_HANDLE
96 IF (lhook) CALL dr_hook('LFIOUV_FORT',0,zhook_handle)
97 clacti=''
98 ilsttu=min(int(len(clstto), jplikb), &
99 & int(len(cdstto), jplikb))
100 irepx=0
101 irang=0
102 iranms=0
103 inbari=0
104 llverg=.false.
105 llisle=.false.
106 llrqle=.false.
107 ylfic%L_C_BTSWAP=.false.
108 !
109 clendi=''
110 CALL get_environment_variable ("LFI_BYTE_ORDER", clendi)
111 CALL iswap_isle (iislen)
112 llisle=iislen.NE.0
113 SELECT CASE (clendi)
114  CASE ('LITTLE_ENDIAN')
115  llrqle=.true.
116  CASE ('BIG_ENDIAN')
117  llrqle=.false.
118  CASE ('NATIVE_ENDIAN')
119  llrqle=llisle
120  CASE DEFAULT
121  llrqle=.false.
122 END SELECT
123 !
124 ylfic%L_C_BTSWAP=(llisle.AND.(knumer<0)).NEQV.llrqle
125 !
126 ylfic%N_C_FPDESC=0
127 ylfic%N_C_OFFSET=0
128 !
129 ! Appel legerement anticipe a LFINUM, permettant une initialisa-
130 ! tion des variables globales du logiciel a la 1ere utilisation.
131 !
132 CALL lfinum_fort &
133 & (lfi, knumer, irang)
134 ! Si KNUMER est nul, alors le numero d'unite logique est
135 ! attribuĂ© automatiquement
136 IF (knumer == 0) THEN
137  CALL lfiuto_fort (lfi, knumer)
138  irang=0
139 ENDIF
140 !
141 IF (ldnomm) THEN
142 !
143 ! Recherche de la longueur "utile" du nom de fichier specifie.
144 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
145 !
146  idecbl=0
147 !
148 101 CONTINUE
149  iposbl=idecbl+int(index(cdnomf(idecbl+1:),' '), jplikb)
150 !
151  IF (iposbl.LE.idecbl) THEN
152  ilnomf=int(len(cdnomf), jplikb)
153  ELSEIF (cdnomf(iposbl:).EQ.' ') THEN
154  ilnomf=max(iposbl-1,1_jplikb )
155  ELSE
156  idecbl=iposbl
157  GOTO 101
158  ENDIF
159 !
160  IF (ilnomf.GT.lfi%JPLFTX) THEN
161  inlnom=lfi%JPLFTX
162  inimes=lfi%NIMESG
163 !
164  IF (inimes.GE.1) THEN
165 !
166 ! Message preventif, car le controle de non ouverture d'un meme
167 ! fichier via deux unites logiques differentes risque de "sauter"
168 ! artificiellement... et pas forcement a cet appel.
169 !
170 ! Le code-reponse ci-dessous est bidon, mais permet de mettre
171 ! en relief le message via LFIEMS.
172 !
173  irep=lfi%JPNIL
174  clnspr='LFIOUV'
175 !
176  IF (lfi%LFRANC) THEN
177  WRITE (unit=clmess,fmt= &
178 & '(''ATTENTION: NOM DE FICHIER TRONQUE A'',I4, &
179 & '' CARACTERES...'')') lfi%JPLFTX
180  ELSE
181  WRITE (unit=clmess,fmt= &
182 & '(''WARNING: FILE NAME TRUNCATED TO ONLY'',I4, &
183 & '' CHARACTERS...'')') lfi%JPLFTX
184  ENDIF
185 !
186  CALL lfiems_fort &
187 & (lfi, knumer,inimes,irep,.false., &
188 & clmess,clnspr, &
189 & clacti)
190  ENDIF
191 !
192  ELSE
193  inlnom=ilnomf
194  ENDIF
195 !
196  clnomf=cdnomf(:inlnom)
197 ELSE
198  ilnomf=int(len(cpnomd), jplikb)
199  clnomf=cpnomd
200  inlnom=ilnomf
201 ENDIF
202 !
203 ! Ci-dessous, initialisations destinees a forcer l'impression
204 ! du nom du fichier en cas de problemes.
205 !
206 clnoms=clnomf
207 ilnoms=inlnom
208 ifactm=0
209 !
210 ! Controle de validite FORTRAN du Numero d'Unite Logique.
211 !
212 IF (knumer > 0) THEN
213  INQUIRE (unit=knumer,exist=llexul,err=901,iostat=irep)
214 ELSE
215  llexul=.true.
216 ENDIF
217 !
218 IF (.NOT.llexul) THEN
219  irep=-30
220  GOTO 1001
221 ENDIF
222 !
223 ! CONTROLE DE L'ARGUMENT D'APPEL "KNIMES"
224 !
225 IF (knimes.LT.0.OR.knimes.GT.2) THEN
226  irep=-2
227  GOTO 1001
228 ENDIF
229 !
230 ! CONTROLE DE L'ARGUMENT D'APPEL "CDSTTO"
231 !
232 ilstto=int(index(cdstto,' '), jplikb)-1
233 DO j=1,lfi%JPNBST
234 IF (cdstto(1:ilstto).EQ.lfi%LFIOUV_CLSTEX(j)(1:ilstto)) GOTO 104
235 ENDDO
236 !
237 ilacti=min(int(len(cdstto), jplikb),int(len(clacti), jplikb))
238 clacti=cdstto(:ilacti)
239 irep=-7
240 GOTO 1001
241 !
242 104 CONTINUE
243 IF (ilstto.GT.0) ilsttu=ilstto
244 clstto=cdstto(:ilsttu)
245 !
246 ! CONTROLE DE NON-OUVERTURE PREALABLE.
247 !
248 IF (irang.NE.0) THEN
249  irep=-5
250  GOTO 1001
251 ENDIF
252 !
253 IF (lfi%LMULTI) CALL lfiver_fort &
254 & (lfi, lfi%VERGLA,'ON')
255 llverg=lfi%LMULTI
256 !
257 ! Recherche d'un eventuel facteur multiplicatif predefini pour
258 ! l'unite logique en question.
259 !
260 CALL lfifmp_fort &
261 & (lfi, knumer,iranfm)
262 ifactm=lfi%MFACTU(iranfm)
263 !
264 IF (ldnomm) THEN
265 !
266 ! SI LE FICHIER EST NOMME, ON VERIFIE QU'IL N'A PAS ETE
267 ! DEJA OUVERT POUR UNE AUTRE UNITE LOGIQUE.
268 !
269  DO j=1,lfi%NBFIOU
270  ij=lfi%NUMIND(j)
271 !
272  IF (clnomf.EQ.lfi%CNOMFI(ij)(:min(lfi%JPLFTX,lfi%NLNOMF(ij)))) &
273 & THEN
274  ilacti=min(int(len(clnomf), jplikb), &
275 & int(len(clacti), jplikb))
276  clacti=clnomf(:ilacti)
277  iranms=ij
278  irep=-13
279  GOTO 1001
280  ENDIF
281 !
282  ENDDO
283 !
284 ENDIF
285 !
286 110 CONTINUE
287 !*
288 ! 1.1 - RECHERCHE D'UN EMPLACEMENT DISPONIBLE DANS LA TABLE DES
289 ! NUMEROS D'UNITES LOGIQUES *LFI%NUMERO* .
290 ! (Il faut IFACTM emplacements CONSECUTIFS)
291 !-----------------------------------------------------------------------
292 !
293 IF ((lfi%NFACTM+ifactm).GT.lfi%JPNXFI) THEN
294  irep=-6
295  GOTO 1001
296 ENDIF
297 !
298 icompt=0
299 itails=lfi%JPNXFI+1
300 icrits=0
301 !
302 DO j=1,lfi%JPNXFI
303 !
304 IF (lfi%NUMERO(j).EQ.lfi%JPNIL) THEN
305  icompt=icompt+1
306  IF (j.NE.lfi%JPNXFI.OR.icompt.LT.ifactm.OR.icompt.GT.itails) &
307 & cycle
308  ipofin=lfi%JPNXFI
309 ELSEIF (icompt.LT.ifactm.OR.icompt.GT.itails) THEN
310  icompt=0
311 !
312  IF ((lfi%JPNXFI-j).LT.ifactm) THEN
313  GOTO 112
314  ELSE
315  cycle
316  ENDIF
317 !
318 ELSE
319  ipofin=j-1
320 ENDIF
321 !
322 ! Les lignes qui suivent sont atteintes si on a trouve un espace
323 ! contigu suffisant dans la table LFI%NUMERO, et de taille inferieure
324 ! ou egale a ce qu'on aurait pu trouver precedemment.
325 ! On calcule alors un critere de cadrage (a gauche ou a droite)
326 ! dans cet espace, en privilegiant une occupation decentree.
327 !
328 icritg=abs(lfi%JPNXFI+1-2*(ipofin-icompt+1))
329 icritd=abs(lfi%JPNXFI+1-2*ipofin)
330 !
331 IF (icritg.GE.icritd) THEN
332  icritr=icritg
333  iposca=ipofin-icompt+1
334 ELSE
335  icritr=icritd
336  iposca=ipofin-ifactm+1
337 ENDIF
338 !
339 ! On retient l'espace trouve s'il est plus petit que ce qu'on
340 ! avait pu trouver precedemment, ou en cas d'egalite de taille
341 ! s'il est plus decentre.
342 !
343 IF (icompt.LT.itails.OR.icritr.GT.icrits) THEN
344  itails=icompt
345  irang=iposca
346  icrits=icritr
347 ENDIF
348 !
349 icompt=0
350 IF ((lfi%JPNXFI-j).LT.ifactm) GOTO 112
351 !
352 ENDDO
353 !
354 112 CONTINUE
355 !
356 IF (itails.GT.lfi%JPNXFI) THEN
357 !
358 ! On n'a pas trouve d'espace ad hoc.
359 !
360  IF (ifactm.GT.1) THEN
361  irep=-27
362  ELSE
363  irep=-16
364  ENDIF
365 !
366  GOTO 1001
367 !
368 ENDIF
369 !
370 iranms=irang
371 IF (lfi%LMISOP) WRITE (unit=lfi%NULOUT,fmt=*) &
372 & '====> LFIOUV - IRANG = ',irang, ', IFACTM = ',ifactm
373 lfi%LERFAT(irang)=lderfa
374 lfi%NIVMES(irang)=knimes
375 inread=0
376 inwrit=0
377 !
378 ! CETTE INITIALISATION QUI PEUT PARAITRE BIEN COMPLIQUEE SERT
379 ! DE PARADE AU MAUVAIS COMPORTEMENT DU "READ" SUR UN FICHIER VIDE,
380 ! sur CRAY-2 sous UNICOS 4.0 et 5.0... ( Debut )
381 !
382 CALL lfidah_fort &
383 & (lfi, idate,iheure)
384 ibase=iheure+lfi%JPNIL
385 !
386 DO j=1,lfi%JPLDOC
387 lfi%MDES1D(ixm(j,irang))=ibase-j
388 ENDDO
389 !**
390 ! 2. - OUVERTURE DU FICHIER AU SENS FORTRAN DU TERME (*OPEN*).
391 !-----------------------------------------------------------------------
392 !
393 ilorec=lfi%JPRECL*ifactm
394 !
395 IF (ldnomm) THEN
396 !*
397 ! 2.1 - CAS OU L'UNITE LOGIQUE DOIT ETRE ASSOCIEE A UN FICHIER
398 ! DONT LE NOM EST EXPLICITEMENT DONNE.
399 !-----------------------------------------------------------------------
400 !
401  INQUIRE (file=cdnomf,exist=llexfi,iostat=irep,err=901)
402 !
403  IF (llexfi.AND.clstto.EQ.'NEW' &
404 & .OR..NOT.llexfi.AND.clstto.EQ.'OLD') THEN
405  clacti=clstto
406  irep=-9
407  irang=0
408  iranms=0
409  GOTO 1001
410  ENDIF
411 !
412  llnouf=clstto.EQ.'NEW'.OR.clstto.EQ.'SCRATCH'.OR..NOT.llexfi
413 !
414 ! APRES TOUS CES CONTROLES DE BASE, ON TENTE L'"OPEN" DU FICHIER .
415 !
416  IF (knumer < 0) THEN
417  CALL openc (clnoms, llnoms, irep)
418  IF (irep /= 0) GOTO 902
419  ELSE
420  OPEN (unit=knumer,file=cdnomf,status=clstto, &
421 & err=902,form='UNFORMATTED',access='DIRECT',recl=ilorec, &
422 & iostat=irep)
423  ENDIF
424 !
425 ELSE
426 !*
427 ! 2.2 - CAS OU L'UNITE LOGIQUE N'A PAS DE NOM DE FICHIER ASSOCIE
428 ! EXPLICITE; ON TENTE DIRECTEMENT L'"OPEN" .
429 !-----------------------------------------------------------------------
430 !
431  IF (knumer < 0) THEN
432  CALL openc (clnoms, llnoms, irep)
433  IF (irep /= 0) GOTO 902
434  ELSEIF (clstto.NE.'OLD'.AND.clstto.NE.'NEW') THEN
435  OPEN (unit=knumer,status=clstto,form='UNFORMATTED', &
436 & access='DIRECT',recl=ilorec,err=902,iostat=irep)
437  ELSE
438  OPEN (unit=knumer,form='UNFORMATTED', &
439 & access='DIRECT',recl=ilorec,err=902,iostat=irep)
440  ENDIF
441 !
442  llnouf=clstto.EQ.'SCRATCH'
443 !
444 ENDIF
445 !*
446 ! 2.3 - L'"OPEN" S'EST BIEN PASSE... ON ESSAIE DE RECUPERER LE NOM
447 ! *SYSTEME* EVENTUEL ASSOCIE A L'UNITE LOGIQUE.
448 !-----------------------------------------------------------------------
449 !
450 
451 IF (knumer > 0) THEN
452  INQUIRE (unit=knumer,named=llnoms,name=clnoms,err=901, &
453  & iostat=irep)
454 ENDIF
455 !
456 IF (llnoms) THEN
457 !
458 ! Recherche de la longueur "utile" du nom systeme du fichier.
459 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
460 !
461  idecbl=0
462 !
463 231 CONTINUE
464  iposbl=idecbl+int(index(clnoms(idecbl+1:),' '), jplikb)
465 !
466  IF (iposbl.LE.idecbl) THEN
467  ilnoms=int(len(clnoms), jplikb)
468  ELSEIF (clnoms(iposbl:).EQ.' ') THEN
469  ilnoms=max(iposbl-1,1_jplikb )
470  ELSE
471  idecbl=iposbl
472  GOTO 231
473  ENDIF
474 !
475  IF (.NOT.ldnomm) THEN
476  ilnomf=ilnoms
477  inlnom=ilnoms
478  clnomf=clnoms
479  ENDIF
480 !
481  DO j=1,lfi%NBFIOU
482  ij=lfi%NUMIND(j)
483 !
484  IF (clnoms.EQ.lfi%CNOMSY(ij)(:lfi%NLNOMS(ij))) THEN
485  ilacti=min(int(len(clnoms), jplikb), &
486 & int(len(clacti), jplikb))
487  clacti=clnoms(:ilacti)
488  irep=-13
489  irang=0
490  iranms=0
491  GOTO 1001
492  ENDIF
493 !
494  ENDDO
495 !
496 ELSE
497  ilnoms=int(len(cpnomd), jplikb)
498  clnoms=cpnomd
499 ENDIF
500 !
501 IF (clstto.EQ.'OLD'.OR..NOT.llnouf) THEN
502 !**
503 ! 3. - DANS LE CAS OU LE FICHIER DEVAIT OU POUVAIT EXISTER AVANT
504 ! OUVERTURE, ON ESSAIE DE LIRE LES PREMIERS ARTICLES.
505 !-----------------------------------------------------------------------
506 ! ( L'ARTICLE DOCUMENTAIRE ET UNE PAIRE D'ARTICLES D'INDEX;
507 ! ON COMMENCE PAR L'ARTICLE NO. 3 CAR IL Y A PLUS DE CHANCES
508 ! D'AVOIR UNE MAUVAISE LECTURE POUR CELUI-CI )
509 !
510 ! DANS LE CAS DU "STATUS" 'UNKNOWN', IL S'AGIT DE LEVER
511 ! L'AMBIGUITE: FICHIER DEJA ECRIT PAR LE LOGICIEL, OU DEVANT ETRE
512 ! CREE PAR LUI ?
513 !
514 
515  DO jrec=3,1,-2
516  inaphy=jrec
517  CALL lfildo_fort &
518 & (lfi, irep,knumer,jrec, &
519 & lfi%MDES1D(ixm(1_jplikb ,irang)), &
520 & inread,ifactm, &
521 & ylfic,iretin)
522 !
523  IF (iretin.NE.0) THEN
524  GOTO 302
525  ENDIF
526 !
527  ENDDO
528 
529 ! Si la longueur max des articles depasse 128, alors il faut faire du
530 ! byte-swapping
531  IF (lfi%MDES1D(ixm(2_jplikb, irang)) > 128) THEN
532  ylfic%L_C_BTSWAP = .NOT. ylfic%L_C_BTSWAP
533  CALL jswap (lfi%MDES1D(ixm(1_jplikb, irang)), lfi%MDES1D(ixm(1_jplikb, irang)), &
534  & 8_jplikm, int(lfi%JPLARD*ifactm, jplikm))
535  ENDIF
536 
537 !
538 302 CONTINUE
539 !
540  IF (irep.EQ.0) THEN
541 !
542 ! LECTURE OK... ON CONTROLE QUELQUES VALEURS "DOCUMENTAIRES"
543 !
544 ! Fin de la parade sur CRAY2, sous UNICOS 4.0 et 5.0 .
545 !
546  DO j=1,lfi%JPLDOC
547  IF (lfi%MDES1D(ixm(j,irang)).NE.(ibase-j)) GOTO 304
548  ENDDO
549 !
550  llnouf=.true.
551  GOTO 390
552 !
553 304 CONTINUE
554  llnouf=.false.
555  ilarph=lfi%MDES1D(ixm(lfi%JPLPAR,irang))
556  inalpp=lfi%MDES1D(ixm(lfi%JPXAPI,irang))
557  ifacph=ilarph/lfi%JPLARD
558  ifacpp=inalpp/lfi%JPNAPP
559 !
560  IF (min(ilarph,inalpp).LE.0.OR.mod(ilarph,lfi%JPLARD).NE.0 &
561 & .OR.lfi%MDES1D(ixm(lfi%JPLMNA,irang)).NE.lfi%JPNCPN &
562 & .OR.lfi%MDES1D(ixm(lfi%JPLLDO,irang)).NE.lfi%JPLDOC &
563 & .OR.mod(inalpp,lfi%JPNAPP).NE.0.OR.ifacpp.NE.ifacph) THEN
564  irep=-10
565  irang=0
566  iranms=0
567  GOTO 1001
568  ELSEIF (lfi%MDES1D(ixm(lfi%JPFEAM,irang)).NE.0) THEN
569  irep=-11
570  llfata=llmoer(irep,irang)
571 !
572  IF (llfata) THEN
573  irang=0
574  iranms=0
575  GOTO 1001
576  ENDIF
577 !
578 ! SI L'ERREUR (-11) N'A PAS ETE FATALE, ON DONNE LA POSSIBILITE
579 ! DE TRAITER LE FICHIER DONT LA DERNIERE MODIFICATION N'A PAS ETE
580 ! "ENREGISTREE" . MAIS SANS AUCUNE GARANTIE ...
581 !
582  ENDIF
583 !
584  IF (ifacph.NE.ifactm) THEN
585 !
586 ! Messagerie de Niveau 1 pour prevenir de l'incident...
587 !
588  inimes=ixnims(iranms)
589 !
590  IF (inimes.GE.1) THEN
591  clnspr='LFIOUV'
592 !
593  IF (lfi%LFRANC) THEN
594  WRITE (unit=clmess,fmt='(''Unite logique'',I3, &
595 & '', facteur multiplicatif lu sur fichier='',I3,'', attendu='', &
596 & I3)')knumer,ifacph,ifactm
597  ELSE
598  WRITE (unit=clmess,fmt='(''Logical Unit'',I3, &
599 & '', multiply factor read on file='',I3,'', expected='',I3)') &
600 & knumer,ifacph,ifactm
601  ENDIF
602 !
603  irepx=irep
604  irep=0
605  CALL lfiems_fort &
606 & (lfi, knumer,inimes,irep,.false., &
607 & clmess,clnspr,clacti)
608 !
609  IF (lfi%LFRANC) THEN
610  ilutil=min(inlnom,lfi%JPLFIX, &
611 & int(len(clmess), jplikb)-6)
612  clmess='Nom='''//clnomf(:ilutil)//''''
613  ELSE
614  ilutil=min(inlnom,lfi%JPLFIX, &
615 & int(len(clmess), jplikb)-7)
616  clmess='Name='''//clnomf(:ilutil)//''''
617  ENDIF
618 !
619  CALL lfiems_fort &
620 & (lfi, knumer,inimes,irep,.false., &
621 & clmess,clnspr,clacti)
622 !
623  IF (ldnomm.AND.clnoms.NE.clnomf) THEN
624 !
625  IF (lfi%LFRANC) THEN
626  ilutil=min(ilnoms,lfi%JPLFIX, &
627 & int(len(clmess), jplikb)-14)
628  clmess='Nom SYSTEME='''//clnoms(:ilutil)//''''
629  ELSE
630  ilutil=min(ilnoms,lfi%JPLFIX, &
631 & int(len(clmess), jplikb)-14)
632  clmess='SYSTEM Name='''//clnoms(:ilutil)//''''
633  ENDIF
634 !
635  CALL lfiems_fort &
636 & (lfi, knumer,inimes,irep,.false., &
637 & clmess,clnspr,clacti)
638  ENDIF
639 !
640  IF (lfi%LFRANC) THEN
641  clmess='On essaie de s''adapter au facteur ' &
642 & //'multiplicatif lu sur le fichier...'
643  ELSE
644  clmess='One tries to adapt to multiply ' &
645 & //'factor read on the file...'
646  ENDIF
647 !
648  CALL lfiems_fort &
649 & (lfi, knumer,inimes,irep,.false., &
650 & clmess,clnspr,clacti)
651  irep=irepx
652  ENDIF
653 !
654 ! On va essayer de traiter le fichier avec la longueur d'Article
655 ! Physique lue sur le fichier. Pour cela, on doit d'abord le fermer,
656 ! puis on va recommencer le traitement depuis le paragraphe 1.1 .
657 !
658  irang=0
659  iranms=0
660  IF (knumer > 0) THEN
661  CLOSE (unit=knumer,status='KEEP',err=905,iostat=irep)
662  ELSE
663  CALL closec (irep)
664  IF (irep /= 0) GOTO 905
665  ENDIF
666 !
667  IF (ifacph.GT.lfi%JPFACX) THEN
668  irep=-28
669  GOTO 1001
670  ENDIF
671 !
672  ifactm=ifacph
673  GOTO 110
674  ENDIF
675 !
676  ELSEIF (clstto.EQ.'OLD') THEN
677  irep=-12
678  irang=0
679  iranms=0
680  GOTO 1001
681  ELSE
682  irep=0
683  llnouf=.true.
684  ENDIF
685 !
686 ENDIF
687 !
688 390 CONTINUE
689 !
690 ! Controle ultime avant le paragraphe suivant, dans la mesure
691 ! ou, contrairement au FORTRAN, on autorise les "STATUS" 'OLD'
692 ! et 'NEW' pour une unite logique sans nom de fichier explicite...
693 ! puisque le logiciel a sa propre mecanique de discrimination entre
694 ! un fichier "existant" ou "en mode creation".
695 !
696 IF (llnouf.AND.clstto.EQ.'OLD' &
697 & .OR..NOT.llnouf.AND.clstto.EQ.'NEW') THEN
698  clacti=clstto
699  irep=-9
700  irang=0
701  iranms=0
702  GOTO 1001
703 ENDIF
704 !**
705 ! 4. - L'OUVERTURE FORTRAN EST OK, ON SAIT SI ON EST EN MODE
706 ! CREATION DU FICHIER INDEXE OU NON... ON COMMENCE A GARNIR
707 ! LES VARIABLES EN COMMON, MAIS SANS INCREMENTER *LFI%NBFIOU*
708 ! CAR ON PEUT ENCORE AVOIR DE (MAUVAISES) SURPRISES.
709 !-----------------------------------------------------------------------
710 !
711 irepx=irep
712 lfi%CNOMFI(irang)=clnomf
713 lfi%NLNOMF(irang)=ilnomf
714 lfi%CNOMSY(irang)=clnoms
715 lfi%NLNOMS(irang)=ilnoms
716 lfi%NDEROP(irang)=0
717 lfi%CSTAOP(irang)=clstto
718 lfi%LNOUFI(irang)=llnouf
719 lfi%LMODIF(irang)=.false.
720 lfi%NDERCO(irang)=irep
721 lfi%NTRULZ(irang)=0
722 lfi%NRFPTZ(irang)=0
723 lfi%NRFDTZ(irang)=0
724 lfi%NBMOLU(irang)=0
725 lfi%NBMOEC(irang)=0
726 lfi%NDERGF(irang)=lfi%JPNIL
727 lfi%CNDERA(irang)=' '
728 lfi%MFACTM(irang)=ifactm
729 lfi%NSUIVF(irang)=lfi%JPNIL
730 lfi%NPRECF(irang)=lfi%JPNIL
731 !
732 ! N.B.: LES PAGES D'INDEX DE RANG "IRANG" SONT AUTOMATIQUEMENT
733 ! "AFFECTEES" A L'UNITE LOGIQUE AYANT CE RANG, ET SERVENT
734 ! A Y STOCKER LA PREMIERE P.A.I. EN RANG DANS LE FICHIER.
735 !
736 ! ( LES PAGES D'INDEX DE RANG "IRANG+(J-1)*LFI%JPNXFI" OU J VARIE
737 ! DE 1 A LFI%JPNPIA, SONT AUTOMATIQUEMENT AFFECTEES A L'UNITE
738 ! LOGIQUE DE RANG "IRANG" )
739 !
740 lfi%NBLECT(irang)=0
741 lfi%NBNECR(irang)=0
742 lfi%NREESP(irang)=0
743 lfi%NREECO(irang)=0
744 lfi%NREELO(irang)=0
745 lfi%NBTROU(irang)=0
746 lfi%NBRENO(irang)=0
747 lfi%NBSUPP(irang)=0
748 lfi%LISTAT(irang)=ldimst
749 lfi%LMIMAL(irang)=.false.
750  IF (lfi%LMULTI) CALL lfiver_fort &
751 & (lfi, lfi%VERRUE(irang),'ASGN')
752 !
753 IF (llnouf) THEN
754 !*
755 ! 4.1 - CAS DE CREATION DU FICHIER INDEXE - INITIALISATIONS DIVERSES
756 !-----------------------------------------------------------------------
757 !
758  ilarph=lfi%JPLARD*ifactm
759  inalpp=lfi%JPNAPP*ifactm
760 !
761  DO j=1,ilarph
762  lfi%MLGPOS(ixm(j,irang))=0
763  ENDDO
764 !
765  DO j=1,lfi%JPNXNA
766  lfi%CNOMAR(ixc(j,irang))=' '
767  ENDDO
768 !
769  DO j=1,ilarph
770  lfi%MDES1D(ixm(j,irang))=0
771  ENDDO
772 !
773 ! NOMBRE DE PAIRES D'ARTICLES D'INDEX RESERVES,
774 ! (ELLES OCCUPERONT LES ARTICLES 2 A (2*INBPIR+1) DU FICHIER)
775 ! ET REMPLISSAGE DE CERTAINS MOTS DE L'ARTICLE DOCUMENTAIRE.
776 !
777  inbpir=max(1_jplikb ,min(lfi%JPNXPR,1+(knbarp-1)/inalpp))
778  lfi%MDES1D(ixm(lfi%JPNPIR,irang))=inbpir
779  lfi%MDES1D(ixm(lfi%JPNAPH,irang))=1+2*inbpir
780  lfi%MDES1D(ixm(lfi%JPLPAR,irang))=ilarph
781  lfi%MDES1D(ixm(lfi%JPLMNA,irang))=lfi%JPNCPN
782  lfi%MDES1D(ixm(lfi%JPLLDO,irang))=lfi%JPLDOC
783  lfi%MDES1D(ixm(lfi%JPXAPI,irang))=inalpp
784  lfi%MDES1D(ixm(lfi%JPFEAM,irang))=1
785  lfi%NPODPI(irang)=1
786  lfi%NALDPI(irang)=0
787  lfi%NPPIMM(irang)=1
788  irangd=irang
789  CALL lfidah_fort &
790 & (lfi, lfi%MDES1D(ixm(lfi%JPDCRE,irang)), &
791 & lfi%MDES1D(ixm(lfi%JPHCRE,irang)))
792 !
793 ! ECRITURE DU PREMIER ARTICLE (DESCRIPTIF)
794 !
795  irec=1
796  inaphy=irec
797  CALL lfiedo_fort &
798 & (lfi, irep,knumer,irec, &
799 & lfi%MDES1D(ixm(1_jplikb ,irang)), &
800 & inwrit, ifactm, ylfic, iretin)
801 !
802  IF (iretin.NE.0) THEN
803  GOTO 904
804  ENDIF
805 !
806 !
807 ! Remise a zero du descripteur en vue d'une fermeture normale.
808 !
809  lfi%MDES1D(ixm(lfi%JPFEAM,irang))=0
810 !
811 ! ECRITURE DES ARTICLES CONTENANT LES PAIRES D'ARTICLES D'INDEX
812 ! "RESERVES".
813 !
814  DO j=1,inbpir
815  irec=irec+1
816  inaphy=irec
817  CALL lfiecc_fort &
818 & (lfi, irep,knumer,irec, &
819 & lfi%CNOMAR(ixc(1_jplikb ,irang)), &
820 & inwrit,ifactm, ylfic, iretin)
821 !
822  IF (iretin.NE.0) THEN
823  GOTO 903
824  ENDIF
825 !
826  irec=irec+1
827  inaphy=irec
828  CALL lfiedo_fort &
829 & (lfi, irep,knumer,irec, &
830 & lfi%MLGPOS(ixm(1_jplikb ,irang)), &
831 & inwrit, ifactm, ylfic, iretin)
832 !
833  IF (iretin.NE.0) THEN
834  GOTO 904
835  ENDIF
836 !
837  ENDDO
838 !
839 ELSE
840 !*
841 ! 4.2 - LE FICHIER EXISTAIT DEJA... ON LIT LA 1ERE PAIRE D'ARTICLES
842 ! D'INDEX ( + LA DERNIERE S'IL Y EN A AU MOINS 2 *UTILISEES* )
843 !-----------------------------------------------------------------------
844 !
845  inbalo=lfi%MDES1D(ixm(lfi%JPNALO,irang))
846  inbpir=lfi%MDES1D(ixm(lfi%JPNPIR,irang))
847  irec=2
848  inaphy=irec
849  CALL lfilcc_fort &
850 & (lfi, irep,knumer,irec, &
851 & lfi%CNOMAR(ixc(1_jplikb ,irang)), &
852 & inread,ifactm,ylfic,iretin)
853 !
854  IF (iretin.NE.0) THEN
855  GOTO 904
856  ENDIF
857 !
858  irec=3
859  inaphy=irec
860  CALL lfildo_fort &
861 & (lfi, irep,knumer,irec, &
862 & lfi%MLGPOS(ixm(1_jplikb ,irang)), &
863 & inread,ifactm, &
864 & ylfic,iretin)
865 !
866  IF (iretin.NE.0) THEN
867  GOTO 904
868  ENDIF
869 !
870  IF (inbalo.LE.inalpp) THEN
871  lfi%NALDPI(irang)=inbalo
872  lfi%NPODPI(irang)=1
873  lfi%NPPIMM(irang)=1
874  irangd=irang
875  ELSE
876 !
877 ! CAS OU IL Y A AU MOINS 2 PAIRES D'ARTICLES D'INDEX UTILISEES.
878 !
879  irgpif=1+(inbalo-1)/inalpp
880  CALL lfirec_fort &
881 & (lfi, irgpif,irang,irec)
882  irangd=irang+lfi%JPNXFI
883  inaphy=irec
884  CALL lfilcc_fort &
885 & (lfi, irep,knumer,irec, &
886 & lfi%CNOMAR(ixc(1_jplikb ,irangd)), &
887 & inread,ifactm,ylfic,iretin)
888 !
889  IF (iretin.NE.0) THEN
890  GOTO 904
891  ENDIF
892 !
893  irec=irec+1
894  inaphy=irec
895  CALL lfildo_fort &
896 & (lfi, irep,knumer,irec, &
897 & lfi%MLGPOS(ixm(1_jplikb ,irangd)), &
898 & inread,ifactm, &
899 & ylfic,iretin)
900 !
901  IF (iretin.NE.0) THEN
902  GOTO 904
903  ENDIF
904 !
905  lfi%NALDPI(irang)=1+mod(inbalo-1,inalpp)
906  lfi%NPODPI(irang)=2
907  lfi%NPPIMM(irang)=2
908  lfi%MRGPIM(2,irang)=irangd
909  lfi%MRGPIF(irangd)=irgpif
910  ENDIF
911 !
912 ENDIF
913 !**
914 ! 5. - L'OUVERTURE AU SENS DU LOGICIEL DE FICHIERS INDEXES LFI
915 ! EST COMPLETE; ON MET DONC A JOUR LES DERNIERES VARIABLES
916 ! EN COMMON, DONT *LFI%NBFIOU*.
917 !-----------------------------------------------------------------------
918 !
919 ! REMARQUE: LA PREMIERE ET LA DERNIERE P.P.I. SONT TOUJOURS
920 ! "PHASEES".
921 !
922 DO j=irang,irangd,lfi%JPNXFI
923 lfi%LECRPI(j,1)=.false.
924 lfi%LECRPI(j,2)=.false.
925 lfi%LPHASP(j)=.true.
926 ENDDO
927 !
928 DO j=0,lfi%JPNPDF-1
929 lfi%NUMAPD(j,irang)=lfi%JPNIL
930 lfi%NLONPD(j,irang)=0
931 lfi%LECRPD(j,irang)=.false.
932 ENDDO
933 !
934 DO j=1,ifactm
935 lfi%NUMERO(irang+j-1)=knumer
936 ENDDO
937 !
938 ylfic%CNOMFI => lfi%CNOMFI (irang)
939 lfi%YLFIC (irang)=ylfic
940 !
941 lfi%NDERPD(irang)=lfi%JPNPDF-1
942 lfi%NBFIOU=lfi%NBFIOU+1
943 lfi%NFACTM=lfi%NFACTM+ifactm
944 lfi%NUMIND(lfi%NBFIOU)=irang
945 inbari=lfi%MDES1D(ixm(lfi%JPNALO,irang))- &
946 & lfi%MDES1D(ixm(lfi%JPNTRU,irang))
947 lfi%NBREAD(irang)=inread
948 lfi%NBWRIT(irang)=inwrit
949 lfi%LTAMPL(irang)=lfi%LTAMLG
950 lfi%LTAMPE(irang)=lfi%LTAMEG
951 lfi%NEXPOR(irang)=lfi%JPNIL
952 lfi%NIMPOR(irang)=lfi%JPNIL
953 !
954 irep=irepx
955 GOTO 1001
956 !**
957 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
958 !-----------------------------------------------------------------------
959 !
960 901 CONTINUE
961 clacti='INQUIRE'
962 inaphy=0
963 GOTO 909
964 !
965 902 CONTINUE
966 clacti='OPEN'
967 irang=0
968 iranms=0
969 inaphy=0
970 GOTO 909
971 !
972 903 CONTINUE
973 clacti='WRITE'
974 GOTO 909
975 !
976 904 CONTINUE
977 clacti='READ'
978 GOTO 909
979 !
980 905 CONTINUE
981 clacti='CLOSE'
982 inaphy=0
983 !
984 909 CONTINUE
985 !
986 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
987 !
988 irep=abs(irep)
989 lfi%NUMAPH(irang)=inaphy
990 IF (irang.EQ.0) lfi%MFACTM(0)=ifactm
991 !**
992 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
993 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
994 !-----------------------------------------------------------------------
995 !
996 1001 CONTINUE
997 krep=irep
998 knbari=inbari
999 llfata=llmoer(irep,irang)
1000 !
1001 IF (llfata) THEN
1002  inimes=2
1003 ELSE
1004  inimes=ixnims(iranms)
1005 ENDIF
1006 !
1007  IF (lfi%LMULTI.AND.llverg) CALL lfiver_fort &
1008 & (lfi, lfi%VERGLA,'OFF')
1009 !
1010 IF (.NOT.llfata.AND.inimes.EQ.0) THEN
1011  IF (lhook) CALL dr_hook('LFIOUV_FORT',1,zhook_handle)
1012  RETURN
1013 ENDIF
1014 !
1015 clnspr='LFIOUV'
1016 !
1017 IF (inimes.GE.1) THEN
1018 !
1019 ! Impression du nom du fichier.
1020 !
1021  IF (lfi%LFRANC) THEN
1022  ilutil=min(inlnom,lfi%JPLFIX, &
1023 & int(len(clmess)-6, jplikb))
1024  clmess='Nom='''//clnomf(:ilutil)//''''
1025  ELSE
1026  ilutil=min(inlnom,lfi%JPLFIX, &
1027 & int(len(clmess)-7, jplikb))
1028  clmess='Name='''//clnomf(:ilutil)//''''
1029  ENDIF
1030 !
1031  CALL lfiems_fort &
1032 & (lfi, knumer,inimes,irep,.false., &
1033 & clmess,clnspr,clacti)
1034 !
1035  IF (ldnomm.AND.clnoms(:ilnoms).NE.clnomf(:inlnom)) THEN
1036 !
1037  IF (lfi%LFRANC) THEN
1038  ilutil=min(ilnoms,lfi%JPLFIX, &
1039 & int(len(clmess)-14, jplikb))
1040  clmess='Nom SYSTEME='''//clnoms(:ilutil)//''''
1041  ELSE
1042  ilutil=min(ilnoms,lfi%JPLFIX, &
1043 & int(len(clmess)-14, jplikb))
1044  clmess='SYSTEM Name='''//clnoms(:ilutil)//''''
1045  ENDIF
1046 !
1047  CALL lfiems_fort &
1048 & (lfi, knumer,inimes,irep,.false., &
1049 & clmess,clnspr,clacti)
1050  ENDIF
1051 !
1052 ENDIF
1053 !
1054 IF (inimes.EQ.2) THEN
1055  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
1056 & '', LDNOMM= '',L1,'', CDSTTO='''''',A,'''''', LDERFA= '',L1, &
1057 & '', LDIMST= '',L1, &
1058 & '', KNIMES='',I2,'', KNBARP='',I6,'' KNBARI='',I6)') &
1059 & krep,knumer,ldnomm,cdstto(:ilsttu),lderfa,ldimst,knimes,knbarp, &
1060 & knbari
1061  CALL lfiems_fort &
1062 & (lfi, knumer,inimes,irep,llfata, &
1063 & clmess,clnspr,clacti)
1064 ENDIF
1065 !
1066 ! LA MESSAGERIE QUI SUIT N'EST PAS EMISE EN CAS D'ERREUR FATALE.
1067 !
1068 IF (inimes.GE.1.AND.(irep.EQ.0.OR.irep.EQ.-11)) THEN
1069 !
1070  IF (llnouf) THEN
1071 !
1072  IF (lfi%LFRANC) THEN
1073  WRITE (unit=clmess,fmt='(''Unite'',I3, &
1074 & '' OUVERTE, CREATION de Fichier,'',I7,'' Articles prevus,'',I7, &
1075 & '' Articles gerables sans debordement'')') &
1076 & knumer,knbarp,inalpp*inbpir
1077  ELSE
1078  WRITE (unit=clmess,fmt='(''Unit'',I3, &
1079 & '' OPENED, File CREATION,'',I7,'' expected Records,'',I7, &
1080 & '' Records may be handled without overflow'')') &
1081 & knumer,knbarp,inalpp*inbpir
1082  ENDIF
1083 !
1084  ELSE
1085 !
1086  IF (lfi%LFRANC) THEN
1087  WRITE (unit=clmess,fmt='(''Unite'',I3, &
1088 & '' OUVERTE, derniere Modification OK a'',I9.6,''_'',I6.6, &
1089 & '','',I7,'' Articles de donnees,'',I9,'' mots en tout'')') &
1090 & knumer,lfi%MDES1D(ixm(lfi%JPDDMG,irang)), &
1091 & lfi%MDES1D(ixm(lfi%JPHDMG,irang)), &
1092 & knbari,ilarph*lfi%MDES1D(ixm(lfi%JPNAPH,irang))
1093  ELSE
1094  WRITE (unit=clmess,fmt='(''Unit'',I3, &
1095 & '' OPENED, last Modification OK at'',I9.6,''_'',I6.6, &
1096 & '','',I7,'' data Records,'',I9,'' words in file'')') &
1097 & knumer,lfi%MDES1D(ixm(lfi%JPDDMG,irang)), &
1098 & lfi%MDES1D(ixm(lfi%JPHDMG,irang)), &
1099 & knbari,ilarph*lfi%MDES1D(ixm(lfi%JPNAPH,irang))
1100  ENDIF
1101 !
1102  ENDIF
1103 !
1104  CALL lfiems_fort &
1105 & (lfi, knumer,inimes,irep,.false., &
1106 & clmess,clnspr,clacti)
1107 ENDIF
1108 !
1109 IF (lhook) CALL dr_hook('LFIOUV_FORT',1,zhook_handle)
1110 
1111 CONTAINS
1112 
1113 #include "lficom2.ixc.h"
1114 #include "lficom2.ixm.h"
1115 #include "lficom2.ixnims.h"
1116 #include "lficom2.llmoer.h"
1117 
1118 SUBROUTINE openc (CDNOMS, LDNOMS, KREP)
1120 IMPLICIT NONE
1121 
1122 CHARACTER (LEN=*) CDNOMS
1123 LOGICAL LDNOMS
1124 INTEGER (KIND=JPLIKB) KREP
1125 
1126 INTEGER (KIND=JPLIKB) I
1127 INTEGER (KIND=JPIM) IREP4
1128 
1129 krep=0
1130 
1131 ldnoms=.true.
1132 
1133 IF (ldnomm) THEN
1134 
1135  cdnoms = cdnomf
1136 
1137 ELSE
1138 
1139  DO i = 1, len(cdnoms)
1140  cdnoms(i:i) = ' '
1141  ENDDO
1142  WRITE (cdnoms, '(I4.4)') -knumer
1143  DO i = 1, 3
1144  IF (cdnoms(1:1) == '0') cdnoms(1:4) = cdnoms(2:5)
1145  ENDDO
1146 
1147  cdnoms = "fort."//trim(cdnoms)
1148 
1149 ENDIF
1150 
1151 SELECT CASE (clstto)
1152  CASE ('NEW')
1153  CALL fi_fopen (ylfic%N_C_FPDESC, cdnoms, "w+")
1154  CASE ('OLD')
1155  CALL fi_fopen (ylfic%N_C_FPDESC, cdnoms, "r+")
1156  IF (ylfic%N_C_FPDESC == 0) &
1157  &CALL fi_fopen (ylfic%N_C_FPDESC, cdnoms, "r")
1158  CASE DEFAULT
1159  CALL fi_fopen (ylfic%N_C_FPDESC, cdnoms, "r+")
1160  IF (ylfic%N_C_FPDESC == 0) &
1161  &CALL fi_fopen (ylfic%N_C_FPDESC, cdnoms, "w+")
1162  IF (ylfic%N_C_FPDESC == 0) &
1163  &CALL fi_fopen (ylfic%N_C_FPDESC, cdnoms, "r")
1164 END SELECT
1165 
1166 IF (ylfic%N_C_FPDESC == 0) THEN
1167  CALL fi_errno (irep4)
1168  krep=int(irep4, jplikb)
1169 ENDIF
1170 
1171 END SUBROUTINE openc
1172 
1173 SUBROUTINE closec (KREP)
1174 USE parkind1, ONLY : jpim
1175 
1176 INTEGER (KIND=JPLIKB) KREP
1177 
1178 INTEGER (KIND=JPIM) IREP4
1179 
1180 krep=0
1181 
1182 CALL fi_fclose (irep4, ylfic%N_C_FPDESC)
1183 IF (irep4 /= 0) THEN
1184  CALL fi_errno (irep4)
1185  krep=irep4
1186 ENDIF
1187 
1188 END SUBROUTINE closec
1189 
1190 END SUBROUTINE lfiouv_fort
1191 
1192 
1193 
1194 ! Oct-2012 P. Marguinaud 64b LFI
1195 SUBROUTINE lfiouv64 &
1196 & (krep, knumer, ldnomm, cdnomf, cdstto, lderfa, &
1197 & ldimst, knimes, knbarp, knbari)
1198 USE lfimod, ONLY : lfi => lficom_default, &
1201 USE lfi_precision
1202 IMPLICIT NONE
1203 ! Arguments
1204 INTEGER (KIND=JPLIKB) KREP ! OUT
1205 INTEGER (KIND=JPLIKB) KNUMER ! IN
1206 LOGICAL LDNOMM ! IN
1207 CHARACTER (LEN=*) CDNOMF ! IN
1208 CHARACTER (LEN=*) CDSTTO ! IN
1209 LOGICAL LDERFA ! IN
1210 LOGICAL LDIMST ! IN
1211 INTEGER (KIND=JPLIKB) KNIMES ! IN
1212 INTEGER (KIND=JPLIKB) KNBARP ! IN
1213 INTEGER (KIND=JPLIKB) KNBARI ! OUT
1214 
1215 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
1216 
1217 CALL lfiouv_fort &
1218 & (lfi, krep, knumer, ldnomm, cdnomf, cdstto, lderfa, &
1219 & ldimst, knimes, knbarp, knbari)
1220 
1221 END SUBROUTINE lfiouv64
1222 
1223 SUBROUTINE lfiouv &
1224 & (krep, knumer, ldnomm, cdnomf, cdstto, lderfa, &
1225 & ldimst, knimes, knbarp, knbari)
1226 USE lfimod, ONLY : lfi => lficom_default, &
1229 USE lfi_precision
1230 IMPLICIT NONE
1231 ! Arguments
1232 INTEGER (KIND=JPLIKM) KREP ! OUT
1233 INTEGER (KIND=JPLIKM) KNUMER ! IN
1234 LOGICAL LDNOMM ! IN
1235 CHARACTER (LEN=*) CDNOMF ! IN
1236 CHARACTER (LEN=*) CDSTTO ! IN
1237 LOGICAL LDERFA ! IN
1238 LOGICAL LDIMST ! IN
1239 INTEGER (KIND=JPLIKM) KNIMES ! IN
1240 INTEGER (KIND=JPLIKM) KNBARP ! IN
1241 INTEGER (KIND=JPLIKM) KNBARI ! OUT
1242 
1243 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
1244 
1245 CALL lfiouv_mt &
1246 & (lfi, krep, knumer, ldnomm, cdnomf, cdstto, lderfa, &
1247 & ldimst, knimes, knbarp, knbari)
1248 
1249 END SUBROUTINE lfiouv
1250 
1251 SUBROUTINE lfiouv_mt &
1252 & (lfi, krep, knumer, ldnomm, cdnomf, cdstto, lderfa, &
1253 & ldimst, knimes, knbarp, knbari)
1254 USE lfimod, ONLY : lficom
1255 USE lfi_precision
1256 IMPLICIT NONE
1257 ! Arguments
1258 type(lficom) lfi ! INOUT
1259 INTEGER (KIND=JPLIKM) KREP ! OUT
1260 INTEGER (KIND=JPLIKM) KNUMER ! IN
1261 LOGICAL LDNOMM ! IN
1262 CHARACTER (LEN=*) CDNOMF ! IN
1263 CHARACTER (LEN=*) CDSTTO ! IN
1264 LOGICAL LDERFA ! IN
1265 LOGICAL LDIMST ! IN
1266 INTEGER (KIND=JPLIKM) KNIMES ! IN
1267 INTEGER (KIND=JPLIKM) KNBARP ! IN
1268 INTEGER (KIND=JPLIKM) KNBARI ! OUT
1269 ! Local integers
1270 INTEGER (KIND=JPLIKB) IREP ! OUT
1271 INTEGER (KIND=JPLIKB) INUMER ! IN
1272 INTEGER (KIND=JPLIKB) INIMES ! IN
1273 INTEGER (KIND=JPLIKB) INBARP ! IN
1274 INTEGER (KIND=JPLIKB) INBARI ! OUT
1275 ! Convert arguments
1276 
1277 inumer = int( knumer, jplikb)
1278 inimes = int( knimes, jplikb)
1279 inbarp = int( knbarp, jplikb)
1280 
1281 CALL lfiouv_fort &
1282 & (lfi, irep, inumer, ldnomm, cdnomf, cdstto, lderfa, &
1283 & ldimst, inimes, inbarp, inbari)
1284 
1285 krep = int( irep, jplikm)
1286 knbari = int( inbari, jplikm)
1287 
1288 IF (knumer == 0) THEN
1289  knumer = int( inumer, jplikm)
1290 ENDIF
1291 
1292 END SUBROUTINE lfiouv_mt
1293 
1294 !INTF KREP OUT
1295 !INTF KNUMER IN
1296 !INTF LDNOMM IN
1297 !INTF CDNOMF IN
1298 !INTF CDSTTO IN
1299 !INTF LDERFA IN
1300 !INTF LDIMST IN
1301 !INTF KNIMES IN
1302 !INTF KNBARP IN
1303 !INTF KNBARI OUT
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine lfiecc_fort(LFI, KREP, KNUMER, KREC, CDTAB, KNBECR, KFACTM, YDFIC, KRETIN)
Definition: lfiecc.F90:6
subroutine openc(CDNOMS, LDNOMS, KREP)
Definition: lfiouv.F90:1119
integer, parameter jplikb
integer, parameter jpim
Definition: parkind1.F90:13
subroutine lfifmp_fort(LFI, KNUMER, KRANFM)
Definition: lfifmp.F90:5
subroutine lfildo_fort(LFI, KREP, KNUMER, KREC, KTAB, KNBLEC, KFACTM, YDFIC, KRETIN)
Definition: lfildo.F90:6
subroutine lfiuto_fort(LFI, KNUMER)
Definition: lfiuto.F90:3
subroutine lfirec_fort(LFI, KRGPIF, KRANG, KREC)
Definition: lfirec.F90:5
quick &counting sorts only inumt inumt name
subroutine new_lfi_default()
Definition: lfimod.F90:376
subroutine lfiouv64(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTO, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI)
Definition: lfiouv.F90:1198
logical, save lficom_default_init
Definition: lfimod.F90:371
subroutine lfinum_fort(LFI, KNUMER, KRANG)
Definition: lfinum.F90:6
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
subroutine closec(KREP, CDSTTC)
Definition: lfifer.F90:1130
subroutine lfilcc_fort(LFI, KREP, KNUMER, KREC, CDTAB, KNBLEC, KFACTM, YDFIC, KRETIN)
Definition: lfilcc.F90:6
subroutine lfiouv_mt(LFI, KREP, KNUMER, LDNOMM, CDNOMF, CDSTTO, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI)
Definition: lfiouv.F90:1254
integer, parameter jpia
Definition: parkind1.F90:19
subroutine lfidah_fort(LFI, KDATE, KHEURE)
Definition: lfidah.F90:6
type(lficom), target, save lficom_default
Definition: lfimod.F90:370
logical lhook
Definition: yomhook.F90:15
subroutine lfiouv_fort(LFI, KREP, KNUMER, LDNOMM, CDNOMF, CDSTTO, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI)
Definition: lfiouv.F90:9
integer, parameter jplikm
subroutine lfiouv(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTO, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI)
Definition: lfiouv.F90:1226
subroutine lfiems_fort(LFI, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI)
Definition: lfiems.F90:7
integer, parameter jpib
Definition: parkind1.F90:14
Definition: lfimod.F90:1
ERROR in index
Definition: ecsort_shared.h:90
subroutine lfiedo_fort(LFI, KREP, KNUMER, KREC, KTAB, KNBECR, KFACTM, YDFIC, KRETIN)
Definition: lfiedo.F90:6