Télécharger kres6.eso

Retour à la liste

Numérotation des lignes :

kres6
  1. C KRES6 SOURCE MB234859 25/01/03 21:15:12 12105
  2. SUBROUTINE KRES6(MRIGID,KSMBR,LDMULT,NELIM,
  3. $ MRIGIC,KSMBRC,KSMBR1)
  4. * SUBROUTINE KRES6(MRIGID,KSMBR,IDEPE,
  5. * $ MRIGIC,KSMBRC,KSMBR0,KSMBR1)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. IMPLICIT INTEGER (I-N)
  8. C***********************************************************************
  9. C NOM : KRES6
  10. C DESCRIPTION : Effectue la condensation des relations
  11. C Repris de resou.eso
  12. C
  13. C
  14. C LANGAGE : ESOPE
  15. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
  16. C mél : gounand@semt2.smts.cea.fr
  17. C***********************************************************************
  18. C VERSION : v1, 15/06/2011, version initiale
  19. C HISTORIQUE : v1, 15/06/2011, création
  20. C HISTORIQUE : 2019/04/10 remplacement de NOEL par NELIM
  21. C Idéalement, il faudrait reprendre ce que Pierre a fait dans
  22. C RESOU dans les fiches 10[0,1]?? et avec MREM.
  23. C HISTORIQUE :
  24. C***********************************************************************
  25. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  26. C en cas de modification de ce sous-programme afin de faciliter
  27. C la maintenance !
  28. C***********************************************************************
  29.  
  30. -INC PPARAM
  31. -INC CCOPTIO
  32. -INC SMRIGID
  33. -INC SMCHPOI
  34. -INC SMELEME
  35. *
  36. * Logique indiquant si on dualise les multiplicateurs de Lagrange
  37. LOGICAL LDMULT
  38. *
  39. NOUNIL=0
  40. NOEN=1
  41. IPOIRI=MRIGID
  42. * verification pas de blocage en double
  43. call verlag(ipoiri)
  44. if (ierr.ne.0) return
  45. * y a t il des matrices de relations non unilaterales
  46. ipoir0 = ipoiri
  47. mrigid=ipoiri
  48. C call prrigi(ipoiri,1)
  49. segact mrigid
  50. nrige= irigel(/1)
  51. idepe=0
  52. nbr = irigel(/2)
  53. do 1000 irig = 1,nbr
  54. meleme=irigel(1,irig)
  55. segact meleme
  56. if ((irigel(6,irig).eq.0.or.nounil.eq.1).and.itypel.eq.22)
  57. > idepe=idepe+1
  58. if (irigel(6,irig).ne.0) iunil=1
  59. segdes meleme
  60. 1000 continue
  61. * idepe=0
  62. lagdua=0
  63. if(idepe.ne.0) then
  64. C on va separer les raideurs
  65. * write (6,*) ' nounil jrcond iunil idepe vaut ',nounil,jrcond,
  66. * $ iunil, idepe
  67. if (jrcond.eq.0) then
  68. *transmis en argument nelim=1
  69. call separm(mrigid,ri1,ri2,nounil,LDMULT,nelim,0)
  70. * if (lagdua.ne.0) then
  71. * write(6,*) ' resou apres separm -- lagdua'
  72. * call ecmail(lagdua)
  73. * else
  74. * write(6,*) ' resou apres separm -- lagdua=0'
  75. * endif
  76. * write(6,*) ' resou apres separm -- ri2'
  77. * call prrigi(ri2,1)
  78. * write(6,*) ' resou apres separm -- ri1'
  79. * call prrigi ( ri1,0)
  80. * write(6,*) ' fin impression ri1'
  81. segact mrigid*mod
  82. jrelim=ri1
  83. jrgard=ri2
  84. if (LDMULT) then
  85. lagdua=ri2.imlag
  86. endif
  87. imlag=lagdua
  88. call fusrig(ri1,ri2,ipoir0)
  89. jrtot=ipoir0
  90. else
  91. ri1=jrelim
  92. ri2=jrgard
  93. ipoir0=jrtot
  94. lagdua=imlag
  95. ipt1=lagdua
  96. if (ipt1.ne.0) segact ipt1
  97. endif
  98. C
  99. * mrigid matrice complete
  100. * ri1 dependance
  101. * ri2 les autres matrices
  102. * ri6 matrice de transfert
  103. * ri3 matrice reduite
  104. * ri5 matrice de transfert transposee
  105. C
  106. C on va proceder a la condensation rigidite puis forces
  107. if(jrcond.eq.0) then
  108. CALL DEPEN3(RI1,RI6)
  109. * write (6,*) ' resou apres depen3 --- ri6 '
  110. * call prrigi(ri6,1)
  111. call scnd2 (ri2,ri6,ri3)
  112. * write (6,*) ' '
  113. * write (6,*) ' '
  114. * write (6,*) ' resou apres scnd2--- ri3 '
  115. * write (6,*) ' '
  116. * call prrigi(ri3,1)
  117. segact ri3
  118. if(ierr.ne.0) then
  119. segsup ri1,ri2,ri6
  120. return
  121. endif
  122.  
  123. segact mrigid*mod
  124. jrcond=ri3
  125. JRDEPP=RI6
  126. C dualisation de la (les) matrice(s) de dependance
  127. call dual00(ri6,ri5)
  128. * write(6,*) ' apres dual0 -- ri5'
  129. * call prrigi( ri5,1)
  130. jrdepd=ri5
  131. ipoiri = ri3
  132. else
  133. ipoiri= jrcond
  134. RI6 = JRDEPP
  135. ri5 = jrdepd
  136. endif
  137. * test si ri3 est vide
  138. ri3=jrcond
  139. segact ri3
  140. * write (6,*) ' dans resou ri3.irigel(/2) ',ri3.irigel(/2)
  141. if (ri3.irigel(/2).eq.0) imtvid=1
  142. C
  143. segdes ri1,ri2,mrigid
  144. mrigic=ipoiri
  145. C maintenant les seconds membres
  146. C write(6,*) ' ipoiri jrdepp jrdepd',ipoiri,ri6,ri5
  147. C call prrigi(ri3)
  148. C call prrigi(ri5)
  149. * en cas de contacts on ne dualise pas . Ce sera fait dans unilater
  150. ifrot=0
  151. MRIGID=IPOIRI
  152. SEGACT MRIGID*MOD
  153. DO I=1,IRIGEL(/2)
  154. IF(IRIGEL(6,I).ne.0) ifrot=1
  155. enddo
  156. if (nounil.eq.1) ifrot=0
  157. * if (ifrot.eq.0) write (6,*) ' resou non unilateral '
  158. * if (ifrot.eq.1) write (6,*) ' resou unilateral pas de dualisation'
  159. if (lagdua.ne.0) then
  160. ipt8=lagdua
  161. segact ipt8
  162. * call ecmail(lagdua,0)
  163. endif
  164. *
  165. ichp2=ksmbr
  166. * ksmbr0=ichp2
  167. * transferer les valeurs imposees des relations sur les inconnues (à éliminer
  168. C )
  169. * write (6,*) ' valeurs imposees ichp2'
  170. * call ecchpo(ichp2,0)
  171. call transr(ichp2,ri1,ichp3)
  172. * call prrigi(ri1)
  173. * write (6,*) ' apres transfert ichp3'
  174. * call ecchpo(ichp3,0)
  175. ksmbr1=ichp3
  176. call mucpri(ichp3,ri2,ichp4)
  177. * write (6,*) ' apres mucpri ichp4 '
  178. * call ecchpo(ichp4,0)
  179. * ri2 est deja dualise. Il faut donc dedualiser ichp4
  180. call dbbcd(ichp4,lagdua)
  181. * write (6,*) ' apres dbbcd ichp4 '
  182. * call ecchpo(ichp4,0)
  183. call adchpo(ichp2,ichp4,ichp1,1.D0,-1.0D0)
  184. call dtchpo(ichp4)
  185. * write (6,*) ' apres adchpo ichp1'
  186. * call ecchpo(ichp1,0)
  187. call mucpri(ichp1,ri5,ichp2)
  188. * write (6,*) ' impression de ri5 '
  189. * call prrigi(ri5,1)
  190. * write (6,*) ' apres mucpri ichp2'
  191. * call ecchpo(ichp2,0)
  192. C mchpo1=ichp1
  193. C segact mchpo1
  194. C write(6,*) 'reso mchpo1 jattri(1)',mchpo1.jattri(1)
  195. C segdes mchpo1
  196. C
  197. mchpo2= ichp1
  198. segact mchpo2*mod
  199. mchpo2.jattri(1)=2
  200. mchpo2= ichp2
  201. segact mchpo2*mod
  202. mchpo2.jattri(1)=2
  203. C write(6,*) 'reso mchpo2 jattri(1)',mchpo2.jattri(1)
  204. segdes mchpo2
  205. C
  206. call fuchpo (ichp1,ichp2,ichp3)
  207. * call dtchpo(ichp1)
  208. call dtchpo(ichp2)
  209. * Ajout gounand : à ce stade, la force réduite n'est pas nulle sur les
  210. * ddls supprimés (multiplicateurs de Lagrange et ddl dépendants), on les
  211. * enlève.
  212. * vecteur a resoudre
  213. * write (6,*) ' le vecteur avant reduction '
  214. * call ecchpo(ichp3,0)
  215. ichp2=ichp3
  216. CALL redfor(ichp2,ri1,ichp3)
  217. if (ierr.ne.0) return
  218. call dtchpo(ichp2)
  219. ksmbrc=ichp3
  220. * vecteur a resoudre
  221. * write (6,*) ' le vecteur '
  222. * call ecchpo(ichp3,0)
  223. * dualisation des mult de lagrange
  224. if (lagdua.ne.0.and.ifrot.eq.0) call dbbch(ichp3,lagdua)
  225. * matrice
  226. * write (6,*) ' la matrice '
  227. * call prrigi(ipoiri)
  228. noid = 1
  229. else
  230. mrigic=mrigid
  231. ksmbrc=ksmbr
  232. ksmbr1=0
  233. endif
  234.  
  235.  
  236.  
  237. RETURN
  238. *
  239. * End of subroutine KRES6
  240. *
  241. END
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  

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