SURFEX v8.1
General documentation of Surfex
fanouv.F90
Go to the documentation of this file.
1 ! Feb-2013 P. Marguinaud fix uninitialized output variable
2 ! Oct-2012 P. Marguinaud 64b LFI
3 ! Jan-2011 P. Marguinaud Thread-safe FA
4 ! Sep-2012 P. Marguinaud Remove unused local variables
5 SUBROUTINE fanouv_fort &
6 & (fa, krep, knumer, ldnomm, cdnomf, cdsttu, &
7 & lderfa, ldimst, knimes, knbarp, knbari, &
8 & cdnomc)
10 USE parkind1, ONLY : jprb
11 USE yomhook , ONLY : lhook, dr_hook
12 USE lfi_precision
13 IMPLICIT NONE
14 !****
15 ! Sous-programme d'initialisation SANS OUVERTURE d'une unite logique
16 ! "Fichier ARPEGE". Il s'agit d'un fichier indexe,
17 ! traite par le logiciel LFI.
18 !
19 ! FANOUV est derive de FAITOU, mais ne fait pas l'appel a la couche LFI
20 ! pour l'ouverture reelle.
21 !
22 ! utilise pour la seule compression des donnees par des processeurs
23 ! qui ne font pas d'ecriture effective sur disque
24 !
25 !**
26 ! ARGUMENTS : Ce sont les memes que pour "LFIOUV", avec CDNOMC comme
27 ! argument supplementaire.
28 !
29 ! KREP (Sortie) ==> Code-reponse du sous-programme;
30 ! KNUMER (Entree) ==> Numero de l'unite logique;
31 ! LDNOMM (Entree) ==> Vrai si l'unite logique doit etre
32 ! associee a un NOM de Fichier EXP-
33 ! LICITE lors de l'"OPEN" FORTRAN;
34 ! CDNOMF (Entree) ==> Nom de fichier explicite, si
35 ! *LDNOMM* est VRAI - Meme si ce
36 ! n'est pas le cas, ce *DOIT* ETRE
37 ! UN OBJET DE TYPE "CHARACTER" .
38 ! CDSTTU (Entree) ==> "STATUS" pour l'"OPEN" FORTRAN
39 ! ('OLD','NEW','UNKNOWN','SCRATCH')
40 ! par defaut, mettre 'UNKNOWN';
41 ! LDERFA (Entree) ==> Option d'erreur fatale;
42 ! LDIMST (Entree) ==> Option impression de Statistiques
43 ! au moment de la fermeture;
44 ! KNIMES (Entree) ==> Niveau de la Messagerie (0,1 ou 2)
45 ! ( 0==>Rien, 2==>Tout )
46 ! KNBARP (Entree) ==> Nombre d'articles logiques prevus,
47 ! ce qui n'est utilise que lors de
48 ! la Creation du fichier,
49 ! et qui n'empeche quand meme pas
50 ! d'avoir plus d'articles logiques;
51 ! KNBARI (Sortie) ==> Nombre d'articles logiques de don-
52 ! nees sur le fichier, initialement.
53 ! (zero si creation)
54 ! CDNOMC (Entree) ==> Nom du CADRE associe au fichier.
55 !*
56 ! N.B. : Pour un fichier en mode creation, ce cadre doit avoir ete
57 ! defini au prealable (via le sous-programme FACADE, ou par
58 ! l'ouverture d'un fichier preexistant).
59 ! Pour un fichier ARPEGE preexistant, le cadre est lu sur le
60 ! fichier; s'il etait deja defini auparavant, il y a controle
61 ! de coherence entre les deux versions du cadre.
62 !
63 !
64 !
65 TYPE(fa_com) :: FA
66 INTEGER (KIND=JPLIKB) KREP, KNUMER, KNIMES, KNBARP, KNBARI
67 !
68 INTEGER (KIND=JPLIKB) IRANG, IRANMS, IREPOU
69 INTEGER (KIND=JPLIKB) ILNOMC, ILOMIN, IREP, J
70 INTEGER (KIND=JPLIKB) IRANER, IRANGC
71 INTEGER (KIND=JPLIKB) ITRONC, ILACTI, INIMES
72 INTEGER (KIND=JPLIKB) ITYPTR, IPUILA
73 !
74 INTEGER (KIND=JPLIKB) IDATEF (fa%jpldat)
75 !
76 LOGICAL LDNOMM, LDERFA, LDIMST, LLNOUF, LLNOUC, LLRLFI
77 !
78 CHARACTER CDNOMF*(*), CDSTTU*(*), CDNOMC*(*)
79 !
80 CHARACTER(LEN=FA%JPXNOM) CLACTI
81 CHARACTER(LEN=FA%JPLMES) CLMESS
82 CHARACTER(LEN=FA%JPLSPX) CLNSPR
83 LOGICAL LLFATA
84 
85 !**
86 ! 1. - CONTROLES DIVERS
87 !-----------------------------------------------------------------------
88 !
89 ! Controle sommaire sur les arguments...
90 !
91 REAL(KIND=JPRB) :: ZHOOK_HANDLE
92 IF (lhook) CALL dr_hook('FANOUV_MT',0,zhook_handle)
93 knbari=0
94 clacti=''
95 irang=0
96 iraner=0
97 iranms=0
98 irepou=jpniil
99 llrlfi=.false.
100 ilnomc=int(len(cdnomc), jplikb)
101 ilomin=min( int(len(cdnomf), jplikb), &
102 & int(len(cdsttu), jplikb), ilnomc)
103 !
104 ! L'appel ci-dessous est legerement anticipe, de maniere a
105 ! initialiser les variables globales du logiciel s'il s'agit
106 ! du premier appel a un sous-programme de ce logiciel.
107 !
108 CALL fanumu_fort &
109 & (fa, knumer,irang)
110 ! Si KNUMER est nul, alors le numero d'unite logique est
111 ! attribuĂ© automatiquement
112 IF (knumer == 0) THEN
113  CALL faauto_fort (fa, knumer, .false.)
114  irang=0
115 ENDIF
116 !
117 IF (ilomin.LE.0) THEN
118  irep=-65
119  GOTO 1001
120 ELSEIF (irang.NE.0) THEN
121 !
122 ! Controle de non-ouverture prealable (au sens du logiciel)
123 !
124  irep=-55
125  iranms=irang
126  GOTO 1001
127 ENDIF
128 !
129 ! Verrouillage global, si necessaire.
130 !
131 ! A-t-on deja atteint le nombre limite de fichiers ARPEGE
132 ! ouverts simultanement ? Si non, on cherche un emplacement libre
133 ! dans la table FA%NULOGI (logiquement, il devrait en exister un)
134 !
135 IF (fa%NFIOUV.GE.fa%JPNXFA) THEN
136  irep=-56
137  GOTO 1001
138 ELSE
139 !
140  DO j=1,fa%JPNXFA
141 !
142  IF (fa%FICHIER(j)%NULOGI.EQ.jpniil) THEN
143  irang=j
144  GOTO 102
145  ENDIF
146 !
147  ENDDO
148 !
149  irep=-66
150  GOTO 1001
151 !
152 102 CONTINUE
153 !
154 ENDIF
155 !
156 !**
157 ! 2. - CONTROLES SPECIFIQUES AU LOGICIEL DE FICHIERS ARPEGE.
158 !-----------------------------------------------------------------------
159 !
160 llnouf=knbari.EQ.0
161 CALL fanuca_fort &
162 & (fa, cdnomc,irangc,.false.)
163 llnouc=irangc.EQ.0
164 !
165 IF (llnouf) THEN
166 !
167  IF (llnouc) THEN
168  irep=-57
169  GOTO 1001
170  ELSE
171 !
172 ! Fichier en mode creation et cadre predefini... OK a ce niveau.
173 !
174 ! On ecrit les articles definissant le cadre sur le fichier,
175 ! ainsi qu'un article ayant pour nom l'identificateur "par defaut",
176 ! (en fait, le nom du cadre) de maniere a ce que cet article soit
177 ! sequentiellement celui qui suit le dernier article du cadre.
178 !
179  ilnomc=fa%CADRE(irangc)%NLCCAD
180 !
181  ENDIF
182 !
183 ENDIF
184 
185 itronc=fa%CADRE(irangc)%MTRONC
186 ityptr=fa%CADRE(irangc)%NTYPTR
187 
188 CALL new_fichier (fa, fa%FICHIER(irang), fa%JPLDAT, itronc, ityptr)
189 
190 !*
191 ! Controle de la Date fichier, et stockage dans FA%MADATE.
192 !
193 ! IDATEF arbitraire pour contenter FACOND
194 idatef(1) = 1993
195 idatef(2) = 9
196 idatef(3) = 2
197 idatef(4) = 0
198 idatef(5) = 0
199 idatef(6) = 1
200 idatef(7) = 0
201 idatef(8) = 0
202 idatef(9) = 1
203 idatef(10) = 0
204 idatef(11) = 0
205 
206 DO j=1,fa%JPLDAT
207  fa%FICHIER(irang)%MADATE(j)=idatef(j)
208 ENDDO
209 
210 fa%FICHIER(irang)%MADATX (:) = 0
211 
212 !**
213 ! 3. - ON MET A JOUR LES TABLES RELATIVES AUX FICHIERS.
214 !-----------------------------------------------------------------------
215 !
216 !
217 irepou=0
218 !
219 !
220 fa%NFIOUV=fa%NFIOUV+1
221 fa%NULIND(fa%NFIOUV)=irang
222 fa%FICHIER(irang)%NULOGI=knumer
223 fa%FICHIER(irang)%NUCADR=irangc
224 !
225 fa%FICHIER(irang)%LNOMME=ldnomm
226 fa%FICHIER(irang)%NIVOMS=knimes
227 fa%FICHIER(irang)%LERRFA=lderfa
228 fa%FICHIER(irang)%LCREAF=.false.
229 fa%FICHIER(irang)%NBFPDG=fa%NBIPDG
230 fa%FICHIER(irang)%NBFCSP=fa%NBICSP
231 fa%FICHIER(irang)%NPUFLA=fa%NPUILA
232 fa%FICHIER(irang)%NMFDPL=fa%NMIDPL
233 fa%FICHIER(irang)%NFGRIB=fa%NIGRIB
234 fa%FICHIER(irang)%CIDENT=cdnomc
235 !
236 IF (ityptr.LT.0) THEN
237  fa%FICHIER(irang)%NSTROF=min(fa%NSTROI,itronc-1,-ityptr-1)
238 ELSE
239  fa%FICHIER(irang)%NSTROF=min(fa%NSTROI,itronc-1)
240 ENDIF
241 !
242 ! Appel a FAINOC pour interpreter les eventuels defauts
243 ! de -1 pris par FA%NBFPDG, FA%NBFCSP, FA%NSTROF et FA%NPUFLA en
244 ! IRANG-ieme position.
245 !
246 CALL fainoc_fort &
247 & (fa, irang )
248 !
249 iraner=irang
250 iranms=irang
251 ipuila=fa%FICHIER(irang)%NPUFLA
252 !
253 fa%FICHIER(irang)%NCOGRIF(:)=fa%NCODGRI(:)
254 fa%FICHIER(irang)%NRASHO = 0
255 fa%FICHIER(irang)%NRASVE = 0
256 !
257 ! L'initialisation de FLAP1Dx sera faite dans FACSIM
258 !
259 fa%FICHIER(irang)%LIFLAP=.true.
260 !
261 ! On incremente le nombre de fichiers attaches au cadre specifie.
262 !
263 fa%CADRE(irangc)%NULCAD=fa%CADRE(irangc)%NULCAD+1
264 irep=irepou
265 GOTO 1001
266 !**
267 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
268 !-----------------------------------------------------------------------
269 !
270 clacti='INQUIRE'
271 !
272 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
273 !
274 irep=abs(irep)
275 !**
276 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
277 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
278 !-----------------------------------------------------------------------
279 !
280 1001 CONTINUE
281 krep=irep
282 llfata=llmoer(irep,iraner)
283 !
284 IF (llfata) THEN
285  inimes=2
286 ELSE
287  inimes=ixnvms(iranms)
288 ENDIF
289 !
290 IF (.NOT.llfata.AND.inimes.EQ.0) THEN
291  IF (lhook) CALL dr_hook('FANOUV_MT',1,zhook_handle)
292  RETURN
293 ENDIF
294 !
295 clnspr='FANOUV'
296 !
297 IF (inimes.EQ.2) THEN
298 !
299  IF (ilnomc.GT.0) THEN
300  ilacti=min(int(len(clacti), jplikb),ilnomc)
301  clacti(1:ilacti)=cdnomc(1:ilnomc)
302  ELSE
303  ilacti=8
304  clacti=fa%CHAINC(:ilacti)
305  ENDIF
306 !
307  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
308 & '', LDNOMM= '',L1,'', CDSTTU='''''',A7,'''''', LDERFA= '',L1, &
309 & '', LDIMST= '',L1, &
310 & '', KNIMES='',I2,'', KNBARP='',I6,'' KNBARI='',I6)') &
311 & krep,knumer,ldnomm,cdsttu,lderfa,ldimst,knimes,knbarp,knbari
312  CALL faipar_fort &
313 & (fa, knumer,inimes,irep,.false.,clmess, &
314 & clnspr,clacti(1:ilacti),llrlfi)
315  clmess='CDNOMC='''//clacti(1:ilacti)//''''
316  CALL faipar_fort &
317 & (fa, knumer,inimes,irep,llfata,clmess, &
318 & clnspr, &
319 & clacti(1:ilacti),llrlfi)
320 ENDIF
321 !
322 IF (lhook) CALL dr_hook('FANOUV_MT',1,zhook_handle)
323 
324 CONTAINS
325 
326 #include "facom2.llmoer.h"
327 #include "facom2.ixnvms.h"
328 
329 END SUBROUTINE fanouv_fort
330 
331 
332 
333 
334 ! Oct-2012 P. Marguinaud 64b LFI
335 SUBROUTINE fanouv64 &
336 & (krep, knumer, ldnomm, cdnomf, cdsttu, lderfa, &
337 & ldimst, knimes, knbarp, knbari, cdnomc)
338 USE fa_mod, ONLY : fa => fa_com_default, &
341 USE lfi_precision
342 IMPLICIT NONE
343 ! Arguments
344 INTEGER (KIND=JPLIKB) KREP ! OUT
345 INTEGER (KIND=JPLIKB) KNUMER ! IN
346 LOGICAL LDNOMM ! IN
347 CHARACTER (LEN=*) CDNOMF ! IN
348 CHARACTER (LEN=*) CDSTTU ! IN
349 LOGICAL LDERFA ! IN
350 LOGICAL LDIMST ! IN
351 INTEGER (KIND=JPLIKB) KNIMES ! IN
352 INTEGER (KIND=JPLIKB) KNBARP ! IN
353 INTEGER (KIND=JPLIKB) KNBARI ! OUT
354 CHARACTER (LEN=*) CDNOMC ! IN
355 
356 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
357 
358 CALL fanouv_fort &
359 & (fa, krep, knumer, ldnomm, cdnomf, cdsttu, lderfa, &
360 & ldimst, knimes, knbarp, knbari, cdnomc)
361 
362 END SUBROUTINE fanouv64
363 
364 SUBROUTINE fanouv &
365 & (krep, knumer, ldnomm, cdnomf, cdsttu, lderfa, &
366 & ldimst, knimes, knbarp, knbari, cdnomc)
367 USE fa_mod, ONLY : fa => fa_com_default, &
370 USE lfi_precision
371 IMPLICIT NONE
372 ! Arguments
373 INTEGER (KIND=JPLIKM) KREP ! OUT
374 INTEGER (KIND=JPLIKM) KNUMER ! IN
375 LOGICAL LDNOMM ! IN
376 CHARACTER (LEN=*) CDNOMF ! IN
377 CHARACTER (LEN=*) CDSTTU ! IN
378 LOGICAL LDERFA ! IN
379 LOGICAL LDIMST ! IN
380 INTEGER (KIND=JPLIKM) KNIMES ! IN
381 INTEGER (KIND=JPLIKM) KNBARP ! IN
382 INTEGER (KIND=JPLIKM) KNBARI ! OUT
383 CHARACTER (LEN=*) CDNOMC ! IN
384 
385 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
386 
387 CALL fanouv_mt &
388 & (fa, krep, knumer, ldnomm, cdnomf, cdsttu, lderfa, &
389 & ldimst, knimes, knbarp, knbari, cdnomc)
390 
391 END SUBROUTINE fanouv
392 
393 SUBROUTINE fanouv_mt &
394 & (fa, krep, knumer, ldnomm, cdnomf, cdsttu, lderfa, &
395 & ldimst, knimes, knbarp, knbari, cdnomc)
396 USE fa_mod, ONLY : fa_com
397 USE lfi_precision
398 IMPLICIT NONE
399 ! Arguments
400 type(fa_com) fa ! INOUT
401 INTEGER (KIND=JPLIKM) KREP ! OUT
402 INTEGER (KIND=JPLIKM) KNUMER ! IN
403 LOGICAL LDNOMM ! IN
404 CHARACTER (LEN=*) CDNOMF ! IN
405 CHARACTER (LEN=*) CDSTTU ! IN
406 LOGICAL LDERFA ! IN
407 LOGICAL LDIMST ! IN
408 INTEGER (KIND=JPLIKM) KNIMES ! IN
409 INTEGER (KIND=JPLIKM) KNBARP ! IN
410 INTEGER (KIND=JPLIKM) KNBARI ! OUT
411 CHARACTER (LEN=*) CDNOMC ! IN
412 ! Local integers
413 INTEGER (KIND=JPLIKB) IREP ! OUT
414 INTEGER (KIND=JPLIKB) INUMER ! IN
415 INTEGER (KIND=JPLIKB) INIMES ! IN
416 INTEGER (KIND=JPLIKB) INBARP ! IN
417 INTEGER (KIND=JPLIKB) INBARI ! OUT
418 ! Convert arguments
419 
420 inumer = int( knumer, jplikb)
421 inimes = int( knimes, jplikb)
422 inbarp = int( knbarp, jplikb)
423 
424 CALL fanouv_fort &
425 & (fa, irep, inumer, ldnomm, cdnomf, cdsttu, lderfa, &
426 & ldimst, inimes, inbarp, inbari, cdnomc)
427 
428 krep = int( irep, jplikm)
429 knbari = int( inbari, jplikm)
430 
431 IF (knumer == 0) THEN
432  knumer = int( inumer, jplikm)
433 ENDIF
434 
435 END SUBROUTINE fanouv_mt
436 
437 
438 
439 !INTF KREP OUT
440 !INTF KNUMER IN
441 !INTF LDNOMM IN
442 !INTF CDNOMF IN
443 !INTF CDSTTU IN
444 !INTF LDERFA IN
445 !INTF LDIMST IN
446 !INTF KNIMES IN
447 !INTF KNBARP IN
448 !INTF KNBARI OUT
449 !INTF CDNOMC IN
integer, parameter jplikb
subroutine faauto_fort(FA, KNUMER, LDLFI)
Definition: faauto.F90:3
subroutine fanouv_mt(FA, KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: fanouv.F90:396
logical, save fa_com_default_init
Definition: fa_mod.F90:477
subroutine new_fa_default()
Definition: fa_mod.F90:649
subroutine fanuca_fort(FA, CDNOMC, KRANGC, LDVERR)
Definition: fanuca.F90:5
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine fainoc_fort(FA, KRANG)
Definition: fainoc.F90:5
subroutine fanouv64(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: fanouv.F90:338
logical lhook
Definition: yomhook.F90:15
subroutine new_fichier(FA, FI, KPLDAT, KPXTRO, KTYPTR)
Definition: fa_mod.F90:609
subroutine fanouv_fort(FA, KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: fanouv.F90:9
integer, parameter jplikm
type(fa_com), target, save fa_com_default
Definition: fa_mod.F90:476
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine fanouv(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: fanouv.F90:367
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31