SURFEX v8.1
General documentation of Surfex
lfilap.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 lfilap_fort &
5 & (lfi, krep, knumer, cdnoma, ktab, klong )
6 USE lfimod, ONLY : lficom
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! SOUS-PROGRAMME DE LECTURE DE L'ARTICLE (DE DONNEES) *PRECEDENT*
13 ! SUR UNE UNITE LOGIQUE OUVERTE POUR LE LOGICIEL DE FICHIERS INDEXES
14 ! *LFI*; L'ARTICLE EN SORTIE EST UN "BLOC" DE DONNEES ADJACENTES.
15 !
16 ! ( "PRECEDENT" = PRECEDENT LE DERNIER *LU* )
17 !**
18 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
19 ! KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
20 ! CDNOMA (SORTIE) ==> NOM DE L'ARTICLE LU; CETTE VARIABLE
21 ! DOIT ETRE ASSEZ LONGUE POUR STOCKER
22 ! LE NOM DE L'ARTICLE ( BLANCS EN FIN
23 ! DE NOM EXCLUS, CEPENDANT );
24 ! KTAB (ENTREE) ==> PREMIER MOT A LIRE;
25 ! KLONG (ENTREE) ==> LONGUEUR DE L'ARTICLE A LIRE.
26 !
27 ! IL EST CHAUDEMENT RECOMMANDE DE N'UTILISER CE SOUS-PROGRAMME
28 ! QU'APRES AVOIR CONTROLE, PAR APPEL PREALABLE AU SOUS-PROGRAMME
29 ! *LFICAP*, L'EXISTENCE D'UN ARTICLE LOGIQUE DE DONNEES "PRECEDENT".
30 ! SINON, IL FAUT PREVOIR DE GERER L'ERREUR DE CODE (-26) ...
31 ! ENTRE AUTRES.
32 !
33 !
34 TYPE(lficom) :: LFI
35 CHARACTER CDNOMA*(*), CLNOMA*(lfi%jpncpn)
36 !
37 INTEGER (KIND=JPLIKB) KREP, KNUMER, KLONG
38 INTEGER (KIND=JPLIKB) KTAB (klong)
39 INTEGER (KIND=JPLIKB) IREP, IRANG, ILCLNO, IRGPIM
40 INTEGER (KIND=JPLIKB) IARTIC, IRGPIF, ILONEX, IREPX
41 INTEGER (KIND=JPLIKB) IPOSEX, IDECBL, IPOSBL, IRETIN
42 INTEGER (KIND=JPLIKB) INIMES, ILCDNO, IRANGF
43 !
44 LOGICAL LLVERF
45 !
46 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
47 CHARACTER(LEN=LFI%JPLMES) CLMESS
48 CHARACTER(LEN=LFI%JPLFTX) CLACTI
49 LOGICAL LLFATA
50 
51 !**
52 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
53 !-----------------------------------------------------------------------
54 !
55 ! Appel legerement anticipe a LFINUM, garantissant l'initialisa-
56 ! tion des variables globales du logiciel a la 1ere utilisation.
57 !
58 REAL(KIND=JPRB) :: ZHOOK_HANDLE
59 IF (lhook) CALL dr_hook('LFILAP_FORT',0,zhook_handle)
60 clacti=''
61 CALL lfinum_fort &
62 & (lfi, knumer,irang)
63 llverf=.false.
64 irep=0
65 irepx=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 (klong.LE.0) THEN
80  irep=-14
81  GOTO 1001
82 ELSEIF (irang.EQ.0) THEN
83  irep=-1
84  GOTO 1001
85 ENDIF
86 !
87  IF (lfi%LMULTI) CALL lfiver_fort &
88 & (lfi, lfi%VERRUE(irang),'ON')
89 llverf=lfi%LMULTI
90 !**
91 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
92 ! A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE,
93 ! DEFINI PAR SON RANG "A PRIORI" DANS LE FICHIER.
94 !-----------------------------------------------------------------------
95 !
96 CALL lficaq_fort &
97 & (lfi, irep,irang,irgpim,iartic,iretin)
98 !
99 IF (iretin.EQ.1) THEN
100  GOTO 903
101 ELSEIF (iretin.EQ.2) THEN
102  GOTO 904
103 ELSEIF (iretin.NE.0) THEN
104  GOTO 1001
105 ELSEIF (iartic.EQ.0) THEN
106  irep=-23
107  GOTO 1001
108 ENDIF
109 !*
110 ! 2.1 - ARTICLE DE DONNEES TROUVE... CONTROLES SUPPLEMENTAIRES.
111 !-----------------------------------------------------------------------
112 !
113 irgpif=lfi%MRGPIF(irgpim)
114 !
115 IF (.NOT.lfi%LPHASP(irgpim)) THEN
116 !
117  CALL lfipha_fort &
118 & (lfi, irep,irang,irgpim,iretin)
119 !
120  IF (iretin.EQ.1) THEN
121  GOTO 903
122  ELSEIF (iretin.EQ.2) THEN
123  GOTO 904
124  ELSEIF (iretin.NE.0) THEN
125  GOTO 1001
126  ENDIF
127 !
128 ENDIF
129 !
130 ilonex=lfi%MLGPOS(ixm(2*iartic-1,irgpim))
131 iposex=lfi%MLGPOS(ixm(2*iartic,irgpim))
132 clnoma=lfi%CNOMAR(ixc(iartic,irgpim))
133 !
134 ! Recherche de la longueur "utile" du nom d'article.
135 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
136 !
137 idecbl=0
138 !
139 211 CONTINUE
140 iposbl=idecbl+int(index(clnoma(idecbl+1:),' '), jplikb)
141 !
142 IF (iposbl.LE.idecbl) THEN
143  ilclno=lfi%JPNCPN
144 ELSEIF (clnoma(iposbl:).EQ.' ') THEN
145  ilclno=iposbl-1
146 ELSE
147  idecbl=iposbl
148  GOTO 211
149 ENDIF
150 !
151 IF (ilcdno.GE.ilclno) THEN
152  cdnoma=clnoma(:ilclno)
153 ELSE
154  irep=-24
155  clacti=clnoma
156  GOTO 1001
157 ENDIF
158 !
159 IF (klong.LT.ilonex) THEN
160  irep=-21
161  llfata=llmoer(irep,irang)
162 !
163  IF (llfata) THEN
164  clacti=clnoma
165  GOTO 1001
166  ENDIF
167 !
168 ! SI L'ERREUR (-21) N'A PAS ETE FATALE, ON VA LIRE SEULEMENT
169 ! LE DEBUT DE L'ARTICLE ( LECTURE PARTIELLE DE *KLONG* MOTS )
170 !
171 ELSEIF (klong.GT.ilonex) THEN
172  irep=-22
173  clacti=clnoma
174  GOTO 1001
175 ENDIF
176 !
177 irepx=irep
178 !**
179 ! 3. - LECTURE DES DONNEES PROPREMENT DITE.
180 !-----------------------------------------------------------------------
181 !
182 CALL lfiled_fort &
183 & (lfi, irep,irang,ktab,klong,irgpim,iposex,iretin)
184 !
185 IF (iretin.EQ.1) THEN
186  GOTO 903
187 ELSEIF (iretin.EQ.2) THEN
188  GOTO 904
189 ELSEIF (iretin.NE.0) THEN
190  GOTO 1001
191 ENDIF
192 !
193 irep=irepx
194 irangf=lfi%JPNAPP*lfi%MFACTM(irang)*(irgpif-1)+iartic
195 !**
196 ! 4. - MISE A JOUR DE STATISTIQUES ET DE TABLES.
197 !-----------------------------------------------------------------------
198 !
199 lfi%NBLECT(irang)=lfi%NBLECT(irang)+1
200 lfi%NBMOLU(irang)=lfi%NBMOLU(irang)+klong
201 lfi%NDERGF(irang)=irangf
202 lfi%CNDERA(irang)=clnoma
203 lfi%NSUIVF(irang)=lfi%JPNIL
204 lfi%NPRECF(irang)=lfi%JPNIL
205 GOTO 1001
206 !**
207 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
208 !-----------------------------------------------------------------------
209 !
210 903 CONTINUE
211 clacti='WRITE'
212 GOTO 909
213 !
214 904 CONTINUE
215 clacti='READ'
216 !
217 909 CONTINUE
218 !
219 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
220 !
221 irep=abs(irep)
222 !**
223 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
224 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
225 !-----------------------------------------------------------------------
226 !
227 1001 CONTINUE
228 krep=irep
229 llfata=llmoer(irep,irang)
230 !
231 IF (irang.NE.0) THEN
232  lfi%NDEROP(irang)=16
233  lfi%NDERCO(irang)=irep
234  IF (llverf) CALL lfiver_fort &
235 & (lfi, lfi%VERRUE(irang),'OFF')
236 ENDIF
237 !
238 IF (llfata.OR.ixnims(irang).EQ.2) THEN
239  inimes=2
240 ELSE
241  IF (lhook) CALL dr_hook('LFILAP_FORT',1,zhook_handle)
242  RETURN
243 ENDIF
244 !
245 clnspr='LFILAP'
246 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
247 & '', CDNOMA='''''',A,'''''', KLONG='',I7)') &
248 & krep,knumer,clnoma(:ilclno),klong
249 CALL lfiems_fort &
250 & (lfi, knumer,inimes,irep,llfata, &
251 & clmess,clnspr,clacti)
252 !
253 IF (lhook) CALL dr_hook('LFILAP_FORT',1,zhook_handle)
254 
255 CONTAINS
256 
257 #include "lficom2.ixc.h"
258 #include "lficom2.ixm.h"
259 #include "lficom2.ixnims.h"
260 #include "lficom2.llmoer.h"
261 
262 END SUBROUTINE lfilap_fort
263 
264 
265 
266 ! Oct-2012 P. Marguinaud 64b LFI
267 SUBROUTINE lfilap64 &
268 & (krep, knumer, cdnoma, ktab, klong)
269 USE lfimod, ONLY : lfi => lficom_default, &
272 USE lfi_precision
273 IMPLICIT NONE
274 ! Arguments
275 INTEGER (KIND=JPLIKB) KREP ! OUT
276 INTEGER (KIND=JPLIKB) KNUMER ! IN
277 CHARACTER (LEN=*) CDNOMA ! OUT
278 INTEGER (KIND=JPLIKB) KLONG ! IN
279 INTEGER (KIND=JPLIKB) KTAB (klong) ! IN
280 
281 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
282 
283 CALL lfilap_fort &
284 & (lfi, krep, knumer, cdnoma, ktab, klong)
285 
286 END SUBROUTINE lfilap64
287 
288 SUBROUTINE lfilap &
289 & (krep, knumer, cdnoma, ktab, klong)
290 USE lfimod, ONLY : lfi => lficom_default, &
293 USE lfi_precision
294 IMPLICIT NONE
295 ! Arguments
296 INTEGER (KIND=JPLIKM) KREP ! OUT
297 INTEGER (KIND=JPLIKM) KNUMER ! IN
298 CHARACTER (LEN=*) CDNOMA ! OUT
299 INTEGER (KIND=JPLIKM) KLONG ! IN
300 INTEGER (KIND=JPLIKB) KTAB (klong) ! IN
301 
302 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
303 
304 CALL lfilap_mt &
305 & (lfi, krep, knumer, cdnoma, ktab, klong)
306 
307 END SUBROUTINE lfilap
308 
309 SUBROUTINE lfilap_mt &
310 & (lfi, krep, knumer, cdnoma, ktab, klong)
311 USE lfimod, ONLY : lficom
312 USE lfi_precision
313 IMPLICIT NONE
314 ! Arguments
315 type(lficom) lfi ! INOUT
316 INTEGER (KIND=JPLIKM) KREP ! OUT
317 INTEGER (KIND=JPLIKM) KNUMER ! IN
318 CHARACTER (LEN=*) CDNOMA ! OUT
319 INTEGER (KIND=JPLIKM) KLONG ! IN
320 INTEGER (KIND=JPLIKB) KTAB (klong) ! IN
321 ! Local integers
322 INTEGER (KIND=JPLIKB) IREP ! OUT
323 INTEGER (KIND=JPLIKB) INUMER ! IN
324 INTEGER (KIND=JPLIKB) ILONG ! IN
325 ! Convert arguments
326 
327 inumer = int( knumer, jplikb)
328 ilong = int( klong, jplikb)
329 
330 CALL lfilap_fort &
331 & (lfi, irep, inumer, cdnoma, ktab, ilong)
332 
333 krep = int( irep, jplikm)
334 
335 END SUBROUTINE lfilap_mt
336 
337 !INTF KREP OUT
338 !INTF KNUMER IN
339 !INTF CDNOMA OUT
340 !INTF KTAB IN DIMS=KLONG KIND=JPLIKB
341 !INTF KLONG IN
subroutine lficaq_fort(LFI, KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficaq.F90:5
integer, parameter jplikb
subroutine lfilap(KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilap.F90:290
subroutine lfilap_fort(LFI, KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilap.F90:6
subroutine lfilap64(KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilap.F90:269
subroutine new_lfi_default()
Definition: lfimod.F90:376
logical, save lficom_default_init
Definition: lfimod.F90:371
subroutine lfilap_mt(LFI, KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilap.F90:311
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
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
subroutine lfiled_fort(LFI, KREP, KRANG, KTAB, KLONG, KRGPIM, KPOSEX, KRETIN)
Definition: lfiled.F90:7
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