SURFEX v8.1
General documentation of Surfex
lfisup.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 lfisup_fort &
5 & (lfi, krep, knumer, cdnoma, klonut )
6 USE lfimod, ONLY : lficom
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! SOUS-PROGRAMME PERMETTANT DE *SUPPRIMER* UN ARTICLE LOGIQUE
13 ! (DE DONNEES) SUR UNE UNITE LOGIQUE OUVERTE POUR LE LOGICIEL
14 ! DE FICHIERS INDEXES *LFI*; L'ARTICLE EST TRANSFORME EN "TROU"
15 ! DANS L'INDEX.
16 !**
17 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
18 ! KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
19 ! CDNOMA (ENTREE) ==> NOM DE L'ARTICLE A RECHERCHER;
20 ! KLONUT (SORTIE) ==> LONGUEUR *REUTILISABLE*
21 ! DE L'ARTICLE SUPPRIME.
22 !
23 !
24 TYPE(lficom) :: LFI
25 CHARACTER CDNOMA*(*), CLNOMA*(lfi%jpncpn)
26 !
27 INTEGER (KIND=JPLIKB) KREP, KNUMER, KLONUT, IMDESC
28 INTEGER (KIND=JPLIKB) IRANG, IREP, ILCDNO, ILCLNO
29 INTEGER (KIND=JPLIKB) IDECBL, IPOSBL, IARTEX, INBALO
30 INTEGER (KIND=JPLIKB) IRGPIM, IRGPIF, ILONGA, J
31 INTEGER (KIND=JPLIKB) IPOSEX, IFACTM, ILARPH, INALPP
32 INTEGER (KIND=JPLIKB) INALPI, INTPPI, INBPIR
33 INTEGER (KIND=JPLIKB) INPPIM, IRECPI, IREC, IRGPI
34 INTEGER (KIND=JPLIKB) IRPIMS, INPILE, IRNGMS
35 INTEGER (KIND=JPLIKB) IRETIN, INIMES
36 !
37 LOGICAL LLVERF
38 !
39 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
40 CHARACTER(LEN=LFI%JPLMES) CLMESS
41 CHARACTER(LEN=LFI%JPLFTX) CLACTI
42 LOGICAL LLFATA
43 
44 !**
45 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
46 !-----------------------------------------------------------------------
47 !
48 ! Appel legerement anticipe a LFINUM, garantissant l'initialisa-
49 ! tion des variables globales du logiciel a la 1ere utilisation.
50 !
51 REAL(KIND=JPRB) :: ZHOOK_HANDLE
52 IF (lhook) CALL dr_hook('LFISUP_FORT',0,zhook_handle)
53 clacti=''
54 CALL lfinum_fort &
55 & (lfi, knumer,irang)
56 llverf=.false.
57 irep=0
58 klonut=0
59 ilcdno=int(len(cdnoma), jplikb)
60 !
61 IF (ilcdno.LE.0) THEN
62  irep=-15
63  clnoma=lfi%CHINCO(:lfi%JPNCPN)
64  ilclno=lfi%JPNCPN
65  GOTO 1001
66 ELSEIF (cdnoma.EQ.' ') THEN
67  irep=-18
68  clnoma=' '
69  ilclno=1
70  GOTO 1001
71 ENDIF
72 !
73 ! Recherche de la longueur "utile" du nom d'article specifie.
74 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
75 !
76 idecbl=0
77 !
78 101 CONTINUE
79 iposbl=idecbl+int(index(cdnoma(idecbl+1:),' '), jplikb)
80 !
81 IF (iposbl.LE.idecbl) THEN
82  ilclno=ilcdno
83 ELSEIF (cdnoma(iposbl:).EQ.' ') THEN
84  ilclno=iposbl-1
85 ELSE
86  idecbl=iposbl
87  GOTO 101
88 ENDIF
89 !
90 IF (ilclno.LE.lfi%JPNCPN) THEN
91  clnoma=cdnoma(:ilclno)
92 ELSE
93  clnoma=cdnoma(:lfi%JPNCPN)
94  ilclno=lfi%JPNCPN
95  irep=-15
96  GOTO 1001
97 ENDIF
98 !
99 IF (irang.EQ.0) THEN
100  irep=-1
101  GOTO 1001
102 ENDIF
103 !
104  IF (lfi%LMULTI) CALL lfiver_fort &
105 & (lfi, lfi%VERRUE(irang),'ON')
106 llverf=lfi%LMULTI
107 !
108 IF (lfi%NEXPOR(irang).GT.0) THEN
109 !
110 ! Fichier en cours d'export... la seule modification acceptee
111 ! est l'ajout de nouveaux articles.
112 !
113  irep=-37
114  GOTO 1001
115 ENDIF
116 !
117 iartex=0
118 inbalo=lfi%MDES1D(ixm(lfi%JPNALO,irang))
119 !
120 IF (inbalo.NE.0) THEN
121 !**
122 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
123 ! A LA RECHERCHE DE L'ARTICLE LOGIQUE A SUPPRIMER.
124 !-----------------------------------------------------------------------
125 !
126  CALL lfiran_fort &
127 & (lfi, irep,irang,clnoma(:ilclno), &
128 & irgpim,iartex,iretin)
129 !
130  IF (iretin.EQ.1) THEN
131  GOTO 903
132  ELSEIF (iretin.EQ.2) THEN
133  GOTO 904
134  ELSEIF (iretin.NE.0) THEN
135  GOTO 1001
136  ENDIF
137 !
138 ENDIF
139 !
140 IF (iartex.EQ.0) THEN
141  irep=-20
142  clacti=clnoma(:ilclno)
143  GOTO 1001
144 ENDIF
145 !
146 ! ON COMPLETE LES CARACTERISTIQUES DE L'ARTICLE PAR SA LONGUEUR,
147 ! EXPRIMEE EN TERME DE DONNEES "LISIBLES" POUR L'UTILISATEUR.
148 !
149 irgpif=lfi%MRGPIF(irgpim)
150 !
151 IF (.NOT.lfi%LPHASP(irgpim)) THEN
152 !
153  CALL lfipha_fort &
154 & (lfi, irep,irang,irgpim,iretin)
155 !
156  IF (iretin.EQ.1) THEN
157  GOTO 903
158  ELSEIF (iretin.EQ.2) THEN
159  GOTO 904
160  ELSEIF (iretin.NE.0) THEN
161  GOTO 1001
162  ENDIF
163 !
164 ENDIF
165 !
166 ilonga=lfi%MLGPOS(ixm(2*iartex-1,irgpim))
167 iposex=lfi%MLGPOS(ixm(2*iartex,irgpim))
168 ifactm=lfi%MFACTM(irang)
169 ilarph=lfi%JPLARD*ifactm
170 inalpp=lfi%JPNAPP*ifactm
171 inalpi=min(inalpp,inbalo-(irgpif-1)*inalpp)
172 intppi=(inbalo-1+inalpp)/inalpp
173 inbpir=lfi%MDES1D(ixm(lfi%JPNPIR,irang))
174 inppim=lfi%NPPIMM(irang)
175 !**
176 ! 3. - AFIN D'ASSURER UN MEILLEUR RECYCLAGE (EVENTUEL) DE CE FUTUR
177 ! TROU, ON CALCULE SA LONGUEUR EFFECTIVEMENT REUTILISABLE.
178 !-----------------------------------------------------------------------
179 !
180 IF (iartex.EQ.1.AND.irgpif.GT.inbpir) THEN
181 !
182 ! IL Y A EU DEBORDEMENT DES P.A.I. PREALLOUEES, ET IL Y A
183 ! EN OUTRE UNE P.A.I. SUR LE FICHIER, JUSTE DERRIERE L'ARTICLE
184 ! LOGIQUE AUQUEL ON S'INTERESSE.
185 !
186  irecpi=lfi%MDES1D(ixm(ilarph+1-(irgpif-inbpir),irang))
187  klonut=ilarph*(irecpi-1)-iposex+1
188 ELSEIF (iartex.EQ.inalpi.AND.irgpif.EQ.intppi) THEN
189 !
190 ! CAS OU L'ARTICLE TROUVE EST LE DERNIER ARTICLE LOGIQUE DE
191 ! DONNEES, SANS P.A.I. JUSTE DERRIERE.
192 ! LA DERNIERE POSITION REUTILISABLE SANS AUGMENTER LA TAILLE
193 ! DU FICHIER CORRESPOND A LA FIN DU DERNIER ARTICLE PHYSIQUE
194 ! CONTENANT DES DONNEES, OU A LA FIN DU DERNIER ARTICLE PHYSIQUE
195 ! EFFECTIVEMENT ECRIT SUR LE FICHIER.
196 !
197  imdesc=lfi%MDES1D(ixm(lfi%JPNAPH,irang))
198  irec=max(1+(iposex+ilonga-2)/ilarph,imdesc)
199  klonut=ilarph*irec-iposex+1
200 !
201 ! EN ARRIVANT AU TEST CI-DESSOUS, ON EST DONC SUR QUE L'ARTICLE
202 ! TROUVE N'EST PAS LE DERNIER ARTICLE LOGIQUE.
203 ! ON VA CALCULER LA DISTANCE ENTRE LES DEBUTS D'ARTICLE,
204 ! CE QUI CONSTITUE LA LONGUEUR REUTILISABLE CHERCHEE.
205 !
206 ELSEIF (iartex.NE.inalpp) THEN
207 !
208 ! L'ARTICLE SUIVANT EST DANS LA MEME PAGE D'INDEX...
209 !
210  klonut=lfi%MLGPOS(ixm(2*iartex+2,irgpim))-iposex
211 ELSE
212 !
213 ! L'ARTICLE TROUVE EST EN PLUS EN FIN DE PAGE D'INDEX...
214 ! RECHERCHE DANS LES P.P.I. DE LA P.A.I. SUIVANTE.
215 !
216  DO j=2,inppim
217  irgpi=lfi%MRGPIM(j,irang)
218 !
219  IF (lfi%MRGPIF(irgpi).EQ.(irgpif+1)) THEN
220 !
221  irpims=irgpi
222 !
223  IF (.NOT.lfi%LPHASP(irpims)) THEN
224 !
225  CALL lfipha_fort &
226 & (lfi, irep,irang,irpims,iretin)
227 !
228  IF (iretin.EQ.1) THEN
229  GOTO 903
230  ELSEIF (iretin.EQ.2) THEN
231  GOTO 904
232  ELSEIF (iretin.NE.0) THEN
233  GOTO 1001
234  ENDIF
235 !
236  ENDIF
237 !
238  GOTO 305
239 !
240  ENDIF
241 !
242  ENDDO
243 !
244 ! LA P.A.I. SUIVANTE (EN RANG DANS LE FICHIER) N'EST PAS
245 ! EN MEMOIRE; DECIDEMENT, CELA SE GATE ! ... ON L'Y MET.
246 !
247  inpile=2
248  CALL lfipim_fort &
249 & (lfi, krep,irang,irngms,irpims, &
250 & irgpif+1,irgpif,inpile, iretin)
251 !
252  IF (iretin.EQ.1) THEN
253  GOTO 903
254  ELSEIF (iretin.EQ.2) THEN
255  GOTO 904
256  ELSEIF (iretin.NE.0) THEN
257  GOTO 1001
258  ENDIF
259 !
260 305 CONTINUE
261 !
262  klonut=lfi%MLGPOS(ixm(2_jplikb ,irpims))-iposex
263 ENDIF
264 !**
265 ! 4 - TRANSFORMATION EFFECTIVE DE L'ARTICLE LOGIQUE DE DONNEES
266 ! EN "TROU" D'INDEX.
267 !-----------------------------------------------------------------------
268 !
269 lfi%CNOMAR(ixc(iartex,irgpim))=' '
270 IF (lfi%NDERGF(irang).NE.lfi%JPNIL.AND. &
271 & lfi%CNDERA(irang).EQ.clnoma(:ilclno)) &
272 & lfi%CNDERA(irang)=' '
273 lfi%LECRPI(irgpim,1)=.true.
274 lfi%NBSUPP(irang)=lfi%NBSUPP(irang)+1
275 lfi%LMIMAL(irang)=lfi%LMIMAL(irang).OR. &
276 & ilonga.EQ.lfi%MDES1D(ixm(lfi%JPLNAL,irang)) &
277 & .OR.ilonga.EQ.lfi%MDES1D(ixm(lfi%JPLXAL,irang))
278 lfi%NBTROU(irang)=lfi%NBTROU(irang)+1
279 lfi%MDES1D(ixm(lfi%JPLTAL,irang))= &
280 & lfi%MDES1D(ixm(lfi%JPLTAL,irang))-ilonga
281 !
282 IF (klonut.NE.ilonga) THEN
283  lfi%MLGPOS(ixm(2*iartex-1,irgpim))=klonut
284  lfi%LECRPI(irgpim,2)=.true.
285 ENDIF
286 !
287 IF (.NOT.lfi%LMODIF(irang)) THEN
288 !
289 ! CAS DE LA PREMIERE MODIFICATION DEPUIS L'OUVERTURE DU FICHIER.
290 !
291  lfi%LMODIF(irang)=.true.
292  CALL lfimoe_fort &
293 & (lfi, irep,irang,iretin)
294 !
295  IF (iretin.EQ.1) THEN
296  GOTO 903
297  ELSEIF (iretin.EQ.2) THEN
298  GOTO 904
299  ELSEIF (iretin.NE.0) THEN
300  GOTO 1001
301  ENDIF
302 !
303 ENDIF
304 !
305 GOTO 1001
306 !**
307 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
308 !-----------------------------------------------------------------------
309 !
310 903 CONTINUE
311 clacti='WRITE'
312 GOTO 909
313 !
314 904 CONTINUE
315 clacti='READ'
316 !
317 909 CONTINUE
318 !
319 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
320 !
321 irep=abs(irep)
322 !**
323 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
324 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
325 !-----------------------------------------------------------------------
326 !
327 1001 CONTINUE
328 krep=irep
329 llfata=llmoer(irep,irang)
330 !
331 IF (irang.NE.0) THEN
332  lfi%NDEROP(irang)=15
333  lfi%NDERCO(irang)=irep
334  IF (llverf) CALL lfiver_fort &
335 & (lfi, lfi%VERRUE(irang),'OFF')
336 ENDIF
337 !
338 IF (llfata.OR.ixnims(irang).EQ.2) THEN
339  inimes=2
340 ELSE
341  IF (lhook) CALL dr_hook('LFISUP_FORT',1,zhook_handle)
342  RETURN
343 ENDIF
344 !
345 clnspr='LFISUP'
346 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
347 & '', CDNOMA='''''',A,'''''', KLONUT='',I8)') &
348 & krep,knumer,clnoma(:ilclno),klonut
349 CALL lfiems_fort &
350 & (lfi, knumer,inimes,irep,llfata, &
351 & clmess,clnspr,clacti)
352 !
353 IF (lhook) CALL dr_hook('LFISUP_FORT',1,zhook_handle)
354 
355 CONTAINS
356 
357 #include "lficom2.ixc.h"
358 #include "lficom2.ixm.h"
359 #include "lficom2.ixnims.h"
360 #include "lficom2.llmoer.h"
361 
362 END SUBROUTINE lfisup_fort
363 
364 
365 
366 ! Oct-2012 P. Marguinaud 64b LFI
367 SUBROUTINE lfisup64 &
368 & (krep, knumer, cdnoma, klonut)
369 USE lfimod, ONLY : lfi => lficom_default, &
372 USE lfi_precision
373 IMPLICIT NONE
374 ! Arguments
375 INTEGER (KIND=JPLIKB) KREP ! OUT
376 INTEGER (KIND=JPLIKB) KNUMER ! IN
377 CHARACTER (LEN=*) CDNOMA ! IN
378 INTEGER (KIND=JPLIKB) KLONUT ! OUT
379 
380 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
381 
382 CALL lfisup_fort &
383 & (lfi, krep, knumer, cdnoma, klonut)
384 
385 END SUBROUTINE lfisup64
386 
387 SUBROUTINE lfisup &
388 & (krep, knumer, cdnoma, klonut)
389 USE lfimod, ONLY : lfi => lficom_default, &
392 USE lfi_precision
393 IMPLICIT NONE
394 ! Arguments
395 INTEGER (KIND=JPLIKM) KREP ! OUT
396 INTEGER (KIND=JPLIKM) KNUMER ! IN
397 CHARACTER (LEN=*) CDNOMA ! IN
398 INTEGER (KIND=JPLIKM) KLONUT ! OUT
399 
400 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
401 
402 CALL lfisup_mt &
403 & (lfi, krep, knumer, cdnoma, klonut)
404 
405 END SUBROUTINE lfisup
406 
407 SUBROUTINE lfisup_mt &
408 & (lfi, krep, knumer, cdnoma, klonut)
409 USE lfimod, ONLY : lficom
410 USE lfi_precision
411 IMPLICIT NONE
412 ! Arguments
413 type(lficom) lfi ! INOUT
414 INTEGER (KIND=JPLIKM) KREP ! OUT
415 INTEGER (KIND=JPLIKM) KNUMER ! IN
416 CHARACTER (LEN=*) CDNOMA ! IN
417 INTEGER (KIND=JPLIKM) KLONUT ! OUT
418 ! Local integers
419 INTEGER (KIND=JPLIKB) IREP ! OUT
420 INTEGER (KIND=JPLIKB) INUMER ! IN
421 INTEGER (KIND=JPLIKB) ILONUT ! OUT
422 ! Convert arguments
423 
424 inumer = int( knumer, jplikb)
425 
426 CALL lfisup_fort &
427 & (lfi, irep, inumer, cdnoma, ilonut)
428 
429 krep = int( irep, jplikm)
430 klonut = int( ilonut, jplikm)
431 
432 END SUBROUTINE lfisup_mt
433 
434 !INTF KREP OUT
435 !INTF KNUMER IN
436 !INTF CDNOMA IN
437 !INTF KLONUT OUT
subroutine lfimoe_fort(LFI, KREP, KRANG, KRETIN)
Definition: lfimoe.F90:5
integer, parameter jplikb
subroutine lfisup_fort(LFI, KREP, KNUMER, CDNOMA, KLONUT)
Definition: lfisup.F90:6
subroutine lfiran_fort(LFI, KREP, KRANG, CDNOMA, KRGPIM, KARTEX, KRETIN)
Definition: lfiran.F90:6
subroutine lfisup_mt(LFI, KREP, KNUMER, CDNOMA, KLONUT)
Definition: lfisup.F90:409
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 lfisup(KREP, KNUMER, CDNOMA, KLONUT)
Definition: lfisup.F90:389
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 lfisup64(KREP, KNUMER, CDNOMA, KLONUT)
Definition: lfisup.F90:369
ERROR in index
Definition: ecsort_shared.h:90
subroutine lfipim_fort(LFI, KREP, KRANG, KRANGM, KRGPIM, KRGPIF, KRGFOR, KNPILE, KRETIN)
Definition: lfipim.F90:6