36
37
38
39#include "implicit_f.inc"
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 INTEGER NEL,NUPARAM,NUVAR,NFUNC,JTHE
73 INTEGER NPF(*),NGL(NEL),IFUNC(NFUNC)
75 my_real,
DIMENSION(NEL),
INTENT(IN) :: rho,temp,off,
76 . epspxx,epspyy,epspzz,epspxy,epspyz,epspzx,
77 . depsxx,depsyy,depszz,depsxy,depsyz,depszx,
78 . sigoxx,sigoyy,sigozz,sigoxy,sigoyz,sigozx
79
80
81
82 my_real ,
DIMENSION(NEL),
INTENT(OUT) :: soundsp,
83 . signxx,signyy,signzz,signxy,signyz,signzx
84
85
86
87 my_real ,
DIMENSION(NEL,NUVAR),
INTENT(INOUT),
TARGET :: uvar
88 my_real ,
DIMENSION(NEL,2),
INTENT(INOUT),
TARGET :: defp
89 my_real ,
DIMENSION(NEL),
INTENT(INOUT) :: epsd
90
91
92
93 INTEGER I,ITER,NITER,IVARF,IFUNC_E,IFUNC_YLD
94 INTEGER, DIMENSION(NEL) :: IPOS1,ILEN1,IAD1,IPOS2,ILEN2,IAD2
95c
96 my_real tanb,tanp,eini,kini,gini,nu,yxi,kep,h,ho,hm,res,dres,
97 . sigy,siga,sigb,sigr,ra1,ra2,rb,rc,na,fac,q2,pp1,pp2,pla2,pla,dpla,
98 . dfdp,dfdc,dgdp,denom,ldot,dwpx2,qx2,depslv,depspv,depspd,
99 . e1,e2,e3,e4,e5,e6,tr,sy1,sy2,sy3,sy4,sy5,sy6,
100 . dfds1,dfds2,dfds3,dfds4,dfds5,dfds6,depsp1,depsp2,depsp3,depsp4,
101 . depsp5,depsp6,depsl1,depsl2,depsl3,depsl4,depsl5,depsl6,epsp,
102 . qy,fy,py,f1,f2,x,x1,x2,dx,
alpha
103 my_real,
DIMENSION(NEL) :: k,g,g2,ra,depsv,dav,d1,d2,d3,
104 . ds1,ds2,ds3,ds4,ds5,ds6,dp,de1,de2,de3,de4,de5,de6,dydx,
105 . fo,po,so1,so2,so3,so4,so5,so6,s1,s2,s3,s4,s5,s6,p,yld,
106 . s1n,s2n,s3n,s4n,s5n,s6n,pn,qn,q,f,fac_e,frate
108 my_real ,
DIMENSION(:),
POINTER :: epspd,epspv
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 niter = 3
132 small = em10
133 big = ep20
134 tol = em20
135
136 epspd => defp(1:nel,1)
137 epspv => defp(1:nel,2)
138
139 eini = uparam(1)
140 gini = uparam(2)
141 kini = uparam(3)
142 nu = uparam(4)
143 tanb = uparam(5)
144 tanp = uparam(6)
145 yxi = uparam(7)
146 sigy = uparam(8)
147 siga = uparam(9)
148 sigb = uparam(10)
149 sigr = uparam(11)
150 ra1 = uparam(12)
151 ra2 = uparam(13)
152 na = uparam(14)
153 rb = uparam(15)
154 rc = uparam(16)
155 kep = uparam(17)
157
158 ifunc_e = ifunc(1)
159 ifunc_yld = ifunc(2)
160
161
162
163 ivarf = 2
164 IF (jthe == 1. and. ifunc_e > 0) THEN
165 DO i=1,nel
166 ipos1(i) = nint(uvar(i, ivarf + 1))
167 iad1(i) = npf(ifunc_e) / 2 + 1
168 ilen1(i) = npf(ifunc_e + 1) / 2 - iad1(i) - ipos1(i)
169 ENDDO
170
171 CALL vinter2(tf,iad1,ipos1,ilen1,nel,temp,dydx,fac_e)
172 uvar(1:nel,ivarf + 1) = ipos1(1:nel)
173
174 k(1:nel) = kini*fac_e(1:nel)
175 g(1:nel) = gini*fac_e(1:nel)
176 g2(1:nel) = g(1:nel)*two
177 ivarf = ivarf + 1
178 ELSE
179 k(1:nel) = kini
180 g(1:nel) = gini
181 g2(1:nel) = gini*two
182 ENDIF
183
184 IF (ifunc_yld > 0) THEN
185 DO i=1,nel
186 tr = (epspxx(i) + epspyy(i) + epspzz(i))*third
187 e1 = epspxx(i) - tr
188 e2 = epspyy(i) - tr
189 e3 = epspzz(i) - tr
190 e4 = half*epspxy(i)
191 e5 = half*epspyz(i)
192 e6 = half*epspzx(i)
193 epsp = half*(e1**2 + e2**2 + e3**2) + e4**2 + e5**2 + e6**2
194 epsp = sqrt(three*epsp)/three_half
196 epsd(i) = epsp
197 ENDDO
198
199 DO i=1,nel
200 ipos2(i) = nint(uvar(i, ivarf + 1))
201 iad2(i) = npf(ifunc_yld) / 2 + 1
202 ilen2(i) = npf(ifunc_yld + 1) / 2 - iad2(i) - ipos2(i)
203 ENDDO
204
205 CALL vinter2(tf,iad2,ipos2,ilen2,nel,epsd,dydx,frate)
206 uvar(1:nel,ivarf + 1) = ipos2(1:nel)
207 ELSE
208 frate(1:nel) = one
209 ENDIF
210 uvar(1:nel,2) = epsd(1:nel)
211
212 IF (jthe == 1) THEN
213 ra(1:nel) = ra1*temp(1:nel)**na + ra2
214 ELSE
215 ra(1:nel) = ra1 + ra2
216 ENDIF
217
218
219
220 DO i=1,nel
221 pla = epspd(i)
222 pla2 = pla**2
223 pp1 = one - rc*pla2
224 pp2 = pp1 + two
225 yld(i) = sigy*frate(i) + siga*(one - exp(-ra(i)*pla))
226 . - sigb *(one - exp(-rb*pla))
227 . + sigr*pla*third*pp2 / pp1
228
229 depsv(i) = (depsxx(i) + depsyy(i) + depszz(i))
230 dav(i) = depsv(i)*third
231 d1(i) = depsxx(i)-dav(i)
232 d2(i) = depsyy(i)-dav(i)
233 d3(i) = depszz(i)-dav(i)
234
235 dp(i) =-k(i)* depsv(i)
236 ds1(i)= g2(i)* d1(i)
237 ds2(i)= g2(i)* d2(i)
238 ds3(i)= g2(i)* d3(i)
239 ds4(i)= g(i) * depsxy(i)
240 ds5(i)= g(i) * depsyz(i)
241 ds6(i)= g(i) * depszx(i)
242
243 po(i) =-(sigoxx(i)+sigoyy(i)+sigozz(i))*third
244 so1(i) = sigoxx(i) + po(i)
245 so2(i) = sigoyy(i) + po(i)
246 so3(i) = sigozz(i) + po(i)
247 so4(i) = sigoxy(i)
248 so5(i) = sigoyz(i)
249 so6(i) = sigozx(i)
250
251 s1(i) = so1(i) + ds1(i)
252 s2(i) = so2(i) + ds2(i)
253 s3(i) = so3(i) + ds3(i)
254 s4(i) = so4(i) + ds4(i)
255 s5(i) = so5(i) + ds5(i)
256 s6(i) = so6(i) + ds6(i)
257 p(i) = po(i) + dp(i)
258
259 signxx(i) = s1(i) - p(i)
260 signyy(i) = s2(i) - p(i)
261 signzz(i) = s3(i) - p(i)
262 signxy(i) = s4(i)
263 signyz(i) = s5(i)
264 signzx(i) = s6(i)
265 ENDDO
266
267
268
269
270 DO i=1,nel
271 q2 = three_half*(so1(i)**2+so2(i)**2+so3(i)**2)
272 . + three*(so4(i)**2+so5(i)**2+so6(i)**2)
273 q(i) = sqrt(q2)
274 fo(i)= q(i) -
max(zero, po(i)*tanb + yld(i))
275 ENDDO
276
277 DO i=1,nel
278 q2 = three_half*(s1(i)**2+s2(i)**2+s3(i)**2)
279 . + three*(s4(i)**2+s5(i)**2+s6(i)**2)
280 q(i)= sqrt(q2)
281 f(i)= q(i) -
max(zero, p(i)*tanb + yld(i))
282 ENDDO
283
284
285
286 DO i=1,nel
287 IF (f(i) > tol) THEN
288
289 IF (fo(i) < zero) THEN
290 x1 = one
291 x2 = zero
292 f1 = fo(i)
293 f2 = f(i)
294 DO iter=1,niter
295 x = (x1*f2 - x2*f1) / (f2 - f1)
296 sy1 = s1(i) - x * ds1(i)
297 sy2 = s2(i) - x * ds2(i)
298 sy3 = s3(i) - x * ds3(i)
299 sy4 = s4(i) - x * ds4(i)
300 sy5 = s5(i) - x * ds5(i)
301 sy6 = s6(i) - x * ds6(i)
302 py = p(i) - x * dp(i)
303 qy = three_half*(sy1**2+sy2**2+sy3**2) + three*(sy4**2+sy5**2+sy6**2)
304 qy = sqrt(qy)
305 fy = qy -
max(zero, py*tanb + yld(i))
306
307 IF (fy*f1 > 0) THEN
308 x1 = x
309 f1 = fy
310 ELSEIF (fy*f2 > 0) THEN
311 x2 = x
312 f2 = fy
313 ELSE
314 EXIT
315 ENDIF
316 ENDDO
317
318
319 ds1(i) = x*ds1(i)
320 ds2(i) = x*ds2(i)
321 ds3(i) = x*ds3(i)
322 ds4(i) = x*ds4(i)
323 ds5(i) = x*ds5(i)
324 ds6(i) = x*ds6(i)
325 dp(i) = x*dp(i)
326
327 s1(i) = sy1
328 s2(i) = sy2
329 s3(i) = sy3
330 s4(i) = sy4
331 s5(i) = sy5
332 s6(i) = sy6
333 p(i) = py
334 q(i) = qy
335
336 de1(i) = x*d1(i)
337 de2(i) = x*d2(i)
338 de3(i) = x*d3(i)
339 de4(i) = x*depsxy(i)
340 de5(i) = x*depsyz(i)
341 de6(i) = x*depszx(i)
342 depsv(i)=x*depsv(i)
343 ELSE
344 de1(i) = d1(i)
345 de2(i) = d2(i)
346 de3(i) = d3(i)
347 de4(i) = depsxy(i)
348 de5(i) = depsyz(i)
349 de6(i) = depszx(i)
350 ENDIF
351 ENDIF
352 ENDDO
353
354
355
356 DO i=1,nel
357 IF (f(i) > zero) THEN
358 dfdp =-tanb
359 dgdp =-tanp
360 dfdc =-one
361
362 IF (q(i) > em20) THEN
363 fac = three_half/q(i)
364 dfds1 = s1(i)*fac
365 dfds2 = s2(i)*fac
366 dfds3 = s3(i)*fac
367 dfds4 = s4(i)*fac
368 dfds5 = s5(i)*fac
369 dfds6 = s6(i)*fac
370 ELSE
371 dfds1 =zero
372 dfds2 =zero
373 dfds3 =zero
374 dfds4 =zero
375 dfds5 =zero
376 dfds6 =zero
377 ENDIF
378
379 ho = siga*ra(i)*exp(-ra(i)*epspd(i)) - sigb*rb*exp(-rb*epspd(i))
380 . + sigr*(one + two_third*rc*pla2 * pp2 / pp1**2)
381 denom = three*g(i) + k(i)*dfdp*dgdp - dfdc*ho
382 IF (denom /= zero) THEN
383 ldot = f(i) / denom
384 ELSE
385 ldot = zero
386 ENDIF
387
388 niter = 4
389 DO iter=1,niter
390
391 depspd = ldot
392 depspv = ldot*dgdp*third
393
394 depsp1 = ldot*dfds1
395 depsp2 = ldot*dfds2
396 depsp3 = ldot*dfds3
397 depsp4 = ldot*dfds4 * two
398 depsp5 = ldot*dfds5 * two
399 depsp6 = ldot*dfds6 * two
400
401
402
403 depsl1 = de1(i) - depsp1
404 depsl2 = de2(i) - depsp2
405 depsl3 = de3(i) - depsp3
406 depsl4 = de4(i) - depsp4
407 depsl5 = de5(i) - depsp5
408 depsl6 = de6(i) - depsp6
409 depslv = depsv(i) + depspv
410
411
412
413 ds1(i)= g2(i)*depsl1
414 ds2(i)= g2(i)*depsl2
415 ds3(i)= g2(i)*depsl3
416 ds4(i)= g(i) *depsl4
417 ds5(i)= g(i) *depsl5
418 ds6(i)= g(i) *depsl6
419 dp(i) =-k(i) *depslv
420
421
422
423 s1n(i) = s1(i) + ds1(i)
424 s2n(i) = s2(i) + ds2(i)
425 s3n(i) = s3(i) + ds3(i)
426 s4n(i) = s4(i) + ds4(i)
427 s5n(i) = s5(i) + ds5(i)
428 s6n(i) = s6(i) + ds6(i)
429 pn(i) = p(i) + dp(i)
430
431
432
433 q2 = three_half*(s1n(i)**2 + s2n(i)**2 + s3n(i)**2)
434 . + three*(s4n(i)**2 + s5n(i)**2 + s6n(i)**2)
435 qn(i)= sqrt(q2)
436
437 dpla = ldot*kep
438 pla = epspd(i) + dpla
439 pla2 = pla**2
440 pp1 = one - rc*pla2
441 pp2 = pp1 + two
442 yld(i) = sigy*frate(i) + siga*(one - exp(-ra(i)*pla))
443 . - sigb *(one - exp(-rb*pla))
444 . + sigr*pla*third*pp2 / pp1
445 yld(i) =
max(yld(i), zero)
446
447
448
449
450 hm = ho
451
452 res = qn(i) -
max(zero, pn(i)*tanb + yld(i))
453 dres = -(three*g(i) + k(i)*dfdp*dgdp - dfdc*hm
454
455 IF (dres /= zero) THEN
456 ldot = ldot - res / dres
457 ENDIF
458
459 ENDDO
460
461
462
463 fy = qn(i) -
max(zero, pn(i)*tanb + yld(i))
464
465 IF (fy > small) THEN
466 IF (tanb*pn(i) + yld(i) <= zero) THEN
467 pn(i) =-yld(i)/tanb
468 s1n(i) = zero
469 s2n(i) = zero
470 s3n(i) = zero
471 s4n(i) = zero
472 s5n(i) = zero
473 s6n(i) = zero
474
475 ELSE
476 IF (qn(i) > small) THEN
477 x = (pn(i)*tanb + yld(i)) / qn(i)
478 IF (x < one-em02 .OR. x > one) THEN
479 WRITE(7,*)'REPROJ Q',x,fy,pn(i),qn(i)
480 WRITE(6,*)'REPROJ Q',x,fy,pn(i),qn(i)
481 ENDIF
482 s1n(i) = x*s1n(i)
483 s2n(i) = x*s2n(i)
484 s3n(i) = x*s3n(i)
485 s4n(i) = x*s4n(i)
486 s5n(i) = x*s5n(i)
487 s6n(i) = x*s6n(i)
488 ENDIF
489 ENDIF
490 ENDIF
491 epspd(i) = epspd(i) + ldot*kep
492 epspv(i) = epspv(i) + ldot*dgdp
493
494
495
496 signxx(i) = s1n(i) - pn(i)
497 signyy(i) = s2n(i) - pn(i)
498 signzz(i) = s3n(i) - pn(i)
499
500 signyz(i) = s5n(i)
501 signzx(i) = s6n(i)
502
503 ENDIF
504
505 uvar(i,1)= yld(i)
506
507 ENDDO
508
509
510
511 DO i=1,nel
512 soundsp(i) = sqrt((k(i) + four_over_3*g(i))/rho(i))
513 ENDDO
514
515 RETURN
subroutine vinter2(tf, iad, ipos, ilen, nel0, x, dydx, y)