Download elelem.eso

Back to the list

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

© Cast3M 2003 - All rights reserved.
Disclaimer