SURFEX v8.1
General documentation of Surfex
lfiree.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 lfiree_fort &
4 & (lfi, krep, krang, cdnoma, klong, krpiex, &
5 & kartex, &
6 & klonex, krpiec, kartec, kposec, kdtrou, &
7 & klonut, kretin )
8 USE lfimod, ONLY : lficom
9 USE parkind1, ONLY : jprb
10 USE yomhook , ONLY : lhook, dr_hook
11 USE lfi_precision
12 IMPLICIT NONE
13 !****
14 ! SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES LFI
15 ! RECHERCHE D'UN EMPLACEMENT OU ECRIRE UN ARTICLE LOGIQUE, DANS
16 ! L'UNITE LOGIQUE CONCERNEE.
17 !**
18 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
19 ! KRANG (ENTREE) ==> RANG ( DANS LA TABLE *LFI%NUMERO* )
20 ! DE L'UNITE LOGIQUE CONCERNEE;
21 ! CDNOMA (ENTREE) ==> NOM DE L'ARTICLE A RECHERCHER;
22 ! KLONG (ENTREE) ==> LONGUEUR DE L'ARTICLE A ECRIRE;
23 ! KRPIEX (SORTIE) ==> RANG ( DANS LE FICHIER ) DE L'ARTI-
24 ! CLE S'IL EXISTAIT DEJA ( 0 SINON );
25 ! KARTEX (SORTIE) ==> RANG ( DANS LA PAGE D'INDEX ) DE L'
26 ! ARTICLE S'IL EXISTAIT ( 0 SINON );
27 ! KLONEX (SORTIE) ==> LONGUEUR DE L'ARTICLE S'IL EXISTAIT
28 ! DEJA ( 0 SINON );
29 ! KRPIEC (SORTIE) ==> RANG ( DANS LE FICHIER ) DE L'ARTI-
30 ! CLE A ECRIRE;
31 ! KARTEC (SORTIE) ==> RANG ( DANS LA PAGE D'INDEX ) DE L'
32 ! ARTICLE A ECRIRE;
33 ! KPOSEC (SORTIE) ==> POSITION ( DANS LE FICHIER ) OU
34 ! COMMENCER A ECRIRE L'ARTICLE;
35 ! KDTROU (SORTIE) ==> VARIATION DU NOMBRE DE TROUS DANS
36 ! L'INDEX, DUE A CETTE ECRITURE;
37 ! KLONUT (SORTIE) ==> SI L'ON VA CREER UN TROU DANS L'IN-
38 ! DEX, LONGUEUR TOTALE UTILISABLE DE
39 ! CE TROU;
40 ! KRETIN (SORTIE) ==> CODE-RETOUR INTERNE.
41 !*
42 ! METHODE: SI L'ARTICLE EXISTE DEJA DANS LE FICHIER, ON ESSAIE AUTANT
43 ! QUE POSSIBLE DE "REECRIRE" SUR PLACE, CE QUI EST POSSIBLE
44 ! SI L'ON A UNE LONGUEUR D'ARTICLE INFERIEURE OU EGALE A
45 ! CELLE EXISTANTE, MAIS EST AUSSI POSSIBLE PAR RECYCLAGE
46 ! DE "TROUS" DE 2 CATEGORIES: EN FIN D'ARTICLE EXISTANT
47 ! ( AVANT L'ARTICLE LOGIQUE OU L'ARTICLE D'INDEX SUIVANT ),
48 ! ET/OU S'IL EXISTE UN "TROU" REPERTORIE DANS L'INDEX CORRE-
49 ! SPONDANT A UN ARTICLE LOGIQUE JUSTE DERRIERE CELUI EXIS-
50 ! TANT.
51 ! SI LA REECRITURE N'EST PAS POSSIBLE, ON ESSAIE ALORS DE
52 ! REUTILISER UN EVENTUEL "TROU" REPERTORIE DANS L'INDEX;
53 ! EN DESESPOIR DE CAUSE, ON ECRIT EN FIN DE FICHIER.
54 !
55 !
56 TYPE(lficom) :: LFI
57 CHARACTER CDNOMA*(*)
58 !
59 INTEGER (KIND=JPLIKB) KREP, KRANG, KLONG, KRPIEX, KARTEX
60 INTEGER (KIND=JPLIKB) KLONEX, KRPIEC, KARTEC
61 INTEGER (KIND=JPLIKB) KPOSEC, KDTROU, KLONUT, ILCDNO, IRANG
62 INTEGER (KIND=JPLIKB) ILTSUF, INTTRU, J
63 INTEGER (KIND=JPLIKB) INBALO, INBPIR, IFACTM, ILARPH
64 INTEGER (KIND=JPLIKB) INTPPI, IRNGSU, INALPP
65 INTEGER (KIND=JPLIKB) INPPIM, INPIME, INTROU, INPPI1
66 INTEGER (KIND=JPLIKB) IDEBEX, IARTIC, IRGPIF
67 INTEGER (KIND=JPLIKB) INALPI, INPAGE, IRGPIM, IRPIFN
68 INTEGER (KIND=JPLIKB) ILFORC, IPOSEX
69 INTEGER (KIND=JPLIKB) IPOSDX, IRECPI, ILSUIV, IPOSUI
70 INTEGER (KIND=JPLIKB) IRGPI, IRPIMS, INPILE
71 INTEGER (KIND=JPLIKB) IRNGMS, INTRPI, ILTROU, IPTROU
72 INTEGER (KIND=JPLIKB) IRPITR, IARTTR, IPOSTR
73 INTEGER (KIND=JPLIKB) IRPIMD, IRPIFD, INALDP, IRETOU
74 INTEGER (KIND=JPLIKB) INIMES, INUMER, IRANGM
75 INTEGER (KIND=JPLIKB) IEXPLO (lfi%jpnpia+lfi%jpnpis+1)
76 INTEGER (KIND=JPLIKB) INDICE (lfi%jpnapx), &
77 & KRETIN, IRETIN
78 !
79 LOGICAL LLTSUF, LLTOPT, LLTTRU, LLRCHA
80 !
81 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
82 CHARACTER(LEN=LFI%JPLMES) CLMESS
83 CHARACTER(LEN=LFI%JPLFTX) CLACTI
84 LOGICAL LLFATA
85 
86 !**
87 ! 1. - CONTROLES DES PARAMETRES D'APPEL ET INITIALISATIONS.
88 !-----------------------------------------------------------------------
89 !
90 REAL(KIND=JPRB) :: ZHOOK_HANDLE
91 IF (lhook) CALL dr_hook('LFIREE_FORT',0,zhook_handle)
92 clacti=''
93 ilcdno=int(len(cdnoma), jplikb)
94 !
95 IF (krang.LE.0.OR.krang.GT.lfi%JPNXFI.OR.klong.LE.0.OR. &
96 & ilcdno.LE.0.OR.ilcdno.GT.lfi%JPNCPN.OR.cdnoma.EQ.' ') THEN
97  krep=-16
98  GOTO 1001
99 ENDIF
100 !
101 irang=krang
102 krep=0
103 lltsuf=.false.
104 lltopt=.false.
105 kartex=0
106 kartec=0
107 krpiec=0
108 krpiex=0
109 klonex=0
110 klonut=lfi%JPNIL
111 iretou=0
112 iltsuf=0
113 inttru=lfi%MDES1D(ixm(lfi%JPNTRU,irang))+lfi%NBTROU(irang)
114 inbalo=lfi%MDES1D(ixm(lfi%JPNALO,irang))
115 inbpir=lfi%MDES1D(ixm(lfi%JPNPIR,irang))
116 llttru=inttru.EQ.0
117 ifactm=lfi%MFACTM(irang)
118 ilarph=lfi%JPLARD*ifactm
119 inalpp=lfi%JPNAPP*ifactm
120 intppi=(inbalo-1+inalpp)/inalpp
121 IF (lfi%LMISOP) WRITE (unit=lfi%NULOUT,fmt=*) &
122 & 'INBALO= ',inbalo,', INTTRU= ',inttru,', INTPPI= ',intppi, &
123 & ', INBPIR= ',inbpir
124 !
125 IF (inbalo.EQ.0) GOTO 240
126 !
127 irngsu=0
128 irpifn=1
129 inppim=lfi%NPPIMM(irang)
130 inpime=0
131 introu=0
132 !
133 !**
134 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
135 ! A LA RECHERCHE DE L'ARTICLE ET/OU D'UN "TROU" DANS L'INDEX,
136 ! SUFFISANT POUR Y "CASER" L'ARTICLE. ( ON COMMENCE
137 ! PAR EXPLORER LES PAGES D'INDEX )
138 !-----------------------------------------------------------------------
139 !
140 inppi1=inppim
141 llrcha=.true.
142 !
143 IF (lfi%NPODPI(irang).EQ.2) THEN
144  idebex=3
145 ELSE
146  idebex=2
147 ENDIF
148 !
149 IF (llttru) THEN
150 !
151  CALL lfiran_fort &
152 & (lfi, krep,irang,cdnoma,irgpim,iartic,iretin)
153 !
154  IF (iretin.EQ.1) THEN
155  GOTO 903
156  ELSEIF (iretin.EQ.2) THEN
157  GOTO 904
158  ELSEIF (iretin.NE.0) THEN
159  GOTO 1001
160  ELSEIF (iartic.NE.0) THEN
161 !
162 ! ARTICLE TROUVE.
163 !
164  irgpif=lfi%MRGPIF(irgpim)
165  inalpi=min(inalpp,inbalo-(irgpif-1)*inalpp)
166 !
167 ! La ligne ci-dessous sert a eviter les ennuis entre les
168 ! etiquettes 213 et 215.
169 !
170  inpage=intppi+1
171  GOTO 212
172  ELSE
173 !
174 ! IL VA FALLOIR CREER UN ARTICLE SUPPLEMENTAIRE.
175 !
176  GOTO 240
177  ENDIF
178 !
179 ENDIF
180 !
181 ! ... DEBUT D'UNE STRUCTURE DE TYPE "BOUCLE" SUR INPAGE,
182 ! QUI NE PEUT PAS (PLUS) ETRE UNE BOUCLE "DO" A PARTIR DU
183 ! MOMENT OU ON VEUT UTILISER, DES QUE POSSIBLE, "LFIRAN"
184 ! POUR UNE RECHERCHE D'ARTICLE MOINS COUTEUSE, SURTOUT LORSQUE
185 ! L'ARTICLE QUE L'ON CHERCHE ETAIT LE DERNIER TRAITE ...
186 !
187 inpage=1
188 !
189 201 CONTINUE
190 !
191 IF (inpage.LE.inppi1) THEN
192 !
193 ! IL S'AGIT D'UNE EXPLORATION EN MEMOIRE ( PAGES D'INDEX ) .
194 !
195  irgpim=lfi%MRGPIM(inpage,irang)
196  irgpif=lfi%MRGPIF(irgpim)
197  inpime=inpime+1
198  iexplo(inpime)=irgpif
199  IF (irgpif.EQ.(irpifn+1)) irpifn=irgpif
200 ELSE
201 !
202 ! IL S'AGIT D'UNE EXPLORATION "HORS MEMOIRE";
203 ! ON CHERCHE LA PROCHAINE P.A.I. NON EXPLOREE .
204 !
205  IF (inpage.EQ.inppi1+1) THEN
206 !
207  IF (irngsu.EQ.0) THEN
208  irgpif=irpifn
209  ELSE
210 !
211 ! Cas ou il y a eu, dans la recherche "en memoire",
212 ! recyclage d'une P.P.I. que l'on avait exploree precedemment.
213 ! Cette P.P.I. est restee sur place, n'a pas ete exploree,
214 ! et il serait bete de l'oublier, au risque de la dupliquer...
215 !
216  irgpim=lfi%MRGPIM(irngsu,irang)
217  irgpif=lfi%MRGPIF(irgpim)
218  inpime=inpime+1
219  iexplo(inpime)=irgpif
220  IF (irgpif.EQ.(irpifn+1)) irpifn=irgpif
221  GOTO 210
222  ENDIF
223 !
224  ENDIF
225 !
226 202 CONTINUE
227  irgpif=irgpif+1
228 !
229  DO j=idebex,inpime
230  IF (iexplo(j).EQ.irgpif) GOTO 202
231  ENDDO
232 !
233  ilforc=1
234  inpile=1
235  CALL lfipim_fort &
236 & (lfi, krep,irang,irangm,irgpim,irgpif,ilforc, &
237 & inpile, iretin)
238 !
239  IF (iretin.EQ.1) THEN
240  GOTO 903
241  ELSEIF (iretin.EQ.2) THEN
242  GOTO 904
243  ELSEIF (iretin.NE.0) THEN
244  GOTO 1001
245  ENDIF
246 !
247  inppim=max(inppim,irangm)
248 ENDIF
249 !*
250 ! 2.1 - "BOUCLE" DE RECHERCHE SUR LES ARTICLES PRESENTS DANS
251 ! LA (PAIRE DE) PAGE D'INDEX DE RANG IRGPIF DANS LE FICHIER.
252 !-----------------------------------------------------------------------
253 !
254 210 CONTINUE
255 inalpi=min(inalpp,inbalo-(irgpif-1)*inalpp)
256 iartic=0
257 !
258 IF (llrcha) THEN
259 !
260  DO j=1,inalpi
261 !
262  IF (lfi%CNOMAR(ixc(j,irgpim)).EQ.cdnoma) THEN
263  iartic=j
264  GOTO 212
265  ENDIF
266 !
267  ENDDO
268 !
269 ENDIF
270 !
271 212 CONTINUE
272 !
273 IF (iartic.NE.0) THEN
274 !
275 ! ON A TROUVE DANS LE FICHIER UN ARTICLE DE MEME NOM QUE CELUI A
276 ! ECRIRE.
277 !
278  llrcha=.false.
279 !
280  IF (.NOT.lfi%LPHASP(irgpim)) THEN
281 !
282  CALL lfipha_fort &
283 & (lfi, krep,irang,irgpim,iretin)
284 !
285  IF (iretin.EQ.1) THEN
286  GOTO 903
287  ELSEIF (iretin.EQ.2) THEN
288  GOTO 904
289  ELSEIF (iretin.NE.0) THEN
290  GOTO 1001
291  ENDIF
292 !
293  ENDIF
294 !
295  krpiex=irgpif
296  klonex=lfi%MLGPOS(ixm(2*iartic-1,irgpim))
297  iposex=lfi%MLGPOS(ixm(2*iartic,irgpim))
298  kartex=iartic
299 !
300  IF (klong.LE.klonex) THEN
301 !
302 ! L'ARTICLE TROUVE EST AU MOINS AUSSI LONG QUE CELUI QUE L'ON VEUT
303 ! ECRIRE: UNE ECRITURE AU MEME EMPLACEMENT EST DONC POSSIBLE.
304 !
305  krpiec=irgpif
306  kartec=iartic
307  kposec=iposex
308  GOTO 240
309  ELSE
310 !
311 ! CAS DE REECRITURE + LONGUE QUE L'ARTICLE EXISTANT SUR LE FICHIER.
312 !
313  iposdx=lfi%MLGPOS(ixm(2*iartic,irgpim))+klong-1
314 !
315  IF (iartic.EQ.1.AND.irgpif.GT.inbpir) THEN
316 !
317 ! IL Y A EU DEBORDEMENT DES P.A.I. PREALLOUEES, ET IL Y A
318 ! EN OUTRE UNE P.A.I. SUR LE FICHIER, JUSTE DERRIERE L'ARTICLE
319 ! LOGIQUE AUQUEL ON S'INTERESSE. ON REGARDE S'IL Y A ASSEZ DE
320 ! PLACE AVANT LA P.A.I. POUR UNE REECRITURE AU MEME ENDROIT.
321 ! ( P.A.I. = PAIRE D'ARTICLES D'INDEX )
322 !
323  irecpi=lfi%MDES1D(ixm(ilarph+1-(irgpif-inbpir),irang))
324  klonut=ilarph*(irecpi-1)-iposex+1
325 !
326  IF (klong.LE.klonut) THEN
327  krpiec=irgpif
328  kartec=iartic
329  kposec=iposex
330  GOTO 240
331  ELSE
332  GOTO 216
333  ENDIF
334 !
335  ELSEIF (iartic.EQ.inalpi.AND.irgpif.EQ.intppi) THEN
336 !
337 ! CAS OU L'ARTICLE TROUVE EST LE DERNIER ARTICLE LOGIQUE DE
338 ! DONNEES, SANS P.A.I. JUSTE DERRIERE. IL Y A DE LA PLACE DONC...
339 !
340  krpiec=irgpif
341  kartec=iartic
342  kposec=iposex
343  GOTO 240
344  ENDIF
345 !
346  ENDIF
347 !
348 ! EN ARRIVANT ICI, ON EST DONC SUR QUE L'ARTICLE TROUVE
349 ! N'EST PAS LE DERNIER ARTICLE LOGIQUE.
350 !
351 ! ON VA REGARDER SI, PAR CHANCE, L'ARTICLE LOGIQUE SUIVANT N'EST
352 ! PAS UN TROU SUFFISANT POUR "CASER" L'EXCEDENT DE DONNEES,
353 ! OU S'IL N'Y A PAS UN TROU DE DONNEES ( NON ASSOCIE A UN TROU DANS
354 ! LA PARTIE "NOMS" DE L'INDEX ) SUFFISANT EN FIN D'ARTICLE EXISTANT,
355 ! AVANT L'ARTICLE LOGIQUE SUIVANT...
356 !
357  IF (iartic.NE.inalpi) THEN
358 !
359 ! L'ARTICLE SUIVANT EST DANS LA MEME PAGE D'INDEX...
360 !
361  ilsuiv=lfi%MLGPOS(ixm(2*iartic+1,irgpim))
362  iposui=lfi%MLGPOS(ixm(2*iartic+2,irgpim))
363  klonut=iposui-iposex
364 !
365  IF (klong.LE.klonut) THEN
366 !
367 ! ... ET IL Y A UN "TROU" SUFFISANT AVANT CET ARTICLE POUR POUVOIR
368 ! ECRIRE LES DONNEES EXCEDENTAIRES.
369 !
370  krpiec=irgpif
371  kartec=iartic
372  kposec=iposex
373  GOTO 240
374 !
375  ELSEIF (lfi%CNOMAR(ixc(iartic+1,irgpim)).EQ.' ' &
376 & .AND.klong.LE.(klonut+ilsuiv)) THEN
377 !
378 ! ... ET C'EST UN TROU QUI PERMET, AVEC L'AIDE EVENTUELLE
379 ! D'UNE ZONE DE DONNEES "MORTE" ENTRE LES 2 ARTICLES,
380 ! DE MENAGER UNE PLACE SUFFISANTE POUR L'EXCES DE DONNEES.
381 !
382  lfi%MLGPOS(ixm(2*iartic+1,irgpim))=iposui+ilsuiv-(iposdx+1)
383  lfi%MLGPOS(ixm(2*iartic+2,irgpim))=iposdx+1
384  lfi%LECRPI(irgpim,2)=.true.
385  krpiec=irgpif
386  kartec=iartic
387  kposec=iposex
388 !
389  IF (lfi%MLGPOS(ixm(2*iartic+1,irgpim)).EQ.0) THEN
390  GOTO 230
391  ELSE
392  GOTO 240
393  ENDIF
394 !
395  ENDIF
396 !
397 ! ... L'ARTICLE SUIVANT N'EST PAS EXPLOITABLE POUR ECRIRE L'EXCES
398 ! DE DONNEES.
399 !
400  GOTO 216
401  ELSE
402 !
403 ! L'ARTICLE TROUVE EST CERTES TROP COURT, MAIS IL EST EN PLUS EN FIN
404 ! DE PAGE D'INDEX...
405 !
406  DO j=2,inppim
407  irgpi=lfi%MRGPIM(j,irang)
408 !
409  IF (lfi%MRGPIF(irgpi).EQ.(irgpif+1)) THEN
410 !
411  irpims=irgpi
412 !
413  IF (.NOT.lfi%LPHASP(irpims)) THEN
414 !
415  CALL lfipha_fort &
416 & (lfi, krep,irang,irpims,iretin)
417 !
418  IF (iretin.EQ.1) THEN
419  GOTO 903
420  ELSEIF (iretin.EQ.2) THEN
421  GOTO 904
422  ELSEIF (iretin.NE.0) THEN
423  GOTO 1001
424  ENDIF
425 !
426  ENDIF
427 !
428  GOTO 215
429 !
430  ENDIF
431 !
432  ENDDO
433 !
434 ! LA P.A.I. SUIVANTE (EN RANG DANS LE FICHIER) N'EST PAS
435 ! EN MEMOIRE; DECIDEMENT, CELA SE GATE ! ... ON L'Y MET.
436 !
437 ! Noter que ce cas de figure ne peut se presenter q'une
438 ! seule fois par exploration de l'index.
439 !
440  inpile=2
441  CALL lfipim_fort &
442 & (lfi, krep,irang,irngms,irpims,irgpif+1,irgpif, &
443 & inpile, iretin)
444 !
445  IF (iretin.EQ.1) THEN
446  GOTO 903
447  ELSEIF (iretin.EQ.2) THEN
448  GOTO 904
449  ELSEIF (iretin.NE.0) THEN
450  GOTO 1001
451  ENDIF
452 !
453  IF (inpage.LE.inppim) THEN
454 !
455 ! On est dans le cadre d'une exploration "en memoire"...
456 !
457  IF (irngms.GT.inppim) THEN
458 !
459 ! ... et il y aura une P.P.I. a explorer en plus,
460 ! a la fin du balayage "en memoire".
461 !
462  inppi1=inppi1+1
463  ELSEIF (irngms.LT.inpage) THEN
464 !
465 ! ... et il y aura une P.P.I. a explorer en plus,
466 ! mais apres le balayage "en memoire".
467 !
468  irngsu=irngms
469  ENDIF
470 !
471  ENDIF
472 !
473  inppim=max(inppim,irngms)
474 !
475 215 CONTINUE
476 !
477 ! LA PAIRE D'ARTICLES D'INDEX SUIVANTE EST EN MEMOIRE.
478 !
479  ilsuiv=lfi%MLGPOS(ixm(1_jplikb ,irpims))
480  iposui=lfi%MLGPOS(ixm(2_jplikb ,irpims))
481  klonut=iposui-iposex
482 !
483  IF (klong.LE.klonut) THEN
484 !
485 ! ... ET IL Y A UN "TROU" SUFFISANT AVANT CETTE PAIRE POUR POUVOIR
486 ! ECRIRE LES DONNEES EXCEDENTAIRES.
487 !
488  krpiec=irgpif
489  kartec=iartic
490  kposec=iposex
491  GOTO 240
492 !
493  ELSEIF (lfi%CNOMAR(ixc(1_jplikb ,irpims)).EQ.' ' &
494 & .AND.klong.LE.(klonut+ilsuiv)) THEN
495 !
496 ! ... ET C'EST UN TROU QUI PERMET, AVEC L'AIDE EVENTUELLE
497 ! D'UNE ZONE DE DONNEES "MORTE" ENTRE LES 2 ARTICLES,
498 ! DE MENAGER UNE PLACE SUFFISANTE POUR L'EXCES DE DONNEES.
499 !
500  lfi%MLGPOS(ixm(1_jplikb ,irpims))= &
501 & iposui+ilsuiv-(iposdx+1)
502  lfi%MLGPOS(ixm(2_jplikb ,irpims))=iposdx+1
503  lfi%LECRPI(irpims,2)=.true.
504  krpiec=irgpif
505  kartec=iartic
506  kposec=iposex
507 !
508  IF (lfi%MLGPOS(ixm(1_jplikb ,irpims)).EQ.0) THEN
509  GOTO 230
510  ELSE
511  GOTO 240
512  ENDIF
513 !
514  ENDIF
515 !
516 ! SI ON ARRIVE ICI, IL FAUT PASSER A LA PAGE SUIVANTE .
517 !
518  ENDIF
519 !
520 ENDIF
521 !
522 216 CONTINUE
523 !
524 ! RECHERCHE EVENTUELLE DE TROUS D'INDEX DE LONGUEUR ADEQUATE.
525 !
526 IF (llttru.OR.lltopt) THEN
527 !
528  IF (.NOT.llrcha) THEN
529  GOTO 240
530  ELSE
531  GOTO 229
532  ENDIF
533 !
534 ELSE
535  intrpi=0
536 !
537  DO j=1,inalpi
538 !
539  IF (lfi%CNOMAR(ixc(j,irgpim)).EQ.' ') THEN
540  intrpi=intrpi+1
541  indice(intrpi)=j
542  ENDIF
543 !
544  ENDDO
545 !
546 ENDIF
547 !
548 IF (intrpi.NE.0) THEN
549 !
550  IF (.NOT.lfi%LPHASP(irgpim)) THEN
551 !
552  CALL lfipha_fort &
553 & (lfi, krep,irang,irgpim,iretin)
554 !
555  IF (iretin.EQ.1) THEN
556  GOTO 903
557  ELSEIF (iretin.EQ.2) THEN
558  GOTO 904
559  ELSEIF (iretin.NE.0) THEN
560  GOTO 1001
561  ENDIF
562 !
563  ENDIF
564 !
565  DO j=1,intrpi
566  iartic=indice(j)
567  iltrou=lfi%MLGPOS(ixm(2*iartic-1,irgpim))
568  iptrou=lfi%MLGPOS(ixm(2*iartic,irgpim))
569 !
570  IF (iltrou.GE.klong) THEN
571 !
572 ! "TROU" D'INDEX DE LONGUEUR SUFFISANTE POUR L'ARTICLE.
573 !
574  IF (.NOT.lltsuf) THEN
575  lltsuf=.true.
576  iltsuf=iltrou+1
577  ENDIF
578 !
579  IF (iltrou.LT.iltsuf) THEN
580  iltsuf=iltrou
581  irpitr=irgpif
582  iarttr=iartic
583  ipostr=iptrou
584  ENDIF
585 !
586  lltopt=iltsuf.EQ.klong
587  ENDIF
588 !
589  ENDDO
590 !
591  introu=introu+intrpi
592  llttru=introu.EQ.inttru
593 ENDIF
594 !
595 ! SI L'ARTICLE A ETE TROUVE PRECEDEMMENT DANS LE FICHIER MAIS TROP
596 ! COURT, ET SI ON A EXPLORE TOUS LES TROUS REFERENCES DANS L'INDEX,
597 ! ON ARRETE L'EXPLORATION DE L'INDEX.
598 !
599 IF (llttru.AND.kartex.NE.0) GOTO 240
600 !
601 ! .... FIN DE "BOUCLE", ON REMONTE POUR UNE EVENTUELLE SUITE ...
602 !
603 229 CONTINUE
604 inpage=inpage+1
605 !
606 IF (inpage.LE.intppi) THEN
607  GOTO 201
608 ELSE
609  GOTO 240
610 ENDIF
611 !
612 230 CONTINUE
613 !*
614 ! 2.3 - CAS OU L'ON A CREE UN TROU DE LONGUEUR NULLE DANS L'INDEX
615 ! ON STOCKE DE QUOI S'EN OCCUPER PLUS TARD, A LA FERMETURE.
616 !-----------------------------------------------------------------------
617 !
618 IF (lfi%NTRULZ(irang).EQ.0) THEN
619  lfi%NRFPTZ(irang)=iposex
620  lfi%NRFDTZ(irang)=iposex
621 ELSE
622  lfi%NRFPTZ(irang)=min(lfi%NRFPTZ(irang),iposex)
623  lfi%NRFDTZ(irang)=max(lfi%NRFDTZ(irang),iposex)
624 ENDIF
625 !
626 lfi%NTRULZ(irang)=lfi%NTRULZ(irang)+1
627 !
628 240 CONTINUE
629 IF (lfi%LMISOP) &
630 & WRITE (unit=lfi%NULOUT,fmt=*)'LFIREE - APRES ETIQUETTE 240'
631 !*
632 ! 2.4 - CALCUL DE LA VARIATION DU NOMBRE DE TROUS REFERENCES
633 ! DANS L'INDEX.
634 !-----------------------------------------------------------------------
635 !
636 IF (kartex.NE.0.AND.kartec.EQ.0.AND..NOT.lltsuf) THEN
637  kdtrou=1
638 ELSEIF (kartex.EQ.0.AND.lltsuf) THEN
639  kdtrou=-1
640 ELSE
641  kdtrou=0
642 ENDIF
643 !*
644 ! 2.5 - QUAND AUCUN EMPLACEMENT CONVENABLE N'A ETE TROUVE,
645 ! IL RESTE A DEFINIR LE RANG DE L'ARTICLE DANS LE FICHIER,
646 ! AINSI QUE LA POSITION DU PREMIER MOT DE DONNEES A ECRIRE.
647 !-----------------------------------------------------------------------
648 !
649 IF (kartec.EQ.0) THEN
650 !
651  IF (lltsuf) THEN
652  krpiec=irpitr
653  kartec=iarttr
654  kposec=ipostr
655  ELSE
656  krpiec=1+inbalo/inalpp
657  kartec=inbalo+1-inalpp*(krpiec-1)
658 !
659  IF (lfi%NALDPI(irang).EQ.inalpp &
660 & .AND.intppi.EQ.(inbpir+ilarph-lfi%JPLDOC)) THEN
661  krep=-17
662  GOTO 1001
663  ENDIF
664 !
665 ! DEFINITION DE LA POSITION OU ECRIRE, DANS LE CAS D'UN ARTICLE
666 ! LOGIQUE SUPPLEMENTAIRE.
667 !
668  IF (inbalo.EQ.0) THEN
669  kposec=(1+2*inbpir)*ilarph+1
670  ELSE
671  irpimd=lfi%MRGPIM(lfi%NPODPI(irang),irang)
672  inaldp=lfi%NALDPI(irang)
673  kposec=lfi%MLGPOS(ixm(2*inaldp,irpimd)) &
674 & +lfi%MLGPOS(ixm(2*inaldp-1,irpimd))
675 !
676  IF (intppi.GT.inbpir) THEN
677  irpifd=lfi%MDES1D(ixm(ilarph+1-(intppi-inbpir),irang))+1
678  kposec=max(kposec,1+ilarph*irpifd)
679  ENDIF
680 !
681  ENDIF
682 !
683  ENDIF
684 !
685 ENDIF
686 !
687 GOTO 1001
688 !**
689 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
690 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
691 !-----------------------------------------------------------------------
692 !
693 903 CONTINUE
694 iretou=1
695 clacti='WRITE'
696 GOTO 909
697 !
698 904 CONTINUE
699 iretou=2
700 clacti='READ'
701 !
702 909 CONTINUE
703 krep=abs(krep)
704 !**
705 ! 10. - PHASE TERMINALE : MESSAGERIE INTERNE EVENTUELLE,
706 ! VIA LE SOUS-PROGRAMME "LFIEMS", PUIS RETOUR.
707 !-----------------------------------------------------------------------
708 !
709 1001 CONTINUE
710 llfata=llmoer(krep,krang)
711 !
712 IF (krep.EQ.0) THEN
713  kretin=0
714 ELSEIF (krep.GT.0) THEN
715  kretin=iretou
716 ELSE
717  kretin=3
718 ENDIF
719 !
720 IF (lfi%LMISOP.OR.llfata) THEN
721  inimes=2
722  clnspr='LFIREE'
723  WRITE (unit=clmess, &
724 & fmt='(''ARGUMENTS='',I4,'','',I3,'','''''', &
725 & A,'''''','',I7,'','',I4,'','',I4,'','',I7,'','',I4,'','', &
726 & I4,'','',I9,'','',SP,I2,SS,'','',I7,'','',I2)') &
727 & krep,krang,cdnoma,klong,krpiex,kartex,klonex, &
728 & krpiec,kartec,kposec,kdtrou,klonut,kretin
729  inumer=lfi%NUMERO(krang)
730  CALL lfiems_fort &
731 & (lfi, inumer,inimes,krep,.false., &
732 & clmess,clnspr,clacti)
733 ENDIF
734 !
735 IF (lhook) CALL dr_hook('LFIREE_FORT',1,zhook_handle)
736 
737 CONTAINS
738 
739 #include "lficom2.ixc.h"
740 #include "lficom2.ixm.h"
741 #include "lficom2.llmoer.h"
742 
743 END SUBROUTINE lfiree_fort
744 
745 
746 
747 ! Oct-2012 P. Marguinaud 64b LFI
748 SUBROUTINE lfiree64 &
749 & (krep, krang, cdnoma, klong, krpiex, kartex, klonex, &
750 & krpiec, kartec, kposec, kdtrou, klonut, kretin)
751 USE lfimod, ONLY : lfi => lficom_default, &
754 USE lfi_precision
755 IMPLICIT NONE
756 ! Arguments
757 INTEGER (KIND=JPLIKB) KREP ! OUT
758 INTEGER (KIND=JPLIKB) KRANG ! IN
759 CHARACTER (LEN=*) CDNOMA ! IN
760 INTEGER (KIND=JPLIKB) KLONG ! IN
761 INTEGER (KIND=JPLIKB) KRPIEX ! OUT
762 INTEGER (KIND=JPLIKB) KARTEX ! OUT
763 INTEGER (KIND=JPLIKB) KLONEX ! OUT
764 INTEGER (KIND=JPLIKB) KRPIEC ! OUT
765 INTEGER (KIND=JPLIKB) KARTEC ! OUT
766 INTEGER (KIND=JPLIKB) KPOSEC ! OUT
767 INTEGER (KIND=JPLIKB) KDTROU ! OUT
768 INTEGER (KIND=JPLIKB) KLONUT ! OUT
769 INTEGER (KIND=JPLIKB) KRETIN ! OUT
770 
771 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
772 
773 CALL lfiree_fort &
774 & (lfi, krep, krang, cdnoma, klong, krpiex, kartex, &
775 & klonex, krpiec, kartec, kposec, kdtrou, klonut, &
776 & kretin)
777 
778 END SUBROUTINE lfiree64
779 
780 SUBROUTINE lfiree &
781 & (krep, krang, cdnoma, klong, krpiex, kartex, klonex, &
782 & krpiec, kartec, kposec, kdtrou, klonut, kretin)
783 USE lfimod, ONLY : lfi => lficom_default, &
786 USE lfi_precision
787 IMPLICIT NONE
788 ! Arguments
789 INTEGER (KIND=JPLIKM) KREP ! OUT
790 INTEGER (KIND=JPLIKM) KRANG ! IN
791 CHARACTER (LEN=*) CDNOMA ! IN
792 INTEGER (KIND=JPLIKM) KLONG ! IN
793 INTEGER (KIND=JPLIKM) KRPIEX ! OUT
794 INTEGER (KIND=JPLIKM) KARTEX ! OUT
795 INTEGER (KIND=JPLIKM) KLONEX ! OUT
796 INTEGER (KIND=JPLIKM) KRPIEC ! OUT
797 INTEGER (KIND=JPLIKM) KARTEC ! OUT
798 INTEGER (KIND=JPLIKM) KPOSEC ! OUT
799 INTEGER (KIND=JPLIKM) KDTROU ! OUT
800 INTEGER (KIND=JPLIKM) KLONUT ! OUT
801 INTEGER (KIND=JPLIKM) KRETIN ! OUT
802 
803 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
804 
805 CALL lfiree_mt &
806 & (lfi, krep, krang, cdnoma, klong, krpiex, kartex, &
807 & klonex, krpiec, kartec, kposec, kdtrou, klonut, &
808 & kretin)
809 
810 END SUBROUTINE lfiree
811 
812 SUBROUTINE lfiree_mt &
813 & (lfi, krep, krang, cdnoma, klong, krpiex, kartex, &
814 & klonex, krpiec, kartec, kposec, kdtrou, klonut, &
815 & kretin)
816 USE lfimod, ONLY : lficom
817 USE lfi_precision
818 IMPLICIT NONE
819 ! Arguments
820 type(lficom) lfi ! INOUT
821 INTEGER (KIND=JPLIKM) KREP ! OUT
822 INTEGER (KIND=JPLIKM) KRANG ! IN
823 CHARACTER (LEN=*) CDNOMA ! IN
824 INTEGER (KIND=JPLIKM) KLONG ! IN
825 INTEGER (KIND=JPLIKM) KRPIEX ! OUT
826 INTEGER (KIND=JPLIKM) KARTEX ! OUT
827 INTEGER (KIND=JPLIKM) KLONEX ! OUT
828 INTEGER (KIND=JPLIKM) KRPIEC ! OUT
829 INTEGER (KIND=JPLIKM) KARTEC ! OUT
830 INTEGER (KIND=JPLIKM) KPOSEC ! OUT
831 INTEGER (KIND=JPLIKM) KDTROU ! OUT
832 INTEGER (KIND=JPLIKM) KLONUT ! OUT
833 INTEGER (KIND=JPLIKM) KRETIN ! OUT
834 ! Local integers
835 INTEGER (KIND=JPLIKB) IREP ! OUT
836 INTEGER (KIND=JPLIKB) IRANG ! IN
837 INTEGER (KIND=JPLIKB) ILONG ! IN
838 INTEGER (KIND=JPLIKB) IRPIEX ! OUT
839 INTEGER (KIND=JPLIKB) IARTEX ! OUT
840 INTEGER (KIND=JPLIKB) ILONEX ! OUT
841 INTEGER (KIND=JPLIKB) IRPIEC ! OUT
842 INTEGER (KIND=JPLIKB) IARTEC ! OUT
843 INTEGER (KIND=JPLIKB) IPOSEC ! OUT
844 INTEGER (KIND=JPLIKB) IDTROU ! OUT
845 INTEGER (KIND=JPLIKB) ILONUT ! OUT
846 INTEGER (KIND=JPLIKB) IRETIN ! OUT
847 ! Convert arguments
848 
849 irang = int( krang, jplikb)
850 ilong = int( klong, jplikb)
851 
852 CALL lfiree_fort &
853 & (lfi, irep, irang, cdnoma, ilong, irpiex, iartex, &
854 & ilonex, irpiec, iartec, iposec, idtrou, ilonut, &
855 & iretin)
856 
857 krep = int( irep, jplikm)
858 krpiex = int( irpiex, jplikm)
859 kartex = int( iartex, jplikm)
860 klonex = int( ilonex, jplikm)
861 krpiec = int( irpiec, jplikm)
862 kartec = int( iartec, jplikm)
863 kposec = int( iposec, jplikm)
864 kdtrou = int( idtrou, jplikm)
865 klonut = int( ilonut, jplikm)
866 kretin = int( iretin, jplikm)
867 
868 END SUBROUTINE lfiree_mt
869 
870 !INTF KREP OUT
871 !INTF KRANG IN
872 !INTF CDNOMA IN
873 !INTF KLONG IN
874 !INTF KRPIEX OUT
875 !INTF KARTEX OUT
876 !INTF KLONEX OUT
877 !INTF KRPIEC OUT
878 !INTF KARTEC OUT
879 !INTF KPOSEC OUT
880 !INTF KDTROU OUT
881 !INTF KLONUT OUT
882 !INTF KRETIN OUT
subroutine lfiree_fort(LFI, KREP, KRANG, CDNOMA, KLONG, KRPIEX, KARTEX, KLONEX, KRPIEC, KARTEC, KPOSEC, KDTROU, KLONUT, KRETIN)
Definition: lfiree.F90:8
integer, parameter jplikb
subroutine lfiree_mt(LFI, KREP, KRANG, CDNOMA, KLONG, KRPIEX, KARTEX, KLONEX, KRPIEC, KARTEC, KPOSEC, KDTROU, KLONUT, KRETIN)
Definition: lfiree.F90:816
subroutine lfiran_fort(LFI, KREP, KRANG, CDNOMA, KRGPIM, KARTEX, KRETIN)
Definition: lfiran.F90:6
subroutine lfiree64(KREP, KRANG, CDNOMA, KLONG, KRPIEX, KARTEX, KLONEX, KRPIEC, KARTEC, KPOSEC, KDTROU, KLONUT, KRETIN)
Definition: lfiree.F90:751
subroutine new_lfi_default()
Definition: lfimod.F90:376
logical, save lficom_default_init
Definition: lfimod.F90:371
integer, parameter jprb
Definition: parkind1.F90:32
subroutine lfiree(KREP, KRANG, CDNOMA, KLONG, KRPIEX, KARTEX, KLONEX, KRPIEC, KARTEC, KPOSEC, KDTROU, KLONUT, KRETIN)
Definition: lfiree.F90:783
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 lfipim_fort(LFI, KREP, KRANG, KRANGM, KRGPIM, KRGPIF, KRGFOR, KNPILE, KRETIN)
Definition: lfipim.F90:6