31 1 NEL ,NGL ,NUPARAM ,NUVAR ,NFUNC ,IFUNC ,NPF ,
32 2 TF ,TIMESTEP,TIME ,UPARAM ,UVAR ,RHO ,PLA ,
33 3 DPLA ,SOUNDSP ,EPSD ,GS ,THK ,THKLY ,OFF ,
34 4 DEPSXX ,DEPSYY ,DEPSXY ,DEPSYZ ,DEPSZX ,
35 5 EPSPXX ,EPSPYY ,EPSPXY ,EPSPYZ ,EPSPZX ,
36 6 SIGOXX ,SIGOYY ,SIGOXY ,SIGOYZ ,SIGOZX ,
37 7 SIGNXX ,SIGNYY ,SIGNXY ,SIGNYZ ,SIGNZX ,
38 8 SIGY ,ET ,DPLANL ,SEQ ,INLOC ,LOFF )
42#include "implicit_f.inc"
49 INTEGER NEL,NUPARAM,NUVAR,INLOC,NPF(*),NFUNC,IFUNC(NFUNC)
50 INTEGER ,
DIMENSION(NEL),
INTENT(IN) :: NGL
53 my_real,
DIMENSION(NUPARAM),
INTENT(IN) ::
55 my_real,
DIMENSION(NEL),
INTENT(IN) ::
56 . RHO,DPLANL,GS,THKLY,LOFF,
57 . depsxx,depsyy,depsxy,depsyz,depszx,
58 . epspxx,epspyy,epspxy,epspyz,epspzx,
59 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx
60 my_real ,
DIMENSION(NEL),
INTENT(OUT) ::
62 . signxx,signyy,signxy,signyz,signzx
63 my_real ,
DIMENSION(NEL),
INTENT(INOUT) ::
64 . pla,dpla,epsd,off,thk,seq
65 my_real ,
DIMENSION(NEL,NUVAR),
INTENT(INOUT) ::
70 INTEGER I,II,Ivisc,ITER,NITER,NINDX,INDEX(NEL),IPOS(NEL),
73 . young(nel),bulk(nel),g(nel),nu,a11(nel),a12(nel),nnu,tang(nel),
74 . afiltr,xscale_sig0,yscale_sig0,xscale_youn,yscale_youn,
75 . xscale_tang,yscale_tang
77 . dlam,devepspxx,devepspyy,devepspzz,trepsp,
78 . normxx,normyy,normxy,dfdsig2,depsdt,dtinv
79 my_real,
DIMENSION(NEL) ::
80 . sxx,syy,szz,sxy,sigvm,yld,hardp,phi,dezz,yld0,dyld0depsd,
81 . dyoundepsd,dtangdepsd,trsig,dphi_dlam,dpxx,dpyy,dpxy
88 young(1:nel) = uparam(1)
89 bulk(1:nel) = uparam(2)
93 a11(1:nel) = uparam(9)
94 a12(1:nel) = uparam(10) ! non-diagonal term, elastic matrix in plane stress
96 ivisc = nint(uparam(12))
98 afiltr =
min(one, uparam(14)*timestep)
100 IF (ifunc(1) > 0)
THEN
101 xscale_sig0 = uparam(16)
102 yscale_sig0 = uparam(17)
105 yld0(1:nel) = uparam(17)
106 dyld0depsd(1:nel) = zero
109 xscale_youn = uparam(18)
110 yscale_youn = uparam(19)
112 IF (ifunc(3) > 0)
THEN
113 xscale_tang = uparam(20)
114 yscale_tang = uparam(21)
117 tang(1:nel) = uparam(21)
118 dtangdepsd(1:nel) = zero
120 dtinv = one/
max(timestep,em20)
124 IF (off(i) < em01) off(i) = zero
125 IF (off(i) < one) off(i) = off(i)*four_over_5
143 trepsp = third*(epspxx(i) + epspyy(i))
144 devepspxx = epspxx(i) - trepsp
145 devepspyy = epspyy(i) - trepsp
147 depsdt = two_third*(devepspxx**2 + devepspyy**2 + devepspzz**2 +
148 . two*(epspxy(i)**2))
159 IF (ifunc(1) > 0)
THEN
161 iad(1:nel) = npf(ifunc(1)) / 2 + 1
162 ilen(1:nel) = npf(ifunc(1)+1) / 2 - iad(1:nel) - ipos(1:nel)
163 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_sig0,dyld0depsd,yld0)
164 yld0(1:nel) = yscale_sig0*yld0(1:nel)
165 dyld0depsd(1:nel) = yscale_sig0*dyld0depsd(1:nel)
168 IF (ifunc(2) > 0)
THEN
170 iad(1:nel) = npf(ifunc(2)) / 2 + 1
171 ilen(1:nel) = npf(ifunc(2)+1) / 2 - iad(1:nel) - ipos(1:nel)
172 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_youn,dyoundepsd,young)
173 young(1:nel) = yscale_youn*young(1:nel)
174 g(1:nel) = half * young(1:nel) / (one + nu)
175 bulk(1:nel) = third * young(1:nel) / (one - nu*two)
176 a11(1:nel) = young(1:nel) / (one - nu*nu)
177 a12(1:nel) = a11(1:nel) * nu
180 IF (ifunc(3) > 0)
THEN
182 iad(1:nel) = npf(ifunc(3)) / 2 + 1
183 ilen(1:nel) = npf(ifunc(3)+1) / 2 - iad(1:nel) - ipos(1:nel
184 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_tang,dtangdepsd,tang)
185 tang(1:nel) = yscale_tang*tang(1:nel)
186 dtangdepsd(1:nel) = yscale_tang*dtangdepsd(1:nel)
190 IF (tang(i) >= 0.99d0*young(i))
THEN
191 tang(i) = 0.99d0*young(i)
194 yld(i) = yld0(i) + (young(i)*tang(i)/(young(i)-tang(i)))*pla(i)
202 signxx(i) = sigoxx(i) + a11(i)*depsxx(i) + a12(i)*depsyy(i)
203 signyy(i) = sigoyy(i) + a11(i)*depsyy(i) + a12(i)*depsxx(i)
204 signxy(i) = sigoxy(i) + depsxy(i)*g(i)
205 signyz(i) = sigoyz(i) + depsyz(i)*gs(i)
206 signzx(i) = sigozx(i) + depszx(i)*gs(i)
208 trsig(i) = signxx(i) + signyy(i)
210 sxx(i) = signxx(i) - trsig(i) * third
211 syy(i) = signyy(i) - trsig(i) * third
212 szz(i) = -trsig(i) * third
215 sigvm(i) = three_half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + three*sxy(i)**2
216 sigvm(i) = sqrt(sigvm(i))
222 phi(1:nel) = sigvm(1:nel) - yld(1:nel)
227 IF (phi(i) > zero .AND. off(i) == one)
THEN
247#include "vectorize.inc"
255 ! a plastic multiplier allowing to update internal variables to satisfy
266 normxx = three_half*sxx(i)/sigvm(i)
267 normyy = three_half*syy(i)/sigvm(i)
268 normxy = three*sxy(i)/sigvm(i)
275 dfdsig2 = normxx * (a11(i)*normxx + a12(i)*normyy)
276 . + normyy * (a11(i)*normyy + a12(i)*normxx)
277 . + normxy * normxy * g(i)
281 hardp(i) = (young(i)*tang(i)/(young(i)-tang(i)))
283 hardp(i) = hardp(i) + dyld0depsd(i)*dtinv +
284 . ((young(i)*dtangdepsd(i)*(young(i) - tang(i))
285 . + young(i)*tang(i)*dtangdepsd(i))/
286 . ((young(i) - tang(i))**2))*dtinv*pla(i)
293 dphi_dlam(i) = - dfdsig2 - hardp(i)
294 dphi_dlam(i) = sign(
max(abs(dphi_dlam(i)),em20),dphi_dlam(i))
297 dlam = -phi(i)/dphi_dlam
300 dpxx(i) = dlam * normxx
301 dpyy(i) = dlam * normyy
302 dpxy(i) = dlam * normxy
305 signxx(i) = signxx(i) - (a11(i)*dpxx(i) + a12(i)*dpyy(i))
306 signyy(i) = signyy(i) - (a11(i)*dpyy(i) + a12(i)*dpxx(i))
307 signxy(i) = signxy(i) - dpxy(i)*g(i)
308 trsig(i) = signxx(i) + signyy(i)
309 sxx(i) = signxx(i) - trsig(i) * third
310 syy(i) = signyy(i) - trsig(i) * third
311 szz(i) = - trsig(i) * third
315 dpla(i) =
max(zero,dpla(i) + dlam)
316 pla(i) =
max(zero,pla(i) + dlam)
318 epsd(i) = dpla(i)*dtinv
322 sigvm(i) = three_half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + three*sxy(i)**2
323 sigvm(i) = sqrt(sigvm(i))
327 yld(i) = yld0(i) + (young(i)*tang(i)/(young(i)-tang(i)))*pla(i)
329 phi(i) = sigvm(i) - yld(i)
334 dezz(i) = dezz(i) - dpxx(i) - dpyy(i)
344 iad(1:nel) = npf(ifunc(1)) / 2 + 1
345 ilen(1:nel) = npf(ifunc(1)+1) / 2 - iad(1:nel) - ipos(1:nel)
346 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_sig0,dyld0depsd,yld0)
347 yld0(1:nel) = yscale_sig0*yld0(1:nel)
348 dyld0depsd(1:nel) = yscale_sig0*dyld0depsd(1:nel)
350 IF (ifunc(3) > 0)
THEN
352 iad(1:nel) = npf(ifunc(3)) / 2 + 1
353 ilen(1:nel) = npf(ifunc(3)+1) / 2 - iad(1:nel) - ipos(1:nel)
354 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_tang,dtangdepsd,tang)
355 tang(1:nel) = yscale_tang*tang(1:nel)
356 dtangdepsd(1:nel) = yscale_tang*dtangdepsd(1:nel)
362 IF (tang(i) >= 0.99d0*young(i))
THEN
363 tang(i) = 0.99d0*young(i)
367 yld(i) = yld0(i) + (young(i)*tang(i)/(young(i)-tang(i)))*pla(i)
369 phi(i) = sigvm(i) - yld(i)
384 IF (dpla(i) > zero)
THEN
385 et(i) = hardp(i) / (hardp(i) + young(i))
390 soundsp(i) = sqrt(a11(i)/rho(i))
395 IF (loff(i) == one)
THEN
396 dezz(i) = -nu*(signxx(i)-sigoxx(i)+signyy(i)-sigoyy(i))/young(i)
397 dezz(i) = dezz(i) -
max(dplanl(i),zero)*half*(signxx(i)+signyy(i))/
max(yld(i),em20)
400 dezz(i) = -nu*(signxx(i)-sigoxx(i)+signyy(i)-sigoyy(i))/young(i) + dezz(i
403 thk(i) = thk(i) + dezz(i)*thkly(i)*off(i)
subroutine mat121c_newton(nel, ngl, nuparam, nuvar, nfunc, ifunc, npf, tf, timestep, time, uparam, uvar, rho, pla, dpla, soundsp, epsd, gs, thk, thkly, off, depsxx, depsyy, depsxy, depsyz, depszx, epspxx, epspyy, epspxy, epspyz, epspzx, sigoxx, sigoyy, sigoxy, sigoyz, sigozx, signxx, signyy, signxy, signyz, signzx, sigy, et, dplanl, seq, inloc, loff)