Télécharger tria2.eso

Retour à la liste

Numérotation des lignes :

tria2
  1. C TRIA2 SOURCE PV 20/03/24 21:22:40 10554
  2. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3. SUBROUTINE TRIA2(IPT1,XDEN,IPT5)
  4. C
  5. C Maillage de l'interieur d'un contour/enveloppe par triangulation de
  6. C Delaunay puis ajout de points
  7. C
  8. C IPT1 : Maillage initial constitue :
  9. C - de SEG2 (contour ferme) ou de TRI3 (surface) en dimension 2
  10. C - de TRI3 (enveloppe fermee) ou de TET4 (volume) en dimension 3
  11. C XDEN : Critere sur la taille de maille maximale cible (le maillage est
  12. C raffine en ajoutant des points au milieu des aretes)
  13. C IPT5 : Maillage de sortie constitue :
  14. C - de TRI3 en dimension 2
  15. C - de TET4 en dimension 3
  16. C
  17. IMPLICIT INTEGER(I-N)
  18. IMPLICIT REAL*8 (A-H,O-Z)
  19. C
  20.  
  21. -INC PPARAM
  22. -INC CCOPTIO
  23. -INC SMELEME
  24. -INC SMCOORD
  25. -INC CCGEOME
  26. -INC SMLENTI
  27. PARAMETER (ICMIN=1000)
  28. DIMENSION XA(3),XB(3),XPMIL(3)
  29. DIMENSION LNBOIT(8)
  30. C
  31. SEGMENT,MCIRCONS
  32. REAL*8 TRC(NBE1,4)
  33. ENDSEGMENT
  34. POINTEUR ITRC1.MCIRCONS
  35. C
  36. SEGMENT,MADJACEN
  37. INTEGER LEAC(NBL1,IDIM+1,2)
  38. ENDSEGMENT
  39. POINTEUR ILEA1.MADJACEN
  40. C
  41. POINTEUR LNCONT.MLENTI
  42. C
  43. SEGACT,IPT1
  44. NBSZ=IPT1.LISOUS(/1)
  45. NTYP=IPT1.ITYPEL
  46. I1=0
  47. C On change le maillage d'entree en POI1 --> IPT2
  48. SEGINI,IPT3=IPT1
  49. CALL CHANGE(IPT3,1)
  50. SEGINI,IPT2=IPT3
  51. 101 CONTINUE
  52. C Maillage englobant a utiliser dans INCL --> IPT3
  53. IF (I1.EQ.0) THEN
  54. IF ((IDIM.EQ.3).AND.(NTYP.EQ.4)) THEN
  55. CALL ECROBJ('MAILLAGE',IPT1)
  56. CALL VOLUME
  57. CALL LIROBJ('MAILLAGE',IPT3,1,IRETOU)
  58. IF (IERR.NE.0) RETURN
  59. SEGACT,IPT3
  60. ELSE
  61. SEGINI,IPT3=IPT1
  62. ENDIF
  63. ELSE
  64. SEGINI,IPT3=IPT5
  65. ENDIF
  66. C Calcul du contour/enveloppe de reference --> IPT4
  67. IF (IDIM.EQ.2) THEN
  68. IF (IPT3.ITYPEL.EQ.2) THEN
  69. SEGINI,IPT4=IPT1
  70. ELSE
  71. CALL ECROBJ('MAILLAGE',IPT3)
  72. CALL PRCONT
  73. CALL LIROBJ('MAILLAGE',IPT4,1,IRETOU)
  74. IF (IERR.NE.0) RETURN
  75. SEGACT,IPT4
  76. ENDIF
  77. ELSEIF (IDIM.EQ.3) THEN
  78. CALL ECROBJ('MAILLAGE',IPT3)
  79. CALL ENVVOL
  80. CALL LIROBJ('MAILLAGE',IPT4,1,IRETOU)
  81. IF (IERR.NE.0) RETURN
  82. SEGACT,IPT4
  83. ENDIF
  84. C Creation d'une liste des numeros de noeuds
  85. IF (I1.EQ.0) THEN
  86. segact mcoord *mod
  87. JG=nbpts
  88. SEGINI,LNCONT
  89. C et marquage des noeuds situes sur le contour/enveloppe IPT4
  90. DO I=1,IPT4.NUM(/2)
  91. DO J=1,IPT4.NUM(/1)
  92. LNCONT.LECT(IPT4.NUM(J,I))=1
  93. ENDDO
  94. ENDDO
  95. ENDIF
  96. C Triangulation de DELAUNAY de IPT2 --> IPT5
  97. C (sans ajout de points)
  98. IF (IDIM.EQ.2) XBOI=200.
  99. IF (IDIM.EQ.3) XBOI=500.
  100. c
  101. MPOVAL=0
  102. CALL DELAUN(MPOVAL,IPT2,XBOI,0,IPT5,LNBOIT,ITRC1,ILEA1)
  103. c
  104. IF (IDIM.NE.1) SEGSUP,ITRC1,ILEA1
  105. SEGACT,IPT2,IPT5
  106. C En cas d'erreur dans DELAUN
  107. IF (IERR.EQ.2) THEN
  108. IERR=0
  109. C On rend le maillage pour controle
  110. SEGSUP,IPT2,IPT3,LNCONT
  111. SEGDES,IPT1
  112. GOTO 999
  113. ENDIF
  114. C On isole les elements de IPT5 inclus dans IPT3 par appel a
  115. C INCLUS option 'BARY'
  116. CALL ECRCHA('BARY')
  117. IF (IDIM.EQ.3) CALL ECRCHA('VOLU')
  118. CALL ECROBJ('MAILLAGE',IPT3)
  119. CALL ECROBJ('MAILLAGE',IPT5)
  120. CALL INCLUS
  121. C Les elements inclus sont ranges dans IPT5 (on ecrase le precedent)
  122. SEGSUP,IPT5
  123. CALL LIROBJ('MAILLAGE',IPT5,1,IRETOU)
  124. IF (IERR.NE.0) RETURN
  125. SEGACT,IPT5
  126. C Creation du contour/enveloppe de IPT5 --> IPT6
  127. CALL ECROBJ('MAILLAGE',IPT5)
  128. IF (IDIM.EQ.2) THEN
  129. CALL PRCONT
  130. ELSEIF (IDIM.EQ.3) THEN
  131. CALL ENVVOL
  132. ENDIF
  133. CALL LIROBJ('MAILLAGE',IPT6,1,IRETOU)
  134. IF (IERR.NE.0) RETURN
  135. SEGACT,IPT6
  136. C Test si les noeuds du contour IPT6 sont marques
  137. DO I=1,IPT6.NUM(/2)
  138. DO J=1,IPT6.NUM(/1)
  139. IF (LNCONT.LECT(IPT6.NUM(J,I)).NE.1) THEN
  140. C Maillage incorrect
  141. CALL ERREUR(426)
  142. SEGSUP,IPT2,IPT3,LNCONT
  143. SEGDES,IPT1
  144. GOTO 999
  145. ENDIF
  146. ENDDO
  147. ENDDO
  148. IF (XDEN.NE.0.) THEN
  149. C Maillage des lignes de la triangulation --> IPT7
  150. NBELE0=nbpts
  151. NBELE00=NBELE0
  152. NBELE2=IPT2.NUM(/2)
  153. CALL ECROBJ('MAILLAGE',IPT5)
  154. CALL CHANLG
  155. CALL LIROBJ('MAILLAGE',IPT7,1,IRETOU)
  156. IF (IERR.NE.0) RETURN
  157. SEGACT,IPT7
  158. C On anticipe l'ajout de noeuds sur le contour/enveloppe de
  159. C reference, il faudra les marquer dans LNCONT
  160. NLI=IPT7.NUM(/2)
  161. LNC0=LNCONT.LECT(/1)
  162. JG=LNC0+NLI
  163. SEGADJ,LNCONT
  164. C Boucle sur les lignes pour l'ajout de noeuds milieux
  165. DO I=1,IPT7.NUM(/2)
  166. C Calcul de la distance de la ligne AB
  167. NA=IPT7.NUM(1,I)
  168. NB=IPT7.NUM(2,I)
  169. DAB=0.
  170. DO J=1,IDIM
  171. XA(J)=XCOOR((NA-1)*(IDIM+1)+J)
  172. XB(J)=XCOOR((NB-1)*(IDIM+1)+J)
  173. DAB=DAB+((XA(J)-XB(J))**2)
  174. ENDDO
  175. DAB=DAB**0.5
  176. IF (DAB.GT.XDEN) THEN
  177. C Creation d'un nouveau noeud au milieu de AB
  178. NBELE2=NBELE2+1
  179. NBELE0=NBELE0+1
  180. NBPTS0=nbpts
  181. C Ajustement du segment MCOORD si besoin
  182. IF (NBPTS0.LT.NBELE0) THEN
  183. NBPTS=NBPTS0+ICMIN
  184. SEGADJ,MCOORD
  185. ENDIF
  186. C Ecriture des coordonnees du nouveau noeud dans XCOOR
  187. DO J=1,IDIM
  188. XPMIL(J)=0.5*(XA(J)+XB(J))
  189. XCOOR(((NBELE0-1)*(IDIM+1))+J)=XPMIL(J)
  190. ENDDO
  191. C et sa densite
  192. XCOOR(((NBELE0-1)*(IDIM+1))+(IDIM+1))=0.
  193. C Ajustement du segment IPT2 si besoin
  194. NBE2=IPT2.NUM(/2)
  195. IF (NBE2.LT.NBELE2) THEN
  196. NBNN=1
  197. NBELEM=NBE2+ICMIN
  198. NBSOUS=0
  199. NBREF=0
  200. SEGADJ,IPT2
  201. ENDIF
  202. C Ajout de ce point dans le maillage de points IPT2
  203. IPT2.NUM(1,NBELE2)=NBELE0
  204. C Si le point est sur le bord, on le marque dans LNCONT
  205. IF ((LNCONT.LECT(NA).EQ.1).AND.(LNCONT.LECT(NB).EQ.1))
  206. & THEN
  207. LNCONT.LECT(NBELE0)=1
  208. ENDIF
  209. ENDIF
  210. ENDDO
  211. C Ajustement de LNCONT
  212. JG=LNC0+(NBELE0-NBELE00)
  213. SEGADJ,LNCONT
  214. C Ajustement final de MCOORD et IPT2
  215. IF (NBELE0.NE.NBELE00) THEN
  216. NBPTS=NBELE0
  217. SEGADJ,MCOORD
  218. NBNN=1
  219. NBELEM=NBELE2
  220. NBSOUS=0
  221. NBREF=0
  222. SEGADJ,IPT2
  223. C Suppression des maillages temporaires utilises
  224. SEGSUP,IPT3,IPT7
  225. C On remonte pour refaire la triangulation
  226. I1=1
  227. GOTO 101
  228. ENDIF
  229. SEGSUP,IPT7
  230. ENDIF
  231. C Ecriture sortie/fin
  232. SEGSUP,IPT2,IPT3,LNCONT
  233. SEGDES,IPT1
  234. C Sortie/fin
  235. 999 RETURN
  236. END
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  

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