44
45
46
49
50
51
52#include "implicit_f.inc"
53
54
55
56#include "com04_c.inc"
57
58
59
60 INTEGER ,INTENT(IN) :: IEOS
61 INTEGER ,INTENT(IN) :: JTHE
62 INTEGER ,INTENT(IN) :: JLAG
63 INTEGER NEL,NUPARAM,NUVAR,NVARTMP,NUMTABL,INLOC
64 INTEGER ,DIMENSION(NUMTABL),INTENT(IN) :: ITABLE
65 INTEGER ,DIMENSION(NEL) ,INTENT(IN) :: NGL
66
68 my_real,
DIMENSION(NUPARAM) ,
INTENT(IN) :: uparam
69 my_real,
DIMENSION(NEL) ,
INTENT(IN) :: volume
70 my_real,
DIMENSION(NEL) ,
INTENT(IN) :: rho,dpdm,off,
71 . depsxx,depsyy,depszz,depsxy,depsyz,depszx,
72 . sigoxx,sigoyy,sigozz,sigoxy,sigoyz,sigozx,dplanl
73 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) :: soundsp,sigy,et,
74 . signxx,signyy,signzz,signxy,signyz,signzx
75 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: pla,dpla,epsd
76 my_real ,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
77 INTEGER ,DIMENSION(NEL,NVARTMP) ,INTENT(INOUT) :: VARTMP
78 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: temp
79 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT)
80 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: seq
81 INTEGER, INTENT(IN) :: LPLANL, LEPSDNL
82 my_real,
DIMENSION(NEL*LPLANL) :: pla_nl
83 my_real,
DIMENSION(NEL*LEPSDNL) :: dpdt_nl
84
85 TYPE(TTABLE), DIMENSION(NTABLE) :: TABLE
86
87
88
89 INTEGER I,II,NINDX,ITER,NITER,ISMOOTH,
90 . FUNC_YLD,,FUNC_ETA,NDIM_YLD,NDIM_TEMP,NDIM_ETA
91 INTEGER ,DIMENSION(NEL) :: INDEX
92c
93 my_real :: young,bulk,lame,g,g2,g3,nu,tref,tini,eta,ldav,cp,
94 . xrate,xscale,yscale,dtinv,j2,q2,dphi_dlam,r,dlamin,
alpha,alphi
95 my_real :: asrate,ddep,dfdsig2,sig_dfdsig
96
97 my_real,
DIMENSION(NEL) ::svm,svmt,yld,yld_tref,yld_temp,
98 . sxx,syy,szz,sxy,syz,szx,sigm,
99 . fact_eta,dydx,hardp,hardr,yld_i,hardp_i,hardr_i,dxdyv,dlam,phi,
100 . ftherm,tfac,pla0,normxx,normyy,normzz,normxy,
101 . normyz,normzx,dpxx,dpyy,dpzz,dpxy,dpyz
102 my_real,
DIMENSION(NEL,3) :: xvec_eta
103 my_real,
DIMENSION(NEL,4) :: xvec
104 INTEGER, DIMENSION(NEL,3) :: IPOS_ETA
105 INTEGER, DIMENSION(NEL,2) :: IPOS
106
107
108
109
110
111
112
113
114
115
116
117
118 young = uparam(1)
119 nu = uparam(2)
120 eta = uparam(3)
121 tref = uparam(4)
122 tini = uparam(5)
123 ismooth = nint(uparam(6))
124 xrate = uparam(7)
125 xscale = uparam(8)
126 yscale = uparam(9)
127 g = uparam(11)
128 g2 = uparam(12)
129 g3 = uparam(13)
130 bulk = uparam(14)
131 lame = uparam(15)
132 cp = uparam(20)
133 asrate = uparam(21)
134
135 dtinv = one /
max(em20, timestep)
136 alpha = asrate*timestep
138
139 IF (jthe /= 0) eta = zero
140
141
142 func_yld = itable(1)
143 func_temp = itable(2)
144 func_eta = itable(3)
145 ndim_yld = table(func_yld)%NDIM
146 IF (func_temp > 0) THEN
147 ndim_temp = table(func_temp)%NDIM
148 ENDIF
149 IF (func_eta > 0) THEN
150 ndim_eta = table(func_eta)%NDIM
151 ENDIF
152
153
154 DO i = 1,nel
155 pla0(i) = pla(i)
156 dpla(i) = zero
157 et(i) = one
158 hardp(i) = zero
159 ENDDO
160
161
162 IF (jthe == 0) THEN
163
164 IF (time == zero) temp(1:nel) = tini
165
166 IF (eta > zero) THEN
167
168 IF (func_eta > 0) THEN
169 IF (inloc == 0) THEN
170 xvec_eta(1:nel,1) = epsd(1:nel) * xrate
171 ELSE
172 xvec_eta(1:nel,1) = dpdt_nl(1:nel) * xrate
173 ENDIF
174 ipos_eta(1:nel,1) = 1
175 IF (ndim_eta > 1) THEN
176 xvec_eta(1:nel,2) = temp(1:nel)
177 ipos_eta(1:nel,2) = vartmp(1:nel,4)
178 END IF
179 IF (ndim_eta > 2) THEN
180 IF (inloc == 0) THEN
181 xvec_eta(1:nel,3) = pla(1:nel)
182 ELSE
183 xvec_eta(1:nel,3) = pla_nl(1:nel)
184 ENDIF
185 ipos_eta(1:nel,3) = vartmp(1:nel,5)
186 END IF
187 CALL table_vinterp(table(func_eta),nel,nel,ipos_eta,xvec_eta,
188 . fact_eta,dxdyv)
189 IF (ndim_eta > 1) vartmp(1:nel,4) = ipos_eta(1:nel,2)
190 IF (ndim_eta > 2) vartmp(1:nel,5) = ipos_eta(1:nel,3)
191 DO i=1,nel
192 ftherm(i) =
min(eta*fact_eta(i), one)
193 END DO
194 ELSE
195 ftherm(1:nel) =
min(eta, one)
196 END IF
197 END IF
198 ENDIF
199
200
201
202
203 DO i=1,nel
204
205 ldav = (depsxx(i) + depsyy(i) + depszz(i)) * lame
206 signxx(i) = sigoxx(i) + depsxx(i)*g2 + ldav
207 signyy(i) = sigoyy(i) + depsyy(i)*g2 + ldav
208 signzz(i) = sigozz(i) + depszz(i)*g2 + ldav
209 signxy(i) = sigoxy(i) + depsxy(i)*g
210 signyz(i) = sigoyz(i) + depsyz(i)*g
211 signzx(i) = sigozx(i) + depszx(i)*g
212
213 sigm(i) = (signxx(i) + signyy(i) + signzz(i)) * third
214
215 sxx(i) = signxx(i) - sigm(i)
216 syy(i) = signyy(i) - sigm(i)
217 szz(i) = signzz(i) - sigm(i)
218 sxy(i) = signxy(i)
219 syz(i) = signyz(i)
220 szx(i) = signzx(i)
221
222 j2 = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) +
223 . sxy(i)**2 + syz(i)**2 + szx(i)**2
224 svm(i) = sqrt(three*j2)
225 ENDDO
226
227
228 xvec(1:nel,1) = pla(1:nel)
229 xvec(1:nel,2) = epsd(1:nel) * xscale
230 ipos(1:nel,1) = vartmp(1:nel,1)
231 ipos(1:nel,2) = 1
233 . xvec,yld,hardp,hardr)
234 yld(1:nel) = yld(1:nel)*yscale
235 hardp(1:nel) = hardp(1:nel)*yscale
236 vartmp(1:nel,1) = ipos(1:nel,1)
237
238 IF (func_temp > 0) THEN
239 xvec(1:nel,2) = tref
240 ipos(1:nel,1) = vartmp(1:nel,2)
241 ipos(1:nel,2) = vartmp(1:nel,3)
242 CALL table_vinterp(table(func_temp),nel,nel,ipos,xvec,yld_tref,dydx)
243 vartmp(1:nel,2) = ipos(1:nel,1)
244 vartmp(1:nel,3) = ipos(1:nel,2)
245 xvec(1:nel,2) = temp(1:nel)
246 CALL table_vinterp(table(func_temp),nel,nel,ipos,xvec,yld_temp,dydx)
247 tfac(1:nel) = yld_temp(1:nel) / yld_tref(1:nel)
248 yld(1:nel) = yld(1:nel) * tfac(1:nel)
249 hardp(1:nel) = hardp(1:nel) * tfac(1:nel)
250 ELSE
251 tfac(1:nel) = one
252 END IF
253
254
255
256
257 phi(1:nel) = svm(1:nel) - yld(1:nel)
258 nindx = 0
259 DO i=1,nel
260 IF (phi(i) >= zero .AND. off(i) == one) THEN
261 nindx = nindx + 1
262 index(nindx) = i
263 ENDIF
264 ENDDO
265
266
267
268
269
270
271 niter = 3
272
273 IF (nindx > 0) THEN
274
275
276 DO iter = 1,niter
277#include "vectorize.inc"
278
279 DO ii = 1, nindx
280 i = index(ii)
281
282
283
284
285
286
287
288
289
290
291
292
293
294 normxx(i) = three_half*sxx(i)/(
max(svm(i),em20))
295 normyy(i) = three_half*syy(i)/(
max(svm(i),em20))
296 normzz(i) = three_half*szz(i)/(
max(svm(i),em20))
297 normxy(i) = three*sxy(i)/(
max(svm(i),em20))
298 normyz(i) = three*syz(i)/(
max(svm(i),em20))
299 normzx(i) = three*szx(i)/(
max(svm(i),em20))
300
301
302
303
304
305
306 dfdsig2 = normxx(i) * normxx(i) * g2
307 . + normyy(i) * normyy(i) * g2
308 . + normzz(i) * normzz(i) * g2
309 . + normxy(i) * normxy(i) * g
310 . + normyz(i) * normyz(i) * g
311 . + normzx(i) * normzx(i) * g
312
313
314
315 sig_dfdsig = signxx(i) * normxx(i)
316 . + signyy(i) * normyy(i)
317 . + signzz(i) * normzz(i)
318 . + signxy(i) * normxy(i)
319 . + signyz(i) * normyz(i)
320 . + signzx(i) * normzx(i)
321 dpla_dlam(i) = sig_dfdsig / yld(i)
322
323
324
325 dphi_dlam = - dfdsig2 + hardp(i)*dpla_dlam(i)
326 dphi_dlam = sign(
max(abs(dphi_dlam),em20),dphi_dlam)
327
328
329
330 dlam(i) = - phi(i) / dphi_dlam
331
332
333
334
335 ddep = dpla_dlam(i)*dlam(i)
336
337 dpla(i) =
max(dpla(i) + ddep,zero)
338
339 pla(i) = pla0(i) + dpla(i)
340
341 dpxx(i) = dlam(i)*normxx(i)
342 dpyy(i) = dlam(i)*normyy(i)
343 dpzz(i) = dlam(i)*normzz(i)
344 dpxy(i) = dlam(i)*normxy(i)
345 dpyz(i) = dlam(i)*normyz(i)
346 dpzx(i) = dlam(i)*normzx(i)
347
348 ENDDO
349
350
351
352 xvec(1:nel,1:2) = zero
353 ipos(1:nel,1:2) = 0
354 DO ii = 1, nindx
355 i = index(ii)
356 xvec(ii,1) = pla(i)
357 xvec(ii,2) = epsd(i)
358 ipos(ii,1) = vartmp(i,1)
359 ipos(ii,2) = 1
360 ENDDO
361 CALL table2d_vinterp_log(table(func_yld),ismooth,nel,nindx,ipos,xvec,yld_i,hardp_i,hardr_i)
362 DO ii = 1, nindx
363 i = index(ii)
364 vartmp(i,1) = ipos(ii,1)
365 hardp(i) = hardp_i(ii)*yscale*tfac(i)
366 yld(i) = yld_i(ii)*yscale*tfac(i)
367 ENDDO
368
369
370
371#include "vectorize.inc"
372 DO ii = 1, nindx
373 i = index(ii)
374
375
376 signxx(i) = signxx(i) - dpxx(i)*g2
377 signyy(i) = signyy(i) - dpyy(i)*g2
378 signzz(i) = signzz(i) - dpzz(i)*g2
379 signxy(i) = signxy(i) - dpxy(i)*g
380 signyz(i) = signyz(i) - dpyz(i)*g
381 signzx(i) = signzx(i) - dpzx(i)*g
382
383
384 sigm(i) = (signxx(i) + signyy(i) + signzz(i)) * third
385
386
387 sxx(i) = signxx(i) - sigm(i)
388 syy(i) = signyy(i) - sigm(i)
389 szz(i) = signzz(i) - sigm(i)
390 sxy(i) = signxy(i)
391 syz(i) = signyz(i)
392 szx(i) = signzx(i)
393
394
395 j2 = half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) +
396 . sxy(i)**2 + syz(i)**2 + szx(i)**2
397 svm(i) = sqrt(three*j2)
398
399
400 phi(i) = svm(i) - yld(i)
401
402 ENDDO
403
404
405 ENDDO
406
407
408
409
410
411
412 DO ii = 1, nindx
413 i = index(ii)
414 et(i) = hardp(i) / (hardp(i) + young)
415 ENDDO
416
417
418 IF (eta > zero .AND. inloc == 0) THEN
419 IF (jthe /= 0 .AND. jlag /= 0) THEN
420 DO ii = 1, nindx
421 i = index(ii)
422 fheat(i) = fheat(i) + ftherm(i)*yld(i)*dpla(i) * volume(i)
423 ENDDO
424 ELSE IF (cp > zero) THEN
425 DO ii = 1, nindx
426 i = index(ii)
427 temp(i) = temp(i) + ftherm(i)*yld(i)*dpla(i) / (cp*rho(i))
428 ENDDO
429 ENDIF
430 ENDIF
431
432 ENDIF
433
434
435
436 IF (inloc > 0 .AND. eta > zero) THEN
437 IF (jthe /= 0 .AND. jlag /= 0) THEN
438 DO i = 1, nel
439 IF (off(i) == one) THEN
440 fheat(i) = fheat(i) +
441 . ftherm(i)*yld(i)*
max(dplanl(i),zero)*volume(i)
442 ENDIF
443 ENDDO
444 ELSE IF (cp > zero) THEN
445 DO i = 1,nel
446 IF (off(i) == one) THEN
447 temp(i) = temp(i) + ftherm(i)*yld(i)*
max(dplanl(i),zero)/(cp*rho(i))
448 ENDIF
449 ENDDO
450 ENDIF
451 ENDIF
452
453
454
455
456
457
458 IF (ieos > 0) THEN
459 signxx(1:nel) = signxx(1:nel) - sigm(1:nel)
460 signyy(1:nel) = signyy(1:nel) - sigm(1:nel)
461 signzz(1:nel) = signzz(1:nel) - sigm(1:nel)
462 signxy(1:nel) = signxy(1:nel)
463 signyz(1:nel) = signyz(1:nel)
464 signzx(1:nel) = signzx(1:nel)
465 soundsp(1:nel)= sqrt((dpdm(1:nel) + four_over_3*g) / rho(1:nel))
466 ELSE
467 soundsp(1:nel)= sqrt((bulk + four_over_3*g) / rho(1:nel))
468 END IF
469
470
471
472 DO i=1,nel
473
474 seq(i) = svm(i)
475
476 sigy(i) = yld(i)
477
478 epsd(i) =
alpha*dpla(i)*dtinv + alphi*epsd(i)
479 ENDDO
480