37
38
39
40#include "implicit_f.inc"
41
42
43
44
45
46
47 INTEGER NEL,NUPARAM,NUVAR,JTHE,INLOC
48 INTEGER ,DIMENSION(NEL), INTENT(IN) :: NGL
50 . time,timestep
51 my_real,
DIMENSION(NUPARAM),
INTENT(IN) ::
52 . uparam
53 my_real,
DIMENSION(NEL),
INTENT(IN) ::
54 . rho,tempel,dplanl,
55 . depsxx,depsyy,depsxy,depsyz,depszx,
56 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx,
57 . gs , thkly
58
59 my_real ,
DIMENSION(NEL),
INTENT(OUT) ::
60 . soundsp,sigy,et,
61 . signxx,signyy,signxy,signyz,signzx
62
63 my_real ,
DIMENSION(NEL),
INTENT(INOUT) ::
64 . pla,dpla,epsd,off,thk,temp,seq
65 my_real ,
DIMENSION(NEL,NUVAR),
INTENT(INOUT) ::
66 . uvar
67
68
69
70 INTEGER I,,ITER,NITER,NINDX,INDEX(NEL)
71c
73 . young,bulk,lam,g,g2,nu,cdr,kdr,hard,yld0,qvoce,bvoce,jcc,
74 . epsp0,mtemp,tini,tref,eta,cp,dpis,dpad,asrate,afiltr,a11,a12,
75 . nnu, normsig
77 .
78 . dtemp,dpdt,dlam,ddep
80 . dsdrdj2,dsdrdj3,
81 . dj3dsxx,dj3dsyy,dj3dsxy,dj3dszz,
82 .
83 .
84 . normxx,normyy,normxy,normzz,
85 . sig_dfdsig,dfdsig2,
86 . dphi_dsig,dphi_dyld,dphi_dfdr,dpdt_nl,
87 . dyld_dpla,dyld_dtemp,dtemp_dlam,dlam_nl
88
90 . trsig,
91 . sxx,syy,sxy,szz,sigm,j2,j3,sigdr,yld,weitemp,
92 . hardp,fhard,frate,ftherm,fdr,phi,dpla_dlam,
93 . dezz,dphi_dlam,dpxx,dpyy,dpxy,dpzz,sigdr2,yld2i
94
95
96
97
98
99
100
101
102
103
104 young = uparam(1)
105 bulk = uparam(2)
106 g = uparam(3)
107 g2 = uparam(4)
108 lam = uparam(5)
109 nu = uparam(6)
110 nnu = uparam(7)
111 a11 = uparam(9)
112 a12 = uparam(10)
113
114 cdr = uparam(12)
115 kdr = uparam(13)
116 tini = uparam(14)
117 hard = uparam(15)
118 yld0 = uparam(16)
119 qvoce = uparam(17)
120 bvoce = uparam(18)
121
122 jcc = uparam(20)
123 epsp0 = uparam(21)
124
125 mtemp = uparam(22)
126 tref = uparam(23)
127 eta = uparam(24)
128 cp = uparam(25)
129 dpis = uparam(26)
130 dpad = uparam(27)
131
132 asrate = uparam(28)
133 afiltr = asrate*timestep/(asrate*timestep + one)
134
135
136 DO i=1,nel
137 IF (off(i) < em01) off(i) = zero
138 IF (off(i) < one) off(i) = off(i)*four_over_5
139
140 dpla(i) = zero
141 et(i) = one
142 hardp(i) = zero
143 ENDDO
144
145 epsd(1:nel) = uvar(1:nel,1)
146
147
148 IF (time == zero) THEN
149 temp(1:nel) = tini
150 ENDIF
151 IF (cp > zero) THEN
152 IF (jthe == 0) THEN
153 IF (inloc == 0) THEN
154 DO i=1,nel
155 IF (epsd(i) < dpis) THEN
156 weitemp(i) = zero
157 ELSEIF (epsd(i) > dpad) THEN
158 weitemp(i) = one
159 ELSE
160 weitemp(i) = ((epsd(i)-dpis)**2 )
161 . * (three*dpad - two*epsd(i) - dpis)
162 . / ((dpad-dpis)**3)
163 ENDIF
164 ENDDO
165 ENDIF
166 ELSE
167 temp(1:nel) = tempel(1:nel)
168 ENDIF
169 ENDIF
170
171
172 DO i = 1,nel
173
174 fhard(i) = yld0 + hard*pla(i) + qvoce*(one-exp(-bvoce*pla(i)))
175
176 frate(i) = one
177 IF (epsd(i) > epsp0) frate(i) = frate(i) + jcc*log(epsd(i)/epsp0)
178
179 ftherm(i) = one
180 IF (cp > zero) ftherm(i) = one - mtemp * (temp(i) - tref)
181
182 yld(i) = fhard(i)*frate(i)*ftherm(i)
183
184 yld(i) =
max(em10, yld(i))
185 ENDDO
186
187
188
189
190 DO i=1,nel
191
192
193 signxx(i) = sigoxx(i) + a11*depsxx(i) + a12*depsyy(i)
194 signyy(i) = sigoyy(i) + a11*depsyy(i) + a12*depsxx(i)
195 signxy(i) = sigoxy(i) + depsxy(i)*g
196 signyz(i) = sigoyz(i) + depsyz(i)*gs(i)
197 signzx(i) = sigozx(i) + depszx(i)*gs(i)
198
199 trsig(i) = signxx(i) + signyy(i)
200 sigm(i) = -trsig(i) * third
201
202 sxx(i) = signxx(i) + sigm(i)
203 syy(i) = signyy(i) + sigm(i)
204 szz(i) = sigm(i)
205 sxy(i) = signxy(i)
206 dezz(i) = -nnu*depsxx(i) - nnu*depsyy(i)
207
208 j2(i) = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) + sxy(i)**2
209
210 j3(i) = sxx(i)*syy(i)*szz(i) - szz(i)*sxy(i)**2
211
212 fdr(i) = j2(i)**3 - cdr*(j3(i)**2)
213
214 IF (fdr(i) > zero) THEN
215 sigdr(i) = kdr * exp((one/six)*log(fdr(i)))
216 ELSE
217 sigdr(i) = zero
218 ENDIF
219 ENDDO
220
221
222
223
224 phi(1:nel) = (sigdr(1:nel) / yld(1:nel))**2 - one
225
226
227 nindx = 0
228 DO i=1,nel
229 IF (phi(i) >= zero .AND. off(i) == one) THEN
230 nindx=nindx+1
231 index(nindx)=i
232 ENDIF
233 ENDDO
234
235
236
237
238
239
240 niter = 3
241
242
243#include "vectorize.inc"
244 DO ii=1,nindx
245
246
247 i = index(ii)
248
249
250 sigdr2(i) = sigdr(i)**2
251 yld2i(i) = one / yld(i)**2
252 dpxx(i) = zero
253 dpyy(i) = zero
254 dpzz(i) = zero
255 dpxy(i) = zero
256 ENDDO
257
258
259 DO iter = 1, niter
260#include "vectorize.inc"
261
262 DO ii=1,nindx
263 i = index(ii)
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279 yld2i(i) = one/(yld(i)**2)
280 dphi_dsig = two*sigdr(i)*yld2i(i)
281
282
283 normsig = sqrt(signxx(i)*signxx(i)
284 . + signyy(i)*signyy(i)
285 . + two*signxy(i)*signxy(i))
286 normsig =
max(normsig,one)
287
288
289 fdr(i) = (j2(i)/(normsig**2))**3 - cdr*((j3(i)/(normsig**3))**2)
290 dphi_dfdr = dphi_dsig*kdr*(one/six)*exp(-(five/six)*log(fdr(i)))
291 dsdrdj2 = dphi_dfdr*three*(j2(i)/(normsig**2))**2
292 dsdrdj3 = -dphi_dfdr*two*cdr*(j3(i)/(normsig**3))
293
294 dj3dsxx = two_third*(syy(i)*szz(i))/(normsig**2)
295 . - third*(sxx(i)*szz(i))/(normsig**2)
296 . - third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
297 dj3dsyy = - third*(syy(i)*szz(i))/(normsig**2)
298 . + two_third*(sxx(i)*szz(i))/(normsig**2)
299 . - third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
300 dj3dszz = - third*(syy(i)*szz(i))/(normsig**2)
301 . - third*(sxx(i)*szz(i))/(normsig**2)
302 . + two_third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
303 dj3dsxy = two*(sxx(i)*sxy(i) + sxy(i)*syy(i))/(normsig**2)
304
305 normxx = dsdrdj2*sxx(i)/normsig + dsdrdj3*dj3dsxx
306 normyy = dsdrdj2*syy(i)/normsig + dsdrdj3*dj3dsyy
307 normzz = dsdrdj2*szz(i)/normsig + dsdrdj3*dj3dszz
308 normxy = two*dsdrdj2*sxy(i)/normsig + dsdrdj3*dj3dsxy
309
310
311
312
313
314
315 dfdsig2 = normxx * (a11*normxx + a12*normyy)
316 . + normyy * (a11*normyy + a12*normxx)
317 . + normxy * normxy * g
318
319
320
321
322
323
324 hardp(i) = hard + qvoce*bvoce*exp(-bvoce*pla(i))
325 dyld_dpla = hardp(i)*frate(i)*ftherm(i)
326
327
328
329 sig_dfdsig = signxx(i) * normxx
330 . + signyy(i) * normyy
331 . + signxy(i) * normxy
332 dpla_dlam(i) = sig_dfdsig / yld(i)
333
334
335
336 IF (jthe == 0 .AND. cp > zero .AND. inloc == 0) THEN
337
338
339 dyld_dtemp = -fhard(i)*frate(i)*mtemp
340
341
342 dtemp_dlam = weitemp(i)*eta/(rho(i)*cp)*sig_dfdsig
343 ELSE
344 dyld_dtemp = zero
345 dtemp_dlam = zero
346 ENDIF
347
348
349
350 dphi_dyld = -two*sigdr2(i)/(yld(i)**3)
351
352
353
354
355
356 dphi_dlam(i) = - dfdsig2 + (dphi_dyld*dyld_dpla
357 IF (jthe == 0 .AND. cp > zero .AND. inloc == 0) THEN
358 dphi_dlam(i) = dphi_dlam(i) + dphi_dyld*dyld_dtemp*dtemp_dlam
359 ENDIF
360 dphi_dlam(i) = sign(
max(abs(dphi_dlam(i)),em20) ,dphi_dlam(i))
361
362
363 dlam = -phi(i)/dphi_dlam(i)
364
365
366 dpxx(i) = dlam * normxx
367 dpyy(i) = dlam * normyy
368 dpzz(i) = dlam * normzz
369 dpxy(i) = dlam * normxy
370
371
372 signxx(i) = signxx(i) - (a11*dpxx(i) + a12*dpyy(i))
373 signyy(i) = signyy(i) - (a11*dpyy(i) + a12*dpxx(i))
374 signxy(i) = signxy(i) - dpxy(i)*g
375 trsig(i) = signxx(i) + signyy(i)
376 sigm(i) = -trsig(i) * third
377 sxx(i) = signxx(i) + sigm(i)
378 syy(i) = signyy(i) + sigm(i)
379 szz(i) = sigm(i)
380 sxy(i) = signxy(i)
381
382
383 ddep = (dlam/yld(i))*sig_dfdsig
384 dpla(i) =
max(zero, dpla(i) + ddep)
385 pla(i) = pla(i) + ddep
386
387
388 j2(i) = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) + sxy(i)**2
389 j3(i) = sxx(i) * syy(i) * szz(i) - szz(i) * sxy(i)**2
390 fdr(i) = j2(i)**3 - cdr*(j3(i)**2)
391 sigdr(i) = kdr * exp((one/six)*log(fdr(i)))
392
393
394 IF (jthe == 0 .AND. cp > zero .AND. inloc == 0) THEN
395 dtemp = weitemp(i)*yld(i)*ddep*eta/(rho(i)*cp)
396 temp(i) = temp(i) + dtemp
397 ftherm(i) = one - mtemp*(temp(i) - tref)
398 ENDIF
399
400
401 fhard(i) = yld0 + hard*pla(i) + qvoce*(one-exp(-bvoce*pla(i)))
402
403
404 yld(i) = fhard(i)*frate(i)*ftherm(i)
405 yld(i) =
max(yld(i), em10)
406
407
408 sigdr2(i) = sigdr(i)**2
409 yld2i(i) = one / yld(i)**2
410 phi(i) = sigdr2(i) * yld2i(i) - one
411
412
413 IF (inloc == 0) THEN
414 dezz(i) = dezz(i) + nnu*dpxx(i) + nnu*dpyy(i) + dpzz(i)
415 ENDIF
416
417 ENDDO
418
419 ENDDO
420
421
422
423
424
425
426 DO i=1,nel
427
428 seq(i) = sigdr(i)
429
430 IF (dpla(i) > zero) THEN
431 et(i) = hardp(i)*frate(i) / (hardp(i)*frate(i) + young)
432 ELSE
433 et(i) = one
434 ENDIF
435
436 dpdt = dpla(i) /
max(em20,timestep)
437 epsd(i) = afiltr * dpdt + (one - afiltr) * epsd(i)
438 uvar(i,1) = epsd(i)
439
440 soundsp(i) = sqrt(a11/rho(i))
441
442 sigy(i) = yld(i)
443
444 IF ((inloc > 0).AND.(off(i) == one).AND.(dplanl(i)>zero)) THEN
445 yld2i(i) = one/(yld(i)**2)
446 dphi_dsig = two*sigdr(i)*yld2i(i)
447 normsig = sqrt(signxx(i)*signxx(i)
448 . + signyy(i)*signyy(i)
449 . + two*signxy(i)*signxy(i))
450 normsig =
max(normsig,one)
451 fdr(i) = (j2(i)/(normsig**2))**3 - cdr*((j3(i)/(normsig**3))**2)
452 IF (fdr(i) > zero) THEN
453 dphi_dfdr = dphi_dsig*kdr*(one/six)*exp(-(five/six)*log(fdr(i)))
454 ELSE
455 dphi_dfdr = zero
456 ENDIF
457 dsdrdj2 = dphi_dfdr*three*(j2(i)/(normsig**2))**2
458 dsdrdj3 = -dphi_dfdr*two*cdr*(j3(i)/(normsig**3))
459 dj3dsxx = two_third*(syy(i)*szz(i))/(normsig**2)
460 . - third*(sxx(i)*szz(i))/(normsig**2)
461 . - third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
462 dj3dsyy = - third*(syy(i)*szz(i))/(normsig**2)
463 . + two_third*(sxx(i)*szz(i))/(normsig**2)
464 . - third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
465 dj3dszz = - third*(syy(i)*szz(i))/(normsig**2)
466 . - third*(sxx(i)*szz(i))/(normsig**2)
467 . + two_third*(sxx(i)*syy(i)-sxy(i)**2)/(normsig**2)
468 dj3dsxy = two*(sxx(i)*sxy(i) + sxy(i)*syy(i))/(normsig**2)
469 normxx = dsdrdj2*sxx(i)/normsig + dsdrdj3*dj3dsxx
470 normyy = dsdrdj2*syy(i)/normsig + dsdrdj3*dj3dsyy
471 normzz = dsdrdj2*szz(i)/normsig + dsdrdj3*dj3dszz
472 normxy = two*dsdrdj2*sxy(i)/normsig + dsdrdj3*dj3dsxy
473 sig_dfdsig = signxx(i) * normxx
474 . + signyy(i) * normyy
475 . + signxy(i) * normxy
476 IF (sig_dfdsig > em01) THEN
477 dlam_nl = (yld(i)*dplanl(i))/sig_dfdsig
478 dezz(i) = dezz(i) + nnu*(dlam_nl*normxx)
479 . + nnu*(dlam_nl*normyy)
480 . + dlam_nl*normzz
481 ENDIF
482 IF (cp > zero .AND. jthe == 0) THEN
483
484 dpdt_nl = dplanl(i)/
max(timestep,em20)
485 IF (dpdt_nl < dpis) THEN
486 weitemp(i) = zero
487 ELSEIF (dpdt_nl > dpad) THEN
488 weitemp(i) = one
489 ELSE
490 weitemp(i) = ((dpdt_nl-dpis)**2 )
491 . * (three*dpad - two*dpdt_nl - dpis)
492 . / ((dpad-dpis)**3)
493 ENDIF
494 dtemp = weitemp(i)*dplanl(i)*yld(i)*eta/(rho(i)*cp)
495 temp(i) = temp(i) + dtemp
496 ENDIF
497 ENDIF
498
499 thk(i) = thk(i) + dezz(i)*thkly(i)*off(i)
500 ENDDO
501