Télécharger reduri.eso

Retour à la liste

Numérotation des lignes :

reduri
  1. C REDURI SOURCE FANDEUR 22/01/19 21:15:13 11256
  2. subroutine reduri(mrigid,moleme,irigre)
  3. implicit real*8(a-h,o-z)
  4. implicit integer (i-n)
  5. -INC SMRIGID
  6. -INC SMELEME
  7.  
  8. -INC PPARAM
  9. -INC CCOPTIO
  10. -INC SMCOORD
  11. segment icpr(nbpts)
  12. segment inode(ino)
  13. segment jelnum(imaxel,ino)
  14. segment izone(imaxel,ino)
  15. irigre=0
  16. ipt1=moleme
  17. segact ipt1
  18. meleme=ipt1
  19. nbso1=ipt1.lisous(/1)
  20. ino=0
  21.  
  22. C Cas d'un MELEME vide => RIGIDITE vide
  23. segact mrigid
  24. IF (nbso1.eq.0) THEN
  25. IF (IPT1.NUM(/2).EQ.0) THEN
  26. NRIGEL = 0
  27. SEGINI,RI1
  28. RI1.MTYMAT = MTYMAT
  29. RI1.IFORIG = IFORIG
  30. irigre = RI1
  31. segdes mrigid
  32. RETURN
  33. ENDIF
  34. ENDIF
  35. *
  36. * creation, d'une numerotation locale
  37. *
  38. segini icpr
  39. do 1 i =1, max(nbso1,1)
  40. if(nbso1.ne.0) then
  41. meleme=ipt1.lisous(i)
  42. segact meleme
  43. endif
  44. do 2 j=1,num(/2)
  45. do 22 k=1,num(/1)
  46. ia= num(k,j)
  47. if(icpr(ia).eq.0) then
  48. ino=ino+1
  49. icpr(ia)=ino
  50. endif
  51. 22 continue
  52. 2 continue
  53. 1 continue
  54. *
  55. * on compte combien d'elements touche un noeud
  56. *
  57. segini inode
  58. do 3 i=1,max(nbso1,1)
  59. if(nbso1.ne.0) then
  60. meleme=ipt1.lisous(i)
  61. endif
  62. do 4 j=1,num(/2)
  63. do 42 k=1,num(/1)
  64. ia=num(k,j)
  65. ib= icpr(ia)
  66. inode(ib)=inode(ib)+1
  67. 42 continue
  68. 4 continue
  69. 3 continue
  70. imaxel=0
  71. do i=1,ino
  72. imaxel=max(imaxel,inode(i))
  73. inode(i)=0
  74. enddo
  75. segini jelnum,izone
  76. *
  77. * jelnum(i,k) dira le Ieme element qui touche le noeud k
  78. * izone (i,k) dira dans quel lisous le ieme element se trouve
  79. * attention le noeud K est le plus petit de l'élément
  80. do 5 i=1,max(nbso1,1)
  81. if(nbso1.ne.0) then
  82. meleme=ipt1.lisous(i)
  83. endif
  84. do 6 j=1,num(/2)
  85. ipeti=nbpts*(idim+1)
  86. do k=1,num(/1)
  87. ipeti=min(num(k,j),ipeti)
  88. enddo
  89. ib= icpr(ipeti)
  90. inode(ib)=inode(ib)+1
  91. ic=inode(ib)
  92. jelnum(ic,ib)=j
  93. izone(ic,ib)=i
  94. 6 continue
  95. 5 continue
  96. *
  97. * travail sur les rigidites elementaires
  98. *
  99. nrigel=coerig(/1)
  100. nrige=irigel(/1)
  101. segini ri1
  102. ri1.mtymat=mtymat
  103. ri1.iforig=iforig
  104. irzon=0
  105. do 10 i=1,irigel(/2)
  106. ipt3=irigel(1,i)
  107. segact ipt3
  108. xmatri=irigel(4,i)
  109. ielzo=0
  110. do 11 j=1,ipt3.num(/2)
  111. ipeti=nbpts*(idim+1)
  112. do k=1,ipt3.num(/1)
  113. ipeti=min(ipeti,ipt3.num(k,j))
  114. enddo
  115.  
  116. * on regarde s'il existe un element de ipt1 ayant ce noeud en plus
  117. * petitre position si non on passe a l'élément suivant
  118. ib=icpr(ipeti)
  119. if(ib.eq.0) go to 11
  120. if(inode(ib).eq.0) go to 11
  121. do 13 mm=1,inode(ib)
  122. if(nbso1.ne.0)then
  123. meleme= ipt1.lisous(izone(mm,ib))
  124. endif
  125. if(ipt3.num(/1).ne.num(/1)) go to 13
  126. iel=jelnum(mm,ib)
  127. do in=1,ipt3.num(/1)
  128. if( ipt3.num(in,j).ne.num(in,iel))go to 13
  129. enddo
  130. * on a trouver un element a conserver
  131. if(ielzo.eq.0) then
  132. segini,ipt4=ipt3
  133. irzon=irzon+1
  134. do kk=1,irigel(/1)
  135. ri1.irigel(kk,irzon)=irigel(kk,i)
  136. enddo
  137. ri1.irigel(1,irzon)=ipt4
  138. ri1.coerig(irzon)=coerig(i)
  139. xmatri=irigel(4,i)
  140. segact xmatri
  141. segini,xmatr1=xmatri
  142. ri1.irigel(4,irzon)= xmatr1
  143. endif
  144. ielzo=ielzo+1
  145. do io=1,re(/2)
  146. do iu=1,re(/1)
  147. xmatr1.re(iu,io,ielzo)=re(iu,io,j)
  148. enddo
  149. enddo
  150. * imatr1.imattt(ielzo)=imattt(j)
  151. do kk=1,ipt3.num(/1)
  152. ipt4.num(kk,ielzo)=ipt3.num(kk,j)
  153. enddo
  154. 13 continue
  155. 11 continue
  156. * on ajuste les longueur si besoin
  157. if(ielzo.ne.0) then
  158. if(ielzo.ne.ipt4.num(/2)) then
  159. nbsous=0
  160. nbelem= ielzo
  161. nbnn=ipt4.num(/1)
  162. nbref=0
  163. segadj ipt4
  164. nelrig=ielzo
  165. nligrp= xmatr1.re(/2)
  166. nligrd= xmatr1.re(/1)
  167. segadj xmatr1
  168. segdes ipt4,xmatr1
  169. else
  170. ri1.irigel(4,irzon)=xmatri
  171. ri1.irigel(1,irzon)=ipt3
  172. segsup xmatr1,ipt4
  173. endif
  174. endif
  175. segdes xmatri
  176. 10 continue
  177. if(irzon.eq.0) then
  178. segdes mrigid
  179. call erreur(21)
  180. return
  181. elseif(irzon.ne.coerig(/1)) then
  182. nrigel=irzon
  183. nrige=irigel(/1)
  184. segadj ri1
  185. segdes ri1
  186. irigre=ri1
  187. else
  188. do io=1,irzon
  189. if( ri1.irigel(1,io).ne.irigel(1,io) )go to 20
  190. enddo
  191. irigre= mrigid
  192. go to 21
  193. 20 continue
  194. irigre=ri1
  195.  
  196. 21 continue
  197. endif
  198. do iou=1,irigel(/2)
  199. ipt3=irigel(1,iou)
  200. segdes ipt3
  201. enddo
  202. segdes mrigid
  203. if(irigre.eq.mrigid) then
  204. segsup ri1
  205. else
  206. segdes ri1
  207. endif
  208. segsup izone,icpr,jelnum,inode
  209. c return
  210. end
  211.  
  212.  
  213.  

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