Télécharger resouc.eso

Retour à la liste

Numérotation des lignes :

resouc
  1. C RESOUC SOURCE PV090527 23/09/13 21:15:03 11739
  2. subroutine resouc(mrigid,mrigic,idemem,ideme0,ideme1,
  3. > nounil,lagdua,icond,imult,if,imtvid,nelim)
  4. IMPLICIT INTEGER(I-N)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. C
  7. C **** Eliminiation des relations dans une raideur
  8. C **** mrigic est la raideur resultante
  9. C icond dit si on a reussi a condense qque chose
  10. C imult dit si il reste des multiplicateurs non condensees
  11. C Ensuite reduction des seconds membres
  12. C
  13. -INC SMRIGID
  14.  
  15. -INC PPARAM
  16. -INC CCOPTIO
  17. -INC SMCHPOI
  18. -INC SMELEME
  19. segment idemem(0)
  20. segment ideme0(idemem(/1),30)
  21. segment ideme1(idemem(/1),30)
  22. C on va separer les raideurs
  23. segact mrigid
  24. if (jrcond.eq.0.and.ichole.eq.0) then
  25. call separm(mrigid,ri1,ri2,nounil,lagdua,nelim,if)
  26. if(ierr.ne.0) return
  27. segact ri1*mod
  28. segact ri2*mod
  29. * write(6,*) 'resouc ri1 ',ri1.mtymat
  30. * write(6,*) 'resouc ri2 ',ri2.mtymat
  31. if (ri1.ne.mrigid) ri1.mtymat='TEMPORAI'
  32. *xx ri2.mtymat='TEMPORAI'
  33. segact mrigid*mod
  34. jrelim=ri1
  35. jrgard=ri2
  36. imlag=max(0,lagdua)
  37. * write(6,*) ' if lagdua ',if,lagdua
  38. call fusrig(ri1,ri2,ipoir0)
  39. if(ierr.ne.0) return
  40. jrtot=ipoir0
  41. else
  42. ri1=jrelim
  43. ri2=jrgard
  44. ipoir0=jrtot
  45. lagdua=imlag
  46. ipt1=lagdua
  47. if (ipt1.ne.0) segact ipt1
  48. endif
  49. iri1s=ri1
  50. iri2s=ri2
  51. C
  52. 1010 continue
  53. C
  54. * mrigid matrice complete
  55. * ri1 dependance
  56. * ri2 les autres matrices
  57. * ri6 matrice de transfert
  58. * ri3 matrice reduite
  59. * ri5 matrice de transfert transposee
  60. C
  61. C on va proceder a la condensation rigidite puis forces
  62. * write(6,*) ' resouc jrcond ichole ',jrcond,ichole
  63. if(jrcond.eq.0.and.ichole.eq.0) then
  64.  
  65. CALL DEPEN3(RI1,RI6)
  66. if(ierr.ne.0) return
  67. * write(6,*) 'resouc ri6 ',ri6.mtymat
  68. segact ri6*mod
  69. if (ri6.ne.mrigid) ri6.mtymat='TEMPORAI'
  70. call scnd2 (ri2,ri6,ri3)
  71. if(ierr.ne.0) return
  72. segact ri3*mod
  73. * write(6,*) 'resouc ri3 ',ri3.mtymat
  74. if (ri3.ne.mrigid) ri3.mtymat='TEMPORAI'
  75. if(ierr.ne.0) then
  76. segsup ri1,ri2,ri6
  77. return
  78. endif
  79.  
  80. segact mrigid*mod
  81. jrcond=ri3
  82. JRDEPP=RI6
  83. C dualisation de la (les) matrice(s) de dependance
  84. call dual00(ri6,ri5)
  85. if(ierr.ne.0) return
  86. * write(6,*) 'resouc ri5 ',ri5.mtymat
  87. if (ri5.ne.mrigid) then
  88. segact ri5*mod
  89. ri5.mtymat='TEMPORAI'
  90. endif
  91. jrdepd=ri5
  92. ipoiri = ri3
  93. else
  94. ipoiri= jrcond
  95. RI6 = JRDEPP
  96. ri5 = jrdepd
  97. endif
  98. * test si on a condense quelque chose
  99. segact ri1
  100. imult=ri1.irigel(/2)
  101. if (ri1.irigel(/2).gt.0) then
  102. imult=0
  103. do ir=1,ri1.irigel(/2)
  104. ipt1=ri1.irigel(1,ir)
  105. segact ipt1
  106. * if (ipt1.itypel.eq.22) then
  107. imult=imult+ipt1.num(/2)
  108. enddo
  109. endif
  110.  
  111.  
  112. * test si il reste des multiplicateurs dans ri3
  113. segact mrigid
  114. ri3=jrcond
  115. segact ri3*mod
  116. icond=0
  117. if (ri3.irigel(/2).eq.0) then
  118. imtvid=1
  119. * write(6,*) ' matrice vide ri3 '
  120. endif
  121. do ir=1,ri3.irigel(/2)
  122. ipt3=ri3.irigel(1,ir)
  123. segact ipt3
  124. if (ipt3.itypel.eq.22) icond=icond+ipt3.num(/2)
  125. enddo
  126. C
  127. *
  128. ri3.jrsup=mrigid
  129. mrigic = ri3
  130. * maintenant reduction des second membres
  131. * en cas de contacts on ne dualise pas . Ce sera fait dans unilater
  132. ifrot=0
  133. SEGACT MRIGID*MOD
  134. DO I=1,IRIGEL(/2)
  135. IF(IRIGEL(6,I).ne.0) ifrot=1
  136. enddo
  137. if (nounil.eq.1) ifrot=0
  138. if (lagdua.gt.0) then
  139. ipt8=lagdua
  140. if (ierr.ne.0) return
  141. segact ipt8
  142. endif
  143. do 1050 ig=1,idemem(/1)
  144. ichp2= idemem(ig)
  145. ideme0(ig,if)=ichp2
  146. * write(6,*) 'ideme0 ig if ',ideme0(ig,if),ig,if
  147. * transferer les valeurs imposees des relations sur les inconnues (à éliminer)
  148. call transr(ichp2,ri1,ichp3)
  149. if(ierr.ne.0) return
  150. ideme1(ig,if)=ichp3
  151. * write(6,*) 'ideme1 ig if ',ideme1(ig,if),ig,if
  152. call mucpri(ichp3,ri2,ichp4)
  153. if(ierr.ne.0) return
  154. * ri2 est deja dualise. Il faut donc dedualiser ichp4
  155. if (lagdua.gt.0) then
  156. call dbbcd(ichp4,lagdua)
  157. if(ierr.ne.0) return
  158. * write(6,*) ' appel dbbcf ',lagdua
  159. endif
  160. call adchpo(ichp2,ichp4,ichp1,1.D0,-1.0D0)
  161. if(ierr.ne.0) return
  162. call dtchpo(ichp4)
  163. call mucpri(ichp1,ri5,ichp2)
  164. if(ierr.ne.0) return
  165. mchpo1=ichp1
  166. mchpo2= ichp1
  167. segact mchpo2*mod
  168. mchpo2.jattri(1)=2
  169. mchpo2= ichp2
  170. segact mchpo2*mod
  171. mchpo2.jattri(1)=2
  172. C
  173. call fuchpo (ichp1,ichp2,ichp3)
  174. if(ierr.ne.0) return
  175. if (ichp2.ne.ichp3) call dtchpo(ichp2)
  176. idemem(ig)=ichp3
  177. * vecteur a resoudre
  178. * dualisation des mult de lagrange
  179. if (lagdua.gt.0.and.ifrot.eq.0) then
  180. call dbbch(ichp3,lagdua)
  181. if(ierr.ne.0) return
  182. * write(6,*) ' appel dbbch ',lagdua
  183. endif
  184. 1050 continue
  185.  
  186. segdes ri1,ri2,ri3,ri5,ri6,mrigid
  187. return
  188. end
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  

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