39
40
41
42#include "implicit_f.inc"
43
44
45
46
47
48
49 INTEGER NEL,NUPARAM,NUVAR,,NPF(*),NFUNC,IFUNC(NFUNC)
50 INTEGER ,DIMENSION(NEL), INTENT(IN) :: NGL
52 . time,timestep,tf(*)
53 my_real,
DIMENSION(NUPARAM),
INTENT(IN) ::
54 . uparam
55 my_real,
DIMENSION(NEL),
INTENT(IN) ::
56 . rho,dplanl,gs,thkly,loff,
57 . depsxx,depsyy,depsxy,depsyz,depszx,
58 . epspxx,epspyy,epspxy,epspyz,epspzx,
59 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx
60 my_real ,
DIMENSION(NEL),
INTENT(OUT) ::
61 . soundsp,sigy,et,
62 . signxx,signyy,signxy,signyz,signzx
63 my_real ,
DIMENSION(NEL),
INTENT(INOUT) ::
64 . pla,dpla,epsd,off,thk,seq
65 my_real ,
DIMENSION(NEL,NUVAR),
INTENT(INOUT) ::
66 . uvar
67
68
69
70 INTEGER I,II,Ivisc,ITER,NITER,NINDX,INDEX(NEL),IPOS(NEL),
71 . IAD(NEL),ILEN(NEL)
73 . young(nel),bulk(nel),g(nel),nu,a11(nel),a12(nel),nnu,tang(nel),
74 . afiltr,xscale_sig0,yscale_sig0,xscale_youn,yscale_youn,
75 . xscale_tang,yscale_tang
77 . dpdt,dlam,ddep,depxx,depyy,devepspxx,devepspyy,devepspzz,trepsp,
78 . normxx,normyy,normxy,denom,dfdsig2,dpdt_nl,depsdt,dtinv
80 . sxx,syy,szz,sxy,sigvm,yld,hardp,phi,dezz,yld0,dyld0depsd,
81 . dyoundepsd,dtangdepsd,trsig,dphi_dlam,test,dpxx,dpyy,dpxy
82
83
84
85
86
87
88 young(1:nel) = uparam(1)
89 bulk(1:nel) = uparam(2)
90 g(1:nel) = uparam(3)
91 nu = uparam(6)
92 nnu = uparam(7)
93 a11(1:nel) = uparam(9)
94 a12(1:nel) = uparam(10)
95
96 ivisc = nint(uparam(12))
97
98 afiltr =
min(one, uparam(14)*timestep)
99
100 IF (ifunc(1) > 0) THEN
101 xscale_sig0 = uparam(16)
102 yscale_sig0 = uparam(17)
103 yld0(1:nel) = zero
104 ELSE
105 yld0(1:nel) = uparam(17)
106 dyld0depsd(1:nel) = zero
107 ENDIF
108
109 xscale_youn = uparam(18)
110 yscale_youn = uparam(19)
111
112 IF (ifunc(3) > 0) THEN
113 xscale_tang = uparam(20)
114 yscale_tang = uparam(21)
115 tang(1:nel) = zero
116 ELSE
117 tang(1:nel) = uparam(21)
118 dtangdepsd(1:nel) = zero
119 ENDIF
120 dtinv = one/
max(timestep,em20)
121
122
123 DO i=1,nel
124 IF (off(i) < em01) off(i) = zero
125 IF (off(i) < one) off(i) = off(i)*four_over_5
126
127 dpla(i) = zero
128 et(i) = one
129 hardp(i) = zero
130 dezz(i) = zero
131 dpxx(i) = zero
132 dpyy(i) = zero
133 dpxy(i) = zero
134 dyld0depsd(i) = zero
135 dyoundepsd(i) = zero
136 dtangdepsd(i) = zero
137 ENDDO
138
139
140 IF (ivisc == 0) THEN
141
142 DO i = 1,nel
143 trepsp = third*(epspxx(i) + epspyy(i))
144 devepspxx = epspxx(i) - trepsp
145 devepspyy = epspyy(i) - trepsp
146 devepspzz = -trepsp
147 depsdt = two_third*(devepspxx**2 + devepspyy**2 + devepspzz**2 +
148 . two*(epspxy(i)**2))
149 depsdt = sqrt(depsdt)
150 epsd(i) = afiltr * depsdt + (one - afiltr) * epsd(i)
151 ENDDO
152 ELSE
153
154 epsd(1:nel) = zero
155 ENDIF
156
157
158 IF (ifunc(1) > 0) THEN
159 ipos(1:nel) = 1
160 iad(1:nel) = npf(ifunc(1)) / 2 + 1
161 ilen(1:nel) = npf(ifunc(1)+1) / 2 - iad(1:nel) - ipos(1:nel)
162 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_sig0,dyld0depsd,yld0)
163 yld0(1:nel) = yscale_sig0*yld0(1:nel)
164 dyld0depsd(1:nel) = yscale_sig0*dyld0depsd(1:nel)
165 ENDIF
166
167 IF (ifunc(2) > 0) THEN
168 ipos(1:nel) = 1
169 iad(1:nel) = npf(ifunc(2)) / 2 + 1
170 ilen(1:nel) = npf(ifunc(2)+1) / 2 - iad(1:nel) - ipos(1:nel)
171 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_youn,dyoundepsd,young)
172 young(1:nel) = yscale_youn*young(1:nel)
173 g(1:nel) = half * young(1:nel) / (one + nu)
174 bulk(1:nel) = third * young(1:nel) / (one - nu*two)
175 a11(1:nel) = young(1:nel) / (one - nu*nu)
176 a12(1:nel) = a11(1:nel) * nu
177 ENDIF
178
179 IF (ifunc(3) > 0) THEN
180 ipos(1:nel) = 1
181 iad(1:nel) = npf(ifunc(3)) / 2 + 1
182 ilen(1:nel) = npf(ifunc(3)+1) / 2 - iad(1:nel) - ipos(1:nel)
183 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_tang,dtangdepsd,tang)
184 tang(1:nel) = yscale_tang*tang(1:nel)
185 dtangdepsd(1:nel) = yscale_tang*dtangdepsd(1:nel)
186 ENDIF
187
188 DO i = 1,nel
189 IF (tang(i) >= 0.99d0*young(i)) THEN
190 tang(i) = 0.99d0*young(i)
191 dtangdepsd(i) = zero
192 ENDIF
193 yld(i) = yld0(i) + (young(i)*tang(i)/(young(i)-tang(i)))*pla(i)
194 ENDDO
195
196
197
198
199 DO i=1,nel
200
201 signxx(i) = sigoxx(i) + a11(i)*depsxx(i) + a12(i)*depsyy(i)
202 signyy(i) = sigoyy(i) + a11(i)*depsyy(i) + a12(i)*depsxx(i)
203 signxy(i) = sigoxy(i) + depsxy(i)*g(i)
204 signyz(i) = sigoyz(i) + depsyz(i)*gs(i)
205 signzx(i) = sigozx(i) + depszx(i)*gs(i)
206
207 trsig(i) = signxx(i) + signyy(i)
208
209 sxx(i) = signxx(i) - trsig(i) * third
210 syy(i) = signyy(i) - trsig(i) * third
211 szz(i) = -trsig(i) * third
212 sxy(i) = signxy(i)
213
214 sigvm(i) = three_half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + three*sxy(i)**2
215 sigvm(i) = sqrt(sigvm(i))
216 ENDDO
217
218
219
220
221 phi(1:nel) = sigvm(1:nel) - yld(1:nel)
222
223
224 nindx = 0
225 DO i=1,nel
226 IF (phi(i) > zero .AND. off(i) == one) THEN
227 nindx=nindx+1
228 index(nindx)=i
229 ENDIF
230 ENDDO
231
232
233
234
235 IF (nindx > 0) THEN
236
237
238 IF (ivisc == 0) THEN
239 niter = 3
240 ELSE
241 niter = 5
242 ENDIF
243
244
245 DO iter = 1, niter
246#include "vectorize.inc"
247
248 DO ii=1,nindx
249
250
251 i = index(ii)
252
253
254
255
256
257
258
259
260
261
262
263
264
265 normxx = three_half*sxx(i)/sigvm(i)
266 normyy = three_half*syy(i)/sigvm(i)
267 normxy = three*sxy(i)/sigvm(i)
268
269
270
271
272
273
274 dfdsig2 = normxx * (a11(i)*normxx + a12(i)*normyy)
275 . + normyy * (a11(i)*normyy + a12(i)*normxx)
276 . + normxy * normxy * g(i)
277
278
279
280 hardp(i) = (young(i)*tang(i)/(young(i)-tang(i)))
281 IF (ivisc == 1) THEN
282 hardp(i) = hardp(i) + dyld0depsd(i)*dtinv +
283 . ((young(i)*dtangdepsd(i)*(young(i) - tang(i))
284 . + young(i)*tang(i)*dtangdepsd(i))/
285 . ((young(i) - tang(i))**2))*dtinv*pla(i)
286 ENDIF
287
288
289
290
291
292 dphi_dlam(i) = - dfdsig2 - hardp(i)
293 dphi_dlam(i) = sign(
max(abs(dphi_dlam(i)),em20),dphi_dlam(i))
294
295
296 dlam = -phi(i)/dphi_dlam(i)
297
298
299 dpxx(i) = dlam * normxx
300 dpyy(i) = dlam * normyy
301 dpxy(i) = dlam * normxy
302
303
304 signxx(i) = signxx(i) - (a11(i)*dpxx(i) + a12(i)*dpyy(i))
305 signyy(i) = signyy(i) - (a11(i)*dpyy(i) + a12(i)*dpxx(i))
306 signxy(i) = signxy(i) - dpxy(i)*g(i)
307 trsig(i) = signxx(i) + signyy(i)
308 sxx(i) = signxx(i) - trsig(i) * third
309 syy(i) = signyy(i) - trsig(i) * third
310 szz(i) = - trsig(i) * third
311 sxy(i) = signxy(i)
312
313
314 dpla(i) =
max(zero,dpla(i) + dlam)
315 pla(i) =
max(zero,pla(i) + dlam)
316 IF (ivisc == 1) THEN
317 epsd(i) = dpla(i)*dtinv
318 ENDIF
319
320
321 sigvm(i) = three_half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + three*sxy(i)**2
322 sigvm(i) = sqrt(sigvm(i))
323
324 IF (ivisc == 0) THEN
325
326 yld(i) = yld0(i) + (young(i)*tang(i)/(young(i)-tang(i)))*pla(i)
327
328 phi(i) = sigvm(i) - yld(i)
329 ENDIF
330
331
332 IF (inloc == 0) THEN
333 dezz(i) = dezz(i) - dpxx(i) - dpyy(i)
334 ENDIF
335
336 ENDDO
337
338
339
340 IF (ivisc == 1) THEN
341
342 ipos(1:nel) = 1
343 iad(1:nel) = npf(ifunc(1)) / 2 + 1
344 ilen(1:nel) = npf(ifunc(1)+1) / 2 - iad(1:nel) - ipos(1:nel)
345 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_sig0,dyld0depsd,yld0)
346 yld0(1:nel) = yscale_sig0*yld0(1:nel)
347 dyld0depsd(1:nel) = yscale_sig0*dyld0depsd(1:nel)
348
349 IF (ifunc(3) > 0) THEN
350 ipos(1:nel) = 1
351 iad(1:nel) = npf(ifunc(3)) / 2 + 1
352 ilen(1:nel) = npf(ifunc(3)+1) / 2 - iad(1:nel) - ipos(1:nel)
353 CALL vinter2(tf,iad,ipos,ilen,nel,epsd/xscale_tang,dtangdepsd,tang)
354 tang(1:nel) = yscale_tang*tang(1:nel)
355 dtangdepsd(1:nel) = yscale_tang*dtangdepsd(1:nel)
356 ENDIF
357
358 DO ii=1,nindx
359 i = index(ii)
360
361 IF (tang(i) >= 0.99d0*young(i)) THEN
362 tang(i) = 0.99d0*young(i)
363 dtangdepsd(i) = zero
364 ENDIF
365
366 yld(i) = yld0(i) + (young(i)*tang(i)/(young(i)-tang(i)))*pla(i)
367
368 phi(i) = sigvm(i) - yld(i)
369 ENDDO
370 ENDIF
371 ENDDO
372
373 ENDIF
374
375
376
377
378
379 DO i=1,nel
380
381 seq(i) = sigvm(i)
382
383 IF (dpla(i) > zero) THEN
384 et(i) = hardp(i) / (hardp(i) + young(i))
385 ELSE
386 et(i) = one
387 ENDIF
388
389 soundsp(i) = sqrt(a11(i)/rho(i))
390
391 sigy(i) = yld(i)
392
393 IF (inloc > 0) THEN
394 IF (loff(i) == one) THEN
395 dezz(i) = -nu*(signxx(i)-sigoxx(i)+signyy(i)-sigoyy(i))/young(i)
396 dezz(i) = dezz(i) -
max(dplanl(i),zero)*half*(signxx(i)+signyy(i))/
max(yld(i),em20)
397 ENDIF
398 ELSE
399 dezz(i) = -nu*(signxx(i)-sigoxx(i)+signyy(i)-sigoyy(i))/young(i) + dezz(i)
400 ENDIF
401
402 thk(i) = thk(i) + dezz(i)*thkly(i)*off(i)
403 ENDDO
404
subroutine vinter2(tf, iad, ipos, ilen, nel0, x, dydx, y)