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