43
44
45
46#include "implicit_f.inc"
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90#include "param_c.inc"
91#include "mvsiz_p.inc"
92
93
94
95 INTEGER ,INTENT(IN) :: NEL,NUPARAM, NUVAR,NVARTMP,INLOC
96 my_real ,
INTENT(IN) :: time,timestep,asrate
97 my_real ,
DIMENSION(NUPARAM) ,
INTENT(IN) :: uparam
98 my_real ,
DIMENSION(NEL) ,
INTENT(IN) :: epsd_pg
99 my_real ,
DIMENSION(NEL) ,
INTENT(IN) :: rho0,thkly,gs,dplanl,
100 . epspxx,epspyy,epspxy,epspyz,epspzx,
101 . depsxx,depsyy,depsxy,depsyz,depszx,
102 . epsxx ,epsyy ,epsxy ,epsyz ,epszx ,
103 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx
104 INTEGER ,INTENT(IN) :: NPF(*),MFUNC,KFUNC(MFUNC)
106 my_real ,
DIMENSION(NEL),
INTENT(IN) :: loff
107 my_real ,
DIMENSION(NEL),
INTENT(INOUT) :: epsp
108
109
110
111 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) :: soundsp,viscmax,etse,
112 . signxx,signyy,signxy,signyz,signzx,dpla_i
113
114
115
116 INTEGER ,DIMENSION(NEL,NVARTMP) ,INTENT(INOUT) :: VARTMP
117 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: pla,off,thk,yld
118 my_real ,
DIMENSION(NEL,3) ,
INTENT(INOUT) :: sigp
119 my_real ,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
120
121
122
123 INTEGER :: I,J,N,NINDX,NMAX,IADBUF,ICC1,ISRATE,
124 my_real :: r,umr,nux,a,b,c,s11,s22,s12,p,p2,dezz,
125 . sigz,s1,s2,s3,vm2,epst,f,df,q2,yld_i,e1,a11,a21,
126 . g1,g31,nnu11,nu11,nu21,nu31,deve1,deve2,deve3,deve4,dpdt,
127 . epsm1,epsr11,epsr21,fisokin1,ca1,cb1,cn1,cc1,cp1,
128 . dsxx,dsyy,dsxy,dexx,deyy,dexy,
alpha,yscale,dav
129 INTEGER ,DIMENSION(MVSIZ) :: INDEX,IPOS,ILEN,IAD,IPOS0
130 my_real ,
DIMENSION(MVSIZ) :: svm,dr,aa,bb,dpla_j,pp,qq,fail,h,hs,
131 . ylo,
zeror,sigexx,sigeyy,sigexy,sigm,epsgm,dfdpla
132 my_real,
DIMENSION(MVSIZ) :: rq
133
134 DATA nmax/3/
135
136
137
138 e1 = uparam(1)
139 nux = uparam(2)
140 epsm1 = uparam(5)
141 epsr11 = uparam(6)
142 epsr21 = uparam(7)
143 ca1 = uparam(3)
144 cb1 = uparam(8)
145 cn1 = uparam(9)
146 icc1 = nint(uparam(10))
147 cc1 = uparam(11)
148 cp1 = uparam(12)
149 fisokin1 = uparam(15)
150 g1 = uparam(16)
151 g31 = uparam(18)
152 a11 = uparam(20)
153 a21 = uparam(21)
154 israte = nint(uparam(13))
155 vflag = nint(uparam(23))
156 yscale = uparam(24)
157
158 nnu11 = nux / (one - nux)
159 nu11 = one/(one-nux)
160 nu21 = one/(one+nux)
161 nu31 = one - nnu11
162
163 DO i=1,nel
164 epsgm(i) = uparam(22)
165 sigm(i) = uparam(4)
166 ENDDO
167
168 IF (mfunc > 0) THEN
170 ipos0(1:nel) = 1
171 iad(1:nel) = npf(kfunc(1)) / 2 + 1
172 ilen(1:nel) = npf(kfunc(1)+1) / 2 - iad(1:nel) - ipos0(1:nel)
173 CALL vinter(tf,iad,ipos0,ilen,nel,
zeror,dfdpla,ylo)
174 ylo(1:nel) = yscale * ylo(1:nel)
175 ENDIF
176
177
178
179 IF (fisokin1 > zero) THEN
180 signxx(1:nel) = sigoxx(1:nel) - sigp(1:nel,1) + a11*depsxx(1:nel) + a21*depsyy(1:nel)
181 signyy(1:nel) = sigoyy(1:nel) - sigp(1:nel,2) + a21*depsxx(1:nel) + a11*depsyy(1:nel)
182 signxy(1:nel) = sigoxy(1:nel) - sigp(1:nel,3) + g1 *depsxy(1:nel)
183 ELSE
184 signxx(1:nel) = sigoxx(1:nel) + a11*depsxx(1:nel) + a21*depsyy(1:nel)
185 signyy(1:nel) = sigoyy(1:nel) + a21*depsxx(1:nel) + a11*depsyy(1:nel)
186 signxy(1:nel) = sigoxy(1:nel) + g1 *depsxy(1:nel)
187 ENDIF
188 signyz(1:nel) = sigoyz(1:nel) + gs(1:nel) * depsyz(1:nel)
189 signzx(1:nel) = sigozx(1:nel) + gs(1:nel) * depszx(1:nel)
190 sigexx(1:nel) = signxx(1:nel)
191 sigeyy(1:nel) = signyy(1:nel)
192 sigexy(1:nel) = signxy(1:nel)
193
194 soundsp(1:nel) = sqrt(a11/rho0(1:nel))
195 viscmax(1:nel) = zero
196 etse(1:nel) = one
197
198
199
200 IF (vflag == 1) THEN
201 epsp(1:nel) = uvar(1:nel,1)
202 ENDIF
203 IF (israte > 0) THEN
204 IF (vflag == 3) THEN
205 DO i=1,nel
206 dav = (epspxx(i)+epspyy(i))*third
207 deve1 = epspxx(i) - dav
208 deve2 = epspyy(i) - dav
209 deve3 = - dav
210 deve4 = half*epspxy(i)
211 epsp(i) = half*(deve1**2 + deve2**2 + deve3**2) + deve4**2
212 epsp(i) = sqrt(three*epsp(i))/three_half
213 epsp(i) = asrate*epsp(i) + (one - asrate)*uvar(i,1)
214 uvar(i,1) = epsp(i)
215 ENDDO
216 ELSEIF (vflag == 2) THEN
217 DO i=1,nel
218 epsp(i) = asrate*epsd_pg(i) + (one - asrate)*uvar(i,1)
219 uvar(i,1) = epsp(i)
220 ENDDO
221 ENDIF
222 ELSEIF (israte == 0) THEN
223 IF (vflag == 3) THEN
224 DO i=1,nel
225 dav = (epspxx(i)+epspyy(i))*third
226 deve1 = epspxx(i) - dav
227 deve2 = epspyy(i) - dav
228 deve3 = - dav
229 deve4 = half*epspxy(i)
230 epsp(i) = half*(deve1**2 + deve2**2 + deve3**2) + deve4**2
231 epsp(i) = sqrt(three*epsp(i))/three_half
232 uvar(i,1) = epsp(i)
233 ENDDO
234 ELSEIF (vflag == 2) THEN
235 DO i=1,nel
236 epsp(i) = half*( abs(epspxx(i)+epspyy(i))
237 . + sqrt( (epspxx(i)-epspyy(i))*(epspxx(i)-epspyy(i))
238 . + epspxy(i)*epspxy(i) ) )
239 ENDDO
240 ENDIF
241 ENDIF
242
243
244
245
246 DO i=1,nel
247 epst = half*( epsxx(i)+epsyy(i)
248 . + sqrt( (epsxx(i)-epsyy(i))*(epsxx(i)-epsyy(i))
249 . + epsxy(i)*epsxy(i) ) )
250 fail(i) =
max(zero,
min(one,(epsr21-epst)/(epsr21-epsr11)))
251 dpla_i(i) = zero
252 ENDDO
253
254
255
256
257 IF (mfunc > 0) THEN
258 ipos(1:nel) = vartmp(1:nel,1)
259 iad(1:nel) = npf(kfunc(1)) / 2 + 1
260 ilen(1:nel) = npf(kfunc(1)+1) / 2 - iad(1:nel) - ipos(1:nel)
261 CALL vinter(tf,iad,ipos,ilen,nel,pla,dfdpla,yld)
262 vartmp(1:nel,1) = ipos(1:nel)
263 ENDIF
264
265 rq(1:nel) = one
266 IF(cc1 /= zero) rq(1:nel) = one + (cc1*epsp(1:nel))**cp1
267
268 IF((mfunc > 0) .AND. (ca1 == zero)) THEN
269 DO i=1,nel
270 ylo(i) = ylo(i) * rq(i)
271 IF (pla(i)>zero) THEN
272 yld(i) = yscale * yld(i) * rq(i)
273 hs(i) = yscale * dfdpla(i) * rq(i)
274 ELSE
275 yld(i) = yscale * yld(i) * rq(i)
276 hs(i) = e1
277 ENDIF
278 ENDDO
279
280 ELSEIF ((mfunc > 0) .AND. (ca1 /= zero)) THEN
281
282 DO i=1,nel
283 ylo(i) = ylo(i) + ca1 * (rq(i)-one)
284 IF (pla(i)>zero) THEN
285 IF (cn1 == one) THEN
286 yld(i) = yscale * yld(i) + (ca1 + cb1*pla(i)) * (rq(i)-one)
287 hs(i) = yscale * dfdpla(i) + cb1 * (rq(i)-one)
288 ELSE
289 yld(i) = yscale * yld(i) + (ca1 + cb1*pla(i)**cn1) * (rq(i)-one)
290 IF (cn1>one) THEN
291 hs(i) = yscale * dfdpla(i) + cn1*cb1*(rq(i)-one) * (pla(i)**(cn1-one))
292 ELSE
293 hs(i) = yscale * dfdpla(i) + cn1*cb1*(rq(i)-one) / ((pla(i)**(one-cn1)))
294 ENDIF
295 ENDIF
296 ELSE
297 yld(i) = yscale * yld(i) + ca1 * (rq(i)-one)
298 hs(i) = e1
299 ENDIF
300 ENDDO
301 ELSE
302
303 DO i=1,nel
304 ylo(i) = ca1 * rq(i)
305 IF (pla(i)>zero) THEN
306 IF (cn1 == one) THEN
307 yld(i) = (ca1 + cb1*pla(i)) * rq(i)
308 hs(i) = cb1 * rq(i)
309 ELSE
310 yld(i) = (ca1 + cb1*pla(i)**cn1) * rq(i)
311 IF (cn1>one) THEN
312 hs(i) = cn1*cb1*rq(i) * (pla(i)**(cn1-one))
313 ELSE
314 hs(i) = cn1*cb1*rq(i) / ((pla(i)**(one-cn1)))
315 ENDIF
316 ENDIF
317 ELSE
318 yld(i) = ca1 * rq(i)
319 hs(i) = e1
320 ENDIF
321 ENDDO
322 ENDIF
323
324 DO i=1,nel
325 IF(icc1 == 1) sigm(i) = sigm(i) * rq(i)
326 IF (icc1 /= 1 .and. cn1 /= zero .and. cb1 /= zero)
327 & epsgm(i)=((sigm(i)/rq(i)-ca1)/cb1)**(one/cn1)
328 IF (pla(i)>=epsgm(i)) THEN
329 yld(i) = sigm(i)
330 hs(i) = zero
331 ENDIF
332 hs(i) = fail(i)*hs(i)
333
334 yld(i)= fail(i)*((one-fisokin1)*yld(i)+fisokin1*ylo(i))
335 yld(i) =
max(yld(i),em20)
336 ENDDO
337
338
339
340
341 DO i=1,nel
342 s1=signxx(i)+signyy(i)
343 s2=signxx(i)-signyy(i)
344 s3=signxy(i)
345 aa(i)=fourth*s1*s1
346 bb(i)=three_over_4*s2*s2+3.*s3*s3
347 svm(i)=sqrt(aa(i)+bb(i))
348 IF (inloc == 0) THEN
349 dezz = -(depsxx(i)+depsyy(i))*nnu11
350 thk(i) = thk(i) + dezz*thkly(i)*off(i)
351 ENDIF
352 ENDDO
353
354
355
356 nindx = 0
357 DO i = 1,nel
358 IF ((svm(i) > yld(i)).AND.(off(i) == one)) THEN
359 nindx=nindx+1
360 index(nindx)=i
361 ENDIF
362 ENDDO
363
364
365
366 IF (nindx > 0) THEN
367#include "vectorize.inc"
368 DO j=1,nindx
369 i=index(j)
370 hs(i) =
max(zero,hs(i))
371 dpla_j(i)=(svm(i)-yld(i))/(g31+hs(i))
372 etse(i)= hs(i)/(hs(i)+e1)
373 h(i) = hs(i)*(one-fisokin1)
374 ENDDO
375
376 DO n=1,nmax
377#include "vectorize.inc"
378 DO j=1,nindx
379 i=index(j)
380 dpla_i(i)=dpla_j(i)
381 yld_i =yld(i)+h(i)*dpla_i(i)
382 dr(i) =half*e1*dpla_i(i)/yld_i
383 pp(i) =one/(one + dr(i)*nu11)
384 qq(i) =one/(one + three*dr(i)*nu21)
385 p2 =pp(i)*pp(i)
386 q2 =qq(i)*qq(i)
387 f =aa(i)*p2+bb(i)*q2-yld_i*yld_i
388 df=-(aa(i)*nu11*p2*pp(i)+ three*bb(i)*nu21*q2*qq(i))
389 . *(e1-two*dr(i)*h(i))/yld_i
390 . -two*h(i)*yld_i
391 df = sign(
max(abs(df),em20),df)
392 IF(dpla_i(i)>zero) THEN
393 dpla_j(i)=
max(zero,dpla_i(i)-f/df)
394 ELSE
395 dpla_j(i)=zero
396 ENDIF
397 ENDDO
398 ENDDO
399
400
401
402#include "vectorize.inc"
403 DO j=1,nindx
404 i=index(j)
405 pla(i) = pla(i) + dpla_i(i)
406 s1=(signxx(i)+signyy(i))*pp(i)
407 s2=(signxx(i)-signyy(i))*qq(i)
408 signxx(i)=half*(s1+s2)
409 signyy(i)=half*(s1-s2)
410 signxy(i)=signxy(i)*qq(i)
411 IF (inloc == 0) THEN
412 dezz = - nu31*dr(i)*s1/e1
413 thk(i) = thk(i) + dezz*thkly(i)*off(i)
414 ENDIF
415 ENDDO
416
417 ENDIF
418
419 DO i=1,nel
420 IF ((pla(i) > epsm1).AND.(off(i) == one)) off(i) = four_over_5
421 IF (vflag == 1) THEN
422 dpdt = dpla_i(i)/
max(em20,timestep)
423 uvar(i,1) = asrate * dpdt + (one - asrate) * uvar(i,1)
424 epsp(i) = uvar(i,1)
425 ENDIF
426 ENDDO
427
428
429
430 IF (fisokin1 > zero) THEN
431 DO i=1,nel
432 dsxx = sigexx(i) - signxx(i)
433 dsyy = sigeyy(i) - signyy(i)
434 dsxy = sigexy(i) - signxy(i)
435 dexx = (dsxx - nux*dsyy)
436 deyy = (dsyy - nux*dsxx)
437 dexy = two*(one+nux)*dsxy
438 alpha = fisokin1*hs(i)/(e1+hs(i)) * third
439 signxx(i) = signxx(i) + sigp(i,1)
440 signyy(i) = signyy(i) + sigp(i,2)
441 signxy(i) = signxy(i) + sigp(i,3)
442 sigp(i,1) = sigp(i,1) +
alpha*(four*dexx+two*deyy)
443 sigp(i,2) = sigp(i,2) +
alpha*(four*deyy+two*dexx)
444 sigp(i,3) = sigp(i,3) +
alpha*dexy
445 ENDDO
446 ENDIF
447
448
449
450 IF (inloc > 0) THEN
451 DO i = 1,nel
452 IF (loff(i) == one) THEN
453 svm(i) = sqrt(signxx(i)*signxx(i)
454 . + signyy(i)*signyy(i)
455 . - signxx(i)*signyy(i)
456 . + three*signxy(i)*signxy(i))
457 dezz =
max(dplanl(i),zero)*half*(signxx(i)+signyy(i))/
max(svm(i),em20)
458 dezz = -nux*((signxx(i)-sigoxx(i)+signyy(i)-sigoyy(i))/e1) - dezz
459 thk(i) = thk(i) + dezz*thkly(i)*off(i)
460 ENDIF
461 ENDDO
462 ENDIF
463
464 RETURN
subroutine vinter(tf, iad, ipos, ilen, nel, x, dydx, y)