SURFEX v8.1
General documentation of Surfex
lficas.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe LFI
3 
4 SUBROUTINE lficas_fort &
5 & (lfi, krep, knumer, cdnoma, klong, &
6 & kposex, ldavan)
7 USE lfimod, ONLY : lficom
8 USE parkind1, ONLY : jprb
9 USE yomhook , ONLY : lhook, dr_hook
10 USE lfi_precision
11 IMPLICIT NONE
12 !****
13 ! SOUS-PROGRAMME DONNANT LES CARACTERISTIQUES ( NOM, LONGUEUR,
14 ! POSITION ) DE L'ARTICLE LOGIQUE *DE DONNEES* SUIVANT, SUR UNE
15 ! UNITE LOGIQUE OUVERTE POUR LE LOGICIEL DE FICHIERS INDEXES *LFI* .
16 !**
17 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
18 ! KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
19 ! CDNOMA (SORTIE) ==> NOM DE L'ARTICLE SUIVANT;
20 ! KLONG (SORTIE) ==> LONGUEUR DE L'ARTICLE SUIVANT;
21 ! KPOSEX (SORTIE) ==> POSITION ( DANS LE FICHIER, DU PRE-
22 ! MIER MOT ) DE L'ARTICLE SUIVANT;
23 ! LDAVAN (ENTREE) ==> VRAI SI ON DOIT "AVANCER" LE
24 ! POINTEUR DU FICHIER.
25 !
26 ! SI L'ON SOUHAITE LIRE ENSUITE L'ARTICLE EN QUESTION (VIA *LFILAS*)
27 ! IL FAUT PRECISER A L'APPEL LDAVAN=.FALSE. ; LDAVAN=.TRUE. SERT
28 ! ESSENTIELLEMENT A ANALYSER LE CONTENU DU FICHIER EN TERMES
29 ! D'ARTICLES LOGIQUES, SANS LIRE LES DONNEES.
30 !
31 ! SI LE FICHIER EST VIDE OU QUE LE DERNIER ARTICLE LOGIQUE LU ETAIT
32 ! LE DERNIER, LE SOUS-PROGRAMME "RETOURNE" KLONG=0, ET CDNOMA=' ' .
33 !
34 !
35 TYPE(lficom) :: LFI
36 CHARACTER CDNOMA*(*), CLNOMA*(lfi%jpncpn)
37 !
38 INTEGER (KIND=JPLIKB) KREP, KNUMER, KLONG, KPOSEX
39 INTEGER (KIND=JPLIKB) IREP, ILCDNO, IDECBL, IPOSBL
40 INTEGER (KIND=JPLIKB) ILCLNO, IRANG, IRGPIM, IARTIC
41 INTEGER (KIND=JPLIKB) IRGPIF, INIMES, IRETIN
42 !
43 LOGICAL LDAVAN, LLVERF
44 !
45 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
46 CHARACTER(LEN=LFI%JPLMES) CLMESS
47 CHARACTER(LEN=LFI%JPLFTX) CLACTI
48 LOGICAL LLFATA
49 
50 !**
51 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
52 !-----------------------------------------------------------------------
53 !
54 ! Appel legerement anticipe a LFINUM, garantissant l'initialisa-
55 ! tion des variables globales du logiciel a la 1ere utilisation.
56 !
57 REAL(KIND=JPRB) :: ZHOOK_HANDLE
58 IF (lhook) CALL dr_hook('LFICAS_FORT',0,zhook_handle)
59 clacti=''
60 CALL lfinum_fort &
61 & (lfi, knumer,irang)
62 llverf=.false.
63 irep=0
64 klong=0
65 kposex=0
66 ilcdno=int(len(cdnoma), jplikb)
67 !
68 IF (ilcdno.LE.0) THEN
69  irep=-15
70  clnoma=lfi%CHINCO(:lfi%JPNCPN)
71  ilclno=lfi%JPNCPN
72  GOTO 1001
73 ELSE
74  cdnoma=' '
75  clnoma=' '
76  ilclno=1
77 ENDIF
78 !
79 IF (irang.EQ.0) THEN
80  irep=-1
81  GOTO 1001
82 ENDIF
83 !
84  IF (lfi%LMULTI) CALL lfiver_fort &
85 & (lfi, lfi%VERRUE(irang),'ON')
86 llverf=lfi%LMULTI
87 !**
88 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
89 ! A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE,
90 ! DEFINI PAR SON RANG "A PRIORI" DANS LE FICHIER.
91 !-----------------------------------------------------------------------
92 !
93 CALL lficax_fort &
94 & (lfi, irep,irang,irgpim,iartic,iretin)
95 !
96 IF (iretin.EQ.1) THEN
97  GOTO 903
98 ELSEIF (iretin.EQ.2) THEN
99  GOTO 904
100 ELSEIF (iretin.NE.0.OR.iartic.EQ.0) THEN
101  GOTO 1001
102 ENDIF
103 !*
104 ! 2.1 - ARTICLE DE DONNEES TROUVE... APRES CONTROLES SUPPLEMENTAI-
105 ! RES, ON RETOURNE SES CARACTERISTIQUES.
106 !-----------------------------------------------------------------------
107 !
108 irgpif=lfi%MRGPIF(irgpim)
109 !
110 IF (.NOT.lfi%LPHASP(irgpim)) THEN
111 !
112  CALL lfipha_fort &
113 & (lfi, irep,irang,irgpim,iretin)
114 !
115  IF (iretin.EQ.1) THEN
116  GOTO 903
117  ELSEIF (iretin.EQ.2) THEN
118  GOTO 904
119  ELSEIF (iretin.NE.0) THEN
120  GOTO 1001
121  ENDIF
122 !
123 ENDIF
124 !
125 klong=lfi%MLGPOS(ixm(2*iartic-1,irgpim))
126 kposex=lfi%MLGPOS(ixm(2*iartic,irgpim))
127 clnoma=lfi%CNOMAR(ixc(iartic,irgpim))
128 !
129 ! Recherche de la longueur "utile" du nom d'article.
130 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
131 !
132 idecbl=0
133 !
134 211 CONTINUE
135 iposbl=idecbl+int(index(clnoma(idecbl+1:),' '), jplikb)
136 !
137 IF (iposbl.LE.idecbl) THEN
138  ilclno=lfi%JPNCPN
139 ELSEIF (clnoma(iposbl:).EQ.' ') THEN
140  ilclno=iposbl-1
141 ELSE
142  idecbl=iposbl
143  GOTO 211
144 ENDIF
145 !
146 IF (ilcdno.GE.ilclno) THEN
147  cdnoma=clnoma(:ilclno)
148 ELSE
149  irep=-24
150  clacti=clnoma
151  GOTO 1001
152 ENDIF
153 !
154 IF (ldavan) THEN
155 !
156 ! ON AVANCE LE "POINTEUR" DU FICHIER...
157 ! ET ON REINITIALISE LES "POINTEURS" SUIVANT ET PRECEDENT.
158 !
159  lfi%NDERGF(irang)=lfi%JPNAPP*lfi%MFACTM(irang)*(irgpif-1)+iartic
160  lfi%CNDERA(irang)=clnoma
161  lfi%NSUIVF(irang)=lfi%JPNIL
162  lfi%NPRECF(irang)=lfi%JPNIL
163 ENDIF
164 !
165 GOTO 1001
166 !**
167 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
168 !-----------------------------------------------------------------------
169 !
170 903 CONTINUE
171 clacti='WRITE'
172 GOTO 909
173 !
174 904 CONTINUE
175 clacti='READ'
176 !
177 909 CONTINUE
178 !
179 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
180 !
181 irep=abs(irep)
182 !**
183 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
184 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
185 !-----------------------------------------------------------------------
186 !
187 1001 CONTINUE
188 krep=irep
189 llfata=llmoer(irep,irang)
190 !
191 IF (irang.NE.0) THEN
192  lfi%NDEROP(irang)=11
193  lfi%NDERCO(irang)=irep
194  IF (llverf) CALL lfiver_fort &
195 & (lfi, lfi%VERRUE(irang),'OFF')
196 ENDIF
197 !
198 IF (llfata.OR.ixnims(irang).EQ.2) THEN
199  inimes=2
200 ELSE
201  IF (lhook) CALL dr_hook('LFICAS_FORT',1,zhook_handle)
202  RETURN
203 ENDIF
204 !
205 clnspr='LFICAS'
206 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
207 & '', CDNOMA='''''',A,'''''', KLONG='',I7,'', KPOSEX='',I8, &
208 & '', LDAVAN= '',L1)') &
209 & krep,knumer,clnoma(:ilclno),klong,kposex,ldavan
210 CALL lfiems_fort &
211 & (lfi, knumer,inimes,irep,llfata, &
212 & clmess,clnspr,clacti)
213 !
214 IF (lhook) CALL dr_hook('LFICAS_FORT',1,zhook_handle)
215 
216 CONTAINS
217 
218 #include "lficom2.ixc.h"
219 #include "lficom2.ixm.h"
220 #include "lficom2.ixnims.h"
221 #include "lficom2.llmoer.h"
222 
223 END SUBROUTINE lficas_fort
224 
225 
226 
227 ! Oct-2012 P. Marguinaud 64b LFI
228 SUBROUTINE lficas64 &
229 & (krep, knumer, cdnoma, klong, kposex, ldavan)
230 USE lfimod, ONLY : lfi => lficom_default, &
233 USE lfi_precision
234 IMPLICIT NONE
235 ! Arguments
236 INTEGER (KIND=JPLIKB) KREP ! OUT
237 INTEGER (KIND=JPLIKB) KNUMER ! IN
238 CHARACTER (LEN=*) CDNOMA ! OUT
239 INTEGER (KIND=JPLIKB) KLONG ! OUT
240 INTEGER (KIND=JPLIKB) KPOSEX ! OUT
241 LOGICAL LDAVAN ! IN
242 
243 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
244 
245 CALL lficas_fort &
246 & (lfi, krep, knumer, cdnoma, klong, kposex, ldavan)
247 
248 END SUBROUTINE lficas64
249 
250 SUBROUTINE lficas &
251 & (krep, knumer, cdnoma, klong, kposex, ldavan)
252 USE lfimod, ONLY : lfi => lficom_default, &
255 USE lfi_precision
256 IMPLICIT NONE
257 ! Arguments
258 INTEGER (KIND=JPLIKM) KREP ! OUT
259 INTEGER (KIND=JPLIKM) KNUMER ! IN
260 CHARACTER (LEN=*) CDNOMA ! OUT
261 INTEGER (KIND=JPLIKM) KLONG ! OUT
262 INTEGER (KIND=JPLIKM) KPOSEX ! OUT
263 LOGICAL LDAVAN ! IN
264 
265 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
266 
267 CALL lficas_mt &
268 & (lfi, krep, knumer, cdnoma, klong, kposex, ldavan)
269 
270 END SUBROUTINE lficas
271 
272 SUBROUTINE lficas_mt &
273 & (lfi, krep, knumer, cdnoma, klong, kposex, ldavan)
274 USE lfimod, ONLY : lficom
275 USE lfi_precision
276 IMPLICIT NONE
277 ! Arguments
278 type(lficom) lfi ! INOUT
279 INTEGER (KIND=JPLIKM) KREP ! OUT
280 INTEGER (KIND=JPLIKM) KNUMER ! IN
281 CHARACTER (LEN=*) CDNOMA ! OUT
282 INTEGER (KIND=JPLIKM) KLONG ! OUT
283 INTEGER (KIND=JPLIKM) KPOSEX ! OUT
284 LOGICAL LDAVAN ! IN
285 ! Local integers
286 INTEGER (KIND=JPLIKB) IREP ! OUT
287 INTEGER (KIND=JPLIKB) INUMER ! IN
288 INTEGER (KIND=JPLIKB) ILONG ! OUT
289 INTEGER (KIND=JPLIKB) IPOSEX ! OUT
290 ! Convert arguments
291 
292 inumer = int( knumer, jplikb)
293 
294 CALL lficas_fort &
295 & (lfi, irep, inumer, cdnoma, ilong, iposex, ldavan)
296 
297 krep = int( irep, jplikm)
298 klong = int( ilong, jplikm)
299 kposex = int( iposex, jplikm)
300 
301 END SUBROUTINE lficas_mt
302 
303 !INTF KREP OUT
304 !INTF KNUMER IN
305 !INTF CDNOMA OUT
306 !INTF KLONG OUT
307 !INTF KPOSEX OUT
308 !INTF LDAVAN IN
integer, parameter jplikb
subroutine lficas(KREP, KNUMER, CDNOMA, KLONG, KPOSEX, LDAVAN)
Definition: lficas.F90:252
subroutine lficax_fort(LFI, KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficax.F90:5
subroutine new_lfi_default()
Definition: lfimod.F90:376
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 lficas_fort(LFI, KREP, KNUMER, CDNOMA, KLONG, KPOSEX, LDAVAN)
Definition: lficas.F90:7
subroutine lficas64(KREP, KNUMER, CDNOMA, KLONG, KPOSEX, LDAVAN)
Definition: lficas.F90:230
type(lficom), target, save lficom_default
Definition: lfimod.F90:370
logical lhook
Definition: yomhook.F90:15
subroutine lfipha_fort(LFI, KREP, KRANG, KRGPIM, KRETIN)
Definition: lfipha.F90:5
integer, parameter jplikm
subroutine lfiems_fort(LFI, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI)
Definition: lfiems.F90:7
Definition: lfimod.F90:1
ERROR in index
Definition: ecsort_shared.h:90
subroutine lficas_mt(LFI, KREP, KNUMER, CDNOMA, KLONG, KPOSEX, LDAVAN)
Definition: lficas.F90:274