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
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) :: VARTMP
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(,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,a1h,a2h,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,dtinv,
93 . dlam,ddep,dfdlam,dfdpla,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,a1,a2,yld,phi,dam,jcrate,
97 . sxx,syy,szz,sxy,syz,szx,dpla,jcr_log,gamma,dgamm,hardp,fdp,
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 a1h = uparam(11)
154 a2h = uparam(12)
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(i) = uvar(i,5) +
max(dplanl(i),zero)
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 a1(i) = a1f + a1h * pla(i)
287 a2(i) =
max(zero, a2f + a2h * pla(i))
288 fdp(i) = third*(sqr3*yld0*a1(i)*i1(i) + a2(i)*
max(zero,i1(i))**2)
289 phi(i) = j2(i) + fdp(i) - yld(i)**2
290 ENDDO
291
292
293
294 nindx = 0
295 nindf = 0
296 DO i = 1,nel
297 IF (phi(i) > zero .and. off(i) == one) THEN
298 nindx = nindx + 1
299 indx(nindx) = i
300 END IF
301 ENDDO
302
303 IF (nindx > 0) THEN
304
305 niter = 4
306 dpla(1:nel) = zero
307
308 DO iter = 1,niter
309
310 DO ii = 1,nindx
311 i = indx(ii)
312
313
314 i1p =
max(zero, i1(i))
315 jp = third * as * i1p
316 tp = two * jp
317
318 np_xx = sxx(i) + tp
319 np_yy = syy(i) + tp
320 np_zz = szz(i) + tp
321 np_xy = sxy(i)
322 np_yz = syz(i)
323 np_zx = szx(i)
324
325
326 ip = third*(sqr3*yld0*a1(i) + two*a2(i)*i1p)
327 nf_xx = sxx(i) + ip
328 nf_yy = syy(i) + ip
329 nf_zz = szz(i) + ip
330 nf_xy = sxy(i)
331 nf_yz = syz(i)
332 nf_zx = szx(i)
333
334
335 dfdlam =-nf_xx * (c11*np_xx + c12 * (np_yy + np_zz))
336 . - nf_yy * (c11*np_yy + c12 * (np_xx + np_zz))
337 . - nf_zz * (c11*np_zz + c12 * (np_xx + np_yy))
338 . -(nf_xy*np_xy + nf_yz*np_yz + nf_zx*np_zx)*two*g2
339
340 dfdpla = third*(sqr3*a1h*yld0*i1(i) + a2h*i1p**2)
341
342 dpla_dlam = two*sqrt((j2(i) + tp*as*i1(i)))
343
344 dphi_dlam = dfdlam + (dfdpla - two*yld(i)*hardp(i))*dpla_dlam
345
346 dlam = -phi(i) / dphi_dlam
347
348
349 dpxx = dlam*np_xx
350 dpyy = dlam*np_yy
351 dpzz = dlam*np_zz
352 dpxy = dlam*np_xy
353 dpyz = dlam*np_yz
354 dpzx = dlam*np_zx
355
356 signxx(i) = signxx(i) - (c11*dpxx + c12*(dpyy + dpzz))
357 signyy(i) = signyy(i) - (c11*dpyy + c12*(dpxx + dpzz))
358 signzz(i) = signzz(i) - (c11*dpzz + c12*(dpxx + dpyy))
359 signxy(i) = signxy(i) - g2*dpxy
360 signyz(i) = signyz(i) - g2*dpyz
361 signzx(i) = signzx(i) - g2*dpzx
362
363
364 ddep = dlam * dpla_dlam
365 dpla(i)=
max(zero, dpla(i) + ddep)
366 pla(i) = pla(i) + ddep
367 ENDDO
368
369
370
371
372 IF (ndim_yld == 1) THEN
373 DO ii = 1, nindx
374 i = indx(ii)
375 xvec1(ii,1) = pla(i)
376 ipos1(ii,1) = vartmp(i,1)
377 ENDDO
378
379 CALL table_vinterp(table(func_yld),nel,nel,ipos1,xvec1,yld_i,hardp_i)
380
381 DO ii = 1, nindx
382 i = indx(ii)
383 yld(i) = yld_i(ii)*yscale
384 hardp(i) = hardp_i(ii)*yscale
385 vartmp(i,1) = ipos1(ii,1)
386 ENDDO
387
388 ELSE IF (ndim_yld == 2) THEN
389 DO ii = 1, nindx
390 i = indx(ii)
391 xvec2(ii,1) = pla(i)
392 xvec2(ii,2) = epsd(i)
393 ipos2(ii,1) = vartmp(i,1)
394 ENDDO
395
396 CALL table_vinterp(table(func_yld),nel,nindx,ipos2,xvec2,yld_i,hardp_i)
397
398 DO ii = 1, nindx
399 i = indx(ii)
400 yld(i) = yld_i(ii)*yscale
401 hardp(i) = hardp_i(ii)*yscale
402 vartmp(i,1) = ipos2(ii,1)
403 ENDDO
404
405 ELSE
406 DO ii = 1, nindx
407 i = indx(ii)
408 xvec3(ii,1) = pla(i)
409 xvec3(ii,2) = epsd(i)
410 xvec3(ii,3) = temp(i)
411 ipos3(ii,1) = vartmp(i,1)
412 ENDDO
413
414 CALL table_vinterp(table(func_yld),nel,nel,ipos3,xvec3,yld_i,hardp_i)
415
416 DO ii = 1, nindx
417 i = indx(ii)
418 yld(i) = yld_i(ii)*yscale
419 hardp(i) = hardp_i(ii)*yscale
420 vartmp(i,1) = ipos3(ii,1)
421 ENDDO
422 END IF
423
424
425
426 DO ii = 1,nindx
427 i = indx(ii)
428 i1(i) = signxx(i) + signyy(i) + signzz(i)
429 i1p =
max(zero, i1(i))
430 sxx(i) = signxx(i) - i1(i)*third
431 syy(i) = signyy(i) - i1(i)*third
432 szz(i) = signzz(i) - i1(i)*third
433 sxy(i) = signxy(i)
434 syz(i) = signyz(i)
435 szx(i) = signzx(i)
436 j2(i) =(sxx(i)**2 + syy(i)**2 + szz(i)**2 ) * half
437 . + sxy(i)**2 + syz(i)**2 + szx(i)**2
438 a1(i) = a1f + a1h * pla(i)
439 a2(i) =
max(zero, a2f + a2h * pla(i))
440 fdp(i) = third*(sqr3*yld0*a1(i)*i1(i) + a2(i)*i1p**2)
441 phi(i) = j2(i) + fdp(i) - yld(i)**2
442 uvar(i,4) = phi(i) / yld(i)**2
443 END DO
444
445 END DO
446
447 END IF
448
449
450
451 IF (idam > 0) THEN
452 IF (idam == 1) THEN
453 IF (inloc == 1) THEN
454 dgamm(1:nel) = dplanl(1:nel)
455 gamma(1:nel) = pla_nl(1:nel)
456 ELSE
457 dgamm(1:nel) = dpla(1:nel)
458 gamma(1:nel) = pla(1:nel)
459 END IF
460 ELSE
461 IF (inloc == 1) THEN
462 dgamm(1:nel) = dplanl(1:nel) * dmg_scale(1:nel)
463 uvar(1:nel,1) = uvar(1:nel,1) + dgamm(1:nel)
464 gamma(1:nel) = uvar(1:nel,1)
465 ELSE
466 dgamm(1:nel) = dpla(1:nel) * dmg_scale(1:nel)
467 uvar(1:nel,1) = uvar(1:nel,1) + dgamm(1:nel)
468 gamma(1:nel) = uvar(1:nel,1)
469 END IF
470 END IF
471
472 DO i = 1,nel
473
474 triax = zero
475 fact = one
476 facr = one + d_jc * jcr_log(i)
477 IF ( j2(i)/= zero)triax = third * i1(i) / sqrt(three*j2(i))
478 IF (itrx == 1 ) THEN
479 fact =
480 ELSE
481 IF (triax > zero )fact = exp(-d_trx*triax)
482 ENDIF
483 gamc = (d1c + d2c * fact) * facr
484 gamf = (d1f + d2f * fact) * facr
485 IF (gamma(i) > gamc) THEN
486 IF (dam(i) == zero) THEN
487 nindf = nindf + 1
488 indf(nindf) = i
489 END IF
490 IF (expn == one) THEN
491 dam(i) = dam(i) + dgamm(i) / (gamf - gamc)
492 ELSE
493 dfac = (gamma(i) - gamc) / (gamf - gamc)
494 dam(i) = dam(i) + expn * dfac**(expn-one) * dgamm(i) / (gamf - gamc)
495 END IF
496 IF (dam(i) >= one) THEN
497 dam(i) = one
498 off(i) = four_over_5
499 END IF
500 dmg(i) = dam(i)
501 END IF
502 ENDDO
503
504 DO i = 1, nel
505 dmg_scale(i) = one - dam(i)
506 END DO
507 END IF
508
509 soundsp(1:nel) = ssp
510
511 IF (nindf > 0) THEN
512 DO ii=1,nindf
513#include "lockon.inc"
514 WRITE(iout, 1000) ngl(indf(ii))
515 WRITE(istdo,1100) ngl(indf(ii)),time
516#include "lockoff.inc"
517 ENDDO
518 END IF
519
520 1000 FORMAT(1x,'START DAMAGE IN SOLID ELEMENT NUMBER ',i10)
521 1100 FORMAT(1x,'START DAMAGE IN SOLID ELEMENT NUMBER ',i10,1x,' AT TIME :',g11.4)
522
523 RETURN