37
38
39
40#include "implicit_f.inc"
41
42
43
44#include "com01_c.inc"
45
46
47
48 INTEGER NEL,NUPARAM,NUVAR,JTHE
49 INTEGER ,DIMENSION(NEL), INTENT(IN) :: NGL
50 INTEGER, INTENT(IN) :: L_PLANL,L_EPSDNL
52 . time,timestep
53 my_real,
DIMENSION(NUPARAM),
INTENT(IN) ::
54 . uparam
55 my_real,
DIMENSION(NEL),
INTENT(IN) ::
56 . rho,tempel,
57 . depsxx,depsyy,depsxy,depsyz,depszx,
58 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx,
59 . gs,thkly,dpla_nl
60 my_real,
DIMENSION(NEL*L_PLANL),
INTENT(IN) ::
61 . pla_nl
62 my_real,
DIMENSION(NEL*L_EPSDNL),
INTENT(IN) ::
63 . plap_nl
64
65 my_real ,
DIMENSION(NEL),
INTENT(OUT) ::
66 . soundsp,sigy,et,
67 . signxx,signyy,signxy,signyz,signzx
68
69 my_real ,
DIMENSION(NEL),
INTENT(INOUT) ::
70 . pla,dpla,epsd,off,thk,temp,seq
71 my_real ,
DIMENSION(NEL,6),
INTENT(INOUT) ::
72 . dmg
73 my_real ,
DIMENSION(NEL,NUVAR),
INTENT(INOUT) ::
74 . uvar
75
76
77
78
79 INTEGER I,II,IGURSON,NINDX,INDEX(NEL),NICE
80
82 . young,bulk,lam,g,g2,nu,cdr,kdr,hard,yld0,qvoce,bvoce,jcc,
83 . epsp0,mtemp,tini,tref,eta,cp,dpis,dpad,asrate,afiltr,hkhi,
84 . q1,q2,ed,an,kw,fr,fc,f0,a11,a12,nnu,dti
86 . trdfds,sigvm,sigdr2,yld2i,omega,
87 . dtemp,fcosh,fsinh,dpdt,dlam,ddep
89 . dpxx,dpyy,dpxy,dpzz,dsdrdj2,dsdrdj3,
90 . dj3dsxx,dj3dsyy,dj3dsxy,dj3dszz,
91 .
92 . dyld_dpla_nl,
93 . normxx,normyy,normxy,normzz,
94 . denom,dphi,sdpla,dphi_dtrsig,sdv_dfdsig,sig_dfdsig,dfdsig2,
95 . dphi_dsig,dphi_dyld,dphi_dfdr,dphi_dfs,dfs_dft,
96 . dfn_dlam,dfsh_dlam,dfg_dlam,dft_dlam,normsig,
97 . dyld_dpla,dyld_dtemp,dtemp_dlam
98
100 . dsigxx,dsigyy,dsigxy,trsig,trdep,
101 . sxx,syy,sxy,szz,sigm,j2,j3,sigdr,yld,weitemp,
102 . hardp,fhard,frate,ftherm,fdr,triax,etat,
103 . fdam,phi0,phi,ft,fs,fg,fn,fsh,dpla_dlam,dezz
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 young = uparam(1)
119 bulk = uparam(2) ! bulk modulus
120 g = uparam(3)
121 g2 = uparam(4)
122 lam = uparam(5)
123 nu = uparam(6)
124 nnu = uparam(7)
125 a11 = uparam(9)
126 a12 = uparam(10)
127
128 nice = nint(uparam(11))
129 cdr = uparam(12)
130 kdr = uparam(13)
131 tini = uparam(14)
132 hard = uparam(15)
133 yld0 = uparam(16)
134 qvoce = uparam(17)
135 bvoce = uparam(18)
136
137 jcc = uparam(20)
138 epsp0 = uparam(21)
139
140 mtemp = uparam(22)
141 tref = uparam(23)
142 eta = uparam(24)
143 cp = uparam(25)
144 dpis = uparam(26)
145 dpad = uparam(27) ! adiabatic plastic strain rate
146
147 asrate = uparam(28)
148 afiltr = asrate*timestep/(asrate*timestep + one)
149 dti = one /
max(timestep, em20)
150
151
152 igurson = nint(uparam(30))
153
154
155
156
157 q1 = uparam(31)
158 q2 = uparam(32)
159 ed = uparam(34)
160 an = uparam(35)
161 kw = uparam(36)
162 fr = uparam(37)
163 fc = uparam(38)
164 f0 = uparam(39)
165 hkhi = uparam(40)
166
167
168 DO i=1,nel
169
170 IF (off(i) < em03) off(i) = zero
171 IF (off(i) < one) off(i) = off(i)*four_over_5
172
173 phi0(i) = uvar(i,1)
174
175 fg(i) = dmg(i,2) ! growth damage
176 fn(i) = dmg(i,3)
177 fsh(i) = dmg(i,4)
178 ft(i) = dmg(i,5)
179 fs(i) = dmg(i,6)
180
181 dpla(i) = zero
182 et(i) = one
183 hardp(i) = zero
184 dezz(i) = zero
185 ENDDO
186
187 epsd(1:nel) = uvar(1:nel,2)
188
189
190 IF (time == zero) THEN
191 temp(1:nel) = tini
192 IF (isigi == 0) THEN
193 dmg(1:nel,5) = f0
194 ft(1:nel) = f0
195 dmg(1:nel,1) = f0/fr
196 IF (f0<fc) THEN
197 dmg(1:nel,6) = f0
198 ELSE
199 dmg(1:nel,6) = fc + (one/q1-fc)*(f0-fc)/(fr-fc)
200 ENDIF
201 fs(1:nel) = dmg(1:nel,6)
202 ENDIF
203 ENDIF
204 IF (cp > zero) THEN
205 IF (jthe == 0) THEN
206 DO i=1,nel
207
208 IF (epsd(i) < dpis) THEN
209 weitemp(i) = zero
210 ELSEIF (epsd(i) > dpad) THEN
211 weitemp(i) = one
212 ELSE
213 weitemp(i) = ((epsd(i)-dpis)**2 )
214 . * (three*dpad - two*epsd(i) - dpis)
215 . / ((dpad-dpis)**3)
216 ENDIF
217 ENDDO
218 ELSE
219 temp(1:nel) = tempel(1:nel)
220 ENDIF
221 ENDIF
222
223
224 DO i=1,nel
225
226 fhard(i) = yld0 + hard*pla(i) + qvoce*(one-exp(-bvoce*pla(i)))
227 IF (igurson == 2) THEN
228 IF (pla_nl(i) - pla(i) < zero) THEN
229 fhard(i) = fhard(i) - hkhi*(pla_nl(i) - pla(i))
230 ENDIF
231 ENDIF
232
233 frate(i) = one
234 IF (epsd(i) > epsp0) frate(i) = frate(i) + jcc*log(epsd(i)/epsp0)
235
236 ftherm(i) = one
237 IF (cp > zero) ftherm(i) = one - mtemp*(temp(i) - tref)
238
239 yld(i) = fhard(i)*frate(i)*ftherm(i)
240
241 yld(i) =
max(em10, yld(i))
242 ENDDO
243
244
245
246
247 DO i=1,nel
248
249
250 signxx(i) = sigoxx(i) + (a11*depsxx(i) + a12*depsyy(i))
251 signyy(i) = sigoyy(i) + (a11*depsyy(i) + a12*depsxx(i))
252 signxy(i) = sigoxy(i) + (depsxy(i)*g)
253 signyz(i) = sigoyz(i) + (depsyz(i)*gs(i))
254 signzx(i) = sigozx(i) + (depszx(i)*gs(i))
255
256 trsig(i) = signxx(i) + signyy(i)
257 sigm(i) = -trsig(i) * third
258
259 sxx(i) = signxx(i) + sigm(i)
260 syy(i) = signyy(i) + sigm(i)
261 szz(i) = sigm(i)
262 sxy(i) = signxy(i)
263 dezz(i) = -nnu*depsxx(i) - nnu*depsyy(i)
264
265 j2(i) = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) + sxy(i)**2
266
267 j3(i) = sxx(i)*syy(i)*szz(i) - szz(i)*sxy(i)**2
268
269 fdr(i) = j2(i)**3 - cdr*(j3(i)**2)
270
271 IF (fdr(i) > zero) THEN
272 sigdr(i) = kdr * exp((one/six)*log(fdr(i)))
273 ELSE
274 sigdr(i) = zero
275 ENDIF
276
277 IF (sigdr(i)>zero) THEN
278 triax(i) = (trsig(i)*third)/sigdr(i)
279 ELSE
280 triax(i) = zero
281 ENDIF
282 IF (trsig(i)<zero) THEN
283 etat(i) = zero
284 ELSE
285 etat(i) = one
286 ENDIF
287 ENDDO
288
289
290
291
292 DO i=1,nel
293 fdam(i) = two*q1*fs(i)*cosh(q2*etat(i)*trsig(i)/yld(i)/two) - (q1*fs(i))**2
294 phi(i) = (sigdr(i) / yld(i))**2 - one + fdam(i)
295 ENDDO
296
297
298 nindx = 0
299 DO i=1,nel
300 IF ((phi(i) > zero).AND.(off(i) == one).AND.(ft(i)<fr)) THEN
301 nindx=nindx+1
302 index(nindx)=i
303 ENDIF
304 ENDDO
305
306
307
308
309#include "vectorize.inc"
310 DO ii=1,nindx
311
312
313 i = index(ii)
314
315
316 dsigxx(i) = a11*depsxx(i) + a12*depsyy(i)
317 dsigyy(i) = a11*depsyy(i) + a12*depsxx(i)
318 dsigxy(i) = depsxy(i)*g
319 dlam = zero
320
321
322 trsig(i) = sigoxx(i) + sigoyy(i)
323 sigm(i) = -trsig(i) * third
324 sxx(i) = sigoxx(i) + sigm(i)
325 syy(i) = sigoyy(i) + sigm(i)
326 szz(i) = sigm(i)
327 sxy(i) = sigoxy(i)
328 j2(i) = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + sxy(i)**2
329 j3(i) = sxx(i)*syy(i)*szz(i) - szz(i)*sxy(i)**2
330 fdr(i) = j2(i)**3 - cdr*(j3(i)**2)
331 sigdr(i) = kdr * exp((one/six)*log(fdr(i)))
332
333 triax(i) = (trsig(i)*third)/sigdr(i)
334 IF (trsig(i)<zero) THEN
335 etat(i) = zero
336 ELSE
337 etat(i) = one
338 ENDIF
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354 yld2i = one/(yld(i)**2)
355 dphi_dsig = two*sigdr(i)*yld2i
356 fsinh = sinh(q2*etat(i)*trsig(i)/(yld(i)*two))
357 dphi_dtrsig = q1*q2*etat(i)*fs(i)*fsinh/yld(i)
358
359
360 normsig = sqrt(sigoxx(i)*sigoxx(i)
361 . + sigoyy(i)*sigoyy(i)
362 . + two*sigoxy(i)*sigoxy(i))
363 normsig =
max(normsig,one)
364
365
366 fdr(i) = (j2(i)/(normsig**2))**3 - cdr*((j3(i)/(normsig**3))**2)
367 dphi_dfdr = dphi_dsig*kdr*(one/six)*exp(-(five/six)*log(fdr(i)))
368 dsdrdj2 = dphi_dfdr*three*(j2(i)/(normsig**2))**2
369 dsdrdj3 = -dphi_dfdr*two*cdr*(j3(i)/(normsig**3))
370
371 dj3dsxx = two_third*(syy(i)*szz(i))/(normsig**2)
372 . - third*(sxx(i)*szz(i))/(normsig**2)
373 . - third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
374 dj3dsyy = - third*(syy(i)*szz(i))/(normsig**2)
375 . + two_third*(sxx(i)*szz(i))/(normsig**2)
376 . - third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
377 dj3dszz = - third*(syy(i)*szz(i))/(normsig**2)
378 . - third*(sxx(i)*szz(i))/(normsig**2)
379 . + two_third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
380 dj3dsxy = two*(sxx(i)*sxy(i) + sxy(i)*syy(i))/(normsig**2)
381
382
383 normxx = dsdrdj2*sxx(i)/normsig + dsdrdj3*dj3dsxx + dphi_dtrsig
384 normyy = dsdrdj2*syy(i)/normsig + dsdrdj3*dj3dsyy + dphi_dtrsig
385 normzz = dsdrdj2*szz(i)/normsig + dsdrdj3*dj3dszz + dphi_dtrsig
386 normxy = two*dsdrdj2*sxy(i)/normsig + dsdrdj3*dj3dsxy
387
388
389 phi(i) = phi0(i)
390
391
392 dphi = normxx * dsigxx(i)
393 . + normyy * dsigyy(i)
394 . + normxy * dsigxy(i)
395
396
397
398
399
400
401 trdfds = normxx + normyy + normzz
402 dfdsig2 = normxx * (a11*normxx + a12*normyy)
403 . + normyy * (a11*normyy + a12*normxx)
404 . + normxy * normxy * g
405
406
407
408
409
410
411 hardp(i) = hard + qvoce*bvoce*exp(-bvoce*pla(i))
412 IF (igurson == 2) THEN
413 IF (pla_nl(i) - pla(i) < zero) THEN
414 hardp(i) = hardp(i) + hkhi
415 ENDIF
416 ENDIF
417 dyld_dpla = hardp(i)*frate(i)*ftherm(i)
418
419 IF (igurson == 2) THEN
420 IF (pla_nl(i) - pla(i) < zero) THEN
421 dyld_dpla_nl = -hkhi*frate(i)*ftherm(i)
422 ELSE
423 dyld_dpla_nl = zero
424 ENDIF
425 ENDIF
426
427
428
429 sdv_dfdsig = sxx(i) * normxx
430 . + syy(i) * normyy
431 . + szz(i) * normzz
432 . + sxy(i) * normxy
433 sig_dfdsig = sigoxx(i) * normxx
434 . + sigoyy(i) * normyy
435 . + sigoxy(i) * normxy
436 dpla_dlam(i) = sig_dfdsig / ((one - ft(i))*yld(i))
437
438
439
440 IF (jthe == 0 .and. cp > zero) THEN
441
442
443 dyld_dtemp = -fhard(i)*frate(i)*mtemp
444
445
446 dtemp_dlam = weitemp(i)*(eta/(rho(i)*cp))*sig_dfdsig
447 ELSE
448 dyld_dtemp = zero
449 dtemp_dlam = zero
450 ENDIF
451
452
453
454 sigdr2 = sigdr(i)**2
455 dphi_dyld = -two*sigdr2/yld(i)**3-dphi_dtrsig*trsig(i)/yld(i)
456
457
458
459
460
461 fcosh = cosh(q2*etat(i)*trsig(i)/(yld(i)*two))
462 dphi_dfs = two*q1*fcosh - two*q1*q1*fs(i)
463
464
465
466 IF (ft(i) >= fc) THEN
467 dfs_dft = ((one/q1)-fc)*(fr-fc)
468 ELSE
469 dfs_dft = one
470 ENDIF
471
472
473
474 IF ((pla(i)>=ed).AND.(ft(i)<fr)) THEN
475
476 IF (triax(i)>=zero) THEN
477 dfn_dlam = an*dpla_dlam(i)
478
479 ELSEIF ((triax(i)<zero).AND.(triax(i)>=-third)) THEN
480 dfn_dlam = an*
max(one + three*triax(i),zero)*dpla_dlam(i)
481
482 ELSE
483 dfn_dlam = zero
484 ENDIF
485 ELSE
486 dfn_dlam = zero
487 ENDIF
488
489
490
491 IF ((sigdr(i) > zero).AND.(ft(i)>zero).AND.(ft(i)<fr)) THEN
492 sigvm = sqrt(
max(em20, three*(j2(i)/(normsig**2))))
493 omega = one - ((twenty7 *(j3(i)/(normsig**3)))/(two*sigvm**3))**2
494 omega =
max(omega,zero)
495 omega =
min(omega,one)
496 dfsh_dlam = kw*omega*ft(i)*sdv_dfdsig/sigdr(i)
497 ELSE
498 dfsh_dlam = zero
499 ENDIF
500
501
502
503 IF ((ft(i)>zero).AND.(ft(i)<fr).AND.(trdfds>zero)) THEN
504 dfg_dlam = (one-ft(i))*trdfds
505 ELSE
506 dfg_dlam = zero
507 ENDIF
508
509
510
511 dft_dlam = dfn_dlam + dfg_dlam + dfsh_dlam
512
513
514 denom = dfdsig2 - (dphi_dyld * dyld_dpla * dpla_dlam(i))
515 . - dphi_dfs * dfs_dft * dft_dlam
516 IF (jthe == 0 .and. cp > zero) THEN
517 denom = denom - dphi_dyld * dyld_dtemp * dtemp_dlam
518 ENDIF
519 denom = sign(
max(abs(denom),em20) ,denom)
520
521
522 !----------------------------------------------------------
523
524
525 IF (igurson == 2) THEN
526 dphi = dphi + dphi_dyld*dyld_dpla_nl*dpla_nl(i)
527 ENDIF
528 dlam = (dphi + phi(i)) / denom
529 dlam =
max(dlam, zero)
530
531
532 dpxx = dlam * normxx
533 dpyy = dlam * normyy
534 dpzz = dlam * normzz
535 dpxy = dlam * normxy
536 trdep(i) = dpxx + dpyy + dpzz
537
538
539 ddep = (dlam/((one - ft(i))*yld(i)))*sig_dfdsig
540 dpla(i) = dpla(i) + ddep
541 pla(i) = pla(i) + ddep
542
543
544
545 IF ((ft(i)>zero).AND.(ft(i)<fr).AND.(trdep(i)>zero)) THEN
546 fg(i) = fg(i) + (one-ft(i))*trdep(i)
547 ENDIF
548 fg(i) =
max(fg(i),zero)
549
550 IF ((pla(i) >= ed).AND.(ft(i)<fr)) THEN
551
552 IF (triax(i)>=zero) THEN
553 fn(i) = fn(i) + an*ddep
554
555 ELSEIF ((triax(i)<zero).AND.(triax(i)>=-third)) THEN
556 fn(i) = fn(i) + an*
max(one + three*triax(i),zero)*ddep
557 ENDIF
558 ENDIF
559 fn(i) =
max(fn(i),zero)
560
561 IF ((sigdr(i) > zero).AND.(ft(i)>zero).AND.(ft(i)<fr)) THEN
562 sigvm = sqrt(
max(em20, three*(j2(i)/(normsig**2))))
563 omega = one - ((twenty7 *(j3(i)/(normsig**3)))/(two*sigvm**3))**2
564 omega =
max(zero,omega)
565 omega =
min(one,omega)
566 sdpla = sxx(i)*dpxx + syy(i)*dpyy + szz(i)*dpzz
567 . + sxy(i)*dpxy
568 fsh(i) = fsh(i) + kw*omega*ft(i)*(sdpla/sigdr(i))
569 ENDIF
570 fsh(i) =
max(fsh(i),zero)
571
572 ft(i) = f0 + fg(i) + fn(i) + fsh(i)
573 ft(i) =
min(ft(i),fr)
574
575 IF (ft(i) < fc)THEN
576 fs(i) = ft(i)
577 ELSE
578 fs(i) = fc + (one/q1 - fc) * (ft(i)-fc)/(fr-fc)
579 ENDIF
580 fs(i) =
min(fs(i),one/q1)
581
582
583 IF (jthe == 0 .AND. cp > zero) THEN
584 dtemp = weitemp(i)*yld(i)*(one-ft(i))*ddep*eta/(rho(i)*cp)
585 temp(i) = temp(i) + dtemp
586 ftherm(i) = one - mtemp* (temp(i) - tref)
587 ENDIF
588
589
590 fhard(i) = yld0 + hard * pla(i) + qvoce*(one-exp(-bvoce*pla(i)))
591 IF (igurson == 2) THEN
592 IF (pla_nl(i) - pla(i) < zero) THEN
593 fhard(i) = fhard(i) - hkhi*(pla_nl(i) - pla(i))
594 ENDIF
595 ENDIF
596
597
598 yld(i) = fhard(i) * frate(i) * ftherm(i)
599 yld(i) =
max(yld(i), em10)
600
601
602 signxx(i) = sigoxx(i) + dsigxx(i) - (a11*dpxx + a12*dpyy)
603 signyy(i) = sigoyy(i) + dsigyy(i) - (a11*dpyy + a12*dpxx)
604 signxy(i) = sigoxy(i) + dsigxy(i) - dpxy*g
605 trsig(i) = signxx(i) + signyy(i)
606 sigm(i) = -trsig(i) * third
607 sxx(i) = signxx(i) + sigm(i)
608 syy(i) = signyy(i) + sigm(i)
609 szz(i) = sigm(i)
610 sxy(i) = signxy(i)
611
612
613 j2(i) = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) + sxy(i)**2
614 j3(i) = sxx(i) * syy(i) * szz(i) - szz(i) * sxy(i)**2
615 fdr(i) = j2(i)**3 - cdr*(j3(i)**2)
616 sigdr(i) = kdr * exp((one/six)*log(fdr(i)))
617
618 triax(i) = (trsig(i)*third)/sigdr(i)
619 IF (trsig(i)<zero) THEN
620 etat(i) = zero
621 ELSE
622 etat(i) = one
623 ENDIF
624
625
626 sigdr2 = sigdr(i)**2
627 yld2i = one / yld(i)**2
628 fcosh = cosh(q2*etat(i)*trsig(i)/(yld(i)*two))
629 fdam(i) = two*q1*fs(i)*fcosh - (q1*fs(i))**2
630 phi(i) = sigdr2 * yld2i - one + fdam(i)
631
632
633 dezz(i) = dezz(i) + nnu*dpxx + nnu*dpyy + dpzz
634 ENDDO
635
636
637
638
639
640 DO i=1,nel
641
642 IF (dpla(i) > zero) THEN
643 uvar(i,1) = phi(i)
644 et(i) = hardp(i)*frate(i) / (hardp(i)*frate(i) + young)
645 ELSE
646 uvar(i,1) = zero
647 et(i) = one
648 ENDIF
649
650 dmg(i,1) = ft(i)/fr
651 dmg(i,2) = fg(i)
652 dmg(i,3) = fn(i)
653 dmg(i,4) = fsh(i)
654 dmg(i,5) =
min(ft(i),fr)
655 dmg(i,6) =
min(fs(i),one/q1)
656 seq(i) = sigdr(i)
657
658 IF (ft(i) >= fr) THEN
659 IF (off(i) == one) off(i) = four_over_5
660 dpla(i) = zero
661 signxx(i) = zero
662 signyy(i) = zero
663 signxy(i) = zero
664 signyz(i) = zero
665 signzx(i) = zero
666 seq(i) = zero
667 ENDIF
668
669 dpdt = dpla(i) /
max(em20,timestep)
670 epsd(i) = afiltr * dpdt + (one - afiltr) * epsd(i)
671 uvar(i,2) = epsd(i)
672
673 soundsp(i) = sqrt((a11)/rho(i))
674
675 sigy(i) = yld(i)
676
677 thk(i) = thk(i) + dezz(i)*thkly(i)*off(i)
678 ENDDO
679