Télécharger impf.eso

Retour à la liste

Numérotation des lignes :

impf
  1. C IMPF SOURCE PV 20/04/01 21:15:37 10569
  2. *
  3. * Fabrique un maillage :
  4. * - d'elements de frottement a partir d'elements de contact
  5. * - de cables frottants a partir du maillage des cables
  6. *
  7. SUBROUTINE IMPF
  8. *
  9. IMPLICIT INTEGER(I-N)
  10. IMPLICIT REAL*8 (A-H,O-Z)
  11. *
  12.  
  13. -INC PPARAM
  14. -INC CCOPTIO
  15. *
  16. -INC SMCOORD
  17. -INC SMELEME
  18. -INC CCGEOME
  19. *
  20. segment icpr(nbpts)
  21. *
  22. idimp1 = IDIM + 1
  23. segact mcoord*mod
  24. nbptin = nbpts
  25. nbpts=nbptin
  26. *
  27. *
  28. * Lecture du maillage de contact / des cables frottants
  29. *
  30. call lirobj('MAILLAGE',ipt1,1,iretou)
  31. if (ierr.ne.0) return
  32. *
  33. segact ipt1
  34. *
  35. if (ipt1.lisous(/1) .eq.0) then
  36. ** elem type 2 ==> cable frottant
  37. if (ipt1.itypel.eq.2) goto 100
  38. endif
  39. *
  40. nbnnin = ipt1.num(/1)
  41. nbelin = ipt1.num(/2)
  42. *
  43. *=========================================================
  44. * Elements de frottement <- Elements de contact (type 22)
  45. *=========================================================
  46. *
  47. * Nombre de noeud(s) support(s) supplementaire(s) pour le frottement
  48. * a ajouter a chaque element de contact pour faire l'element de
  49. * frottement correspondant
  50. * Le(s) noeud(s) supplementaire(s) a(ont) les memes coordonnees que
  51. * le noeud support du contact (1er noeud de l'element de contact).
  52. * attention:
  53. * creation des noeuds supports différés à la première utilisation en 3d
  54. * on se sert de icpr pour stocker le mult de frottement associé a un mult de contact
  55. * de facon a ne le creer qu'une fois
  56. segini icpr
  57. nbs = 1
  58. if (idim.eq.3) nbs = 2
  59. ipt2=ipt1
  60. segact ipt2
  61. nbsous=max(1,ipt1.lisous(/1))
  62. nbref=0
  63. nbnn=0
  64. nbelem=0
  65. segini ipt4
  66. do is=1,nbsous
  67. if (ipt1.lisous(/1).ne.0) ipt2=ipt1.lisous(is)
  68. segact ipt2
  69. nbnn=ipt2.num(/1)+nbs
  70. nbelem=ipt2.num(/2)
  71. nbsous=0
  72. segini ipt3
  73. ipt4.lisous(is)=ipt3
  74. ipt3.itypel=22
  75. do iel=1,ipt2.num(/2)
  76. do in=1,ipt2.num(/1)
  77. ipt3.num(in,iel)=ipt2.num(in,iel)
  78. enddo
  79. ipt3.icolor(iel)=ipt2.icolor(iel)
  80. il=ipt2.num(1,iel)
  81. if (icpr(il).eq.0) then
  82. nbpts=nbpts+1
  83. icpr(il)=nbpts
  84. if (idim.eq.3) nbpts=nbpts+1
  85. endif
  86. ipt3.num(ipt2.num(/1)+1,iel)=icpr(il)
  87. if (idim.eq.3) ipt3.num(ipt2.num(/1)+2,iel)=icpr(il)+1
  88. enddo
  89. ipt4.lisous(is)=ipt3
  90. enddo
  91. * remplissage mcoord
  92. segadj mcoord
  93. do i=1,icpr(/1)
  94. ip=icpr(i)
  95. if (ip.ne.0) then
  96. ip=(ip-1)*(idim+1)
  97. xcoor(ip+1)=xcoor((i-1)*(idim+1)+1)
  98. xcoor(ip+2)=xcoor((i-1)*(idim+1)+2)
  99. if (idim.eq.3) xcoor(ip+3)=xcoor((i-1)*(idim+1)+3)
  100. if (idim.eq.3) then
  101. ip=icpr(i)+1
  102. ip=(ip-1)*(idim+1)
  103. xcoor(ip+1)=xcoor((i-1)*(idim+1)+1)
  104. xcoor(ip+2)=xcoor((i-1)*(idim+1)+2)
  105. xcoor(ip+3)=xcoor((i-1)*(idim+1)+3)
  106. endif
  107. endif
  108. enddo
  109. *
  110. meleme=ipt4
  111. if (ipt4.lisous(/1).eq.1) then
  112. meleme=ipt4.lisous(1)
  113. segsup ipt4
  114. endif
  115.  
  116. goto 900
  117.  
  118. *============================
  119. * Elements de cable frottant
  120. *============================
  121. 100 continue
  122. *
  123. nbnnin = ipt1.num(/1)
  124. nbelin = ipt1.num(/2)
  125. *
  126. segact mcoord
  127. nbptin = nbpts
  128. *
  129. * IDIM element(s) de frottement en chaque point geometrique definissant
  130. * le reseau des cables (un seul element associe au noeud commun a
  131. * plusieurs elements de cable pour chaque direction de l'espace)
  132. nbptr = nbptin
  133. segini icpr
  134. nbs = 0
  135. do 101 iel = 1, nbelin
  136. do 102 in = 1, nbnnin
  137. ia = ipt1.num(in,iel)
  138. if (icpr(ia).ne.0) goto 102
  139. nbs = nbs+1
  140. icpr(ia) = nbs
  141. 102 continue
  142. 101 continue
  143. *
  144. nbnn = 2
  145. nbelem = nbs*idim
  146. nbref = 0
  147. nbsous = 0
  148. segini meleme
  149. itypel = 22
  150. *
  151. nbpts = nbptin + (nbs*idim)
  152. segadj,mcoord
  153. *
  154. nbel = 0
  155. ndec = (nbptin-1) * idimp1
  156. do 103 iel = 1, nbelin
  157. do 104 in = 1, nbnnin
  158. ia = ipt1.num(in,iel)
  159. if (icpr(ia).eq.0) goto 104
  160. icpr(ia) = 0
  161. ip = (ia-1)*idimp1
  162. xb = xcoor(ip+1)
  163. yb = xcoor(ip+2)
  164. zb = xcoor(ip+3)
  165. if (idim.eq.3) tb = xcoor(ip+4)
  166. do 105 id = 1,idim
  167. nbel = nbel+1
  168. ndec = ndec+idimp1
  169. xcoor(ndec+1) = xb
  170. xcoor(ndec+2) = yb
  171. xcoor(ndec+3) = zb
  172. if (idim.eq.3) xcoor(ndec+4) = tb
  173. num(1,nbel) = nbptin + nbel
  174. num(2,nbel) = ia
  175. 105 continue
  176. 104 continue
  177. 103 continue
  178. *
  179. segsup icpr
  180. c* goto 900
  181. *
  182. *=======
  183. * Fin : Ecriture du MELEME de frottement
  184. *=======
  185. 900 CONTINUE
  186. segdes,meleme
  187. call ecrobj('MAILLAGE',meleme)
  188.  
  189. 990 CONTINUE
  190. segdes,ipt1
  191.  
  192. return
  193. end
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  

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