SURFEX v7.3
General documentation of Surfex
|
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