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