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