SURFEX v8.1
General documentation of Surfex
lfipxa.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe LFI
3 SUBROUTINE lfipxa_fort &
4 & (lfi, krep, knumer, cdnoma, cdstru, cdsuiv, &
5 & klsuiv )
6 USE lfimod, ONLY : lficom
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! Sous-programme Preparatoire a l'eXport d'un Article d'un
13 ! fichier LFI vers un systeme a priori different.
14 !
15 ! Il s'agit, en l'occurrence, de decrire la structure interne
16 ! de cet article en termes de types de variables.
17 !**
18 ! ARGUMENTS : KREP (Sortie) ==> Code-Reponse du sous-programme;
19 ! KNUMER (Entree) ==> Numero d'Unite Logique associe;
20 ! CDNOMA (Entree) ==> Nom de l'article decrit;
21 ! CDSTRU (Entree) ==> Structure interne de cet article;
22 ! CDSUIV (Sortie) ==> Nom de l'article suivant sur le
23 ! fichier, s'il en existe;
24 ! KLSUIV (Sortie) ==> Longueur de cet article.
25 !
26 ! (s'il n'y a pas d'article suivant, on retourne CDSUIV=' ' et
27 ! KLSUIV=0)
28 !
29 ! Les syntaxes autorisees pour CDSTRU sont decrites dans le sous-
30 ! programmes *LFIDST*.
31 !
32 !
33 TYPE(lficom) :: LFI
34 CHARACTER CDNOMA*(*), CDSUIV*(*), CDSTRU*(*)
35 CHARACTER*(LFI%JPNCPN) CLNOMA, CLSUIV, CLSTRU
36 !
37 INTEGER (KIND=JPLIKB) KREP, KNUMER, KLSUIV
38 INTEGER (KIND=JPLIKB) ILONEX, ILCLNO, ILCDNO, IRANMX
39 INTEGER (KIND=JPLIKB) IDECBL, IPOSBL, ILCDST
40 INTEGER (KIND=JPLIKB) IRANG, IREP, INBALO, IRANIE
41 INTEGER (KIND=JPLIKB) INIMES, IARTEX
42 INTEGER (KIND=JPLIKB) IRGPIM, IRGPIF, IARTIC, IRETIN
43 INTEGER (KIND=JPLIKB) ILCDSU, ILCLSU, ILCLST
44 INTEGER (KIND=JPLIKB) ILUSTR
45 !
46 LOGICAL LLVERF
47 !
48 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
49 CHARACTER(LEN=LFI%JPLMES) CLMESS
50 CHARACTER(LEN=LFI%JPLFTX) CLACTI
51 LOGICAL LLFATA
52 
53 !**
54 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
55 !-----------------------------------------------------------------------
56 !
57 ! Appel legerement anticipe a LFINUM, garantissant l'initialisa-
58 ! tion des variables globales du logiciel a la 1ere utilisation.
59 !
60 REAL(KIND=JPRB) :: ZHOOK_HANDLE
61 IF (lhook) CALL dr_hook('LFIPXA_FORT',0,zhook_handle)
62 clacti=''
63 CALL lfinum_fort &
64 & (lfi, knumer,irang)
65 irep=0
66 llverf=.false.
67 ilcdno=int(len(cdnoma), jplikb)
68 ilcdsu=int(len(cdsuiv), jplikb)
69 ilcdst=int(len(cdstru), jplikb)
70 clnoma=' '
71 ilclno=1
72 clstru=' '
73 ilclst=1
74 clsuiv=' '
75 ilclsu=1
76 klsuiv=0
77 !
78 IF (ilcdno.LE.0) THEN
79  irep=-15
80  clnoma=lfi%CHINCO(:lfi%JPNCPN)
81  ilclno=lfi%JPNCPN
82 ELSEIF (cdnoma.EQ.' ') THEN
83  irep=-18
84 ENDIF
85 !
86 IF (ilcdsu.LE.0) THEN
87  irep=-15
88  clsuiv=lfi%CHINCO(:lfi%JPNCPN)
89  ilclsu=lfi%JPNCPN
90 ENDIF
91 !
92 IF (ilcdst.LE.0) THEN
93  irep=-15
94  clstru=lfi%CHINCO(:lfi%JPNCPN)
95  ilclst=lfi%JPNCPN
96 ELSEIF (cdstru.EQ.' ') THEN
97  irep=-39
98 ENDIF
99 !
100 IF (irep.NE.0) THEN
101  GOTO 1001
102 ELSE
103  cdsuiv=' '
104 ENDIF
105 !
106 ! Recherche de la longueur "utile" du nom d'article specifie.
107 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
108 !
109 idecbl=0
110 !
111 101 CONTINUE
112 iposbl=idecbl+int(index(cdnoma(idecbl+1:),' '), jplikb)
113 !
114 IF (iposbl.LE.idecbl) THEN
115  ilclno=ilcdno
116 ELSEIF (cdnoma(iposbl:).EQ.' ') THEN
117  ilclno=iposbl-1
118 ELSE
119  idecbl=iposbl
120  GOTO 101
121 ENDIF
122 !
123 IF (ilclno.LE.lfi%JPNCPN) THEN
124  clnoma=cdnoma(:ilclno)
125 ELSE
126  clnoma=cdnoma(:lfi%JPNCPN)
127  ilclno=lfi%JPNCPN
128  irep=-15
129  GOTO 1001
130 ENDIF
131 !
132 ! Recherche de la longueur "utile" de la structure specifiee.
133 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
134 !
135 idecbl=0
136 !
137 102 CONTINUE
138 iposbl=idecbl+int(index(cdstru(idecbl+1:),' '), jplikb)
139 !
140 IF (iposbl.LE.idecbl) THEN
141  ilustr=ilcdst
142 ELSEIF (cdstru(iposbl:).EQ.' ') THEN
143  ilustr=iposbl-1
144 ELSE
145  idecbl=iposbl
146  GOTO 102
147 ENDIF
148 !
149 ilclst=min(ilclst,ilustr)
150 !
151 IF (irang.EQ.0) THEN
152  irep=-1
153  GOTO 1001
154 ENDIF
155 !
156  IF (lfi%LMULTI) CALL lfiver_fort &
157 & (lfi, lfi%VERRUE(irang),'ON')
158 llverf=lfi%LMULTI
159 iranie=lfi%NEXPOR(irang)
160 !
161 IF (iranie.LE.0) THEN
162  irep=-38
163  clacti='EXPORT'
164  GOTO 1001
165 ENDIF
166 !
167 iranmx=lfi%NRCFMX(iranie)
168 iartex=0
169 ilonex=0
170 inbalo=lfi%MDES1D(ixm(lfi%JPNALO,irang))
171 
172 IF (inbalo.NE.0) THEN
173 !**
174 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
175 ! A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE.
176 !-----------------------------------------------------------------------
177 !
178  CALL lfiran_fort &
179 & (lfi, irep,irang,clnoma(:ilclno),irgpim, &
180 & iartex,iretin)
181 !
182  IF (iretin.EQ.1) THEN
183  GOTO 903
184  ELSEIF (iretin.EQ.2) THEN
185  GOTO 904
186  ELSEIF (iretin.NE.0) THEN
187  GOTO 1001
188  ENDIF
189 !
190 ENDIF
191 !
192 IF (iartex.EQ.0) THEN
193  irep=-20
194  clacti=clnoma(:ilclno)
195  GOTO 1001
196 ENDIF
197 !
198 ! ON COMPLETE LES CARACTERISTIQUES DE L'ARTICLE.
199 !
200 irgpif=lfi%MRGPIF(irgpim)
201 !
202 IF (.NOT.lfi%LPHASP(irgpim)) THEN
203 !
204  CALL lfipha_fort &
205 & (lfi, irep,irang,irgpim,iretin)
206 !
207  IF (iretin.EQ.1) THEN
208  GOTO 903
209  ELSEIF (iretin.EQ.2) THEN
210  GOTO 904
211  ELSEIF (iretin.NE.0) THEN
212  GOTO 1001
213  ENDIF
214 !
215 ENDIF
216 !
217 ilonex=lfi%MLGPOS(ixm(2*iartex-1,irgpim))
218 !**
219 ! 8. - RECHERCHE DE L'ARTICLE LOGIQUE DE DONNEES SUIVANT.
220 !-----------------------------------------------------------------------
221 !
222 CALL lficax_fort &
223 & (lfi, irep,irang,irgpim,iartic,iretin)
224 !
225 IF (iretin.EQ.1) THEN
226  GOTO 903
227 ELSEIF (iretin.EQ.2) THEN
228  GOTO 904
229 ELSEIF (iretin.NE.0.OR.iartic.EQ.0) THEN
230  GOTO 1001
231 ENDIF
232 !
233 irgpif=lfi%MRGPIF(irgpim)
234 !
235 IF (.NOT.lfi%LPHASP(irgpim)) THEN
236 !
237  CALL lfipha_fort &
238 & (lfi, irep,irang,irgpim,iretin)
239 !
240  IF (iretin.EQ.1) THEN
241  GOTO 903
242  ELSEIF (iretin.EQ.2) THEN
243  GOTO 904
244  ELSEIF (iretin.NE.0) THEN
245  GOTO 1001
246  ENDIF
247 !
248 ENDIF
249 !
250 klsuiv=lfi%MLGPOS(ixm(iartic,irgpim))
251 clsuiv=lfi%CNOMAR(ixc(iartic,irgpim))
252 !
253 ! Recherche de la longueur "utile" du nom d'article.
254 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
255 !
256 idecbl=0
257 !
258 811 CONTINUE
259 iposbl=idecbl+int(index(clsuiv(idecbl+1:),' '), jplikb)
260 !
261 IF (iposbl.LE.idecbl) THEN
262  ilclsu=lfi%JPNCPN
263 ELSEIF (clsuiv(iposbl:).EQ.' ') THEN
264  ilclsu=iposbl-1
265 ELSE
266  idecbl=iposbl
267  GOTO 811
268 ENDIF
269 !
270 IF (ilcdsu.GE.ilclsu) THEN
271  cdsuiv=clsuiv(:ilclno)
272 ELSE
273  irep=-24
274  clacti=clsuiv
275  GOTO 1001
276 ENDIF
277 !
278 GOTO 1001
279 !**
280 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
281 !-----------------------------------------------------------------------
282 !
283 903 CONTINUE
284 clacti='WRITE'
285 GOTO 909
286 !
287 904 CONTINUE
288 clacti='READ'
289 !
290 909 CONTINUE
291 !
292 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
293 !
294 irep=abs(irep)
295 !**
296 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
297 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
298 !-----------------------------------------------------------------------
299 !
300 1001 CONTINUE
301 krep=irep
302 llfata=llmoer(irep,irang)
303 !
304 IF (irang.NE.0) THEN
305  lfi%NDEROP(irang)=22
306  lfi%NDERCO(irang)=irep
307  IF (llverf) CALL lfiver_fort &
308 & (lfi, lfi%VERRUE(irang),'OFF')
309 ENDIF
310 !
311 IF (llfata.OR.ixnims(irang).EQ.2) THEN
312  inimes=2
313 ELSE
314  IF (lhook) CALL dr_hook('LFIPXA_FORT',1,zhook_handle)
315  RETURN
316 ENDIF
317 !
318 clnspr='LFIPXA'
319 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
320 & '', CDNOMA='''''',A,'''''', CDSTRU='''''',A, &
321 & '''''', CDSUIV='''''',A,'''''', KLSUIV='',I7)') &
322 & krep,knumer,clnoma(:ilclno),clstru(:ilclst), &
323 & clsuiv(:ilcdsu),klsuiv
324 CALL lfiems_fort &
325 & (lfi, knumer,inimes,irep,llfata,clmess, &
326 & clnspr,clacti)
327 !
328 IF (lhook) CALL dr_hook('LFIPXA_FORT',1,zhook_handle)
329 
330 CONTAINS
331 
332 #include "lficom2.ixc.h"
333 #include "lficom2.ixm.h"
334 #include "lficom2.ixnims.h"
335 #include "lficom2.llmoer.h"
336 
337 END SUBROUTINE lfipxa_fort
338 
339 
340 
341 ! Oct-2012 P. Marguinaud 64b LFI
342 SUBROUTINE lfipxa64 &
343 & (krep, knumer, cdnoma, cdstru, cdsuiv, klsuiv)
344 USE lfimod, ONLY : lfi => lficom_default, &
347 USE lfi_precision
348 IMPLICIT NONE
349 ! Arguments
350 INTEGER (KIND=JPLIKB) KREP ! OUT
351 INTEGER (KIND=JPLIKB) KNUMER ! IN
352 CHARACTER (LEN=*) CDNOMA ! IN
353 CHARACTER (LEN=*) CDSTRU ! IN
354 CHARACTER (LEN=*) CDSUIV ! OUT
355 INTEGER (KIND=JPLIKB) KLSUIV ! OUT
356 
357 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
358 
359 CALL lfipxa_fort &
360 & (lfi, krep, knumer, cdnoma, cdstru, cdsuiv, klsuiv)
361 
362 END SUBROUTINE lfipxa64
363 
364 SUBROUTINE lfipxa &
365 & (krep, knumer, cdnoma, cdstru, cdsuiv, klsuiv)
366 USE lfimod, ONLY : lfi => lficom_default, &
369 USE lfi_precision
370 IMPLICIT NONE
371 ! Arguments
372 INTEGER (KIND=JPLIKM) KREP ! OUT
373 INTEGER (KIND=JPLIKM) KNUMER ! IN
374 CHARACTER (LEN=*) CDNOMA ! IN
375 CHARACTER (LEN=*) CDSTRU ! IN
376 CHARACTER (LEN=*) CDSUIV ! OUT
377 INTEGER (KIND=JPLIKM) KLSUIV ! OUT
378 
379 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
380 
381 CALL lfipxa_mt &
382 & (lfi, krep, knumer, cdnoma, cdstru, cdsuiv, klsuiv)
383 
384 END SUBROUTINE lfipxa
385 
386 SUBROUTINE lfipxa_mt &
387 & (lfi, krep, knumer, cdnoma, cdstru, cdsuiv, klsuiv)
388 USE lfimod, ONLY : lficom
389 USE lfi_precision
390 IMPLICIT NONE
391 ! Arguments
392 type(lficom) lfi ! INOUT
393 INTEGER (KIND=JPLIKM) KREP ! OUT
394 INTEGER (KIND=JPLIKM) KNUMER ! IN
395 CHARACTER (LEN=*) CDNOMA ! IN
396 CHARACTER (LEN=*) CDSTRU ! IN
397 CHARACTER (LEN=*) CDSUIV ! OUT
398 INTEGER (KIND=JPLIKM) KLSUIV ! OUT
399 ! Local integers
400 INTEGER (KIND=JPLIKB) IREP ! OUT
401 INTEGER (KIND=JPLIKB) INUMER ! IN
402 INTEGER (KIND=JPLIKB) ILSUIV ! OUT
403 ! Convert arguments
404 
405 inumer = int( knumer, jplikb)
406 
407 CALL lfipxa_fort &
408 & (lfi, irep, inumer, cdnoma, cdstru, cdsuiv, ilsuiv)
409 
410 krep = int( irep, jplikm)
411 klsuiv = int( ilsuiv, jplikm)
412 
413 END SUBROUTINE lfipxa_mt
414 
415 !INTF KREP OUT
416 !INTF KNUMER IN
417 !INTF CDNOMA IN
418 !INTF CDSTRU IN
419 !INTF CDSUIV OUT
420 !INTF KLSUIV OUT
subroutine lfipxa64(KREP, KNUMER, CDNOMA, CDSTRU, CDSUIV, KLSUIV)
Definition: lfipxa.F90:344
subroutine lfipxa(KREP, KNUMER, CDNOMA, CDSTRU, CDSUIV, KLSUIV)
Definition: lfipxa.F90:366
integer, parameter jplikb
subroutine lfiran_fort(LFI, KREP, KRANG, CDNOMA, KRGPIM, KARTEX, KRETIN)
Definition: lfiran.F90:6
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 lfipxa_mt(LFI, KREP, KNUMER, CDNOMA, CDSTRU, CDSUIV, KLSUIV)
Definition: lfipxa.F90:388
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
subroutine lfipxa_fort(LFI, KREP, KNUMER, CDNOMA, CDSTRU, CDSUIV, KLSUIV)
Definition: lfipxa.F90:6
ERROR in index
Definition: ecsort_shared.h:90