SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/LFI/mt/lfirac_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe LFI
00002       SUBROUTINE LFIRAC_MT (LFI, KNOMAR, KNALPI, KCLE, KINDIC, KNBVAL )
00003       USE LFIMOD, ONLY : LFICOM
00004       USE PARKIND1, ONLY : JPRB
00005       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00006 C****
00007 C        SOUS-PROGRAMME *INTERNE* DU LOGICIEL DE FICHIERS INDEXES *LFI*;
00008 C     RECHERCHE, DANS UNE PAGE D'INDEX "NOMS", DES OCCURENCES D'UN NOM
00009 C     D'ARTICLE DONNE. CE SOUS-PROGRAMME NE PEUT MARCHER QUE SI LES NOMS
00010 C     D'ARTICLES OCCUPENT UN NOMBRE ENTIER DE MOTS, ET RAISONNE EN
00011 C     TERME DE MOTS; CE QUI SUPPOSE AUSSI QU'UN ARGUMENT D'APPEL DE TYPE
00012 C     "CHARACTER" OCCUPANT UN NOMBRE ENTIER DE MOTS PUISSE ETRE TRAITE
00013 C     COMME UN TABLEAU D'ENTIERS PAR LE SOUS-PROGRAMME APPELE.
00014 C        DE PLUS, LE SOUS-PROGRAMME "WHENEQ" DOIT ETRE UTILISABLE...
00015 C     BREF, CE SOUS-PROGRAMME NE DOIT ETRE APPELE QUE SI LE PARAMETER
00016 C     "LPRECH" EST VRAI.
00017 C**
00018 C    ARGUMENTS : KNOMAR (ENTREE) ==> PAGE D'INDEX "NOMS" A EXLORER;
00019 C                KNALPI (ENTREE) ==> NOMBRE D'ARTICLES DANS CETTE PAGE;
00020 C                KCLE   (ENTREE) ==> NOM D'ARTICLE A RECHERCHER;
00021 C                KINDIC (SORTIE) ==> INDICES DES NOMS TROUVES;
00022 C                KNBVAL (SORTIE) ==> NOMBRE D'OCCURENCES DU NOM .
00023 C*
00024 C          Noter que la Page d'Index "Noms" peut etre multiple.
00025 C
00026 C
00027 C
00028       TYPE(LFICOM) :: LFI
00029 #ifndef f77
00030 #include "precision.h"
00031 C
00032       INTEGER (KIND=JPDBLE) KNOMAR (LFI%JPNMPN,LFI%JPNAPX),
00033      S                      KCLE (LFI%JPNMPN)
00034       INTEGER (KIND=JPDBLE) INOMAR (LFI%JPNAPX,
00035      S                           LFI%LFIRAC_JPDEBN:LFI%JPNMPN,2)
00036 #else
00037       INTEGER KNOMAR (LFI%JPNMPN,LFI%JPNAPX), KCLE (LFI%JPNMPN)
00038       INTEGER INOMAR (LFI%JPNAPX,LFI%LFIRAC_JPDEBN:LFI%JPNMPN,2)
00039 #endif
00040       INTEGER KNALPI, KNBVAL, KINDIC (LFI%JPNAPX), 
00041      S        INDICE (LFI%JPNAPX,LFI%JPNMPN+1)
00042       INTEGER INBVAL, IRECH, INARTI, J, IRECHS, JF, ISTOCK, JFOIS
00043 #include "lficom_mt.h"
00044 C**
00045 C     1.  -  OCCURRENCES DU PREMIER MOT DE KCLE DANS LA PAGE D'INDEX.
00046 C-----------------------------------------------------------------------
00047 C
00048       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00049       IF (LHOOK) CALL DR_HOOK('LFIRAC_MT',0,ZHOOK_HANDLE)
00050       IF (LFI%JPNMPN.EQ.1) THEN
00051         CALL WHENEQ (KNALPI,KNOMAR,LFI%JPNMPN,KCLE(1),KINDIC,KNBVAL)
00052         IF (LHOOK) CALL DR_HOOK('LFIRAC_MT',1,ZHOOK_HANDLE)
00053         RETURN
00054       ELSE
00055         KNBVAL=0
00056         CALL WHENEQ (KNALPI,KNOMAR,LFI%JPNMPN,KCLE(1), 
00057      S               INDICE(1,1),INBVAL)
00058         IF (INBVAL.EQ.0.OR.INBVAL.GT.KNALPI)  THEN 
00059           IF (LHOOK) CALL DR_HOOK('LFIRAC_MT',1,ZHOOK_HANDLE)
00060           RETURN
00061         ENDIF
00062       ENDIF
00063 C**
00064 C     2.  -  LE DEBUT DE KCLE A ETE TROUVE; EXTRACTION D'UNE PARTIE DE
00065 C            LA PAGE DANS UN TABLEAU DE TRAVAIL AVANT DE POURSUIVRE .
00066 C-----------------------------------------------------------------------
00067 C
00068       IRECH=1
00069       INARTI=INBVAL
00070 C
00071       DO 201 JFOIS=2,LFI%JPNMPN
00072       DO 201 J=1,INARTI
00073       INOMAR(J,JFOIS,IRECH)=KNOMAR(JFOIS,INDICE(J,1))
00074   201 CONTINUE
00075 C**
00076 C     3.  -  RECHERCHE DANS LES AUTRES MOTS DECRIVANT LES NOMS D'ARTICLE
00077 C-----------------------------------------------------------------------
00078 C
00079       DO 302 JFOIS=2,LFI%JPNMPN
00080       CALL WHENEQ (INARTI,INOMAR(1,JFOIS,IRECH),1,KCLE(JFOIS),
00081      S             INDICE(1,JFOIS),INBVAL)
00082       IF (INBVAL.EQ.0.OR.INBVAL.GT.INARTI)  THEN 
00083         IF (LHOOK) CALL DR_HOOK('LFIRAC_MT',1,ZHOOK_HANDLE)
00084         RETURN
00085       ENDIF
00086       INARTI=INBVAL
00087       IRECHS=3-IRECH
00088 C
00089       DO 301 JF=JFOIS+1,LFI%JPNMPN
00090 CDIR$ IVDEP
00091       DO 301 J=1,INARTI
00092       INOMAR(J,JF,IRECHS)=INOMAR(INDICE(J,JFOIS),JF,IRECH)
00093   301 CONTINUE
00094 C
00095       IRECH=IRECHS
00096   302 CONTINUE
00097 C**
00098 C     4.  -  "COMPOSITION" DES INDICES POUR EXPRIMER LE RESULTAT EN
00099 C            INDICES DANS LA PAGE (KNOMAR) .
00100 C-----------------------------------------------------------------------
00101 C
00102       KNBVAL=INARTI
00103       ISTOCK=LFI%JPNMPN
00104 C
00105       DO 402 JFOIS=LFI%JPNMPN,3,-1
00106 CDIR$ IVDEP
00107       DO 401 J=1,INARTI
00108       INDICE(J,JFOIS+1)=INDICE(INDICE(J,ISTOCK),JFOIS-1)
00109   401 CONTINUE
00110 C
00111       ISTOCK=JFOIS+1
00112   402 CONTINUE
00113 C
00114       DO 403 J=1,INARTI
00115       KINDIC(J)=INDICE(INDICE(J,ISTOCK),1)
00116   403 CONTINUE
00117 C
00118       IF (LHOOK) CALL DR_HOOK('LFIRAC_MT',1,ZHOOK_HANDLE)
00119       END
00120