44
45
46
49
50
51
52#include "implicit_f.inc"
53
54
55
56#include "tabsiz_c.inc"
57
58
59
60 INTEGER, INTENT(IN) :: NEL,NUPARAM,NUVAR,NFUNC,NUMTABL,INLOC
61 INTEGER, INTENT(IN) :: NVARTMP
62 INTEGER, DIMENSION(NFUNC), INTENT(IN) :: IFUNC
63 my_real,
INTENT(IN) :: time,timestep
64 my_real,
DIMENSION(NUPARAM),
INTENT(IN) :: uparam
65 my_real,
DIMENSION(NEL),
INTENT(IN) :: gs,rho,dplanl,
66 . depsxx,depsyy,depsxy,depsyz,depszx,
67 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx
68 TYPE(TABLE_4D_), DIMENSION(NUMTABL), INTENT(IN) :: TABLE
69 my_real,
DIMENSION(NEL),
INTENT(IN) :: loff
70
71
72
73 my_real,
DIMENSION(NEL),
INTENT(OUT) ::
74 . signxx,signyy,signxy,signyz,signzx,dezz,dpla
75
76
77
78 INTEGER, DIMENSION(NEL,NVARTMP), INTENT(INOUT) :: VARTMP
79 my_real,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
80 my_real,
DIMENSION(NEL),
INTENT(INOUT) :: off,yld,pla,epsd,soundsp
81
82
83
84 INTEGER :: NPF(SNPC)
86
87
88
89 INTEGER I,II,ITER,NITER,ICONV,ICAS,NINDX
90 INTEGER, PARAMETER :: FUNC_TRAC = 1
91 INTEGER, PARAMETER :: FUNC_COMP = 2
92 INTEGER, PARAMETER :: FUNC_SHEAR = 3
93 INTEGER, DIMENSION(NEL) :: INDX,IAD,ILEN
94 my_real :: lam,dlam,df1,epsdot,da0,da1,da2,
95 . ca,cb,aa,bb,cc,a1s,a1c,a1t,a2s,a2c,a2t,e,nu,nu1,nupc,xfac,
96 . yy,dx2,dfdsigdlam,yld_norm,epd_min,epd_max,
97 . normxx,normyy,normxy,normzz,normyz,normzx,alfa,alfi,dtinv,
98 . normgxx,normgyy,normgxy,normgzz,sig_dfdsig,
99 . epdt_min,epdt_max,epdc_min,epdc_max,epds_min,epds_max
100 my_real,
DIMENSION(NEL) :: ff,p,svm,svm2,ylds,sxx,syy,sxy,szz,
101 . dpxx,dpyy,dpxy,dpzz,sigt,sigc,sigs,dft,dfc,dfs,a11_2d,a12_2d,g,
102 . a0,a1,a2,nup,epspt,epspc,epsps,epdt,epdc,epds,dydx,
103 . epdt_f,epdc_f,epds_f,dplat,dplac,dplas,gf,
alpha,dlam_nl
104 my_real,
DIMENSION(NEL,2) :: xvec
105 my_real,
DIMENSION(NUMTABL) :: tfac
106 my_real,
DIMENSION(NFUNC) :: yfac
107 LOGICAL :: CONV(NEL)
108 my_real,
PARAMETER :: sfac = 1.05d0
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 e = uparam(1)
133 nu = uparam(5)
134
135 nupc = uparam(9)
136
137 iconv = nint(uparam(15))
138 icas = uparam(17)
139 xfac = uparam(18)
140 alfa =
min(one, uparam(16)*timestep)
141 epdt_min = uparam(19)
142 epdt_max = uparam(20)
143 epdc_min = uparam(21)
144 epdc_max = uparam(22)
145 epds_min = uparam(23)
146 epds_max = uparam(24)
147 tfac(1) = uparam(25)
148 tfac(2) = uparam(26)
149 tfac(3) = uparam(27)
150 yfac(1) = uparam(28)
151 yfac(2) = uparam(29)
152 a11_2d(1:nel) = uparam(2)
153 a12_2d(1:nel) = uparam(3)
154 g(1:nel) = uparam(4)
155 nu1 = nu/(one - nu) ! aa1/aa2
156 alfi = one - alfa
157 dtinv = one /
max(em20, timestep)
158
159
160 IF (time == zero) THEN
161 nup(1:nel) = nupc
162 uvar(1:nel,7) = nupc
163 ELSE
164 nup(1:nel) = uvar(1:nel,7)
165 ENDIF
166
167
168 epspt(1:nel) = uvar(1:nel,1)
169 epspc(1:nel) = uvar(1:nel,2)
170 epsps(1:nel) = uvar(1:nel,3)
171 epdt_f(1:nel) = uvar(1:nel,4)
172 epdc_f(1:nel) = uvar(1:nel,5)
173 epds_f(1:nel) = uvar(1:nel,6)
174 dplat(1:nel) = zero
175 dplac(1:nel) = zero
176 dplas(1:nel) = zero
177 DO i=1,nel
178 epdt(i) =
min(epdt_max,
max(epdt_f(i),epdt_min)) * xfac
179 epdc(i) =
min(epdc_max,
max(epdc_f(i),epdc_min)) * xfac
180 epds(i) =
min(epds_max,
max(epds_f(i),epds_min)) * xfac
181 ENDDO
182
183
184 xvec(1:nel,1) = epspt(1:nel)
185 xvec(1:nel,2) = epdt(1:nel)
187 sigt(1:nel) = sigt(1:nel) * tfac(1)
188 dft(1:nel) = dft(1:nel) * tfac(1)
190 xvec(1:nel,1) = epspc(1:nel)
191 xvec(1:nel,2) = epdc(1:nel)
193 sigc(1:nel) = sigc(1:nel) * tfac(2)
194 dfc(1:nel) = dfc(1:nel) * tfac(2)
195 END IF
196 IF (table(func_shear)%NOTABLE > 0) THEN
197 xvec(1:nel,1) = epsps(1:nel)
198 xvec(1:nel,2) = epds(1:nel)
200 sigs(1:nel) = sigs(1:nel) * tfac(3)
201 dfs(1:nel) = dfs(1:nel) * tfac(3)
202 END IF
203 IF (icas == 0) THEN
204 sigc(1:nel) = sigt(1:nel)
205 sigs(1:nel) = sigt(1:nel)/sqr3
206 ELSEIF (icas == 1) THEN
207 DO i=1,nel
208 sigs(i) = one /(sigt(i) + sigc(i))/sqr3
209 sigs(i) = two*sigt(i)*sigc(i)*sigs(i)
210 ENDDO
211 ENDIF
212
213 IF (iconv == 1) THEN
214 DO i=1,nel
215 conv(i) = .false.
216 aa = one /(sigt(i) + sigc(i))/sqr3
217 IF (sigs(i) < sfac*two*sigt(i)*sigc(i)*aa) THEN
218 sigs(i) = sfac*two*sigt(i)*sigc(i)*aa
219 conv(i) = .true.
220 ENDIF
221 END DO
222 END IF
223 DO i=1,nel
224 a0(i) = sigs(i)*sqr3
225 a1(i) = three*(((sigt(i)-sigc(i))/(sigt(i)+sigc(i))) -
226 . a0(i)*((sigt(i)-sigc(i))/(sigt(i)*sigc(i))))
227 a2(i) = eighteen*((one/(sigt(i)+sigc(i)))-a0(i)/(two*sigt(i)*sigc(i)))
228 END DO
229
230
231
232
233 DO i=1,nel
234
235 signxx(i) = sigoxx(i) + a11_2d(i)*depsxx(i) + a12_2d(i)*depsyy(i)
236 signyy(i) = sigoyy(i) + a11_2d(i)*depsyy(i) + a12_2d(i)*depsxx(i)
237 signxy(i) = sigoxy(i) + depsxy(i)*g(i)
238 signyz(i) = sigoyz(i) + depsyz(i)*gs(i)
239 signzx(i) = sigozx(i) + depszx(i)*gs(i)
240 p(i) = -(signxx(i) + signyy(i)) * third
241
242 sxx(i) = signxx(i) + p(i)
243 syy(i) = signyy(i) + p(i)
244 szz(i) = p(i)
245 dezz(i)= -nu1 * (depsxx(i) + depsyy(i))
246 soundsp(i) = sqrt(a11_2d(i)/rho(i))
247 ENDDO
248
249
250
251
252
253 DO i = 1,nel
254 alpha(i) = (nine/two)*((one-two*nup(i))/(one+nup(i)))
255 ENDDO
256 niter = 4
257 nindx = 0
258 DO i=1,nel
259 svm2(i) = three_half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + three*signxy(i)**2
260 svm(i) = sqrt(
max(em20,svm2(i)))
261 ylds(i) = svm(i) - a0(i) - a1(i)*p(i) - a2(i)*p(i)*p(i)
262 IF (ylds(i) > 0 .AND. off(i) == one) THEN
263 nindx = nindx + 1
264 indx(nindx) = i
265 ENDIF
266 ENDDO
267
268
269
270
271 IF (nindx > 0) THEN
272
273
274 DO iter = 1,niter
275
276
277 DO ii = 1,nindx
278 i = indx(ii)
279
280
281
282
283
284
285
286
287 ! plasticity ...
288
289
290 gf(i) = sqrt(
max(em20,(svm(i)**2)+
alpha(i)*p(i)**2))
291
292
293 normgxx = (three_half*sxx(i) - third*
alpha(i)*p(i) ) /gf(i)
294 normgyy = (three_half*syy(i) - third*
alpha(i)*p(i) ) /gf(i)
295 normgzz = (three_half*szz(i) - third*
alpha(i)*p(i) ) /gf(i)
296 normgxy = three*signxy(i)/gf(i)
297
298
299 cb = a1(i) + two*a2(i)*p(i)
300 normxx = three_half * sxx(i)/svm(i) + cb /three
301 normyy = three_half * syy(i)/svm(i) + cb /three
302 normzz = three_half * szz(i)/svm(i) + cb /three
303 normxy = three * signxy(i)/svm(i)
304
305
306 dfdsigdlam = normxx * (a11_2d(i)*normgxx + a12_2d(i)*normgyy)
307 . + normyy * (a11_2d(i)*normgyy + a12_2d(i)*normgxx)
308 . + normxy * normgxy * g(i)
309
310 yld_norm = svm(i)/gf(i)
311 bb = three_half/(one + nup(i))
312 dft(i) = dft(i) * yld_norm * bb
313 IF (table(
func_comp)%NOTABLE > 0) dfc(i) = dfc(i) * yld_norm * bb
314 IF (table(func_shear)%NOTABLE > 0) dfs(i) = dfs(i) * yld_norm * sqr3/two
315 IF (icas == 0) THEN
316 dfc(i) = dft(i)
317 dfs(i) = (one/sqr3)*dft(i)
318 ELSEIF (icas == 1) THEN
319 aa = one /(sigt(i) + sigc(i))/sqr3
320 dfs(i) = two*(dft(i)*sigc(i) + dfc(i)*sigt(i))*aa
321 . - two*sqr3*sigc(i)*sigt(i)*(dft(i) + dfc(i))*aa*aa
322 ENDIF
323 IF (iconv == 1) THEN
324 IF (conv(i)) THEN
325 aa = one /(sigt(i) + sigc(i))/sqr3
326 dfs(i) = sfac*(two*(dft(i)*sigc(i) + dfc(i)*sigt(i))*aa
327 . - two*sqr3*sigc(i)*sigt(i)*(dft(i) + dfc(i))*aa*aa)
328 ENDIF
329 ENDIF
330
331
332 cc = sigs(i)/sigc(i)/sigt(i)
333
334 a1s = -three*sqr3*(sigt(i)-sigc(i))/(sigt(i)*sigc(i))
335 a1c = three*( (sigs(i)*sqr3/( sigc(i)**2)) -
336 . (two*sigt(i)/( (sigt(i
337 a1t = three*(two*sigc(i)/((sigt(i) + sigc(i))**2) -
338 . (sigs(i)*sqr3/(sigt(i)**2)))
339
340 a2s = -nine*sqr3/(sigt(i)*sigc(i))
341 a2c = eighteen*((sigs(i)*sqr3/(two*sigt(i)*(sigc(i)**2))) -
342 . one/((sigt(i)+sigc(i))**2))
343 a2t = eighteen*((sigs(i)*sqr3/(two*sigc(i)*(sigt(i)**2))) -
344 . one/((sigt(i)+sigc(i))**2))
345
346 da0 = sqr3*dfs(i)
347 da1 = a1s*dfs(i) + a1t*dft(i) + a1c*dfc(i)
348 da2 = a2s*dfs(i) + a2t*dft(i) + a2c*dfc(i)
349
350 ff(i) = dfdsigdlam + da0 + p(i)*da1 + p(i)**2 * da2
351 ff(i) = sign(
max(abs(ff(i)),em20) ,ff(i))
352
353 dlam = ylds(i)/ff(i)
354
355 dpxx(i) = dlam * normgxx
356 dpyy(i) = dlam * normgyy
357 dpzz(i) = dlam * normgzz
358 dpxy(i) = dlam * normgxy
359
360
361 signxx(i) = signxx(i) - (a11_2d(i)*dpxx(i) + a12_2d(i)*dpyy(i))
362 signyy(i) = signyy(i) - (a11_2d(i)*dpyy(i) + a12_2d(i)*dpxx(i))
363 signxy(i) = signxy(i) - dpxy(i)*g(i)
364
365
366 epspt(i) = epspt(i) + dlam* yld_norm * bb
367 epspc(i) = epspt(i)
368 epsps(i) = epsps(i) + dlam* yld_norm*sqr3/two
369
370 pla(i) = pla(i) + dlam*yld_norm*off(i)
371 dpla(i) = dpla(i) + dlam *yld_norm
372 dplat(i) = dplat(i) + dlam* yld_norm*bb
373 dplac(i) = dplat(i)
374 dplas(i) = dplas(i) + dlam* yld_norm*sqr3/two
375
376 ENDDO
377
378
379 xvec(1:nel,1) = epspt(1:nel)
380 xvec(1:nel,2) = epdt(1:nel)
382 sigt(1:nel) = sigt(1:nel) * tfac(1)
383 dft(1:nel) = dft(1:nel) * tfac(1)
385 xvec(1:nel,1) = epspc(1:nel)
386 xvec(1:nel,2) = epdc(1:nel)
388 sigc(1:nel) = sigc(1:nel) * tfac(2)
389 dfc(1:nel) = dfc(1:nel) * tfac(2)
390 END IF
391 IF (table(func_shear)%NOTABLE > 0) THEN
392 xvec(1:nel,1) = epsps(1:nel)
393 xvec(1:nel,2) = epds(1:nel)
395 sigs(1:nel) = sigs(1:nel) * tfac(3)
396 dfs(1:nel) = dfs(1:nel) * tfac(3)
397 END IF
398 IF (icas == 0) THEN
399 DO ii = 1,nindx
400 i = indx(ii)
401 sigc(i) = sigt(i)
402 sigs(i) = sigt(i)/sqr3
403 ENDDO
404 ELSEIF (icas == 1) THEN
405 DO ii = 1,nindx
406 i = indx(ii)
407 sigs(i) = one /(sigt(i) + sigc(i))/sqr3
408 sigs(i) = two*sigt(i)*sigc(i)*sigs(i)
409 ENDDO
410 ENDIF
411 IF (iconv == 1) THEN
412 DO ii = 1,nindx
413 i = indx(ii)
414 conv(i) = .false.
415 aa = one /(sigt(i) + sigc(i))/sqr3
416 IF (sigs(i) < sfac*two*sigt(i)*sigc(i)*aa) THEN
417 sigs(i) = sfac*two*sigt(i)*sigc(i)*aa
418 conv(i) = .true.
419 ENDIF
420 END DO
421 END IF
422 DO ii = 1,nindx
423 i = indx(ii)
424 a0(i) = sigs(i)*sqr3
425 a1(i) = three*(((sigt(i)-sigc(i))/(sigt(i)+sigc(i))) -
426 . a0(i)*((sigt(i)-sigc(i))/(sigt(i)*sigc(i))))
427 a2(i) = eighteen*((one/(sigt(i)+sigc(i)))-a0(i)/(two*sigt(i)*sigc(i)))
428 END DO
429
430
431 DO ii = 1,nindx
432 i = indx(ii)
433 p(i) = -third*(signxx(i) + signyy(i) )
434 sxx(i) = signxx(i) + p(i)
435 syy(i) = signyy(i) + p(i)
436 szz(i) = p(i)
437 svm2(i)= three_half*(sxx(i)**2 + syy(i)**2 + szz(i)**2) + three*signxy(i)**2
438 svm(i) = sqrt(svm2(i))
439 ylds(i) = svm(i) - a0(i) - a1(i)*p(i) - a2(i)*p(i)*p(i)
440 IF (inloc == 0) THEN
441 dezz(i) = dezz(i) + nu1*(dpxx(i) + dpyy(i)) + dpzz(i)
442 ENDIF
443 ENDDO
444 ENDDO
445 ENDIF
446
447
448
449
450 IF (ifunc(1) > 0) THEN
451 iad(1:nel) = npf(ifunc(1)) / 2 + 1
452 ilen(1:nel) = npf(ifunc(1)+1) / 2 - iad(1:nel) - vartmp(1:nel,8)
453
454 CALL vinter(tf,iad,vartmp(1:nel,8),ilen,nel,pla,dydx,nup)
455
456 uvar(1:nel,7) = yfac(1) * nup(1:nel)
457 uvar(1:nel,7) =
max(zero,
min(nup(1:nel), half))
458 END IF
459
460
461
462
463 IF (inloc > 0) THEN
464 DO i = 1,nel
465 IF (loff(i) == one) THEN
466 alpha(i)= (nine/two)*((one-two*nup(i))/(one+nup(i)))
467 gf(i) = sqrt(
max(em20,(svm(i)**2)+
alpha(i)*p(i)**2))
468 normgxx = (three_half*sxx(i) - third*
alpha(i)*p(i))/gf(i)
469 normgyy = (three_half*syy(i) - third*
alpha(i)*p(i))/gf(i)
470 normgzz = (three_half*szz(i) - third*
alpha
471 yld_norm = svm(i)/gf(i)
472 IF (yld_norm /= zero) THEN
473 dlam_nl(i) = (one/yld_norm)*
max(dplanl(i),zero)
474 dezz(i) = dezz(i) + nu1*(dlam_nl(i)*normgxx)
475 . + nu1*(dlam_nl(i)*normgyy)
476 . + dlam_nl(i)*normgzz
477 ENDIF
478 ENDIF
479 ENDDO
480 ENDIF
481
482
483
484
485 uvar(1:nel,1) = epspt(1:nel)
486 uvar(1:nel,2) = epspc(1:nel)
487 uvar(1:nel,3) = epsps(1:nel)
488 uvar(1:nel,4) = alfa*dplat(1:nel)*dtinv + alfi*epdt_f(1:nel)
489 uvar(1:nel,5) = alfa*dplac(1:nel)*dtinv + alfi*epdc_f(1:nel)
490 uvar(1:nel,6) = alfa*dplas(1:nel)*dtinv + alfi*epds_f(1:nel)
491 epsd(1:nel) = alfa*dpla(1:nel)*dtinv + alfi*epsd(1:nel)
492
subroutine func_comp(table, ntable, nptmax, npt_trac, npt_shear, npt_comp, x_comp, y_comp, nup)
subroutine table_mat_vinterp(table, dimx, nel, ipos, xx, yy, dydx)
subroutine vinter(tf, iad, ipos, ilen, nel, x, dydx, y)