42
43
44
47
48
49
50#include "implicit_f.inc"
51
52
53
54#include "com04_c.inc"
55#include "units_c.inc"
56#include "comlock.inc"
57
58
59
60 INTEGER :: NEL,NUPARAM,NUVAR,NVARTMP,NUMTABL,INLOC
62 INTEGER ,DIMENSION(NEL) ,INTENT(IN) :: NGL
63 INTEGER ,DIMENSION(NTABLE) ,INTENT(IN) :: ITABLE
64 my_real ,
DIMENSION(NUPARAM),
INTENT(IN) :: uparam
65 my_real ,
DIMENSION(NEL) ,
INTENT(IN) :: temp,
66 . epspxx,epspyy,epspzz,epspxy,epspyz,epspzx,
67 . depsxx,depsyy,depszz,depsxy,depsyz,depszx,
68 . sigoxx,sigoyy,sigozz,sigoxy,sigoyz,sigozx
69
70 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) :: epsd,soundsp
71 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) ::
72 . signxx,signyy,signzz,signxy,signyz,signzx
73 INTEGER ,DIMENSION(NEL,NVARTMP) ,INTENT(INOUT) ::
74 my_real ,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
75 my_real ,
DIMENSION(NEL) ,
INTENT(INOUT) :: off,pla,dplanl,dmg,dmg_scale
76 TYPE(TTABLE), DIMENSION(NTABLE) :: TABLE
77
78
79
80 INTEGER :: I,II,ITER,NITER,NINDX,NINDF,ITRX,IDAM
82 INTEGER :: IPOS1(NEL,1), IPOS2(NEL,2), IPOS3(NEL,3)
83 INTEGER :: NDIM_YLD,FUNC_YLD
84 my_real :: xvec1(nel,1), xvec2(nel,2), xvec3(nel,3)
85 INTEGER ,DIMENSION(NEL) :: INDX,INDF
86
87 my_real :: young,nu,ssp,g,g2,bulk,yld0,c11,c12,
88 . a1f,a2f,as,d1c,d2c,d1f,d2f,d_trx,d_jc,dm,expn
89
91
92 my_real facr,triax,i1p,ip,jp,tp,fact,facd,dfac,
93 . dlam,ddep,dfdlam,dpla_dlam,dphi_dlam,
94 . gamc,gamf,np_xx,np_yy,np_zz,np_xy,np_yz,np_zx,
95 . nf_xx,nf_yy,nf_zz,nf_xy,nf_yz,nf_zx,dpxx,dpyy,dpzz,dpxy,dpyz,dpzx
96 my_real ,
DIMENSION(NEL) :: i1,j2,yld,phi,dam,jcrate
97 . sxx,syy,szz,sxy,syz,szx,dpla
98 . yld_i,hardp_i,pla_nl,dpdt_nl
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 young = uparam(1)
146 nu = uparam(2)
147 g = uparam(3)
148 bulk = uparam(4)
149
150 yld0 = uparam(5)
151 a1f = uparam(9)
152 a2f = uparam(10)
153
154
155 as = uparam(13)
156
157 d1c = uparam(14)
158 d2c = uparam(15)
159 d1f = uparam(16)
160 d2f = uparam(17)
161 d_trx = uparam(18)
162 d_jc = uparam(19)
163 expn = uparam(20)
164
165 cc = uparam(21)
166 epsdref = uparam(22)
167 epsdmax = uparam(23)
168 fcut = uparam(24)
169
170 itrx = nint(uparam(26))
171 idam = nint(uparam(27))
172 ssp = uparam(28)
173 xscale = uparam(30)
174 yscale = uparam(31)
175 c11 = uparam(32)
176 c12 = uparam(33)
177
178 func_yld = itable(1)
179 ndim_yld = table(func_yld)%NDIM
180
181 g2 = g * two
184
185 IF (inloc > 0) THEN
186 dtinv = one /
max(timestep, em20)
187 DO i = 1,nel
188 pla_nl
189 uvar(i,5) = pla_nl(i)
190 dpdt_nl(i) =
min(
max(dplanl(i),zero)*dtinv ,epsdmax)
191 ENDDO
192 ENDIF
193
194
195
196 dam(1:nel) = dmg(1:nel)
197 dpla(1:nel) = zero
198
199 DO i = 1,nel
200 IF (off(i) < 0.001) off(i) = zero
201 IF (off(i) < one) off(i) = off(i)*four_over_5
202 IF (off(i) == one) THEN
203 signxx(i) = sigoxx(i) + c11*depsxx(i) + c12*(depsyy(i) + depszz(i))
204 signyy(i) = sigoyy(i) + c11*depsyy(i) + c12*(depsxx(i) + depszz(i))
205 signzz(i) = sigozz(i) + c11*depszz(i) + c12*(depsxx(i) + depsyy(i))
206 signxy(i) = sigoxy(i) + depsxy(i)*g
207 signyz(i) = sigoyz(i) + depsyz(i)*g
208 signzx(i) = sigozx(i) + depszx(i)*g
209 i1(i) = signxx(i) + signyy(i) + signzz(i)
210
211 sxx(i) = signxx(i) - i1(i) * third
212 syy(i) = signyy(i) - i1(i) * third
213 szz(i) = signzz(i) - i1(i) * third
214 sxy(i) = signxy(i)
215 syz(i) = signyz(i)
216 szx(i) = signzx(i)
217 j2(i) = (sxx(i)**2 + syy(i)**2 + szz(i)**2)*half
218 . + sxy(i)**2 + syz(i)**2 + szx(i)**2
219 END IF
220 ENDDO
221
222 jcr_log(1:nel) = zero
223 jcrate(1:nel) = one
224 IF (epsdref > zero) THEN
225 IF (inloc == 1) THEN
226 jcr_log(1:nel) = log(dpdt_nl(1:nel) / epsdref)
227 jcrate(1:nel) = one + cc * jcr_log(1:nel)
228 ELSE
229 DO i = 1,nel
230 IF (off(i) == one) THEN
231 epsd(i) = (epspxx(i)**2 + epspyy(i)**2 + epspzz(i)**2 )*two
232 . + epspxy(i)**2 + epspyz(i)**2 + epspzx(i)**2
233 epsd(i) =
min(sqrt(epsd(i)) ,epsdmax)
234 epsd(i) =
alpha*epsd(i) + alphai*uvar(i,3)
235 uvar(i,3) = epsd(i)
236 IF (epsd(i) > epsdref) THEN
237 jcr_log(i) = log(epsd(i) / epsdref)
238 jcrate(i) = one + cc * jcr_log(i)
239 END IF
240 END IF
241 ENDDO
242 END IF
243 END IF
244
245
246
247 IF (ndim_yld == 1) THEN
248 xvec1(1:nel,1) = pla(1:nel)
249 ipos1(1:nel,1) = vartmp(1:nel,1)
250
251 CALL table_vinterp(table(func_yld),nel,nel,ipos1,xvec1,yld,hardp)
252
253 yld(1:nel) = yld(1:nel) * yscale * jcrate(1:nel)
254 hardp(1:nel) = hardp(1:nel) * yscale * jcrate(1:nel)
255 vartmp(1:nel,1) = ipos1(1:nel,1)
256
257 ELSE IF (ndim_yld == 2) THEN
258 xvec2(1:nel,1) = pla(1:nel)
259 xvec2(1:nel,2) = epsd(1:nel)
260 ipos2(1:nel,1) = vartmp(1:nel,1)
261 ipos2(1:nel,2) = 1
262
263 CALL table_vinterp(table(func_yld),nel,nel,ipos2,xvec2,yld,hardp)
264
265 yld(1:nel) = yld(1:nel) * yscale
266 hardp(1:nel) = hardp(1:nel) * yscale
267 vartmp(1:nel,1) = ipos2(1:nel,1)
268
269 ELSE
270 xvec3(1:nel,1) = pla(1:nel)
271 xvec3(1:nel,2) = epsd(1:nel)
272 xvec3(1:nel,3) = temp(1:nel)
273 ipos3(1:nel,1) = vartmp(1:nel,1)
274 ipos3(1:nel,2) = 1
275 ipos3(1:nel,3) = 1
276
277 CALL table_vinterp(table(func_yld),nel,nel,ipos3,xvec3,yld,hardp)
278
279 yld(1:nel) = yld(1:nel) * yscale
280 hardp(1:nel) = hardp(1:nel) * yscale
281 vartmp(1:nel,1) = ipos3(1:nel,1)
282
283 END IF
284
285 DO i = 1,nel
286 fvm(i) =
max(zero, i1(i) + half*sqr3*a1f*yld0 / a2f )
287 phi(i) = j2(i) + third*a2f * fvm(i)**2
288 . - (yld(i)**2 + fourth*(a1f*yld0)**2/a2f)
289 ENDDO
290
291
292
293 nindx = 0
294 nindf = 0
295 DO i = 1,nel
296 IF (phi(i) > zero .and. off(i) == one) THEN
297 nindx = nindx + 1
298 indx(nindx) = i
299 END IF
300 ENDDO
301
302 IF (nindx > 0) THEN
303
304 niter = 4
305 dpla(1:nel) = zero
306
307 DO iter = 1,niter
308
309 DO ii = 1,nindx
310 i = indx(ii)
311
312
313 i1p =
max(zero, i1(i))
314 jp = third * as * i1p
315 tp = two * jp
316
317 np_xx = sxx(i) + tp
318 np_yy = syy(i) + tp
319 np_zz = szz(i) + tp
320 np_xy = sxy(i)
321 np_yz = syz(i)
322 np_zx = szx(i)
323
324
325 ip = two_third * a2f * fvm(i)
326 nf_xx = sxx(i) + ip
327 nf_yy = syy(i) + ip
328 nf_zz = szz(i) + ip
329 nf_xy = sxy(i)
330 nf_yz = syz(i)
331 nf_zx = szx(i)
332
333
334 dfdlam =-nf_xx * (c11*np_xx + c12 * (np_yy + np_zz))
335 . - nf_yy * (c11*np_yy + c12 * (np_xx + np_zz))
336 . - nf_zz * (c11*np_zz + c12 * (np_xx + np_yy))
337 . -(nf_xy*np_xy + nf_yz*np_yz + nf_zx*np_zx)*two*g2
338
339 dpla_dlam = two*sqrt((j2(i) + tp*as*i1(i)))
340 dphi_dlam = dfdlam - two*yld(i)*hardp(i)*dpla_dlam
341
342 dlam = -phi(i) / dphi_dlam
343
344
345 dpxx = dlam*np_xx
346 dpyy = dlam*np_yy
347 dpzz = dlam*np_zz
348 dpxy = dlam*np_xy
349 dpyz = dlam*np_yz
350 dpzx = dlam*np_zx
351
352 signxx(i) = signxx(i) - (c11*dpxx + c12*(dpyy + dpzz))
353 signyy(i) = signyy(i) - (c11*dpyy + c12*(dpxx + dpzz))
354 signzz(i) = signzz(i) - (c11*dpzz + c12*(dpxx + dpyy))
355 signxy(i) = signxy(i) - g2*dpxy
356 signyz(i) = signyz(i) - g2*dpyz
357 signzx(i) = signzx(i) - g2*dpzx
358
359
360 ddep = dlam * dpla_dlam
361 dpla(i)=
max(zero, dpla(i) + ddep)
362 pla(i) = pla(i) + ddep
363 ENDDO
364
365
366
367
368 IF (ndim_yld == 1) THEN
369 DO ii = 1, nindx
370 i = indx(ii)
371 xvec1(ii,1) = pla(i)
372 ipos1(ii,1) = vartmp(i,1)
373 ENDDO
374
375 CALL table_vinterp(table(func_yld),nel,nel,ipos1,xvec1,yld_i,hardp_i)
376
377 DO ii = 1, nindx
378 i = indx(ii)
379 yld(i) = yld_i(ii)*yscale
380 hardp(i) = hardp_i(ii)*yscale
381 vartmp(i,1) = ipos1(ii,1)
382 ENDDO
383
384 ELSE IF (ndim_yld == 2) THEN
385 DO ii = 1, nindx
386 i = indx(ii)
387 xvec2(ii,1) = pla(i)
388 xvec2(ii,2) = epsd(i)
389 ipos2(ii,1) = vartmp(i,1)
390 ENDDO
391
392 CALL table_vinterp(table(func_yld),nel,nindx,ipos2,xvec2,yld_i,hardp_i)
393
394 DO ii = 1, nindx
395 i = indx(ii)
396 yld(i) = yld_i(ii)*yscale
397 hardp(i) = hardp_i(ii)*yscale
398 vartmp(i,1) = ipos2(ii,1)
399 ENDDO
400
401 ELSE
402 DO ii = 1, nindx
403 i = indx(ii)
404 xvec3(ii,1) = pla(i)
405 xvec3(ii,2) = epsd(i)
406 xvec3(ii,3) = temp(i)
407 ipos3(ii,1) = vartmp(i,1)
408 ENDDO
409
410 CALL table_vinterp(table(func_yld),nel,nel,ipos3,xvec3,yld_i,hardp_i)
411
412 DO ii = 1, nindx
413 i = indx(ii)
414 yld(i) = yld_i(ii)*yscale
415 hardp(i) = hardp_i(ii)*yscale
416 vartmp(i,1) = ipos3(ii,1)
417 ENDDO
418 END IF
419
420
421
422 DO ii = 1,nindx
423 i = indx(ii)
424 i1(i) = signxx(i) + signyy(i) + signzz(i)
425 sxx(i) = signxx(i) - i1(i)*third
426 syy(i) = signyy(i) - i1(i)*third
427 szz(i) = signzz(i) - i1(i)*third
428 sxy(i) = signxy(i)
429 syz(i) = signyz(i)
430 szx(i) = signzx(i)
431 j2(i) =(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) * half
432 . + sxy(i)**2 + syz(i)**2 + szx(i)**2
433 fvm(i) =
max(zero, i1(i) + half*sqr3*a1f*yld0 / a2f )
434 phi(i) = j2(i) + third*a2f * fvm(i)**2
435 . - (yld(i)**2 + fourth*(a1f*yld0)**2/a2f)
436 uvar(i,4) = phi(i) / yld(i)**2
437 END DO
438
439 END DO
440
441 END IF
442
443
444
445 IF (idam > 0) THEN
446 IF (idam == 1) THEN
447 IF (inloc == 1) THEN
448 dgamm(1:nel) = dplanl(1:nel)
449 gamma(1:nel) = pla_nl(1:nel)
450 ELSE
451 dgamm(1:nel) = dpla(1:nel)
452 gamma(1:nel) = pla(1:nel)
453 END IF
454 ELSE
455 IF (inloc == 1) THEN
456 dgamm(1:nel) = dplanl(1:nel) * dmg_scale(1:nel)
457 uvar(1:nel,1) = uvar(1:nel,1) + dgamm(1:nel)
458 gamma(1:nel) = uvar(1:nel,1)
459 ELSE
460 dgamm(1:nel) = dpla(1:nel) * dmg_scale(1:nel)
461 uvar(1:nel,1) = uvar(1:nel,1) + dgamm(1:nel)
462 gamma(1:nel) = uvar(1:nel,1)
463 END IF
464 END IF
465
466 DO i = 1,nel
467
468 triax = zero
469 fact = one
470 facr = one + d_jc * jcr_log(i)
471 IF ( j2(i)/= zero)triax = third * i1(i) / sqrt(three*j2(i))
472 IF (itrx == 1 ) THEN
473 fact = exp(-d_trx*triax)
474 ELSE
475 IF (triax > zero )fact = exp(-d_trx*triax)
476 ENDIF
477 gamc = (d1c + d2c * fact) * facr
478 gamf = (d1f + d2f * fact) * facr
479 IF (gamma(i) > gamc) THEN
480 IF (dam(i) == zero) THEN
481 nindf = nindf + 1
482 indf(nindf) = i
483 END IF
484 IF (expn == one) THEN
485 dam(i) = dam(i) + dgamm(i) / (gamf - gamc)
486 ELSE
487 dfac = (gamma(i) - gamc) / (gamf - gamc)
488 dam(i) = dam(i) + expn * dfac**(expn-one) * dgamm(i) / (gamf - gamc)
489 END IF
490 IF (dam(i) >= one) THEN
491 dam(i) = one
492 off(i) = four_over_5
493 END IF
494 dmg(i) = dam(i)
495 END IF
496 ENDDO
497
498 DO i = 1, nel
499 dmg_scale(i) = one - dam(i)
500 END DO
501 END IF
502
503 soundsp(1:nel) = ssp
504
505 IF (nindf > 0) THEN
506 DO ii=1,nindf
507#include "lockon.inc"
508 WRITE(iout, 1000) ngl(indf(ii))
509 WRITE(istdo,1100) ngl(indf(ii)),time
510#include "lockoff.inc"
511 ENDDO
512 END IF
513
514 1000 FORMAT(1x,'START DAMAGE IN SOLID ELEMENT NUMBER ',i10)
515 1100 FORMAT(1x,'START DAMAGE IN SOLID ELEMENT NUMBER ',i10,1x,' AT TIME :',g11.4)
516
517 RETURN