45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "mvsiz_p.inc"
53
54
55
56#include "scr05_c.inc"
57#include "scr17_c.inc"
58#include "impl1_c.inc"
59#include "tabsiz_c.inc"
60
61
62
63 INTEGER, INTENT(IN) :: NUPARAM
64 INTEGER, INTENT(IN) :: NIPARAM
65 INTEGER, INTENT(IN) :: NEL,NUVAR,ISMSTR,IHET,IEXPAN
66 my_real,
INTENT(IN) :: time, timestep
67 INTEGER, DIMENSION(NIPARAM), INTENT(IN) :: IPARAM(NIPARAM)
68 my_real,
DIMENSION(NUPARAM),
INTENT(IN) :: uparam(nuparam)
69 my_real,
DIMENSION(NEL),
INTENT(IN) ::rho,rho0,volume,eint,
70 . offg,epsth3,epsp1,epsp2,epsp3,epsp4,epsp5,epsp6,
71 . epsxx,epsyy,epszz,epsxy,epsyz,epszx,
72 . mfxx,mfxy,mfxz,mfyx,mfyy,mfyz,mfzx,mfzy,mfzz
73
74
75
76 my_real ,
DIMENSION(NEL),
INTENT(OUT) :: soundsp,viscmax,
77 . signxx,signyy,signzz,signxy,signyz,signzx
78
79
80
81 my_real,
DIMENSION(NEL,NUVAR),
INTENT(INOUT) :: uvar(nel,nuvar)
82 my_real,
DIMENSION(NEL),
INTENT(INOUT) :: off(nel),et(nel)
83
84
85
86 INTEGER NPF(SNPC),NFUNC,IFUNC(NFUNC)
88 EXTERNAL finter
89
90
91
92 INTEGER I,II,J,K,KFP,NPRONY,NORDER,IFORM
93 my_real tensioncut,amax,gvmax,gmax,ffac,trace,rbulk,dpdmu,
94 . aa,cc,fac,inve,etv,rv_pui,amin,nu_1
95 my_real,
DIMENSION(3) :: lam_al,fft
97 my_real,
DIMENSION(100) :: gi,taux
98 my_real,
DIMENSION(NEL) :: sumdwdl,rv,j2third,p,dwdrv,eti,gtmax
100 my_real,
DIMENSION(NEL,3) :: t1,sigprv,ev,evm,dwdl,cii
101 my_real,
DIMENSION(NEL,6) :: dotb,svisc,c0,c1
102 my_real,
DIMENSION(NEL,3,3) :: f,ll,bb,lb,blt
103 my_real,
DIMENSION(NEL,6,100) :: h0, h
104 my_real,
DIMENSION(MVSIZ,3) :: evv
105 my_real,
DIMENSION(MVSIZ,6) :: av
106 my_real,
DIMENSION(MVSIZ,3,3) :: dirprv
107 my_real,
DIMENSION(NEL) :: p_fac
108 DOUBLE PRECISION AMAX1
109
110
111
112
113
114
115
116 norder = iparam(1)
117 nprony = iparam(2)
118 iform = iparam(3)
119
120 gmax = zero
121 DO i=1,norder
122
123 mu(i) = uparam(i)
124
125 al(i) = uparam(10+i)
126
127 gmax = gmax + mu(i)*al(i)
128 ENDDO
129
130 rbulk = uparam(21)
131
132 tensioncut = uparam(23)
133
134 ffac = uparam(24)
135
136 kfp = ifunc(1)
137
138 gvmax = zero
139 etv = zero
140 IF (nprony > 0) THEN
141 DO i=1,nprony
142 taux(i) = uparam(24 + nprony + i)
143 gi(i) = uparam(24 + i)
144 gvmax = gvmax + gi(i)
145 ENDDO
146 etv =
min(gvmax,rbulk)/gmax
147 ENDIF
148
149
150 DO i=1,nel
151 av(i,1) = epsxx(i)
152 av(i,2) = epsyy(i)
153 av(i,3) = epszz(i)
154 av(i,4) = epsxy(i) * half
155 av(i,5) = epsyz(i) * half
156 av(i,6) = epszx(i) * half
157 ENDDO
158
159
160
161
162 IF (iresp == 1) THEN
164 ELSE
166 ENDIF
167
168
169
170
171 IF (ismstr == 0 .OR. ismstr == 2 .OR. ismstr == 4) THEN
172 DO i=1,nel
173 ev(i,1) = exp(evv(i,1))
174 ev(i,2) = exp(evv(i,2))
175 ev(i,3) = exp(evv(i,3))
176 ENDDO
177
178 ELSEIF (ismstr == 10 .OR. ismstr == 12) THEN
179 DO i =1,nel
180 IF (offg(i)<=one) THEN
181 ev(i,1) = sqrt(evv(i,1) + one)
182 ev(i,2) = sqrt(evv(i,2) + one)
183 ev(i,3) = sqrt(evv(i,3) + one)
184 ELSE
185 ev(i,1) = evv(i,1) + one
186 ev(i,2) = evv(i,2) + one
187 ev(i,3) = evv(i,3) + one
188 END IF
189 ENDDO
190
191 ELSE
192 DO i=1,nel
193 ev(i,1) = evv(i,1) + one
194 ev(i,2) = evv(i,2) + one
195 ev(i,3) = evv(i,3) + one
196 ENDDO
197 ENDIF
198
199
200 IF (impl_s > 0 .OR. ihet > 1) THEN
201 DO j = 1,3
202
203
204
205 eti(1:nel) = zero
206 DO ii = 1,norder
207 IF(mu(ii)*al(ii)/=zero) THEN
208 DO i=1,nel
209 amax = ev(i,j)
210 IF(amax/=zero) THEN
211 IF((al(ii)-one)/=zero) THEN
212 eti(i) = eti(i) + mu(ii)*al(ii) * exp((al(ii)-one)*log(amax))
213 ELSE
214 eti(i) = eti(i) + mu(ii)*al(ii)
215 ENDIF
216 ENDIF
217 ENDDO
218 ENDIF
219 ENDDO
220 et(1:nel)=
max(eti(1:nel),et(1:nel))
221 ENDDO
222 DO i=1,nel
223 et(i) =
max(one,et(i)/gmax)
224 et(i)= et(i)+etv
225 ENDDO
226 ENDIF
227
228
229
230 DO i=1,nel
231 rv(i) = (ev(i,1)*ev(i,2)*ev(i,3))
232 ENDDO
233
234
235 IF (iexpan > 0 .AND. (ismstr == 10 .OR. ismstr == 11 .OR. ismstr == 12)) THEN
236 DO i=1,nel
237 rv(i) = rv(i) - epsth3(i)
238 ENDDO
239 ENDIF
240
241 p_fac(1:nel) = one
242 IF (rbulk > 24*gmax) THEN
243 nu_1 = fourty*(half-(3*rbulk-gmax)/(6*rbulk+gmax))
244 DO i=1,nel
245 amin =
min(ev(i,1),ev(i,2),ev(i,3))
246 IF (amin<zep2) p_fac(i) =
max(one,nu_1/
max(em20,amin))
247 ENDDO
248 END IF
249
250
251
252 DO i=1,nel
253
254
255 IF (rv(i) > zero) THEN
256 rv_pui = exp((-third)*log(rv(i)))
257 j2third(i) = rv_pui**2
258 ELSE
259 rv_pui = zero
260 j2third(i) = zero
261 ENDIF
262 evm(i,1) = ev(i,1)*rv_pui
263 evm(i,2) = ev(i,2)*rv_pui
264 evm(i,3) = ev(i,3)*rv_pui
265
266
267 IF (kfp > 0) THEN
268 p(i) = rbulk*ffac*finter(kfp,rv(i),npf,tf,dpdmu)
269
270 ELSE
271 p(i) = p_fac(i)*rbulk
272 ENDIF
273 ENDDO
274
275
276 gtmax(1:nel) = gmax + gvmax
277 eti(1:nel) = zero
278 cii(1:nel,1:3) = zero
279 DO ii = 1,norder
280 IF (mu(ii)*al(ii) /= zero) THEN
281 DO i=1,nel
282 lam_al(1:3) = exp(al(ii)*log(evm(i,1:3)))
283 amax = third*(lam_al(1)+lam_al(2)+lam_al(3))
284 cii(i,1:3) = cii(i,1:3) + mu(ii)*al(ii)*(lam_al(1:3)+amax)
285 ENDDO
286 ENDIF
287 ENDDO
288
289 amax1 = 0.81*half/gmax
290 DO i = 1,nel
291 amax = amax1*
max(cii(i,1),cii(i,2),cii(i,3))
292 eti(i) =
max(one,amax)
293 gtmax(i) = gmax*eti(i) + gvmax
294 et(i) = eti(i)+etv
295 ENDDO
296
297
298
299
300
301
302
303 DO j=1,3
304 dwdl(1:nel,j)=zero
305 DO ii=1,norder
306 DO i=1,nel
307 IF (evm(i,j)/=zero) THEN
308 IF (al(ii)/=zero) THEN
309 dwdl(i,j) = dwdl(i,j) + mu(ii) * exp(al(ii)*log(evm(i,j)))
310 ELSE
311 dwdl(i,j) = dwdl(i,j) + mu(ii)
312 ENDIF
313 ENDIF
314 ENDDO
315 ENDDO
316 ENDDO
317
318
319
320 DO i=1,nel
321
322 IF (iform == 1) THEN
323 dwdrv(i) = p(i)*(rv(i)- one)
324
325 ELSEIF (iform == 2) THEN
326 dwdrv(i) = p(i)*(one - one/rv(i))
327 ENDIF
328 sumdwdl(i)=(dwdl(i,1)+dwdl(i,2)+dwdl(i,3))*third
329 ENDDO
330
331
332 DO j=1,3
333 DO i=1,nel
334 inve = one/rv(i)
335 sigprv(i,j) = (dwdl(i,j)-(sumdwdl(i)-rv(i)*dwdrv(i)))*inve
336 ENDDO
337 ENDDO
338
339
340 DO i=1,nel
341 t1(i,1) = rv(i)*sigprv(i,1)/ev(i,1)
342 t1(i,2) = rv(i)*sigprv(i,2)/ev(i,2)
343 t1(i,3) = rv(i)*sigprv(i,3)/ev(i,3)
344 ENDDO
345
346
347 DO j=1,3
348 DO i=1,nel
349 IF(off(i)==zero.OR.t1(i,j)>abs(tensioncut))THEN
350 sigprv(i,1)=zero
351 sigprv(i,2)=zero
352 sigprv(i,3)=zero
353 off(i)=zero
354 ENDIF
355 ENDDO
356 ENDDO
357
358
359 DO i=1,nel
360
361
362 signxx(i) = dirprv(i,1,1)*dirprv(i,1,1)*sigprv
363 . + dirprv(i,1,2)*dirprv(i,1,2)*sigprv(i,2)
364 . + dirprv(i,1,3)*dirprv(i,1,3)*sigprv(i,3)
365
366 signyy(i) = dirprv(i,2,2)*dirprv(i,2,2)*sigprv(i,2)
367 . + dirprv(i,2,3)*dirprv(i,2,3)*sigprv(i,3)
368 . + dirprv(i,2,1)*dirprv(i,2,1)*sigprv(i,1)
369
370 signzz(i) = dirprv(i,3,3)*dirprv(i,3,3)*sigprv(i,3)
371 . + dirprv(i,3,1)*dirprv(i,3,1)*sigprv(i,1)
372 . + dirprv(i,3,2)*dirprv(i,3,2)*sigprv(i,2)
373
374 signxy(i) = dirprv(i,1,1)*dirprv(i,2,1)*sigprv(i,1)
375 . + dirprv(i,1,2)*dirprv(i,2,2)*sigprv(i,2)
376 . + dirprv(i,1,3)*dirprv(i,2,3)*sigprv(i,3)
377
378 signyz(i) = dirprv(i,2,2)*dirprv(i,3,2)*sigprv(i,2)
379 . + dirprv(i,2,3)*dirprv(i,3,3)*sigprv(i,3)
380 . + dirprv(i,2,1)*dirprv(i,3,1)*sigprv(i,1)
381
382 signzx(i) = dirprv(i,3,3)*dirprv(i,1,3)*sigprv(i
383 . + dirprv(i,3,1)*dirprv(i,1,1)*sigprv(i,1)
384 . + dirprv(i,3,2)*dirprv(i,1,2)*sigprv
385
386 !
Save user variables
for post-processing
387 uvar(i,1) =
max(sigprv(i,1),sigprv(i,2),sigprv(i,3))
388 uvar(i,2) =
min(sigprv(i,1),sigprv(i,2),sigprv(i,3))
389 uvar(i,3) = off(i)
390
391
392
393 soundsp(i) = sqrt((two_third*gtmax(i)+p(i))/rho(i))
394
395 viscmax(i) = zero
396 ENDDO
397
398
399
400
401 IF (nprony > 0) THEN
402 IF (ismstr == 10 .or. ismstr == 12) THEN
403
404
405
406
407
408 DO i=1,nel
409 ll(i,1,1) = epsp1(i)
410 ll(i,2,2) = epsp2(i)
411 ll(i,3,3) = epsp3(i)
412 ll(i,1,2) = epsp4(i) * half
413 ll(i,2,3) = epsp5(i) * half
414 ll(i,1,3) = epsp6(i) * half
415 ll(i,2,1) = ll(i,1,2)
416 ll(i,3,1) = ll(i,1,3)
417 ll(i,3,2) = ll(i,2,3)
418
419 f(i,1,1) = one + mfxx(i)
420 f(i,2,2) = one + mfyy(i)
421 f(i,3,3) = one + mfzz(i)
422 f(i,1,2) = mfxy(i)
423 f(i,2,3) = mfyz(i)
424 f(i,3,1) = mfzx(i)
425 f(i,2,1) = mfyx(i)
426 f(i,3,2) = mfzy(i)
427 f(i,1,3) = mfxz(i)
428 ENDDO
429
431
432
433
434 DO i=1,nel
435 bb(i,1,1) = bb(i,1,1) * j2third(i)
436 bb(i,2,2) = bb(i,2,2) * j2third(i)
437 bb(i,3,3) = bb(i,3,3) * j2third(i)
438 bb(i,1,2) = bb(i,1,2) * j2third(i)
439 bb(i,2,3) = bb(i,2,3) * j2third(i)
440 bb(i,1,3) = bb(i,1,3) * j2third(i)
441 bb(i,2,1) = bb(i,1,2)
442 bb(i,3,2) = bb(i,2,3)
443 bb(i,3,1) = bb(i,1,3)
444 ENDDO
445
447
449
450 DO i=1,nel
451 dotb(i,1) = lb(i,1,1) + blt(i,1,1)
452 dotb(i,2) = lb(i,2,2) + blt(i,2,2)
453 dotb(i,3) = lb(i,3,3) + blt(i,3,3)
454 dotb(i,4) = lb(i,1,2) + blt(i,1,2)
455 dotb(i,5) = lb(i,2,3) + blt(i,2,3)
456 dotb(i,6) = lb(i,1,3) + blt(i,1,3)
457 ENDDO
458
459 DO j=1,6
460 svisc(1:nel,j) = zero
461 DO ii= 1,nprony
462 fac= -timestep/taux(ii)
463 DO i=1,nel
464 h0(i,j,ii) = uvar(i, 6 + (ii - 1)*6 + j)
465 h(i,j,ii) = exp(fac)*h0(i,j,ii) +
466 . exp(half*fac)*dotb(i,j)*timestep
467 uvar(i, 6 + (ii - 1)*6 + j)= h(i,j,ii)
468 ENDDO
469 ENDDO
470
471
472
473 DO ii = 1,nprony
474 DO i=1,nel
475 svisc(i,j) = svisc(i,j) + gi(ii)*h(i,j,ii)
476 ENDDO
477 ENDDO
478 ENDDO
479
480
481
482 DO i=1,nel
483 inve = one/rv(i)
484 svisc(i,1) = svisc(i,1)*inve
485 svisc(i,2) = svisc(i,2)*inve
486 svisc(i,3) = svisc(i,3)*inve
487 svisc(i,4) = svisc(i,4)*inve
488 svisc(i,5) = svisc(i,5)*inve
489 svisc(i,6) = svisc(i,6)*inve
490
491 trace = (svisc(i,1) + svisc(i,2) + svisc(i,3)) * third
492 svisc(i,1) = svisc(i,1) - trace
493 svisc(i,2) = svisc(i,2) - trace
494 svisc(i,3) = svisc(i,3) - trace
495
496 signxx(i) = signxx(i) + svisc(i,1)
497 signyy(i) = signyy(i) + svisc(i,2)
498 signzz(i) = signzz(i) + svisc(i,3)
499 signxy(i) = signxy(i) + svisc(i,4)
500 signyz(i) = signyz(i) + svisc(i,5)
501 signzx(i) = signzx(i) + svisc(i,6)
502 ENDDO
503
504 ELSE
505
506 DO i=1,nel
507
508 c0(i,1) = uvar(i,4)
509 c0(i,2) = uvar(i,5)
510 c0(i,3) = uvar(i,6)
511 c0(i,4) = uvar(i,7)
512 c0(i,5) = uvar(i,8)
513 c0(i,6) = uvar(i,9)
514
515 cc = third*(evm(i,1)**2 + evm(i,2)**2 + evm(i,3)**2)
516 fft(1) = evm(i,1)**2 - cc
517 fft(2) = evm(i,2)**2 - cc
518 fft(3) = evm(i,3)**2 - cc
519
520 c1(i,1) = dirprv(i,1,1)*dirprv(i,1,1)*fft(1)
521 . + dirprv(i,1,2)*dirprv(i,1,2)*fft(2)
522 . + dirprv(i,1,3)*dirprv(i,1,3)*fft(3)
523
524 c1(i,2) = dirprv(i,2,2)*dirprv(i,2,2)*fft(2)
525 . + dirprv(i,2,3)*dirprv(i,2,3)*fft(3)
526 . + dirprv(i,2,1)*dirprv(i,2,1)*fft(1)
527
528 c1(i,3) = dirprv(i,3,3)*dirprv(i,3,3)*fft(3)
529 . + dirprv(i,3,1)*dirprv(i,3,1)*fft(1)
530 . + dirprv(i,3,2)*dirprv(i,3,2)*fft(2)
531
532 c1(i,4) = dirprv(i,1,1)*dirprv(i,2,1)*fft(1)
533 . + dirprv(i,1,2)*dirprv(i,2,2)*fft(2)
534 . + dirprv(i,1,3)*dirprv(i,2,3)*fft(3)
535
536 c1(i,5) = dirprv(i,2,2)*dirprv(i,3,2)*fft(2)
537 . + dirprv(i,2,3)*dirprv(i,3,3)*fft(3)
538 . + dirprv(i,2,1)*dirprv(i,3,1)*fft(1)
539
540 c1(i,6) = dirprv(i,3,3)*dirprv(i,1,3)*fft(3)
541 . + dirprv(i,3,1)*dirprv(i,1,1)*fft(1)
542 . + dirprv(i,3,2)*dirprv(i,1,2)*fft(2)
543
544 uvar(i,4) = c1(i,1)
545 uvar(i,5) = c1(i,2)
546 uvar(i,6) = c1(i,3)
547 uvar(i,7) = c1(i,4)
548 uvar(i,8) = c1(i,5)
549 uvar(i,9) = c1(i,6)
550 ENDDO
551
552
553 DO j=1,6
554 svisc(1:nel,j) = zero
555 DO ii= 1,nprony
556 fac= -timestep/taux(ii)
557 DO i=1,nel
558 h0(i,j,ii) = uvar(i, 12 + (ii - 1)*6 + j)
559 h(i,j,ii) = exp(fac)*h0(i,j,ii) +
560 . exp(half*fac)*(c1(i,j) - c0(i,j))
561 uvar(i, 12 + (ii - 1)*6 + j)= h(i,j,ii)
562 ENDDO
563 ENDDO
564
565 DO ii = 1,nprony
566 DO i=1,nel
567 svisc(i,j) = svisc(i,j) + gi(ii)*h(i,j,ii)
568 ENDDO
569 ENDDO
570 ENDDO
571
572
573 DO i=1,nel
574 inve = one/rv(i)
575 svisc(i,1) = svisc(i,1)*inve
576 svisc(i,2) = svisc(i,2)*inve
577 svisc(i,3) = svisc(i,3)*inve
578 svisc(i,4) = svisc(i,4)*inve
579 svisc(i,5) = svisc(i,5)*inve
580 svisc(i,6) = svisc(i,6)*inve
581
582 signxx(i) = signxx(i) + svisc(i,1)
583 signyy(i) = signyy(i) + svisc(i,2)
584 signzz(i) = signzz(i) + svisc(i,3)
585 signxy(i) = signxy(i) + svisc(i,4)
586 signyz(i) = signyz(i) + svisc(i,5)
587 signzx(i) = signzx(i) + svisc(i,6)
588 ENDDO
589
590 ENDIF
591 ENDIF
592
for(i8=*sizetab-1;i8 >=0;i8--)
subroutine prodaat(a, c, nel)
subroutine prodmat(a, b, c, nel)
subroutine valpvecdp_v(sig, val, vec, nel)
subroutine valpvec_v(sig, val, vec, nel)