Download tria1.eso

Back to the list

   1 : C TRIA1     SOURCE    SH236661  13/11/25    21:15:10     7869           
   2 : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
   3 :       SUBROUTINE TRIA1(MPOVAL,IPT1,IVC,XDEN,IPT2)
   4 : C
   5 : C Triangulation de Delaunay d un ensemble de points
   6 : C
   7 : C IPT1 : Maillage de POI1 a trianguler
   8 : C IVC  : Indicateur pour verifier (IVC=1) ou non (IVC=0) la convexite
   9 : C        de la triangulation
  10 : C XDEN : Critere sur la taille de maille maximale cible (le maillage est
  11 : C        raffine en ajoutant des points au milieu des aretes)
  12 : C IPT2 : Maillage de la triangulation
  13 : C
  14 :       IMPLICIT INTEGER(I-N)
  15 :       IMPLICIT REAL*8 (A-H,O-Z)
  16 : C
  17 : -INC SMCHPOI
  18 : -INC CCOPTIO
  19 : -INC SMELEME
  20 : -INC SMCOORD
  21 : -INC CCGEOME
  22 :       PARAMETER (ICMIN=1000)
  23 :       DIMENSION XA(3),XB(3),XPMIL(3)
  24 :       DIMENSION LNBOIT(8)
  25 : C
  26 :       SEGMENT,MCIRCONS
  27 :          REAL*8 TRC(NBE1,4)
  28 :       ENDSEGMENT
  29 :       POINTEUR ITRC1.MCIRCONS
  30 : C
  31 :       SEGMENT,MADJACEN
  32 :          INTEGER LEAC(NBL1,IDIM+1,2)
  33 :       ENDSEGMENT
  34 :       POINTEUR ILEA1.MADJACEN
  35 : C
  36 : C
  37 :       SEGINI,IPT4=IPT1
  38 : C     Taille de la boite de triangulation :
  39 :       IF (IDIM.EQ.1) XBOI=2.
  40 :       IF (IDIM.EQ.2) XBOI=200.
  41 :       IF (IDIM.EQ.3) XBOI=500.
  42 : C     IBOI=1  -->  on garde la boite de triangulation
  43 : C     IBOI=0  -->  on ne la garde pas (valeur par defaut)
  44 :       IBOI=0
  45 : C     Triangulation de DELAUNAY
  46 :       NBVC=0
  47 : 100   CONTINUE
  48 : c
  48 :       CALL DELAUN(MPOVAL,IPT4,XBOI,IBOI,IPT2,LNBOIT,ITRC1,ILEA1)
  49 : c
  50 :       IF (IDIM.NE.1) SEGSUP,ITRC1,ILEA1
  51 : C     En cas d'erreur dans DELAUN
  52 :       IF (IERR.EQ.2) THEN
  53 :          SEGSUP,IPT4
  54 :          IERR=0
  55 :          GOTO 999
  56 :       ENDIF
  57 :       SEGACT,IPT2
  58 : C     Verification de la convexite de la premiere triangulation
  59 :       IF (IDIM.EQ.1) GOTO 102
  60 :       IF ((IDIM.EQ.2).AND.(IPT2.ITYPEL.EQ.2)) GOTO 102
  61 :       IF ((IDIM.EQ.3).AND.((IPT2.ITYPEL.EQ.2).OR.(IPT2.ITYPEL.EQ.4)))
  62 :      &   GOTO 102
  63 :       IF ((IVC.EQ.1).AND.(NBVC.EQ.0)) THEN
  64 :          ICONV=0
  65 :          NBVC=NBVC+1
  65 :          CALL VERCON(IPT2,ICONV)
  66 :          IF (ICONV.EQ.0) THEN
  67 :             DO I=1,10
  68 :                XBOI=5.*XBOI
  69 : c
  69 :              CALL DELAUN(MPOVAL,IPT4,XBOI,IBOI,IPT2,LNBOIT,ITRC1,ILEA1)
  70 : c
  71 :                IF (IDIM.NE.1) SEGSUP,ITRC1,ILEA1
  72 :                NBVC=NBVC+1
  72 :                CALL VERCON(IPT2,ICONV)
  73 :                IF (ICONV.EQ.1) GOTO 101
  74 :             ENDDO
  75 : 101         CONTINUE
  76 :          ENDIF
  77 :          NBVC=1
  78 :       ENDIF
  79 : 102   CONTINUE
  80 : C     Re-triangulation en ajoutant des noeuds sur les aretes
  81 :       SEGACT,IPT2
  82 :       IF (XDEN.NE.0.) THEN
  83 :          NBELE0=XCOOR(/1)/(IDIM+1)
  84 :          NBELE00=NBELE0
  85 :          NBELE4=IPT4.NUM(/2)
  86 : C        Maillage des lignes de la triangulation initiale
  87 :          IF (IPT2.ITYPEL.EQ.2) THEN
  88 :             SEGINI,IPT3=IPT2
  89 :          ELSE
  89 :             CALL ECROBJ('MAILLAGE',IPT2)
  89 :             CALL CHANLG
  89 :             CALL LIROBJ('MAILLAGE',IPT3,1,IRETOU)
  90 :             IF (IERR.NE.0) RETURN
  91 :             SEGACT,IPT3
  92 :          ENDIF
  93 : C        Boucle sur les lignes pour l'ajout de noeuds milieux
  94 :          DO I=1,IPT3.NUM(/2)
  95 : C           Calcul de la distance de la ligne AB
  96 :             NA=IPT3.NUM(1,I)
  97 :             NB=IPT3.NUM(2,I)
  98 :             DAB=0.
  99 :             DO J=1,IDIM
 100 :                XA(J)=XCOOR((NA-1)*(IDIM+1)+J)
 101 :                XB(J)=XCOOR((NB-1)*(IDIM+1)+J)
 102 :                DAB=DAB+((XA(J)-XB(J))**2)
 103 :             ENDDO
 104 :             DAB=DAB**0.5
 105 :             IF (DAB.GT.XDEN) THEN
 106 : C              Creation d'un nouveau noeud au milieu de AB
 107 :                NBELE4=NBELE4+1
 108 :                NBELE0=NBELE0+1
 109 :                NBPTS0=XCOOR(/1)/(IDIM+1)
 110 : C              Ajustement du segment MCOORD si besoin
 111 :                IF (NBPTS0.LT.NBELE0) THEN
 112 :                   NBPTS=NBPTS0+ICMIN
 113 :                   SEGADJ,MCOORD
 114 :                ENDIF
 115 : C              Ecriture des coordonnees du nouveau noeud dans XCOOR
 116 :                DO J=1,IDIM
 117 :                   XPMIL(J)=0.5*(XA(J)+XB(J))
 118 :                   XCOOR(((NBELE0-1)*(IDIM+1))+J)=XPMIL(J)
 119 :                ENDDO
 120 : C              et sa densite
 121 :                XCOOR(((NBELE0-1)*(IDIM+1))+(IDIM+1))=0.
 122 : C              Ajustement du segment IPT4 si besoin
 123 :                NBE4=IPT4.NUM(/2)
 124 :                IF (NBE4.LT.NBELE4) THEN
 125 :                   NBNN=1
 126 :                   NBELEM=NBE4+ICMIN
 127 :                   NBSOUS=0
 128 :                   NBREF=0
 129 :                   SEGADJ,IPT4
 130 :                ENDIF
 131 : C              Ajout de ce point dans le maillage de points IPT4
 132 :                IPT4.NUM(1,NBELE4)=NBELE0
 133 :             ENDIF
 134 :          ENDDO
 135 : C        Ajustement final de MCOORD et IPT4
 136 :          IF (NBELE0.NE.NBELE00) THEN
 137 :             NBPTS=NBELE0
 138 :             SEGADJ,MCOORD
 139 :             NBNN=1
 140 :             NBELEM=NBELE4
 141 :             NBSOUS=0
 142 :             NBREF=0
 143 :             SEGADJ,IPT4
 144 : C           On remonte faire la triangulation de IPT4
 145 :             GOTO 100
 146 :          ENDIF
 147 :          SEGSUP,IPT3
 148 :       ENDIF
 149 :       SEGSUP,IPT4
 150 : C     Sortie/fin
 151 : 999   RETURN
 152 :       END
 153 : 
 154 :  
 155 :  
 156 :  

© Cast3M 2003 - All rights reserved.
Disclaimer