SURFEX v8.1
General documentation of Surfex
lficaq.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 lficaq_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* PRECEDENT, 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, KRETIN
33 INTEGER (KIND=JPLIKB) 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('LFICAQ_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%NPRECF(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 *LFICAP* ) .
67 !
68  IF (lfi%NDERGF(irang).EQ.lfi%JPNIL) THEN
69  idergf=inbalo+1
70  ELSE
71  idergf=lfi%NDERGF(irang)
72  ENDIF
73 !
74  IF (idergf.LE.1) THEN
75  lfi%NPRECF(irang)=0
76  GOTO 1001
77  ENDIF
78 !
79  irangf=idergf-1
80 !
81 ELSEIF (lfi%NPRECF(irang).EQ.0) THEN
82 !
83 ! PLUS D'ARTICLE LOGIQUE "PRECEDENT" A LIRE .
84 !
85  GOTO 1001
86 ELSEIF (lfi%NDERGF(irang).EQ.lfi%JPNIL.OR. &
87 & lfi%NPRECF(irang).LT.lfi%NDERGF(irang)) THEN
88  irangf=lfi%NPRECF(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 !
141 ! ON CHERCHE LE PREMIER ARTICLE LOGIQUE *DE DONNEES* DE LA PAGE
142 ! D'INDEX, A PARTIR DU RANG *IARTIK* DANS CETTE PAGE.
143 !
144 DO j=iartik,1,-1
145 !
146 IF (lfi%CNOMAR(ixc(j,irgpim)).NE.' ') THEN
147  iartic=j
148  GOTO 220
149 ENDIF
150 !
151 ENDDO
152 !
153 ! CHOU BLANC POUR CETTE PAGE... A PRIORI, ON VA CHERCHER DANS
154 ! LA P.A.I. PRECEDENTE, EN RANG DANS LE FICHIER.
155 !
156 IF (irgpif.GT.1) THEN
157  irgpif=irgpif-1
158  irangf=inalpp*irgpif
159  GOTO 211
160 ENDIF
161 !
162 ! SI ON ARRIVE ICI, C'EST QUE LE PREMIER ARTICLE LOGIQUE EST UN TROU
163 !
164 lfi%NPRECF(irang)=0
165 GOTO 1001
166 !*
167 ! 2.2 - ARTICLE DE DONNEES REPERE, ON RENVOIE SES CARACTERISTIQUES.
168 !-----------------------------------------------------------------------
169 !
170 220 CONTINUE
171 krgpim=irgpim
172 kartex=iartic
173 lfi%NPRECF(irang)=(irgpif-1)*inalpp+iartic
174 GOTO 1001
175 !**
176 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
177 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
178 !-----------------------------------------------------------------------
179 !
180 903 CONTINUE
181 iretou=1
182 clacti='WRITE'
183 GOTO 909
184 !
185 904 CONTINUE
186 iretou=2
187 clacti='READ'
188 !
189 909 CONTINUE
190 krep=abs(krep)
191 !**
192 ! 10. - PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE,
193 ! VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR.
194 !-----------------------------------------------------------------------
195 !
196 1001 CONTINUE
197 llfata=llmoer(krep,krang)
198 !
199 IF (krep.EQ.0) THEN
200  kretin=0
201 ELSEIF (krep.GT.0) THEN
202  kretin=iretou
203 ELSE
204  kretin=3
205 ENDIF
206 !
207 IF (lfi%LMISOP.OR.llfata) THEN
208  inumer=lfi%NUMERO(krang)
209  inimes=2
210  clnspr='LFICAQ'
211  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KRANG='',I3, &
212 & '', KRGPIM='',I3,'', KARTEX='',I5,'', KRETIN='',I2)') &
213 & krep,krang,krgpim,kartex,kretin
214  CALL lfiems_fort &
215 & (lfi, inumer,inimes,krep,.false., &
216 & clmess,clnspr,clacti)
217 ENDIF
218 !
219 IF (lhook) CALL dr_hook('LFICAQ_FORT',1,zhook_handle)
220 
221 CONTAINS
222 
223 #include "lficom2.ixc.h"
224 #include "lficom2.ixm.h"
225 #include "lficom2.llmoer.h"
226 
227 END SUBROUTINE lficaq_fort
228 
229 
230 
231 ! Oct-2012 P. Marguinaud 64b LFI
232 SUBROUTINE lficaq64 &
233 & (krep, krang, krgpim, kartex, kretin)
234 USE lfimod, ONLY : lfi => lficom_default, &
237 USE lfi_precision
238 IMPLICIT NONE
239 ! Arguments
240 INTEGER (KIND=JPLIKB) KREP ! OUT
241 INTEGER (KIND=JPLIKB) KRANG ! IN
242 INTEGER (KIND=JPLIKB) KRGPIM ! OUT
243 INTEGER (KIND=JPLIKB) KARTEX ! OUT
244 INTEGER (KIND=JPLIKB) KRETIN ! OUT
245 
246 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
247 
248 CALL lficaq_fort &
249 & (lfi, krep, krang, krgpim, kartex, kretin)
250 
251 END SUBROUTINE lficaq64
252 
253 SUBROUTINE lficaq &
254 & (krep, krang, krgpim, kartex, kretin)
255 USE lfimod, ONLY : lfi => lficom_default, &
258 USE lfi_precision
259 IMPLICIT NONE
260 ! Arguments
261 INTEGER (KIND=JPLIKM) KREP ! OUT
262 INTEGER (KIND=JPLIKM) KRANG ! IN
263 INTEGER (KIND=JPLIKM) KRGPIM ! OUT
264 INTEGER (KIND=JPLIKM) KARTEX ! OUT
265 INTEGER (KIND=JPLIKM) KRETIN ! OUT
266 
267 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
268 
269 CALL lficaq_mt &
270 & (lfi, krep, krang, krgpim, kartex, kretin)
271 
272 END SUBROUTINE lficaq
273 
274 SUBROUTINE lficaq_mt &
275 & (lfi, krep, krang, krgpim, kartex, kretin)
276 USE lfimod, ONLY : lficom
277 USE lfi_precision
278 IMPLICIT NONE
279 ! Arguments
280 type(lficom) lfi ! INOUT
281 INTEGER (KIND=JPLIKM) KREP ! OUT
282 INTEGER (KIND=JPLIKM) KRANG ! IN
283 INTEGER (KIND=JPLIKM) KRGPIM ! OUT
284 INTEGER (KIND=JPLIKM) KARTEX ! OUT
285 INTEGER (KIND=JPLIKM) KRETIN ! OUT
286 ! Local integers
287 INTEGER (KIND=JPLIKB) IREP ! OUT
288 INTEGER (KIND=JPLIKB) IRANG ! IN
289 INTEGER (KIND=JPLIKB) IRGPIM ! OUT
290 INTEGER (KIND=JPLIKB) IARTEX ! OUT
291 INTEGER (KIND=JPLIKB) IRETIN ! OUT
292 ! Convert arguments
293 
294 irang = int( krang, jplikb)
295 
296 CALL lficaq_fort &
297 & (lfi, irep, irang, irgpim, iartex, iretin)
298 
299 krep = int( irep, jplikm)
300 krgpim = int( irgpim, jplikm)
301 kartex = int( iartex, jplikm)
302 kretin = int( iretin, jplikm)
303 
304 END SUBROUTINE lficaq_mt
305 
306 !INTF KREP OUT
307 !INTF KRANG IN
308 !INTF KRGPIM OUT
309 !INTF KARTEX OUT
310 !INTF KRETIN OUT
subroutine lficaq_fort(LFI, KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficaq.F90:5
integer, parameter jplikb
subroutine lficaq_mt(LFI, KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficaq.F90:276
subroutine lficaq64(KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficaq.F90:234
subroutine new_lfi_default()
Definition: lfimod.F90:376
subroutine lficaq(KREP, KRANG, KRGPIM, KARTEX, KRETIN)
Definition: lficaq.F90:255
logical, save lficom_default_init
Definition: lfimod.F90:371
integer, parameter jprb
Definition: parkind1.F90:32
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