Télécharger tria1.eso

Retour à la liste

Numérotation des lignes :

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

© Cast3M 2003 - Tous droits réservés.
Mentions légales