Télécharger sbstep.eso

Retour à la liste

Numérotation des lignes :

sbstep
  1. C SBSTEP SOURCE CHAT 05/01/13 03:12:07 5004
  2. CCC
  3. C **********************************************************************
  4. CCC
  5. SUBROUTINE SUBSTEP
  6. . (sigini,varini,dsigtr,sigfin,varfin,
  7. . ddefpl,Kmat,ndims,ndimv,ndimk,
  8. . xmat,kerre,precis,nitmax,nescri,ues,
  9. . nmodel,nnumer,deltax,nsteps,
  10. . isub,ntotiter,iincre)
  11. c
  12. c IN:
  13. c sigini Initial stresses
  14. c varini Initial internal variables
  15. c dsigtr Increment of trial stresses
  16. c ndims Stress dimension
  17. c ndimv Internal variable dimension
  18. c ndimk Tangent stiffness matrix dimension
  19. c xmat Material parameters
  20. c precis Tolerance for local problem iterations
  21. c nitmax Maximun iterations for local problem
  22. c nescri Write intermediate results (0:no, 1: yes)
  23. c ues Output unit
  24. c nmodel Plasticity model
  25. c nnumer Generalized flow vector computation
  26. c 0:analytical
  27. c 1:1st forward differences
  28. c 2:1st centered differences
  29. c 3:1st complex approximation
  30. c deltax Relative stepsize value
  31. c nsteps Number of substeps
  32. c OUT:
  33. c sigfin Final stresses
  34. c varfin Final internal variables
  35. c ddefpl Increment of plastic strains
  36. c Kmat Consistent tangent stiffness matrix
  37. c kerre Error control flag
  38. IMPLICIT INTEGER(I-N)
  39.  
  40. integer ndims,ndimv,ndimk,kerre,nitmax,nescri,iterlocal,
  41. . nnumer,ues,nmodel,nsteps,isub,ntotiter,iincre
  42. real*8 sigini(*),varini(*),ddefpl(*),
  43. . dsigtr(*),sigfin(*),varfin(*),
  44. . Kmat(*),xmat(*),precis,deltax
  45. integer ips,i,k,ivoid,ndimx,flagini,iaux,ic,jf
  46. real*8 sig1(6),sig2(6),ddsigtr(6),dddefpl(6),
  47. . var1(4),var2(4),Kmat0(64),Kmat1(64),Kmat2(64),
  48. . alphai
  49.  
  50. do i=1,2
  51. var1(i)=0.D0
  52. var2(i)=0.D0
  53. enddo
  54. do i=1,6
  55. sig1(i)=0.D0
  56. sig2(i)=0.D0
  57. ddsigtr(i)=0.D0
  58. dddefpl(i)=0.D0
  59. enddo
  60. do i=1,64
  61. Kmat0(i)=0.D0
  62. Kmat1(i)=0.D0
  63. Kmat2(i)=0.D0
  64. enddo
  65. c nescri=1
  66. c variable de ecoj2 que no se usa
  67. ivoid=0
  68. c dimension de sigma ampliado
  69. call fijarndimx(nmodel,xmat,ndims,ndimx)
  70. c posicion en el step (valor de i inicial)
  71. ips =0
  72. c contador de substeps
  73. isub =0
  74. c contador de iteraciones
  75. ntotiter=0
  76. c flag de primer substep para la mtc
  77. flagini=1
  78. c poner sigma y varint iniciales
  79. do i=1,ndims
  80. sig1(i)=sigini(i)
  81. enddo
  82. do i=1,ndimv
  83. var1(i)=varini(i)
  84. enddo
  85. do while (ips.lt.nsteps)
  86. 100 continue
  87. c proporcion de carga para el substep
  88. alphai=float(iincre)/float(nsteps)
  89. c dividir incremento de sigma
  90. do k=1,ndims
  91. ddsigtr(k)=dsigtr(k)*alphai
  92. enddo
  93. c integra un substep
  94. if (nmodel.eq.1) then
  95. call eco_j2(sig1,var1,ddsigtr,sig2,var2,
  96. . dddefpl,ivoid,ndims,xmat,kerre,
  97. . precis,nitmax,nescri,ues,iterlocal)
  98. else if (nmodel.eq.2) then
  99. call eco_rhmc(sig1,var1,ddsigtr,sig2,var2,
  100. . dddefpl,ivoid,ndims,xmat,kerre,
  101. . precis,nitmax,nescri,ues,iterlocal)
  102. else
  103. call eco_MRSMAC(sig1,var1,ddsigtr,sig2,var2,
  104. . dddefpl,ivoid,ndims,xmat,kerre,
  105. . precis,nitmax,nescri,ues,nnumer,deltax,
  106. . iterlocal)
  107. endif
  108. c criterio de aceptacion
  109. if (kerre.eq.1) then
  110. if (iincre.eq.1) then
  111. write(*,*) ' Numero de substeps max. insuficiente'
  112. return
  113. else
  114. iincre=int(iincre/2)
  115. iaux=nsteps-(ips+iincre)
  116. if (iaux.lt.0) iincre=nsteps-ips
  117. c repite el step dividido por la mitad
  118. kerre=0
  119. goto 100
  120. endif
  121. endif
  122. c añadir defor plastica del step
  123. do i=1,ndims
  124. ddefpl(i)=dddefpl(i)
  125. enddo
  126. do i=1,6
  127. dddefpl(i)=0.D0
  128. enddo
  129. c poner como inicial las sigma y varint finales del step
  130. do i=1,ndims
  131. sig1(i)=sig2(i)
  132. enddo
  133. do i=1,ndimv
  134. var1(i)=var2(i)
  135. enddo
  136. c actualizar la i de posicion en el step
  137. ips=ips+iincre
  138. c añadir uno al contador de steps
  139. isub=isub+1
  140. c añadir el numero de iteraciones al total
  141. ntotiter=ntotiter+(iterlocal)
  142. c calcula la nx.nx de la inversa del jacobiano (sin E^-1 en la diagonal)
  143. if (nmodel.eq.1) then
  144. call jac_J2(Kmat1,ndimx,sig2,ndims,var2(1),var2(2),xmat,
  145. . nescri,ues,kerre)
  146. else if (nmodel.eq.2) then
  147. call jac_rhmc(Kmat1,ndimx,sig2,ndims,var2(2),xmat,
  148. . nescri,ues,kerre)
  149. else
  150. call jac_mrsmac(Kmat1,ndimx,sig2,ndims,
  151. . var2(1),var2(2),var2(3),var2(4),
  152. . xmat,nescri,ues,nnumer,deltax,kerre)
  153. endif
  154. if (flagini.eq.1) then
  155. c se guardan ns columnas de Kmat1 en Kmat0 multiplicadas por alphai
  156. do ic=1,ndims
  157. do jf=1,ndimx
  158. Kmat0(ndimx*(ic-1)+jf)=Kmat1(ndimx*(ic-1)+jf)*alphai
  159. enddo
  160. enddo
  161. flagini=0
  162. do i=1,ndimx*ndimx
  163. Kmat1(i)=0.D0
  164. enddo
  165. else
  166. c suma (Anterior + P*alphai) [nx.ns+nx.ns]
  167. do ic=1,ndims
  168. Kmat0(ndimx*(ic-1)+ic)=Kmat0(ndimx*(ic-1)+ic)+alphai
  169. enddo
  170. c multiplica Kmat2=Kmat1*Kmat0 [nx.ns=nx.nx*nx.ns];
  171. c corresponde a JSS^-1*()
  172. do ic=1,ndims
  173. do jf=1,ndimx
  174. do k=1,ndimx
  175. Kmat2(ndimx*(ic-1)+jf)=Kmat2(ndimx*(ic-1)+jf)+
  176. . Kmat1(ndimx*(k-1)+jf)*Kmat0(ndimx*(ic-1)+k)
  177. enddo
  178. enddo
  179. enddo
  180. c guarda Kmat2 en Kmat0 para el siguiente paso
  181. do i=1,ndimx*ndims
  182. Kmat0(i)=Kmat2(i)
  183. enddo
  184. do i=1,ndimx*ndimx
  185. Kmat1(i)=0.D0
  186. enddo
  187. do i=1,ndimx*ndims
  188. Kmat2(i)=0.D0
  189. enddo
  190. c write(ues,999)((Kmat0(ndims*(jf-1)+i),jf=1,ndims),i=1,ndims)
  191. endif
  192. enddo
  193. c poner las sigma y varint finales
  194. do i=1,ndims
  195. sigfin(i)=sig2(i)
  196. enddo
  197. do i=1,ndimv
  198. varfin(i)=var2(i)
  199. enddo
  200. c Kmat2 = Matriz de hook
  201. ivoid=1
  202. call MatHok(Kmat2,ndimx,ndims,ivoid)
  203. c calcular (Pt*Kmat0)*E [(ns.nx*nx.ns)*ns.ns]
  204. do ic=1,ndims
  205. do jf=1,ndims
  206. Kmat(ndimk*(ic-1)+jf)=0.D0
  207. do k=1,ndims
  208. Kmat(ndimk*(ic-1)+jf)=Kmat(ndimk*(ic-1)+jf)+
  209. . Kmat0(ndimx*(k-1)+jf)*Kmat2(ndimx*(ic-1)+k)
  210. enddo
  211. enddo
  212. enddo
  213. end
  214.  
  215.  
  216.  
  217.  

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