Download poelem.eso

Back to the list

   1 : C POELEM    SOURCE    CHAT      05/01/13    02:16:22     5004           
   2 :       SUBROUTINE POELEM(MCLAS,MCLPO1,MCENT,PONBEL,
   3 :      $     LEPOEL,IMPR,IRET)
   4 :       IMPLICIT INTEGER(I-N)
   5 :       IMPLICIT REAL*8 (A-H,O-Z)
   6 : C***********************************************************************
   7 : C NOM         : POELEM
   8 : C DESCRIPTION : On construit la liste séquentielle indexée 
   9 : C               d'éléments LEPOEL (type MLELEM).
  10 : *               NOPOI1 : indice du point considéré dans MCLPO1
  11 : *               LEPOEL.LESPOI(LEPOEL.INDEX(NOPOI1)) :
  12 : *                  contient le numéro du point considéré
  13 : *               LEPOEL.LESPOI(LEPOEL.INDEX(NOPOI1)+1 
  14 : *                          -> LEPOEL.INDEX(NOPOI1+1)-1) :
  15 : *                  contient les numéros des points centre des 
  16 : *                  éléments de MCLAS contenant le point considéré (!)
  17 : *
  18 : *        PONBEL est tel que PONBEL(NOPOI1) = nb d'éléments 
  19 : *                                            contenant le POI1
  20 : *              (NOPOI1 est le numéro local du point dans MCLPO1)
  21 : *        
  22 : *        PONBEL est calculé dans la subroutine ponbel.eso
  23 : *        Il sert à dimensionner le tableau LESPOI et remplir 
  24 : *        le tableau INDEX du segment LEPOEL.
  25 : C
  26 : C LANGAGE     : ESOPE
  27 : C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  28 : C               mél : gounand@semt2.smts.cea.fr
  29 : C***********************************************************************
  30 : C APPELES          : KRIPAD : MELEME -> (num. globale->locale) 
  31 : C APPELES (E/S)    : -
  32 : C APPELES (BLAS)   : -
  33 : C APPELES (CALCUL) : -
  34 : C APPELE PAR       : POIELE, ELPOEL
  35 : C***********************************************************************
  36 : C SYNTAXE GIBIANE    : -
  37 : C ENTREES            : MCLAS (type MELEME)  : maillage de classe de 
  38 : C                                             points (sommet, face) par
  39 : C                                             élément (MMAIL,ELTFA)
  40 : C                      MCLPO1 (type MELEME) : maillage de points
  41 : C                                             correspondant à MCLAS
  42 : C                      MCENT  (type MELEME) : un maillage de 
  43 : C                           points (dits 'centres') ayant le meme
  44 : C                           nombre d'éléments que MCLAS et 
  45 : C                           servant à repérer les éléments de MCLAS.
  46 : C                      PONBEL (type MLENTI) : une liste indiquant
  47 : C                           à combien d'éléments de MCLAS appartient
  48 : C                           un point de MCLPO1.
  49 : C                    
  50 : C ENTREES/SORTIES    : -
  51 : C SORTIES            : LEPOEL (type MLELEM) : liste séquentielle indexée
  52 : C                                             d'éléments (cf. plus haut)
  53 : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  54 : C***********************************************************************
  55 : C VERSION    : v1, 02/11/98, version initiale
  56 : C HISTORIQUE : v1, 02/11/98, création
  57 : C HISTORIQUE :
  58 : C HISTORIQUE :
  59 : C***********************************************************************
  60 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
  61 : C en cas de modification de ce sous-programme afin de faciliter
  62 : C la maintenance !
  63 : C***********************************************************************
  64 : -INC CCOPTIO
  65 : -INC SMELEME
  66 :       POINTEUR MCLAS.MELEME
  67 :       POINTEUR MCLPO1.MELEME
  68 :       POINTEUR MCENT.MELEME
  69 : -INC SMLENTI
  70 :       POINTEUR PONBEL.MLENTI
  71 :       POINTEUR KRIPO1.MLENTI
  72 : *
  73 : *     Segment MLELEM
  74 : *
  75 :       SEGMENT MLELEM
  76 :       INTEGER INDEX(NBL+1)
  77 :       INTEGER LESPOI(NBTPOI)
  78 :       ENDSEGMENT
  79 : *
  80 : *     LISTE SEQUENTIELLE INDEXEE D'ELEMENTS
  81 : *
  82 : *     NBL      : NOMBRE D'ELEMENTS
  83 : *     NBTPOI   : NOMBRE TOTAL DE POINTS REFERENCEES 
  84 : *     INDEX(I) : INDICE DU 1ER POINT DU IEME ELEMENT 
  85 : *                DANS LE TABLEAU LESPOI
  86 : *     LESPOI(INDEX(I) -> INDEX(I+1)-1) : NUMERO DES NOEUDS
  87 : *                DU IEME ELEMENT
  88 : *
  89 :       POINTEUR LEPOEL.MLELEM
  90 :       POINTEUR ICOUR.MLELEM
  91 :       INTEGER IMPR,IRET
  92 :       INTEGER NBL,NBTPOI
  93 : *
  94 : * Executable statements
  95 : *
  96 :       IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans poelem.eso' 
  97 :       SEGACT MCLPO1
  98 :       NBSOUS=MCLPO1.LISOUS(/1)
  99 :       NOTYP =MCLPO1.ITYPEL
 100 :       IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN
 101 :          WRITE(IOIMP,*) 'MCLPO1 must contain only POI1 elements'
 102 :          GOTO 9999
 103 :       ENDIF
 104 :       NBPOI1=MCLPO1.NUM(/2)
 105 :       SEGACT PONBEL
 106 :       NPONB=PONBEL.LECT(/1)
 107 :       IF (NPONB.NE.NBPOI1) THEN
 108 :          WRITE(IOIMP,*) 'Dimension of MCLPO1 and PONBEL are not equal'
 109 :          GOTO 9999
 110 :       ENDIF
 111 : C   On initialise le segment LEPOEL (type MLELEM)
 112 : C              et le segment ICOUR  (type MLELEM)
 113 : C     dans ICOUR, seul le tableau INDEX nous intéresse
 114 :       NBL=NBPOI1
 115 :       NBTPOI=0
 116 :       SEGINI LEPOEL
 117 :       IDEPA=1
 118 :       DO 2 INBL=1,NBL
 119 :          LEPOEL.INDEX(INBL)=IDEPA
 120 :          IDEPA=IDEPA+1+PONBEL.LECT(INBL)
 121 :  2    CONTINUE
 122 :       LEPOEL.INDEX(NBL+1)=IDEPA
 123 :       SEGDES PONBEL
 124 :       SEGINI,ICOUR=LEPOEL
 125 :       NBTPOI=IDEPA-1
 126 :       SEGADJ LEPOEL
 127 : C
 128 : C     On remplit LESPOI(INDEX(I)) avec le numéro du Ieme point
 129 : C     de MCLPO1.
 130 : C
 131 :       DO 3 INBL=1,NBL
 132 :          LEPOEL.LESPOI(ICOUR.INDEX(INBL))=MCLPO1.NUM(1,INBL)
 133 :          ICOUR.INDEX(INBL)=ICOUR.INDEX(INBL)+1
 134 :  3    CONTINUE
 135 : C   In KRIPAD : SEGINI KRIPO1
 135 :       CALL KRIPAD(MCLPO1,KRIPO1)
 136 :       SEGDES MCLPO1
 137 : C
 138 : C     On remplit LESPOI(INDEX(I)+1 -> INDEX(I+1)-1)
 139 : C     avec les points centres des éléments contenant le
 140 : C     Ieme point de MCLPO1.
 141 : C     
 142 : C     On procède en bouclant sur les éléments de MCLAS pour
 143 : C     remplir le tableau LESPOI.
 144 : C
 145 :       SEGACT MCENT
 146 :       SEGACT MCLAS
 147 :       NBSOUS=MCLAS.LISOUS(/1)
 148 :       IF (NBSOUS.EQ.0) NBSOUS=1
 149 :       ICENT=0
 150 :       DO 4 INBSOU=1,NBSOUS
 151 :          IF (NBSOUS.GT.1) THEN
 152 :             IPT1=MCLAS.LISOUS(INBSOU)
 153 :             SEGACT IPT1
 154 :          ELSE
 155 :             IPT1=MCLAS
 156 :          ENDIF
 157 :          NBPOEL=IPT1.NUM(/1)
 158 :          NBELEM=IPT1.NUM(/2)
 159 :          DO 42 INBEL=1,NBELEM
 160 :             ICENT=ICENT+1
 161 :             NOCEN=MCENT.NUM(1,ICENT)
 162 :             DO 422 INBPO=1,NBPOEL
 163 :                NOPOI1=KRIPO1.LECT(IPT1.NUM(INBPO,INBEL))
 164 :                IF (NOPOI1.NE.0) THEN
 165 :                   LEPOEL.LESPOI(ICOUR.INDEX(NOPOI1))=NOCEN
 166 :                   ICOUR.INDEX(NOPOI1)=ICOUR.INDEX(NOPOI1)+1
 167 :                ELSE
 168 :                   WRITE(IOIMP,*) 'Erreur grave MCLPO1 n''est pas'
 169 :                   WRITE(IOIMP,*) 'le maillage de points correspondant'
 170 :                   WRITE(IOIMP,*) 'à MCLAS.'
 171 :                   GOTO 9999
 172 :                ENDIF
 173 :  422        CONTINUE
 174 :  42      CONTINUE
 175 :          IF (NBSOUS.GT.1) SEGDES IPT1
 176 :  4    CONTINUE
 177 :       SEGDES MCLAS
 178 :       SEGDES MCENT
 179 :       IF (IMPR.GT.2) THEN
 180 :          WRITE(IOIMP,*) 'On a créé LEPOEL (type MLELEM)=',LEPOEL
 181 :          IF (IMPR.GT.3) THEN
 182 :             WRITE(IOIMP,4000) 'LEPOEL.INDEX',NBL+1
 183 :             WRITE(IOIMP,5000) (LEPOEL.INDEX(I),I=1,NBL+1)
 184 :             WRITE(IOIMP,4000) 'LEPOEL.LESPOI',NBTPOI
 185 :             WRITE(IOIMP,5000) (LEPOEL.LESPOI(I),I=1,NBTPOI)
 186 :          ENDIF
 187 :       ENDIF
 188 :       SEGDES LEPOEL
 189 :       SEGSUP ICOUR
 190 :       SEGSUP KRIPO1
 191 : *
 192 : * Normal termination
 193 : *
 194 :       IRET=0
 195 :       RETURN
 196 : *
 197 : * Format handling
 198 : *
 199 :  4000  FORMAT (A,'(1..',I8,')')
 200 :  5000  FORMAT (8(1X,I8))
 201 : *
 202 : * Error handling
 203 : *
 204 :  9999 CONTINUE
 205 :       IRET=1
 206 :       WRITE(IOIMP,*) 'An error was detected in subroutine poelem'
 207 :       RETURN
 208 : *
 209 : * End of subroutine POELEM
 210 : *
 211 :       END
 212 : 
 213 :  
 214 :  

© Cast3M 2003 - All rights reserved.
Disclaimer