Télécharger frig.eso

Retour à la liste

Numérotation des lignes :

frig
  1. C FRIG SOURCE CB215821 24/04/12 21:16:04 11897
  2.  
  3. SUBROUTINE FRIG
  4.  
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8(A-H,O-Z)
  7.  
  8. * Ce sous-programme calcule la raideur de frottement.
  9. * Il a besoin pour cela du maillage de frottement et de la raideur
  10. * de contact (ou la raideur totale si c'est plus simple)
  11.  
  12.  
  13. -INC PPARAM
  14. -INC CCOPTIO
  15. -INC CCREEL
  16.  
  17. -INC SMCHPOI
  18. -INC SMCOORD
  19. -INC SMELEME
  20. -INC SMMODEL
  21. -INC SMRIGID
  22.  
  23. logical ltelq
  24.  
  25. idimp1 = IDIM + 1
  26. *
  27. * Test sur les options de calcul
  28. if (idim .ne. 3) then
  29. if (ifomod .ne. -1 .and. ifomod .ne. 0) then
  30. call erreur(710)
  31. return
  32. endif
  33. endif
  34. *
  35. * Lecture obligatoire du modele de frottement
  36. *
  37. call LIROBJ('MMODEL' , modini,1,iretou)
  38. if (ierr.ne.0) return
  39. *
  40. * Quelques initialisations
  41. *
  42. mmodel = modini
  43. segact mmodel
  44. nsous = kmodel(/1)
  45. n1 = nsous
  46. segini,mmode1
  47. segini,mmode2
  48. *
  49. * Travail préparatoire de separation des modeles de frottement
  50. *
  51. icoulo = 0
  52. icable = 0
  53. ipp2 = 0
  54. ltelq=.false.
  55. do 700 imod = 1, nsous
  56. imodel= kmodel(imod)
  57. segact imodel
  58. if (matmod(1).eq.'COULOMB') then
  59. icoulo=icoulo+1
  60. mmode1.kmodel(icoulo) = imodel
  61. * modele(s) de Coulomb : on agglomere les maillages sous-jacents
  62. if (icoulo.eq.1) then
  63. ipp2 = imamod
  64. else
  65. meleme = ipp2
  66. ipp1 = imamod
  67. call fuse(meleme,ipp1,ipp2,ltelq)
  68. if (icoulo.ge.3) segsup,meleme
  69. endif
  70. else if (matmod(1).eq.'FROCABLE') then
  71. icable = icable+1
  72. mmode2.kmodel(icable) = imodel
  73. else
  74. segdes,imodel
  75. endif
  76. 700 continue
  77. segdes mmodel
  78. n1 = icoulo
  79. segadj,mmode1
  80. modcou = mmode1
  81. n1 = icable
  82. segadj,mmode2
  83. modcab = mmode2
  84. if (icoulo.eq.0 .and. icable.eq.0) then
  85. call erreur(21)
  86. goto 9000
  87. endif
  88. *
  89. * Lecture conditionnelle des arguments (selon les modeles de frottement)
  90. *
  91. lecond = 0
  92. if (icoulo.ne.0) lecond = 1
  93. *
  94. iraidc = 0
  95. ichjeu = 0
  96. *
  97. * Lecture de la raideur de contact
  98. call lirobj('RIGIDITE',iraidc,lecond,iretou)
  99. if (ierr.ne.0) GOTO 9000
  100. *
  101. * Lecture du champ de jeux
  102. call lirobj('CHPOINT ',ichjeu,lecond,iretou)
  103. if (ierr.ne.0) GOTO 9000
  104. *
  105. * Initialisation de la raideur (totale) de frottement
  106. *
  107. mrigid = 0
  108. *
  109. * Traitement des modeles de Coulomb
  110. *
  111. if (icoulo.ne.0) then
  112. ri1 = 0
  113. meleme = ipp2
  114. if (idim .eq. 3) then
  115. call frig3C(meleme,iraidc,ichjeu, ri1)
  116. else
  117. call frig2C(meleme,iraidc,ichjeu, ri1)
  118. endif
  119. if (icoulo.ge.2) segsup meleme
  120. if (ierr.ne.0 .or. ri1.eq.0) goto 9000
  121. mrigid = ri1
  122. endif
  123. *
  124. * Traitement des modeles Frocable
  125. *
  126. if (icable.ne.0) then
  127. mmodel = modcab
  128. * Petit modele unitaire local (a detruire en fin de traitement)
  129. n1=1
  130. segini,mmode2
  131. * Option accro 'GLISS'
  132. igliss=1
  133. DO 500 imod=1,icable
  134. imodel = kmodel(imod)
  135. C* segact imodel
  136. segact,mmode2*mod
  137. mmode2.kmodel(1)=imodel
  138. do io=1,ivamod(/1)
  139. if (tymode(io).eq.'MAILLAGE') go to 510
  140. enddo
  141. call erreur(16)
  142. goto 9000
  143. 510 continue
  144. ri2 = 0
  145. meleme=ivamod(io)
  146. call ecrobj('MAILLAGE',meleme)
  147. call ecrobj('MMODEL ',mmode2)
  148. call accro(igliss)
  149. if (ierr.ne.0) goto 9000
  150. call lirobj('RIGIDITE',ri2,1,iretou)
  151. if (ierr.ne.0) goto 9000
  152. c* segdes imodel (desactive par accro)
  153. c* On fusionne ri2 dans la rigidite (totale) mrigid
  154. if (mrigid.eq.0) then
  155. mrigid = ri2
  156. else
  157. segact,mrigid*mod,ri2
  158. nriav = irigel(/2)
  159. nrigel = nriav + ri2.irigel(/2)
  160. segadj,mrigid
  161. do io = 1, ri2.irigel(/2)
  162. do iu = 1, ri2.irigel(/1)
  163. irigel(iu,io+nriav) = ri2.irigel(iu,io)
  164. enddo
  165. coerig(io+nriav) = ri2.coerig(io)
  166. enddo
  167. segsup ri2
  168. endif
  169. 500 continue
  170. segdes mrigid
  171. segsup mmode2
  172. endif
  173. *
  174. * traitement des modeles ...
  175. *
  176. * -> Brancher ici le traitement specifique a chaque autre modele de
  177. * frottement qui doit fournir la rigidite de frottement associee
  178. * qui sera fusionnee dans la rigidite mrigid (cf. modeles frocable)
  179. *
  180. * Fin du traitement :
  181. *
  182. call ecrobj('RIGIDITE',mrigid)
  183. * call prrigi(mrigid)
  184.  
  185. 9000 CONTINUE
  186. mmode1 = modcou
  187. segsup,mmode1
  188. mmode1 = modcab
  189. segsup,mmode1
  190. *
  191. return
  192. end
  193.  
  194.  
  195.  
  196.  
  197.  

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