SURFEX v8.1
General documentation of Surfex
lficax.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 lficax_fort &
4 & (lfi, krep, krang, krgpim, kartex, kretin )
5 USE lfimod, ONLY : lficom
6 USE parkind1, ONLY : jprb
7 USE yomhook , ONLY : lhook, dr_hook
9 IMPLICIT NONE
10 !****
11 ! SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI;
12 ! RECHERCHE DE L'ARTICLE LOGIQUE *DE DONNEES* SUIVANT, DANS UNE
13 ! UNITE LOGIQUE DONNEE.
14 !**
15 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
16 ! KRANG (ENTREE) ==> RANG ( DANS LA TABLE *LFI%NUMERO* )
17 ! DE L'UNITE LOGIQUE CONCERNEE;
18 ! KRGPIM (SORTIE) ==> RANG DANS LES TABLES LFI%CNOMAR,LFI%MLGPOS,
19 ! ETC. DE LA P.P.I OU FIGURE
20 ! L'ARTICLE ( 0 SI PAS TROUVE );
21 ! KARTEX (SORTIE) ==> RANG ( DANS LA PAGE D'INDEX ) DE L'
22 ! ARTICLE S'IL EXISTE ( 0 SINON );
23 ! KRETIN (SORTIE) ==> CODE-RETOUR INTERNE.
24 !
25 !
26 TYPE(lficom) :: LFI
27 INTEGER (KIND=JPLIKB) KREP, KRANG, KRGPIM, KARTEX
28 INTEGER (KIND=JPLIKB) IRANG, INBALO, INALPP, INTPPI
29 INTEGER (KIND=JPLIKB) INPPIM, IDERGF, IRANGF, IRGPIF
30 INTEGER (KIND=JPLIKB) IRGPIM, IRANGM, ILFORC, J
31 INTEGER (KIND=JPLIKB) INPILE, IARTIK, IARTIC, IRETOU
32 INTEGER (KIND=JPLIKB) INIMES, INUMER, INALPI
33 INTEGER (KIND=JPLIKB) KRETIN, IRETIN
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 REAL(KIND=JPRB) :: ZHOOK_HANDLE
45 IF (lhook) CALL dr_hook('LFICAX_FORT',0,zhook_handle)
46 clacti=''
47 iretou=0
48 !
49 IF (krang.LE.0.OR.krang.GT.lfi%JPNXFI) THEN
50  krep=-16
51  GOTO 1001
52 ENDIF
53 !
54 irang=krang
55 krep=0
56 krgpim=0
57 kartex=0
58 inbalo=lfi%MDES1D(ixm(lfi%JPNALO,irang))
59 inalpp=lfi%JPNAPP*lfi%MFACTM(irang)
60 intppi=(inbalo-1+inalpp)/inalpp
61 inppim=lfi%NPPIMM(irang)
62 !
63 IF (lfi%NSUIVF(irang).EQ.lfi%JPNIL) THEN
64 !
65 ! ON N'A DONC PAS ENCORE APPELE CE SOUS-PROGRAMME POUR
66 ! RECHERCHER CET ARTICLE ( A PRIORI, VIA *LFICAS* ) .
67 !
68  IF (lfi%NDERGF(irang).EQ.lfi%JPNIL) THEN
69  idergf=0
70  ELSE
71  idergf=lfi%NDERGF(irang)
72  ENDIF
73 !
74  IF (idergf.GE.inbalo) THEN
75  lfi%NSUIVF(irang)=0
76  GOTO 1001
77  ENDIF
78 !
79  irangf=idergf+1
80 !
81 ELSEIF (lfi%NSUIVF(irang).EQ.0) THEN
82 !
83 ! PLUS D'ARTICLE LOGIQUE A LIRE "SEQUENTIELLEMENT".
84 !
85  GOTO 1001
86 ELSEIF (lfi%NDERGF(irang).EQ.lfi%JPNIL.OR. &
87 & lfi%NSUIVF(irang).GT.lfi%NDERGF(irang)) THEN
88  irangf=lfi%NSUIVF(irang)
89 ELSE
90  krep=-16
91  GOTO 1001
92 ENDIF
93 !**
94 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
95 ! A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE,
96 ! DEFINI PAR SON RANG "A PRIORI" DANS LE FICHIER.
97 ! ( MAIS IL FAUT "SAUTER" LES TROUS )
98 !-----------------------------------------------------------------------
99 !*
100 ! 2.1 - RECHERCHE DANS LES PAGES D'INDEX .
101 !-----------------------------------------------------------------------
102 !
103 irgpif=1+(irangf-1)/inalpp
104 !
105 211 CONTINUE
106 !
107 IF (irangf.LE.inalpp) THEN
108  irgpim=lfi%MRGPIM(1,irang)
109  GOTO 215
110 ELSEIF (irangf.GT.inalpp*(intppi-1)) THEN
111  irgpim=lfi%MRGPIM(lfi%NPODPI(irang),irang)
112  GOTO 215
113 ENDIF
114 !
115 DO j=2,inppim
116 irgpim=lfi%MRGPIM(j,irang)
117 IF (lfi%MRGPIF(irgpim).EQ.irgpif) GOTO 215
118 ENDDO
119 !
120 ! MISE EN MEMOIRE DE L'ARTICLE D'INDEX "NOMS" CHERCHE.
121 !
122 ilforc=1
123 inpile=1
124 CALL lfipim_fort &
125 & (lfi, krep,irang,irangm,irgpim,irgpif, &
126 & ilforc,inpile,iretin)
127 !
128 IF (iretin.EQ.1) THEN
129  GOTO 903
130 ELSEIF (iretin.EQ.2) THEN
131  GOTO 904
132 ELSEIF (iretin.NE.0) THEN
133  GOTO 1001
134 ENDIF
135 !
136 inppim=max(inppim,irangm)
137 !
138 215 CONTINUE
139 iartik=irangf-inalpp*(irgpif-1)
140 inalpi=min(inalpp,inbalo-(irgpif-1)*inalpp)
141 !
142 ! ON CHERCHE LE PREMIER ARTICLE LOGIQUE *DE DONNEES* DE LA PAGE
143 ! D'INDEX, A PARTIR DU RANG *IARTIK* DANS CETTE PAGE.
144 !
145 DO j=iartik,inalpi
146 !
147 IF (lfi%CNOMAR(ixc(j,irgpim)).NE.' ') THEN
148  iartic=j
149  GOTO 220
150 ENDIF
151 !
152 ENDDO
153 !
154 ! CHOU BLANC POUR CETTE PAGE... A PRIORI, ON VA CHERCHER DANS
155 ! LA P.A.I. SUIVANTE, EN RANG DANS LE FICHIER.
156 !
157 IF (irgpif.LT.intppi) THEN
158  irangf=inalpp*irgpif+1
159  irgpif=irgpif+1
160  GOTO 211
161 ENDIF
162 !
163 ! SI ON ARRIVE ICI, C'EST QUE LE DERNIER ARTICLE LOGIQUE EST UN TROU.
164 !
165 lfi%NSUIVF(irang)=0
166 GOTO 1001
167 !*
168 ! 2.2 - ARTICLE DE DONNEES REPERE, ON RENVOIE SES CARACTERISTIQUES.
169 !-----------------------------------------------------------------------
170 !
171 220 CONTINUE
172 krgpim=irgpim
173 kartex=iartic
174 lfi%NSUIVF(irang)=(irgpif-1)*inalpp+iartic
175 GOTO 1001
176 !**
177 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
178 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
179 !-----------------------------------------------------------------------
180 !
181 903 CONTINUE
182 iretou=1
183 clacti='WRITE'
184 GOTO 909
185 !
186 904 CONTINUE
187 iretou=2
188 clacti='READ'
189 !
190 909 CONTINUE
191 krep=abs(krep)
192 !**
193 ! 10. - PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE,
194 ! VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR.
195 !-----------------------------------------------------------------------
196 !
197 1001 CONTINUE
198 llfata=llmoer(krep,krang)
199 !
200 IF (krep.EQ.0) THEN
201  kretin=0
202 ELSEIF (krep.GT.0) THEN
203  kretin=iretou
204 ELSE
205  kretin=3
206 ENDIF
207 !
208 IF (lfi%LMISOP.OR.llfata) THEN
209  inumer=lfi%NUMERO(krang)
210  inimes=2
211  clnspr='LFICAX'
212  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KRANG='',I3, &
213 & '', KRGPIM='',I3,'', KARTEX='',I5,'', KRETIN='',I2)') &
214 & krep,krang,krgpim,kartex,kretin
215  CALL lfiems_fort &
216 & (lfi, inumer,inimes,krep,.false., &
217 & clmess,clnspr,clacti)
218 ENDIF
219 !
220 IF (lhook) CALL dr_hook('LFICAX_FORT',1,zhook_handle)
221 
222 CONTAINS
223 
224 #include "lficom2.ixc.h"
225 #include "lficom2.ixm.h"
226 #include "lficom2.llmoer.h"
227 
228 END SUBROUTINE lficax_fort
229 
230 
231 
232 ! Oct-2012 P. Marguinaud 64b LFI
233 SUBROUTINE lficax64 &
234 & (krep, krang, krgpim, kartex, kretin)
235 USE lfimod, ONLY : lfi => lficom_default, &
238 USE lfi_precision
239 IMPLICIT NONE
240 ! Arguments
241 INTEGER (KIND=JPLIKB) KREP ! OUT
242 INTEGER (KIND=JPLIKB) KRANG ! IN
243 INTEGER (KIND=JPLIKB) KRGPIM ! OUT
244 INTEGER (KIND=JPLIKB) KARTEX ! OUT
245 INTEGER (KIND=JPLIKB) KRETIN ! OUT
246 
247 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
248 
249 CALL lficax_fort &
250 & (lfi, krep, krang, krgpim, kartex, kretin)
251 
252 END SUBROUTINE lficax64
253 
254 SUBROUTINE lficax &
255 & (krep, krang, krgpim, kartex, kretin)
256 USE lfimod, ONLY : lfi => lficom_default, &
259 USE lfi_precision
260 IMPLICIT NONE
261 ! Arguments
262 INTEGER (KIND=JPLIKM) KREP ! OUT
263 INTEGER (KIND=JPLIKM) KRANG ! IN
264 INTEGER (KIND=JPLIKM) KRGPIM ! OUT
265 INTEGER (KIND=JPLIKM) KARTEX ! OUT
266 INTEGER (KIND=JPLIKM) KRETIN ! OUT
267 
268 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
269 
270 CALL lficax_mt &
271 & (lfi, krep, krang, krgpim, kartex, kretin)
272 
273 END SUBROUTINE lficax
274 
275 SUBROUTINE lficax_mt &
276 & (lfi, krep, krang, krgpim, kartex, kretin)
277 USE lfimod, ONLY : lficom
278 USE lfi_precision
279 IMPLICIT NONE
280 ! Arguments
281 type(lficom) lfi ! INOUT
282 INTEGER (KIND=JPLIKM) KREP ! OUT
283 INTEGER (KIND=JPLIKM) KRANG ! IN
284 INTEGER (KIND=JPLIKM) KRGPIM ! OUT
285 INTEGER (KIND=JPLIKM) KARTEX ! OUT
286 INTEGER (KIND=JPLIKM) KRETIN ! OUT
287 ! Local integers
288 INTEGER (KIND=JPLIKB) IREP ! OUT
289 INTEGER (KIND=JPLIKB) IRANG ! IN
290 INTEGER (KIND=JPLIKB) IRGPIM ! OUT
291 INTEGER (KIND=JPLIKB) IARTEX ! OUT
292 INTEGER (KIND=JPLIKB) IRETIN ! OUT
293 ! Convert arguments
294 
295 irang = int( krang, jplikb)
296 
297 CALL lficax_fort &
298 & (lfi, irep, irang, irgpim, iartex, iretin)
299 
300 krep = int( irep, jplikm)
301 krgpim = int( irgpim, jplikm)
302 kartex = int( iartex, jplikm)
303 kretin = int( iretin, jplikm)
304 
305 END SUBROUTINE lficax_mt
306 
307 !INTF KREP OUT
308 !INTF KRANG IN
309 !INTF KRGPIM OUT
310 !INTF KARTEX OUT
311 !INTF KRETIN OUT
integer, parameter jplikb
subroutine lficax_fort(LFI, KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficax.F90:5
subroutine new_lfi_default()
Definition: lfimod.F90:376
subroutine lficax(KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficax.F90:256
logical, save lficom_default_init
Definition: lfimod.F90:371
integer, parameter jprb
Definition: parkind1.F90:32
subroutine lficax_mt(LFI, KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficax.F90:277
subroutine lficax64(KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficax.F90:235
type(lficom), target, save lficom_default
Definition: lfimod.F90:370
logical lhook
Definition: yomhook.F90:15
integer, parameter jplikm
subroutine lfiems_fort(LFI, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI)
Definition: lfiems.F90:7
Definition: lfimod.F90:1
subroutine lfipim_fort(LFI, KREP, KRANG, KRANGM, KRGPIM, KRGPIF, KRGFOR, KNPILE, KRETIN)
Definition: lfipim.F90:6