SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/LFI/mt/lficas_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe LFI
00002       SUBROUTINE LFICAS_MT (LFI, KREP, KNUMER, CDNOMA, KLONG, 
00003      S                      KPOSEX, LDAVAN )
00004       USE LFIMOD, ONLY : LFICOM
00005       USE PARKIND1, ONLY : JPRB
00006       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00007 C****
00008 C        SOUS-PROGRAMME DONNANT LES CARACTERISTIQUES ( NOM, LONGUEUR,
00009 C     POSITION ) DE L'ARTICLE LOGIQUE *DE DONNEES* SUIVANT, SUR UNE
00010 C     UNITE LOGIQUE OUVERTE POUR LE LOGICIEL DE FICHIERS INDEXES *LFI* .
00011 C**
00012 C    ARGUMENTS : KREP   (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
00013 C                KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
00014 C                CDNOMA (SORTIE) ==> NOM DE L'ARTICLE SUIVANT;
00015 C                KLONG  (SORTIE) ==> LONGUEUR DE L'ARTICLE SUIVANT;
00016 C                KPOSEX (SORTIE) ==> POSITION ( DANS LE FICHIER, DU PRE-
00017 C                                    MIER MOT ) DE L'ARTICLE SUIVANT;
00018 C                LDAVAN (ENTREE) ==> VRAI SI ON DOIT "AVANCER" LE
00019 C                                    POINTEUR DU FICHIER.
00020 C
00021 C     SI L'ON SOUHAITE LIRE ENSUITE L'ARTICLE EN QUESTION (VIA *LFILAS*)
00022 C     IL FAUT PRECISER A L'APPEL LDAVAN=.FALSE. ; LDAVAN=.TRUE. SERT
00023 C     ESSENTIELLEMENT A ANALYSER LE CONTENU DU FICHIER EN TERMES
00024 C     D'ARTICLES LOGIQUES, SANS LIRE LES DONNEES.
00025 C
00026 C     SI LE FICHIER EST VIDE OU QUE LE DERNIER ARTICLE LOGIQUE LU ETAIT
00027 C     LE DERNIER, LE SOUS-PROGRAMME "RETOURNE" KLONG=0, ET CDNOMA=' ' .
00028 C
00029 #ifndef f77
00030 #include "precision.h"
00031 #endif
00032 C
00033       TYPE(LFICOM) :: LFI
00034       CHARACTER CDNOMA*(*), CLNOMA*(LFI%JPNCPN)
00035 C
00036       INTEGER KREP, KNUMER, KLONG, KPOSEX, IREP, ILCDNO, IDECBL, IPOSBL
00037       INTEGER ILCLNO, IRANG, IRGPIM, IARTIC, IRGPIF, INIMES, IRETIN
00038 C
00039       LOGICAL LDAVAN, LLVERF
00040 C
00041 #include "lficom2.h"
00042 #include "lficom_mt.h"
00043 C**
00044 C     1.  -  CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
00045 C-----------------------------------------------------------------------
00046 C
00047 C        Appel legerement anticipe a LFINUM, garantissant l'initialisa-
00048 C     tion des variables globales du logiciel a la 1ere utilisation.
00049 C
00050       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00051       IF (LHOOK) CALL DR_HOOK('LFICAS_MT',0,ZHOOK_HANDLE)
00052       CALL LFINUM_MT (LFI, KNUMER,IRANG)
00053       LLVERF=.FALSE.
00054       IREP=0
00055       KLONG=0
00056       KPOSEX=0
00057       ILCDNO=LEN (CDNOMA)
00058 C
00059       IF (ILCDNO.LE.0) THEN
00060         IREP=-15
00061         CLNOMA=LFI%CHINCO(:LFI%JPNCPN)
00062         ILCLNO=LFI%JPNCPN
00063         GOTO 1001
00064       ELSE
00065         CDNOMA=' '
00066         CLNOMA=' '
00067         ILCLNO=1
00068       ENDIF
00069 C
00070       IF (IRANG.EQ.0) THEN
00071         IREP=-1
00072         GOTO 1001
00073       ENDIF
00074 C
00075        IF (LFI%LMULTI) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'ON')
00076       LLVERF=LFI%LMULTI
00077 C**
00078 C     2.  -  EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
00079 C            A LA RECHERCHE DE L'ARTICLE LOGIQUE DEMANDE,
00080 C            DEFINI PAR SON RANG "A PRIORI" DANS LE FICHIER.
00081 C-----------------------------------------------------------------------
00082 C
00083       CALL LFICAX_MT (LFI, IREP,IRANG,IRGPIM,IARTIC,IRETIN)
00084 C
00085       IF (IRETIN.EQ.1) THEN
00086         GOTO 903
00087       ELSEIF (IRETIN.EQ.2) THEN
00088         GOTO 904
00089       ELSEIF (IRETIN.NE.0.OR.IARTIC.EQ.0) THEN
00090         GOTO 1001
00091       ENDIF
00092 C*
00093 C     2.1 -  ARTICLE DE DONNEES TROUVE... APRES CONTROLES SUPPLEMENTAI-
00094 C            RES, ON RETOURNE SES CARACTERISTIQUES.
00095 C-----------------------------------------------------------------------
00096 C
00097       IRGPIF=LFI%MRGPIF(IRGPIM)
00098 C
00099       IF (.NOT.LFI%LPHASP(IRGPIM)) THEN
00100 C
00101         CALL LFIPHA_MT (LFI, IREP,IRANG,IRGPIM,IRETIN)
00102 C
00103         IF (IRETIN.EQ.1) THEN
00104           GOTO 903
00105         ELSEIF (IRETIN.EQ.2) THEN
00106           GOTO 904
00107         ELSEIF (IRETIN.NE.0) THEN
00108           GOTO 1001
00109         ENDIF
00110 C
00111       ENDIF
00112 C
00113       KLONG=LFI%MLGPOS(IXM(2*IARTIC-1,IRGPIM))
00114       KPOSEX=LFI%MLGPOS(IXM(2*IARTIC,IRGPIM))
00115       CLNOMA=LFI%CNOMAR(IXC(IARTIC,IRGPIM))
00116 C
00117 C        Recherche de la longueur "utile" du nom d'article.
00118 C        (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
00119 C
00120       IDECBL=0
00121 C
00122   211 CONTINUE
00123       IPOSBL=IDECBL+INDEX (CLNOMA(IDECBL+1:),' ')
00124 C
00125       IF (IPOSBL.LE.IDECBL) THEN
00126         ILCLNO=LFI%JPNCPN
00127       ELSEIF (CLNOMA(IPOSBL:).EQ.' ') THEN
00128         ILCLNO=IPOSBL-1
00129       ELSE
00130         IDECBL=IPOSBL
00131         GOTO 211
00132       ENDIF
00133 C
00134       IF (ILCDNO.GE.ILCLNO) THEN
00135         CDNOMA=CLNOMA(:ILCLNO)
00136       ELSE
00137         IREP=-24
00138         CLACTI=CLNOMA
00139         GOTO 1001
00140       ENDIF
00141 C
00142       IF (LDAVAN) THEN
00143 C
00144 C          ON AVANCE LE "POINTEUR" DU FICHIER...
00145 C       ET ON REINITIALISE LES "POINTEURS" SUIVANT ET PRECEDENT.
00146 C
00147         LFI%NDERGF(IRANG)=LFI%JPNAPP*LFI%MFACTM(IRANG)*(IRGPIF-1)+IARTIC
00148         LFI%CNDERA(IRANG)=CLNOMA
00149         LFI%NSUIVF(IRANG)=LFI%JPNIL
00150         LFI%NPRECF(IRANG)=LFI%JPNIL
00151       ENDIF
00152 C
00153       GOTO 1001
00154 C**
00155 C     9.  - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
00156 C-----------------------------------------------------------------------
00157 C
00158   903 CONTINUE
00159       CLACTI='WRITE'
00160       GOTO 909
00161 C
00162   904 CONTINUE
00163       CLACTI='READ'
00164 C
00165   909 CONTINUE
00166 C
00167 C      AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
00168 C
00169       IREP=IABS (IREP)
00170 C**
00171 C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
00172 C            VIA LE SOUS-PROGRAMME "LFIEMS" .
00173 C-----------------------------------------------------------------------
00174 C
00175  1001 CONTINUE
00176       KREP=IREP
00177       LLFATA=LLMOER (IREP,IRANG)
00178 C
00179       IF (IRANG.NE.0) THEN
00180         LFI%NDEROP(IRANG)=11
00181         LFI%NDERCO(IRANG)=IREP
00182          IF (LLVERF) CALL LFIVER_MT (LFI, LFI%VERRUE(IRANG),'OFF')
00183       ENDIF
00184 C
00185       IF (LLFATA.OR.IXNIMS (IRANG).EQ.2) THEN
00186         INIMES=2
00187       ELSE
00188         IF (LHOOK) CALL DR_HOOK('LFICAS_MT',1,ZHOOK_HANDLE)
00189         RETURN
00190       ENDIF
00191 C
00192       CLNSPR='LFICAS'
00193       WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER='
00194 ',I3,     S    '', CDNOMA='''''',A,'''''', KLONG='',I7,'', KPOSEX='
00195 ',I8,     S    '', LDAVAN= '',L1)')
00196      S  KREP,KNUMER,CLNOMA(:ILCLNO),KLONG,KPOSEX,LDAVAN
00197       CALL LFIEMS_MT (LFI, KNUMER,INIMES,IREP,LLFATA,
00198      S                CLMESS,CLNSPR,CLACTI)
00199 C
00200       IF (LHOOK) CALL DR_HOOK('LFICAS_MT',1,ZHOOK_HANDLE)
00201       END
00202