Télécharger uniqm1.eso

Retour à la liste

Numérotation des lignes :

uniqm1
  1. C UNIQM1 SOURCE PV090527 23/02/02 21:15:08 11577
  2. *
  3. subroutine uniqm1(ipt1,meleme,nbdif,iordre)
  4. *
  5. * construit un maillage constitue des elements unique d'un autre maillage
  6. * le maillage est elementaire et l'ordre de description est ou n'est pas
  7. * significatif selon la valeur de iordre
  8. *
  9. implicit real*8 (a-h,o-z)
  10.  
  11. -INC PPARAM
  12. -INC CCOPTIO
  13. -INC CCGEOME
  14. -INC SMELEME
  15. -INC SMCOORD
  16. segment netn(nbpts+1+nbhash)
  17. segment ietn(letn)
  18. segment ihash2(nbelem)
  19. *
  20. * pas de test sur le type 22 car peut etre tres long
  21. if (ipt1.itypel.eq.22) then
  22. segact ipt1
  23. if (ipt1.num(/2).gt.3*nbpts) then
  24. meleme=ipt1
  25. nbdif=0
  26. return
  27. endif
  28. endif
  29. numnp=nbpts
  30. * construction des tableaux noeuds => elements
  31. * on rejoute un hashcode comme noeud supplementaire de l'element car il est moins partage que les noeuds
  32. * dans le cas des elements de contact
  33. segact ipt1
  34. nbnn=ipt1.num(/1)
  35. nbelem=ipt1.num(/2)
  36. numnp=max(nbnn,numnp)
  37. nbhash=min(numnp*nbnn,nbelem)
  38. segini netn,ihash2
  39. do 1055 j=1,nbelem
  40. ihash=0
  41. ihashb=0
  42. do 1050 i=1,nbnn
  43. ip=ipt1.num(i,j)
  44. netn(ip)=netn(ip)+1
  45. ir=1
  46. * tri des noeuds pour calculer le hash car ils peuvent etre dans le desordre
  47. do k=1,nbnn
  48. if (ipt1.num(k,j).gt.ip) ir=ir+1
  49. enddo
  50. ihash=ip*ir+ihash
  51. * le deuxieme hash sert a accelerer les comparaisons entre elements. On le prend indifferent a l'ordre.
  52. ihashb=ipt1.num(i,j)+ihashb
  53. 1050 continue
  54. ihash=mod(ihash,nbhash)+numnp+1
  55. netn(ihash)=netn(ihash)+1
  56. ihash2(j)=ihashb
  57. 1055 continue
  58. do 1060 i=2,netn(/1)
  59. netn(i)=netn(i)+netn(i-1)
  60. 1060 continue
  61. letn=netn(netn(/1))
  62. segini ietn
  63. do 1075 j=1,nbelem
  64. ihash=0
  65. do 1070 i=1,nbnn
  66. ip=ipt1.num(i,j)
  67. ietn(netn(ip))=j
  68. netn(ip)=netn(ip)-1
  69. ir=1
  70. do k=1,nbnn
  71. if (ipt1.num(k,j).gt.ip) ir=ir+1
  72. enddo
  73. ihash=ip*ir+ihash
  74. 1070 continue
  75. ihash=mod(ihash,nbhash)+numnp+1
  76. ietn(netn(ihash))=j
  77. netn(ihash)=netn(ihash)-1
  78. 1075 continue
  79. *
  80. * recherche et elimination des doublons
  81. *
  82. segini,meleme=ipt1
  83. nbnn=num(/1)
  84. DO 150 IEF=1,nbelem
  85. * recherche du noeud ayant le moins d'elements et calcul simultanement du hash
  86. nbel=letn+1
  87. ino=0
  88. ihash=0
  89. do 160 inf=1,nbnn
  90. ip=num(inf,ief)
  91. ir=1
  92. do k=1,nbnn
  93. if (ipt1.num(k,ief).gt.ip) ir=ir+1
  94. enddo
  95. ihash=ip*ir+ihash
  96. id=netn(ip)+1
  97. if=netn(ip+1)
  98. if (nbel.gt.(if-id)) then
  99. ino=inf
  100. nbel=if-id
  101. endif
  102. 160 continue
  103. ihash=mod(ihash,nbhash)+numnp+1
  104. id=netn(ihash)+1
  105. if=netn(ihash+1)
  106. if (nbel.gt.(if-id)) then
  107. ino=ihash
  108. nbel=if-id
  109. endif
  110. * test sur les elements connectes a ce noeud
  111. if (ino.le.numnp) then
  112. ip=num(ino,ief)
  113. ** write(6,*) ' utilisation du noeud ',ino,ip
  114. else
  115. ip=ino
  116. ** write(6,*) ' utilisation du hash ',ip
  117. endif
  118. id=netn(ip)+1
  119. if=netn(ip+1)
  120. do 165 itn=id,if
  121. iem=ietn(itn)
  122. * les elements sont ranges par ordre decroissant dans ietn car il est rempli a partir de la fin
  123. * on peut donc s'arreter des qu'on s'est atteint
  124. if (iem.le.ief) goto 150
  125. if (ihash2(iem).ne.ihash2(ief)) goto 165
  126. do 167 i0=1,nbnn
  127. * pas le meme test si optio ordre
  128. if (iordre.eq.0) then
  129. do 166 i1b=i0,nbnn+i0-1
  130. i1=mod(i1b-1,nbnn)+1
  131. if (num(i0,ief).eq.num(i1,iem)) goto 167
  132. 166 continue
  133. else
  134. if (num(i0,ief).eq.num(i0,iem)) goto 167
  135. endif
  136. goto 165
  137. 167 continue
  138. ** write (6,*) ' ief elimine ',ief
  139. num(1,ief)=0
  140. icolor(iem)=itabm(icolor(ief),icolor(iem))
  141. goto 150
  142. 165 continue
  143. 150 continue
  144. * compression du résultat
  145. nbelem=0
  146. do 200 iel=1,num(/2)
  147. if (num(1,iel).ne.0) then
  148. nbelem=nbelem+1
  149. do i=1,num(/1)
  150. num(i,nbelem)=num(i,iel)
  151. enddo
  152. icolor(nbelem)=icolor(iel)
  153. endif
  154. 200 continue
  155. nbnn=num(/1)
  156. nbsous=0
  157. nbref=0
  158. nbdif = num(/2)-nbelem
  159. if (nbdif.ne.0) then
  160. interr(1)=nbdif
  161. moterr(1:4)=noms(itypel)
  162. call erreur(-354)
  163. segadj meleme
  164. else
  165. segsup meleme
  166. meleme = ipt1
  167. endif
  168.  
  169. c if (nbelem.eq.0) then
  170. c segsup meleme
  171. c meleme=0
  172. c endif
  173. segsup netn,ietn,ihash2
  174.  
  175. return
  176. end
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  

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