Download meland.eso

Back to the list

   1 : C MELAND    SOURCE    CHAT      05/01/13    01:41:54     5004           
   2 :       SUBROUTINE MELAND(GPMELS,
   3 :      $     MAICOM,
   4 :      $     IMPR,IRET)
   5 :       IMPLICIT INTEGER(I-N)
   6 :       IMPLICIT REAL*8 (A-H,O-Z)
   7 : C***********************************************************************
   8 : C NOM         : MELAND
   9 : C DESCRIPTION : Renvoie le maillage de points (POI1) MAICOM des
  10 : C               points appartenant à tous les maillages de gpmels.
  11 : C
  12 : C LANGAGE     : ESOPE
  13 : C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  14 : C               mél : gounand@semt2.smts.cea.fr
  15 : C***********************************************************************
  16 : C APPELES          : -
  17 : C APPELE PAR       : MELCOM
  18 : C***********************************************************************
  19 : C ENTREES            : GPMELS
  20 : C SORTIES            : MAICOM
  21 : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  22 : C***********************************************************************
  23 : C VERSION    : v1, 12/05/99, version initiale
  24 : C HISTORIQUE : v1, 12/05/99, création
  25 : C HISTORIQUE :
  26 : C HISTORIQUE :
  27 : C***********************************************************************
  28 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
  29 : C en cas de modification de ce sous-programme afin de faciliter
  30 : C la maintenance !
  31 : C***********************************************************************
  32 : -INC CCOPTIO
  33 : -INC SMCOORD
  34 : -INC SMELEME
  35 :       POINTEUR MELCOU.MELEME
  36 :       POINTEUR SOUMEL.MELEME
  37 :       INTEGER NBELEM,NBNN,NBREF,NBSOUS
  38 :       POINTEUR MAICOM.MELEME
  39 : -INC SMLENTI
  40 :       INTEGER JG
  41 :       POINTEUR IWORK.MLENTI
  42 : *
  43 : * Includes persos
  44 : *
  45 :       SEGMENT MELS
  46 :       POINTEUR LISMEL(NBMEL).MELEME
  47 :       ENDSEGMENT
  48 :       POINTEUR GPMELS.MELS
  49 : *
  50 :       INTEGER IMPR,IRET
  51 : *
  52 :       LOGICAL LSAME
  53 :       INTEGER BEGI,LAST,ILAST,IPREC,LDG,ILDG,NUMNO
  54 :       INTEGER IELEM,IPOEL,ISOUS,IMEL
  55 :       INTEGER NELEM,NPOEL,NSOUS,NMEL
  56 : *     
  57 : * Executable statements
  58 : *
  59 :       IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans meland.eso' 
  60 :       SEGACT GPMELS
  61 :       NMEL=GPMELS.LISMEL(/1)
  62 :       IF (NMEL.LE.0) THEN
  63 :          WRITE(IOIMP,*) 'Nombre de MELEMEs négatif ou nul'
  64 :          GOTO 9999
  65 :       ENDIF
  66 : * On cherche le cas évident :
  67 : * - Maillage tous identiques de POI1
  68 :       MELCOU=GPMELS.LISMEL(1)
  69 :       SEGACT MELCOU
  70 :       LSAME=.FALSE.
  71 :       IF (MELCOU.ITYPEL.EQ.1) THEN
  72 :          LSAME=.TRUE.
  73 :          DO 1 IMEL=2,NMEL
  74 :             IF (GPMELS.LISMEL(IMEL).NE.MELCOU) THEN
  75 :                LSAME=.FALSE.
  76 :             ENDIF
  77 :  1       CONTINUE
  78 :       ENDIF
  79 :       SEGDES MELCOU
  80 :       IF (LSAME) THEN 
  81 :          SEGINI,MAICOM=MELCOU
  82 :          SEGDES MAICOM
  83 :       ELSE
  84 : * - On construit la liste chaînée avec le premier maillage
  85 :          JG=XCOOR(/1)/(IDIM+1)
  86 :          SEGINI IWORK
  87 : *   degré, fin de la liste chaînée
  88 :          LDG=0
  89 :          BEGI=XCOOR(/1)/(IDIM+1)+1
  90 :          LAST=BEGI
  91 :          MELCOU=GPMELS.LISMEL(1)
  92 :          SEGACT MELCOU
  93 :          NSOUS=MELCOU.LISOUS(/1)
  94 :          DO 3 ISOUS=1,MAX(1,NSOUS)
  95 :             IF (NSOUS.EQ.0) THEN
  96 :                SOUMEL=MELCOU
  97 :             ELSE
  98 :                SOUMEL=MELCOU.LISOUS(ISOUS)
  99 :                SEGACT SOUMEL
 100 :             ENDIF
 101 :             NPOEL=SOUMEL.NUM(/1)
 102 :             NELEM=SOUMEL.NUM(/2)
 103 :             DO 32 IELEM=1,NELEM
 104 :                DO 322 IPOEL=1,NPOEL
 105 :                   NUMNO=SOUMEL.NUM(IPOEL,IELEM)
 106 :                   IF (IWORK.LECT(NUMNO).EQ.0) THEN
 107 :                      LDG=LDG+1
 108 :                      IWORK.LECT(NUMNO)=LAST
 109 :                      LAST=NUMNO
 110 :                   ENDIF
 111 :  322           CONTINUE
 112 :  32         CONTINUE
 113 :             IF (NSOUS.NE.0) THEN
 114 :                SEGDES SOUMEL
 115 :             ENDIF
 116 :  3       CONTINUE
 117 :          SEGDES MELCOU
 118 : * - On réduit la liste chaînée des points des autres maillages 
 119 : *   qui ne sont pas déjà dedans
 120 : *COMM         write(ioimp,*) 'nmel=',nmel
 121 :          DO 5 IMEL=2,NMEL
 122 : *COMM            write(ioimp,*) 'last,ldg,imel',LAST,LDG,IMEL
 123 : *COMM            SEGPRT,IWORK
 124 : * On attribue le signe - à tous les points de la liste chaînée
 125 :             NUMNO=LAST
 126 :             DO 52 ILDG=1,LDG
 127 :                IPREC=IWORK.LECT(NUMNO)
 128 :                IWORK.LECT(NUMNO)=-IWORK.LECT(NUMNO)
 129 :                NUMNO=IPREC
 130 :  52         CONTINUE
 131 : *COMM            write(ioimp,*) 'négativation'
 132 : *COMM            SEGPRT,IWORK
 133 :             MELCOU=GPMELS.LISMEL(IMEL)
 134 : * On attribue le signe + aux points de la liste chaînée
 135 : * qui sont dans le IMEL ième maillage
 136 :             SEGACT MELCOU
 137 :             NSOUS=MELCOU.LISOUS(/1)
 138 :             DO 54 ISOUS=1,MAX(1,NSOUS)
 139 :                IF (NSOUS.EQ.0) THEN
 140 :                   SOUMEL=MELCOU
 141 :                ELSE
 142 :                   SOUMEL=MELCOU.LISOUS(ISOUS)
 143 :                   SEGACT SOUMEL
 144 :                ENDIF
 145 :                NPOEL=SOUMEL.NUM(/1)
 146 :                NELEM=SOUMEL.NUM(/2)
 147 :                DO 542 IELEM=1,NELEM
 148 :                   DO 5422 IPOEL=1,NPOEL
 149 :                      NUMNO=SOUMEL.NUM(IPOEL,IELEM)
 150 :                      IF (IWORK.LECT(NUMNO).LT.0) THEN
 151 :                         IWORK.LECT(NUMNO)=-IWORK.LECT(NUMNO)
 152 :                      ENDIF
 153 :  5422             CONTINUE
 154 :  542           CONTINUE
 155 :                IF (NSOUS.NE.0) THEN
 156 :                   SEGDES SOUMEL
 157 :                ENDIF
 158 :  54         CONTINUE
 159 :             SEGDES MELCOU
 160 : *COMM            write(ioimp,*) 'positivation'
 161 : *COMM            SEGPRT,IWORK
 162 : * On nettoie la liste chaînée des points qui sont restés 
 163 : * avec le signe négatif
 164 : *
 165 : * D'abord, on cherche la fin de ce qui sera la nouvelle liste
 166 : *   If (LAST.EQ.BEGI), la liste résultat est vide
 167 :             IF (LAST.NE.BEGI) THEN
 168 :                NUMNO=LAST
 169 :  56            CONTINUE
 170 :                IPREC=IWORK.LECT(NUMNO)
 171 :                IF (IPREC.LT.0) THEN
 172 :                   LDG=LDG-1
 173 :                   IWORK.LECT(NUMNO)=0
 174 :                   NUMNO=-IPREC
 175 :                   IF (NUMNO.NE.BEGI) THEN
 176 :                      GOTO 56
 177 :                   ENDIF
 178 :                ENDIF
 179 :                LAST=NUMNO
 180 :             ENDIF
 181 : *COMM            write(ioimp,*) 'Fin de la liste=',LAST
 182 : * Une fois obtenue la fin de la liste résultat, on continue
 183 : *   If (LAST.EQ.BEGI), la liste résultat est vide
 184 :             IF (LAST.NE.BEGI) THEN
 185 :                ILAST=LAST
 186 :                NUMNO=LAST
 187 : *   IPREC est forcément positif sinon, LAST n'aurait pas la bonne valeur
 188 :                IPREC=IWORK.LECT(NUMNO)
 189 :                NUMNO=IPREC
 190 : *COMM               write(ioimp,*) 'ilast,numno,iprec',ILAST,NUMNO,IPREC
 191 :                IF (NUMNO.NE.BEGI) THEN
 192 :  58               CONTINUE
 193 :                   IPREC=IWORK.LECT(NUMNO)
 194 : *COMM                  write(ioimp,*) 'ilast,numno,iprec',ILAST,NUMNO,IPREC
 195 :                   IF (IPREC.LT.0) THEN
 196 :                      LDG=LDG-1
 197 :                      IWORK.LECT(NUMNO)=0
 198 :                      NUMNO=-IPREC
 199 :                   ELSE
 200 :                      IWORK.LECT(ILAST)=NUMNO
 201 :                      ILAST=NUMNO
 202 :                      NUMNO=IPREC
 203 :                   ENDIF
 204 :                   IF (NUMNO.NE.BEGI) THEN
 205 :                      GOTO 58
 206 :                   ENDIF
 207 :                ENDIF
 208 :                IWORK.LECT(ILAST)=BEGI
 209 : *COMM               write(ioimp,*) 'nettoyage'
 210 : *COMM               SEGPRT,IWORK
 211 :             ENDIF
 212 :  5       CONTINUE
 213 : * Créer le maillage de points correspondant à la liste chaînée
 214 :          NBNN=1
 215 :          NBELEM=LDG
 216 :          NBSOUS=0
 217 :          NBREF=0
 218 :          SEGINI MAICOM
 219 :          MAICOM.ITYPEL=1
 220 :          NUMNO=LAST
 221 :          DO 7 ILDG=1,LDG
 222 :             IPREC=IWORK.LECT(NUMNO)
 223 :             MAICOM.NUM(1,ILDG)=NUMNO
 224 :             NUMNO=IPREC
 225 :  7       CONTINUE
 226 :          SEGDES MAICOM
 227 :          SEGSUP IWORK
 228 :       ENDIF
 229 :       SEGDES GPMELS
 230 :       IF (IMPR.GT.2) THEN
 231 :          WRITE(IOIMP,*) 'On a créé MAICOM=',MAICOM
 232 :          IF (IMPR.GT.3) THEN
 233 :             SEGPRT,MAICOM
 234 :          ENDIF
 235 :       ENDIF
 236 : *
 237 : * Normal termination
 238 : *
 239 :       IRET=0
 240 :       RETURN
 241 : *
 242 : * Format handling
 243 : *
 244 : *
 245 : * Error handling
 246 : *
 247 :  9999 CONTINUE
 248 :       IRET=1
 249 :       WRITE(IOIMP,*) 'An error was detected in subroutine meland'
 250 :       RETURN
 251 : *
 252 : * End of subroutine MELAND
 253 : *
 254 :       END
 255 : 
 256 :  
 257 :  
 258 :  

© Cast3M 2003 - All rights reserved.
Disclaimer