42
43
44
45#include "implicit_f.inc"
46
47
48
49 INTEGER NEL,NUPARAM,NUVAR,NVARTMP
51 . time,timestep,uparam(nuparam),
52 . rho0(nel),pla(nel),
53 . epspxx(nel),epspyy
54 . epspxy(nel),epspyz(nel),epspzx(nel),
55 . depsxx(nel),depsyy(nel),depszz(nel),
56 . depsxy(nel),depsyz(nel),depszx(nel),
57 . sigoxx(nel),sigoyy(nel),sigozz(nel),
58 . sigoxy(nel),sigoyz(nel),sigozx(nel),
59 . seq(nel),epsp(nel),asrate
60
61 INTEGER, INTENT(INOUT) :: (NEL,NVARTMP)
62
63
64
66 . signxx(nel),signyy(nel),signzz
67 . signxy(nel),signyz(nel),signzx(nel),
68 . soundsp(nel),et(nel),dpla(nel)
69
70
71
73 . uvar(nel,nuvar),off(nel),yld(nel)
74
75
76
77 INTEGER NPF(*), MFUNC, KFUNC(MFUNC)
79 . tf(*)
80
81
82
83 INTEGER I,II,J,NITER,ITER,NINDX,INDEX(NEL),
84 . J1,J2,ITAB,JJ(NEL),VP,IDEV,ISRATE,
85 . IAD1(NEL),IPOS1(NEL),ILEN1(NEL),
86 . IAD2(NEL),IPOS2(NEL),ILEN2(NEL)
88 . d11,d12,d13,d22,d23,d33,g12,g23,g13,e11,e22,e33,
89 . ff,gg,hh,ll,mm,nn,sigy,qr1,qr2,cr1,cr2,fac,
90 . normxx,normyy,normxy,normzz,normzx,normyz,
91 . dlam,ddep,sig_dfdsig,dfdsig2,dpdt
93 . sighl(nel),h(nel),y1(nel),y2(nel),
94 . dpxx(nel),dpyy(nel),dpzz(nel),dpxy(nel),
95 . dpzx(nel),dpyz(nel),dpla_dlam(nel),phi(nel),
96 . dydx1(nel),dydx2(nel),dphi_dlam(nel)
98 . DIMENSION(:), ALLOCATABLE :: rate, yfac
99
100
101
102
103
104
105 d11 = uparam(4)
106 d12 = uparam(5)
107 d13 = uparam(6)
108 d22 = uparam(7)
109 d23 = uparam(8)
110 d33 = uparam(9)
111 g12 = uparam(10)
112 g13 = uparam(11)
113 g23 = uparam(12)
114 e11 = uparam(13)
115 e22 = uparam(14)
116 e33 = uparam(15)
117
118 ff = uparam(19)
119 gg = uparam(20)
120 hh = uparam(21)
121 ll = uparam(22)
122 mm = uparam(23)
123 nn = uparam(24)
124
125 sigy = uparam(25)
126 qr1 = uparam(26)
127 cr1 = uparam(27)
128 qr2 = uparam(28)
129 cr2 = uparam(29)
130
131 vp = nint(uparam(30))
132
133 itab = 0
134 IF (mfunc > 0) THEN
135 itab = 1
136 ALLOCATE(rate(mfunc),yfac(mfunc))
137 DO i = 1,mfunc
138 rate(i) = uparam(30+i)
139 yfac(i) = uparam(30+mfunc+i)
140 ENDDO
141 ENDIF
142
143
144 IF ((vp == 2) .OR.THEN
145 idev = vp-2
146 israte = 1
148 . epspxx ,epspyy
149 . epspzx )
150 ENDIF
151
152
153 DO i=1,nel
154
155 IF (off(i) < one) off(i) = four_over_5*off(i)
156 IF (off(i) < em01) off(i) = zero
157
158 et(i) = one
159 h(i) = zero
160
161 dpla(i) = zero
162 dpxx(i) = zero
163 dpyy(i) = zero
164 dpzz(i) = zero
165 dpxy(i) = zero
166 dpyz(i) = zero
167 dpzx(i) = zero
168
169 IF ((itab == 1).AND.(mfunc > 1)) THEN
170
171 IF (vp == 1) epsp(i) = uvar(i,1)
172
173 jj(i) = 1
174 DO j = 2,mfunc-1
175 IF (epsp(i) >= rate(j)) jj(i) = j
176 ENDDO
177 ENDIF
178 ENDDO
179
180
181
182 IF (itab == 0) THEN
183 DO i = 1,nel
184 yld(i) = sigy
185 . + qr1*(one - exp(-cr1*pla(i)))
186 . + qr2*(one - exp(-cr2*pla(i)))
187 h(i) = qr1*cr1*exp(-cr1*pla(i)) + qr2*cr2*exp(-cr2*pla
188 ENDDO
189 ELSE
190
191
192 IF (mfunc == 1) THEN
193
194 ipos1(1:nel) = vartmp(1:nel,1)
195 iad1(1:nel) = npf(kfunc(1)) / 2 + 1
196 ilen1(1:nel) = npf(kfunc(1)+1) / 2 - iad1(1:nel) - ipos1(1:nel)
197
198 CALL vinter(tf,iad1,ipos1,ilen1,nel,pla,dydx1,y1)
199
200 vartmp(1:nel,1) = ipos1(1:nel)
201
202 yld(1:nel) = yfac(1)*y1(1:nel)
203 h(1:nel) = yfac(1)*dydx1(1:nel)
204
205 ELSE
206 DO i=1,nel
207 j1 = jj(i)
208 j2 = j1 + 1
209
210 ipos1(i) = vartmp(i,j1)
211 iad1(i) = npf(kfunc(j1)) / 2 + 1
212 ilen1(i) = npf(kfunc(j1)+1) / 2 - iad1(i) - ipos1(i)
213
214 ipos2(i) = vartmp(i,j2)
215 iad2(i) = npf(kfunc(j2)) / 2 + 1
216 ilen2(i) = npf(kfunc(j2)+1) / 2 - iad2(i) - ipos2(i)
217 ENDDO
218
219 CALL vinter(tf,iad1,ipos1,ilen1,nel,pla,dydx1,y1)
220 CALL vinter(tf,iad2,ipos2,ilen2,nel,pla,dydx2,y2)
221
222 DO i=1,nel
223 j1 = jj(i)
224 j2 = j1+1
225
226 y1(i) = y1(i)*yfac(j1)
227 y2(i) = y2(i)*yfac(j2)
228 fac = (epsp(i) - rate(j1))/(rate(j2) - rate(j1))
229 yld(i) = y1(i) + fac*(y2(i)-y1(i))
230 yld(i) =
max(yld(i),em20)
231
232 dydx1(i) = dydx1(i)*yfac(j1)
233 dydx2(i) = dydx2(i)*yfac(j2)
234 h(i) = dydx1(i)+fac*(dydx2(i)-dydx1(i))
235
236 vartmp(i,j1) = ipos1(i)
237 vartmp(i,j2) = ipos2(i)
238 ENDDO
239 ENDIF
240 ENDIF
241
242
243
244
245 DO i=1,nel
246
247
248 signxx(i) = sigoxx(i) + d11*depsxx(i) + d12*depsyy(i) + d13*depszz(i)
249 signyy(i) = sigoyy(i) + d12*depsxx(i) + d22*depsyy(i) + d23*depszz(i)
250 signzz(i) = sigozz(i) + d13*depsxx(i) + d23*depsyy(i) + d33*depszz(i)
251 signxy(i) = sigoxy(i) + g12*depsxy(i)
252 signyz(i) = sigoyz(i) + g23*depsyz(i)
253 signzx(i) = sigozx(i) + g13*depszx(i)
254
255
256 sighl(i) = ff*(signyy(i) - signzz(i))**2 + gg*(signzz(i) - signxx(i))**2 +
257 . hh*(signxx(i) - signyy(i))**2 + two*ll*signyz(i)**2 +
258 . two*mm*signzx(i)**2 + two*nn*signxy(i)**2
259 sighl(i) = sqrt(
max(zero,sighl(i)))
260 ENDDO
261
262
263
264
265 phi(1:nel) = sighl(1:nel) - yld(1:nel)
266
267 nindx = 0
268 index = 0
269 DO i=1,nel
270 IF ((phi(i)>zero).AND.(off(i) == one)) THEN
271 nindx = nindx+1
272 index(nindx) = i
273 ENDIF
274 ENDDO
275
276
277
278
279
280
281 niter = 3
282
283
284 DO iter = 1, niter
285#include "vectorize.inc"
286
287 DO ii=1,nindx
288 i = index(ii)
289
290
291
292
293
294
295
296
297
298
299
300
301
302 normxx = (gg*(signxx(i)-signzz(i)) + hh*(signxx(i)-signyy(i)))/(
max(sighl(i),em20))
303 normyy = (ff*(signyy(i)-signzz(i)) + hh*(signyy(i)-signxx(i)))/(
max(sighl(i),em20))
304 normzz = (ff*(signzz(i)-signyy(i)) + gg*(signzz(i)-signxx(i)))/(
max(sighl(i),em20))
305 normxy = two*nn*signxy(i)/(
max(sighl(i),em20))
306 normyz = two*ll*signyz(i)/(
max(sighl(i),em20))
307 normzx = two*mm*signzx(i)/(
max(sighl(i),em20))
308
309
310
311
312
313
314 dfdsig2 = normxx * (d11 * normxx + d12 * normyy + d13 * normzz )
315 . + normyy * (d12 * normxx + d22 * normyy + d23
316 . + normzz * (d13 * normxx + d23 * normyy + d33 * normzz )
317 . + normxy * normxy * g12
318 . + normyz * normyz * g23
319 . + normzx * normzx * g13
320
321
322
323
324
325
326
327
328
329
330 sig_dfdsig = signxx(i) * normxx
331 . + signyy(i) * normyy
332 . + signzz(i) * normzz
333 . + signxy(i) * normxy
334 . + signyz(i) * normyz
335 . + signzx(i) * normzx
336 dpla_dlam(i) = sig_dfdsig /
max(yld(i),em20)
337
338
339
340
341
342 dphi_dlam(i) = - dfdsig2 - h(i)*dpla_dlam(i)
343 dphi_dlam(i) = sign(
max(abs(dphi_dlam(i)),em20) ,dphi_dlam(i))
344
345
346 dlam = -phi(i)/dphi_dlam(i)
347
348
349 dpxx(i) = dlam * normxx
350 dpyy(i) = dlam * normyy
351 dpzz(i) = dlam * normzz
352 dpxy(i) = dlam * normxy
353 dpyz(i) = dlam * normyz
354 dpzx(i) = dlam * normzx
355
356
357 signxx(i) = signxx(i) - (d11*dpxx(i) + d12*dpyy(i) + d13*dpzz(i))
358 signyy(i) = signyy(i) - (d12*dpxx(i) + d22*dpyy(i) + d23*dpzz(i))
359 signzz(i) = signzz(i) - (d13*dpxx(i) + d23*dpyy(i) + d33*dpzz(i))
360 signxy(i) = signxy(i) - dpxy(i)*g12
361 signyz(i) = signyz(i) - dpyz(i)*g23
362 signzx(i) = signzx(i) - dpzx(i)*g13
363
364
365 ddep = dlam*dpla_dlam(i)
367 pla(i) = pla(i) + ddep
368
369
370 sighl(i) = ff*(signyy(i) - signzz(i))**2 + gg*(signzz(i) - signxx(i))**2 +
371 . hh*(signxx(i) - signyy(i))**2 + two*ll*signyz(i)**2 +
372 . two*mm*signzx(i)**2 + two*nn
373 sighl(i) = sqrt(
max(sighl(i),zero))
374
375
376 IF (itab == 0) THEN
377
378 yld(i) = sigy
379 . + qr1*(one - exp(-cr1*pla(i)))
380 . + qr2*(one - exp(-cr2*pla(i)))
381 h(i) = qr1*cr1*exp(-cr1*pla(i)) + qr2
382
383
384 phi(i) = sighl(i) - yld(i)
385 ENDIF
386
387 ENDDO
388
389
390
391 IF (itab == 1) THEN
392
393 IF (mfunc == 1) THEN
394
395 ipos1(1:nel) = vartmp(1:nel,1)
396 iad1(1:nel) = npf(kfunc(1)) / 2 + 1
397 ilen1(1:nel) = npf(kfunc(1)+1) / 2 - iad1(1:nel) - ipos1(1:nel)
398
399 CALL vinter(tf,iad1,ipos1,ilen1,nel,pla,dydx1,y1)
400
401 vartmp(1:nel,1) = ipos1(1:nel)
402
403 yld(1:nel) = yfac(1)*y1(1:nel)
404 h(1:nel) = yfac(1)*dydx1(1:nel)
405
406 phi(1:nel) = sighl(1:nel) - yld(1:nel)
407
408 ELSE
409 DO i=1,nel
410 j1 = jj(i)
411 j2 = j1 + 1
412
413 ipos1(i) = vartmp(i,j1)
414 iad1(i) = npf(kfunc(j1)) / 2 + 1
415 ilen1(i) = npf(kfunc(j1)+1) / 2 - iad1(i) - ipos1(i)
416
417 ipos2(i) = vartmp(i,j2)
418 iad2(i) = npf(kfunc(j2)) / 2 + 1
419 ilen2(i) = npf(kfunc(j2)+1) / 2 - iad2(i) - ipos2(i)
420 ENDDO
421
422 CALL vinter(tf,iad1,ipos1,ilen1,nel,pla,dydx1,y1)
423 CALL vinter(tf,iad2,ipos2,ilen2,nel,pla,dydx2,y2)
424
425 DO i=1,nel
426 j1 = jj(i)
427 j2 = j1+1
428
429 y1(i) = y1(i)*yfac(j1)
430 y2(i) = y2(i)*yfac(j2)
431 fac = (epsp(i) - rate(j1))/(rate(j2) - rate(j1))
432 yld(i) = y1(i) + fac*(y2(i)-y1(i))
433 yld(i) =
max(yld(i),em20)
434
435 dydx1(i) = dydx1(i)*yfac(j1)
436 dydx2(i) = dydx2(i)*yfac(j2)
437 h(i) = dydx1(i)+fac*(dydx2(i)-dydx1(i))
438
439 vartmp(i,j1) = ipos1(i)
440 vartmp(i,j2) = ipos2(i)
441
442 phi(i) = sighl(i) - yld(i)
443 ENDDO
444 ENDIF
445 ENDIF
446
447 ENDDO
448
449
450
451
452
453
454 DO i=1,nel
455
456 seq(i) = sighl(i)
457
458 soundsp(i) = sqrt(
max(d11,d22,d33)/rho0(i))
459
460 IF (dpla(i)>zero) THEN
461 et(i) = h(i) / (h(i) +
max(e11,e22,e33))
462 ELSE
463 et(i) = one
464 ENDIF
465
466 IF ((itab == 1).AND.(mfunc > 1).AND.(vp == 1)) THEN
467 dpdt = dpla(i)/
max(em20,timestep)
468 uvar(i,1) = asrate * dpdt + (one - asrate) * uvar(i,1)
469 epsp(i) = uvar(i,1)
470 ENDIF
471 ENDDO
472 IF (ALLOCATED(rate)) DEALLOCATE(rate)
473 IF (ALLOCATED(yfac)) DEALLOCATE(yfac)
474
subroutine mstrain_rate(nel, israte, asrate, epsd, idev, ep1, ep2, ep3, ep4, ep5, ep6)
subroutine vinter(tf, iad, ipos, ilen, nel, x, dydx, y)