SURFEX v8.1
General documentation of Surfex
lfidst.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 lfidst_fort &
4 & (lfi, krep, krang, kranie, cdstru, klong )
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 ! Decorticage de la STructure decrivant un article logique
13 ! de donnees, en vue de son import ou export ulterieur.
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 ! KRANIE (Entree) ==> Rang dans les tables d'import/exp;
19 ! CDSTRU (Entree) ==> Structure interne de cet article;
20 ! KLONG (Entree) ==> Longueur (mots) de l'article.
21 !
22 ! Les syntaxes autorisees pour CDSTRU sont decrites ci-dessous.
23 ! La presence de crochets [ ] indique le cote optionnel, mais dans
24 ! tous les cas ce cote optionnel est reserve a la toute derniere
25 ! partie de la description. Si l'argument optionnel est present,
26 ! il doit etre coherent avec la longueur effective de l'article.
27 !
28 ! 'type [nbre]' ==> article homogene,ex: 'i', 'r 20'
29 !
30 ! 'type_1 nbre_1 ... type_n [nbre_n]' ==> juxtaposition de types,ex:
31 ! 'i 2 r', 'i 3 r 2 c 80000'
32 !
33 ! '(type_1 nbre_1 ... type_n nbre_n) [nbre]' ==> boucle,ex:
34 ! '(i 1 r 1)'
35 !
36 ! ou une juxtaposition des possibilites ci-dessus.
37 !
38 ! Les blancs ne sont pas obligatoires, ils sont neutres et utilises
39 ! ci-dessus pour des questions de clarte.
40 !
41 !
42 TYPE(lficom) :: LFI
43 CHARACTER CDSTRU*(*), CLSTRU*(lfi%jpncpn)
44 !
45 INTEGER (KIND=JPLIKB) KREP, KRANG, KRANIE, KLONG
46 INTEGER (KIND=JPLIKB) IRANG, ILCLST, ILUSTR
47 INTEGER (KIND=JPLIKB) J, INMOTS, INIPAR, IDEXPL, INGROU
48 INTEGER (KIND=JPLIKB) IJ, IDECAL, IPOSTY
49 INTEGER (KIND=JPLIKB) INIMES, INUMER, IDECGR, INTYPE
50 !
51 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
52 CHARACTER(LEN=LFI%JPLMES) CLMESS
53 CHARACTER(LEN=LFI%JPLFTX) CLACTI
54 LOGICAL LLFATA
55 
56 !**
57 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
58 !-----------------------------------------------------------------------
59 !
60 REAL(KIND=JPRB) :: ZHOOK_HANDLE
61 IF (lhook) CALL dr_hook('LFIDST_FORT',0,zhook_handle)
62 clacti=''
63 ilustr=int(len(cdstru), jplikb)
64 clstru=' '
65 ilclst=1
66 !
67 IF (krang.LE.0.OR.krang.GT.lfi%JPNXFI.OR.ilustr.LE.0.OR. &
68 & kranie.LE.0.OR.kranie.GT.lfi%JPIMEX) THEN
69  krep=-16
70  ilclst=min(lfi%JPNCPN,int(len(clstru), jplikb))
71  clstru=lfi%CHINCO(:ilclst)
72  GOTO 1001
73 ENDIF
74 !
75 irang=krang
76 krep=0
77 ilclst=min(ilustr,int(len(clstru), jplikb))
78 clstru=cdstru(:ilclst)
79 inmots=0
80 inipar=0
81 ingrou=0
82 idecgr=0
83 idexpl=lfi%NREXPL(lfi%NAEXPL(krang),kranie)
84 ij=0
85 !**
86 ! 2. - DECORTICAGE PROPREMENT DIT.
87 !-----------------------------------------------------------------------
88 !*
89 ! 2.1 - DEBUT "BOUCLE" SUR LES GROUPES.
90 !-----------------------------------------------------------------------
91 !
92 211 CONTINUE
93 !
94 idecal=ij
95 !
96 IF (idecal.GE.ilustr) GOTO 301
97 !
98 DO j=idecal+1,ilustr
99 !
100 IF (cdstru(j:j).EQ.'(') THEN
101 !
102  ingrou=ingrou+1
103  inipar=inipar+1
104 !
105  IF (inipar.GT.1) THEN
106  krep=-40
107  GOTO 1001
108  ENDIF
109 !
110  ij=j
111 !
112 ELSEIF (cdstru(j:j).NE.' ') THEN
113 !
114  iposty=int(index(lfi%CTYPMX,cdstru(j:j)), jplikb)
115 !
116  IF (iposty.EQ.0) THEN
117  krep=-40
118  GOTO 1001
119  ENDIF
120 !
121  ingrou=ingrou+1
122  ij=j-1
123 !
124 ENDIF
125 !
126 ENDDO
127 !*
128 ! 2.2 - DEBUT "BOUCLE" SUR LES TYPES.
129 !-----------------------------------------------------------------------
130 !
131 intype=0
132 !
133 idecal=ij
134 !
135 DO j=idecal+1,ilustr
136 !
137 IF (cdstru(j:j).EQ.')') THEN
138 !
139  inipar=inipar-1
140 !
141  IF (intype.EQ.0.OR.inipar.NE.0) THEN
142  krep=-40
143  GOTO 1001
144  ENDIF
145 !
146  ij=j
147 
148  GOTO 211
149 !
150 ELSEIF (cdstru(j:j).NE.' ') THEN
151 !
152  iposty=int(index(lfi%CTYPMX,cdstru(j:j)), jplikb)
153 !
154  IF (iposty.EQ.0) THEN
155  krep=-40
156  GOTO 1001
157  ENDIF
158 !
159  intype=intype+1
160 !
161  IF ((idexpl+2).GT.lfi%JPDEXP) THEN
162  krep=-42
163  GOTO 1001
164  ENDIF
165 !
166  lfi%NDEXPL(idexpl+1,kranie)=iposty
167 !
168  IF (j.EQ.ilustr) THEN
169 !
170  IF (inipar.EQ.0) THEN
171  lfi%NDEXPL(idexpl+2,kranie)=lfi%JPNIL
172  idexpl=idexpl+2
173  GOTO 301
174  ELSE
175  krep=-40
176  GOTO 1001
177  ENDIF
178 !
179  ELSE
180 !
181  CALL lfichi_fort &
182 & (lfi, krep,cdstru(j+1:ilustr), &
183 & lfi%NDEXPL(idexpl+2,kranie), &
184 & ij)
185  IF (krep.NE.0) GOTO 1001
186 !
187  idexpl=idexpl+2
188 !
189  ENDIF
190 !
191 ENDIF
192 !
193 ENDDO
194 !
195 
196 
197 !
198 301 CONTINUE
199 !
200 
201 
202 !**
203 ! 10. - PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE,
204 ! VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR.
205 !-----------------------------------------------------------------------
206 !
207 1001 CONTINUE
208 llfata=llmoer(krep,krang)
209 !
210 IF (lfi%LMISOP.OR.llfata) THEN
211  inumer=lfi%NUMERO(krang)
212  inimes=2
213  clnspr='LFIDST'
214  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KRANG='',I3, &
215 & '''''', CDSTRU='''''',A,'''''', KLONG='',I7)') &
216 & krep,krang,clstru(:ilclst),klong
217  CALL lfiems_fort &
218 & (lfi, inumer,inimes,krep,.false., &
219 & clmess,clnspr,clacti)
220 ENDIF
221 !
222 IF (lhook) CALL dr_hook('LFIDST_FORT',1,zhook_handle)
223 
224 CONTAINS
225 
226 #include "lficom2.llmoer.h"
227 
228 END SUBROUTINE lfidst_fort
229 
230 
231 
232 ! Oct-2012 P. Marguinaud 64b LFI
233 SUBROUTINE lfidst64 &
234 & (krep, krang, kranie, cdstru, klong)
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) KRANIE ! IN
244 CHARACTER (LEN=*) CDSTRU ! IN
245 INTEGER (KIND=JPLIKB) KLONG ! IN
246 
247 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
248 
249 CALL lfidst_fort &
250 & (lfi, krep, krang, kranie, cdstru, klong)
251 
252 END SUBROUTINE lfidst64
253 
254 SUBROUTINE lfidst &
255 & (krep, krang, kranie, cdstru, klong)
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) KRANIE ! IN
265 CHARACTER (LEN=*) CDSTRU ! IN
266 INTEGER (KIND=JPLIKM) KLONG ! IN
267 
268 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
269 
270 CALL lfidst_mt &
271 & (lfi, krep, krang, kranie, cdstru, klong)
272 
273 END SUBROUTINE lfidst
274 
275 SUBROUTINE lfidst_mt &
276 & (lfi, krep, krang, kranie, cdstru, klong)
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) KRANIE ! IN
285 CHARACTER (LEN=*) CDSTRU ! IN
286 INTEGER (KIND=JPLIKM) KLONG ! IN
287 ! Local integers
288 INTEGER (KIND=JPLIKB) IREP ! OUT
289 INTEGER (KIND=JPLIKB) IRANG ! IN
290 INTEGER (KIND=JPLIKB) IRANIE ! IN
291 INTEGER (KIND=JPLIKB) ILONG ! IN
292 ! Convert arguments
293 
294 irang = int( krang, jplikb)
295 iranie = int( kranie, jplikb)
296 ilong = int( klong, jplikb)
297 
298 CALL lfidst_fort &
299 & (lfi, irep, irang, iranie, cdstru, ilong)
300 
301 krep = int( irep, jplikm)
302 
303 END SUBROUTINE lfidst_mt
304 
305 !INTF KREP OUT
306 !INTF KRANG IN
307 !INTF KRANIE IN
308 !INTF CDSTRU IN
309 !INTF KLONG IN
subroutine lfidst_mt(LFI, KREP, KRANG, KRANIE, CDSTRU, KLONG)
Definition: lfidst.F90:277
integer, parameter jplikb
subroutine lfidst(KREP, KRANG, KRANIE, CDSTRU, KLONG)
Definition: lfidst.F90:256
subroutine lfidst64(KREP, KRANG, KRANIE, CDSTRU, KLONG)
Definition: lfidst.F90:235
subroutine new_lfi_default()
Definition: lfimod.F90:376
subroutine lfichi_fort(LFI, KREP, CDSTRU, KVAL, KPOSC2)
Definition: lfichi.F90:5
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
subroutine lfidst_fort(LFI, KREP, KRANG, KRANIE, CDSTRU, KLONG)
Definition: lfidst.F90:5
Definition: lfimod.F90:1
ERROR in index
Definition: ecsort_shared.h:90