Télécharger duali2.eso

Retour à la liste

Numérotation des lignes :

duali2
  1. C DUALI2 SOURCE CB215821 26/08/24 21:16:18 12622
  2. C DUALISE LE RESULTAT DE SURF POUR LE MAILLAGE PAR POLYGONE
  3. C
  4. SUBROUTINE DUALI2(FER,XPRO,XPROJ1,IPT2,NUMELG,NDEB,NUMNP)
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. LOGICAL PORDO
  8. INTEGER INTD
  9. SEGMENT /FER/(NFI(ITT),MAI(IPP),ITOUR)
  10. SEGMENT XPRO
  11. REAL*8 XPROJ(3,1)
  12. ENDSEGMENT
  13. POINTEUR XPROJ1.XPRO
  14. SEGMENT ILIST(NBNN)
  15. SEGMENT INB(NUMNP)
  16. -INC SMELEME
  17. POINTEUR POLY.MELEME, POLY1.MELEME
  18. *
  19. INTD=0
  20. DO 101, NUCOT = 1, ITOUR
  21. *
  22. IDEB = MAI(NUCOT)
  23. IFIN = MAI(NUCOT+1)-1
  24. *
  25. DO 84, IP2 = IDEB, IFIN
  26. *
  27. 84 CONTINUE
  28. 101 CONTINUE
  29.  
  30. IAUX=XPRO
  31. XPRO=XPROJ1
  32. XPROJ1=IAUX
  33. SEGINI INB
  34. * ON CREE UN NOEUD AU CENTRE DE GRAVITE DE CHAQUE TRIANGLE
  35. DO 15 I=1,NUMELG
  36. *
  37. XPROJ(1,NDEB+I-1)=0.
  38. XPROJ(2,NDEB+I-1)=0.
  39. XPROJ(3,NDEB+I-1)=0.
  40. DO 10 J=1,3
  41. IP=IPT2.NUM(J,I)
  42. INB(IP)=INB(IP)+1
  43. XPROJ(1,NDEB+I-1)=XPROJ(1,NDEB+I-1)+XPROJ1.XPROJ(1,IP)
  44. XPROJ(2,NDEB+I-1)=XPROJ(2,NDEB+I-1)+XPROJ1.XPROJ(2,IP)
  45. XPROJ(3,NDEB+I-1)=XPROJ(3,NDEB+I-1)+XPROJ1.XPROJ(3,IP)
  46. 10 CONTINUE
  47. XPROJ(1,NDEB+I-1)=XPROJ(1,NDEB+I-1)/3
  48. XPROJ(2,NDEB+I-1)=XPROJ(2,NDEB+I-1)/3
  49. XPROJ(3,NDEB+I-1)=XPROJ(3,NDEB+I-1)/3
  50. 15 CONTINUE
  51. * ON CONSTRUIT LES ELEMENTS
  52. NBNN=0
  53. DO 20 IP=1,NUMNP
  54. NBNN=MAX(INB(IP),NBNN)
  55. INB(IP)=0
  56. 20 CONTINUE
  57. *
  58. SEGINI ILIST
  59. NBELEM=NUMNP
  60. NBSOUS=0
  61. NBREF=0
  62. SEGINI MELEME
  63. ITYPEL=32
  64. DO 35 I=1,NUMELG
  65. DO 30 J=1,3
  66. IP=IPT2.NUM(J,I)
  67. INB(IP)=INB(IP)+1
  68. NUM(INB(IP),IP)=I
  69. 30 CONTINUE
  70. 35 CONTINUE
  71. *
  72. NUMNP = NUMELG + NDEB - 1
  73. NUMELG = NBELEM
  74. *
  75. * MAINTENANT IL FAUT REPASSER LES ELEMENTS POUR METTRE LES NOEUDS
  76. * DANS LE BON SENS ET S'OCCUPER DES BORDS
  77. *
  78. DO 100 INT=1,NBELEM
  79. *
  80. * Ordonnancement
  81. *
  82. NUSP = 0
  83. PORDO = .FALSE.
  84. *
  85. * TANT QUE LE POLYGONE N'EST PAS ENTIEREMENT ORDONNEE
  86. *
  87. 50 CONTINUE
  88. *
  89. * Boucle sur tous les triangles voisins
  90. *
  91. DO 70 I=1,INB(INT)
  92. *
  93. ICT = NUM(I,INT)
  94. *
  95. * Boucle sur les sommets du triangle associé
  96. *
  97. DO 60 K=1,3
  98. IF (IPT2.NUM(K,ICT).EQ.INT) THEN
  99. *
  100. * C'est le centre du polygone
  101. *
  102. INT1 = IPT2.NUM(MOD(K,3)+1,ICT)
  103. INT2 = IPT2.NUM(MOD(K+1,3)+1,ICT)
  104. *
  105. IF (NUSP.EQ.0) THEN
  106. *
  107. * Pas encore de sommets mémorisés
  108. *
  109. IF (INT.LT.NDEB) THEN
  110. *
  111. * Le centre du polygone est sur le coté
  112. *
  113. INP3 = NUSOM(INT1, INT, FER, NDEB)
  114. INP4 = NUSOM(INT2, INT, FER, NDEB)
  115. *
  116. IF (INP3.NE.0) THEN
  117. *
  118. * Premier sommet du polygone
  119. *
  120. ILIST(1) = INP3
  121. ILIST(2) = ICT + NDEB - 1
  122. INTF = INT2
  123. NUSP = 2
  124. *
  125. IF (INP4.NE.0) THEN
  126. *
  127. * Le polygone est triangulaire
  128. *
  129. ILIST(3) = INP4
  130. PORDO = .TRUE.
  131. NUSP = 3
  132. *
  133. ENDIF
  134. *
  135. ELSEIF (INP4.NE.0) THEN
  136. *
  137. * Premier sommet du polygone
  138. *
  139. ILIST(1) = INP4
  140. ILIST(2) = ICT + NDEB - 1
  141. INTF = INT1
  142. NUSP = 2
  143. *
  144. ENDIF
  145. ELSE
  146. *
  147. * Le centre du polygone est au milieu de la surface
  148. *
  149. ILIST(1) = ICT + NDEB - 1
  150. INTD = INT1
  151. INTF = INT2
  152. NUSP = 1
  153. *
  154. ENDIF
  155. *
  156. ELSE
  157. *
  158. * Des noeuds sont deja memorisés
  159. *
  160. IF (INT1.EQ.INTF.OR.INT2.EQ.INTF) THEN
  161. *
  162. NUSP = NUSP+1
  163. ILIST (NUSP) = ICT + NDEB - 1
  164. *
  165. IF (INT1.EQ.INTF) THEN
  166. INTF = INT2
  167. ELSE IF (INT2.EQ.INTF) THEN
  168. INTF = INT1
  169. ENDIF
  170. *
  171. IF (INTF.EQ.INTD) THEN
  172. *
  173. * Polygone fermé
  174. *
  175. PORDO = .TRUE.
  176. *
  177. ENDIF
  178. *
  179. INP3 = NUSOM(INTF, INT, FER, NDEB)
  180. *
  181. IF (INP3.NE.0) THEN
  182. *
  183. * Le deux sommets sont voisins sur la frontiere
  184. * => on ferme le polygone
  185. *
  186. NUSP = NUSP+1
  187. ILIST (NUSP) = INP3
  188. PORDO = .TRUE.
  189. *
  190. ENDIF
  191. *
  192. ENDIF
  193. *
  194. ENDIF
  195. *
  196. ENDIF
  197. *
  198. 60 CONTINUE
  199. *
  200. 70 CONTINUE
  201. *
  202. IF (.NOT.PORDO) GOTO 50
  203. *
  204. * Stockage du maillage dans un segment MELEME
  205. *
  206. IF (INT.EQ.1) THEN
  207. *
  208. * Initialisation du pointeur chapeau du maillage
  209. *
  210. NBNN = 0
  211. NBELEM = 0
  212. NBREF = 0
  213. NBSOUS = 1
  214. SEGINI POLY1
  215. *
  216. ELSE
  217. *
  218. * Recherche si un polygone a NUSP cotés existe deja dans MELEME
  219. *
  220. NBELEM = 0
  221. *
  222. DO 80 I=1, POLY1.LISOUS(/1)
  223. *
  224. POLY = POLY1.LISOUS(I)
  225. *
  226. IF (POLY.NUM(/1).EQ.NUSP) THEN
  227. *
  228. NBELEM = POLY.NUM(/2)+1
  229. NBNN = NUSP
  230. NBSOUS = 0
  231. NBREF = 0
  232. *
  233. SEGADJ POLY
  234. GOTO 81
  235. *
  236. ENDIF
  237. *
  238. 80 CONTINUE
  239. 81 CONTINUE
  240. *
  241. IF (NBELEM.EQ.0) THEN
  242. *
  243. NBNN = 0
  244. NBELEM = 0
  245. NBREF = 0
  246. NBSOUS = POLY1.LISOUS(/1)+1
  247. SEGADJ POLY1
  248. *
  249. ENDIF
  250. *
  251. ENDIF
  252. *
  253. IF (NBELEM.EQ.0) THEN
  254. *
  255. * Creation de l'element a NUSP cote
  256. *
  257. NBELEM = 1
  258. NBNN = NUSP
  259. NBSOUS = 0
  260. NBREF = 0
  261. *
  262. SEGINI POLY
  263. *
  264. NBSOUS = POLY1.LISOUS(/1)
  265. POLY1.LISOUS(NBSOUS) = POLY
  266. POLY.ITYPEL = 32
  267. *
  268. ENDIF
  269. *
  270. * Recopie des données dans le MELEME
  271. *
  272. DO 90 I = 1, NUSP
  273. *
  274. POLY.NUM(I, NBELEM) = ILIST(I)
  275. *
  276. 90 CONTINUE
  277. *
  278. 100 CONTINUE
  279. *
  280. * Recopie du nouveau MELEME dans l'ancien
  281. *
  282. IPT3 = IPT2
  283. IPT2 = POLY1
  284. *
  285. SEGSUP IPT3
  286. *
  287. END
  288.  
  289.  
  290.  
  291.  
  292.  

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