Télécharger renuel.eso

Retour à la liste

Numérotation des lignes :

renuel
  1. C RENUEL SOURCE CB215821 26/08/24 21:18:14 12622
  2. subroutine renuel(ipt6)
  3. *
  4. * renumerote les elements dans un meleme de proche en proche
  5. * ne fonctionne que pour un meleme simple
  6. *
  7.  
  8. -INC PPARAM
  9. -INC CCOPTIO
  10. -INC SMELEME
  11. -INC SMCOORD
  12. SEGMENT IADJ(NODES+1)
  13. SEGMENT JADJC(JADDIM)
  14. C IADJ(i) pointe sur JADJC qui contient les voisins de i entre
  15. C IADJ(i) et IADJ(i+1)-1
  16. SEGMENT IELFAI(NBELEM)
  17. SEGMENT IPTFAI(NODES)
  18. SEGMENT ICPR(nbpts)
  19. SEGMENT IPLIST(NODES)
  20. *
  21. segini icpr
  22. segact ipt6*mod
  23. meleme=ipt6
  24. do 10000 isous=1,max(1,ipt6.lisous(/1))
  25. if (ipt6.lisous(/1).ne.0) meleme=ipt6.lisous(isous)
  26. segact meleme*mod
  27. segini,ipt1=meleme
  28. ipt2=meleme
  29. nodes=0
  30. do 10001 il=1,ipt1.num(/2)
  31. do 100 ip=1,ipt1.num(/1)
  32. if (icpr(num(ip,il)).ne.0) goto 100
  33. nodes=nodes+1
  34. icpr(num(ip,il))=nodes
  35. 100 continue
  36. 10001 CONTINUE
  37. ** iadj: nombre d'elements touchant un noeud
  38. segini iadj
  39. do 10002 il=1,ipt1.num(/2)
  40. do 200 ip=1,ipt1.num(/1)
  41. ipt=icpr(num(ip,il))
  42. iadj(ipt)=iadj(ipt)+1
  43. 200 continue
  44. 10002 CONTINUE
  45. ** position fin dans jadjc
  46. do ipt=1,nodes
  47. iadj(ipt+1)=iadj(ipt)+iadj(ipt+1)
  48. enddo
  49. ** iadjc: element touchant noeud
  50. JADDIM=iadj(nodes+1)
  51. segini jadjc
  52. do 10003 il=1,ipt1.num(/2)
  53. do 300 ip=1,ipt1.num(/1)
  54. ipt=icpr(num(ip,il))
  55. jadjc(iadj(ipt))=il
  56. iadj(ipt)=iadj(ipt)-1
  57. 300 continue
  58. 10003 CONTINUE
  59. * creation tableau des elements faits, tableau des noeuds faits, et
  60. * et nouveau meleme
  61. nbsous=0
  62. nbref=0
  63. nbnn=ipt1.num(/1)
  64. nbelem=ipt1.num(/2)
  65. segini ielfai,iptfai
  66. ipt2.itypel=ipt1.itypel
  67. * remplissage maillage ordonnee et noeuds ordonné
  68. ielcou=0
  69. segini iplist
  70. * point de depart chosi par minimum degre
  71. nbconn=100000
  72. idep=0
  73. do ip=1,nodes
  74. nbc=iadj(ip+1)-iadj(ip)
  75. if (nbc.lt.nbconn) then
  76. nbconn=nbc
  77. idep=ip
  78. endif
  79. enddo
  80. if (idep.eq.0) call erreur(5)
  81. iplist(1)=idep
  82. iptfai(idep)=1
  83. ipc=1
  84. ipf=1
  85. 1000 continue
  86. if (ipc.gt.nodes) goto 2000
  87. i=iplist(ipc)
  88. ipre=iadj(i)+1
  89. ider=iadj(i+1)
  90. do 1010 jel=ipre,ider
  91. iel=jadjc(jel)
  92. if (ielfai(iel).eq.1) goto 1010
  93. ielcou=ielcou+1
  94. do ip=1,nbnn
  95. ipt2.num(ip,ielcou)=ipt1.num(ip,iel)
  96. ipt=icpr(ipt1.num(ip,iel))
  97. if (iptfai(ipt).eq.0) then
  98. ipf=ipf+1
  99. iplist(ipf)=ipt
  100. iptfai(ipt)=1
  101. endif
  102. enddo
  103. ielfai(iel)=1
  104. 1010 continue
  105. ipc=ipc+1
  106. if (ipc.le.ipf) goto 1000
  107. if (ipc.gt.nodes) goto 2000
  108. * plusieurs composantes connexes on cherche un nouveau point de depart
  109. nbconn=100000
  110. idep=0
  111. do ip=1,nodes
  112. if (iptfai(ip).eq.0) then
  113. nbc=iadj(ip+1)-iadj(ip)
  114. if (nbc.lt.nbconn) then
  115. nbconn=nbc
  116. idep=ip
  117. endif
  118. endif
  119. enddo
  120. if (idep.eq.0) call erreur(5)
  121. ipf=ipf+1
  122. iptfai(idep)=1
  123. iplist(ipf)=idep
  124. goto 1000
  125. * on a fini
  126. 2000 continue
  127. if (ipf.ne.nodes) write (6,*) ' probleme ',ipc,ipf,nodes
  128. segsup iadj,jadjc,ielfai,iptfai,icpr,iplist
  129. segdes ipt1,ipt2
  130. 10000 continue
  131. return
  132. end
  133.  
  134.  
  135.  
  136.  

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