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