34 1 NEL ,NUPARAM,NUVAR ,NFUNC ,IFUNC ,
35 2 NPF ,TF ,TIME ,TIMESTEP,UPARAM ,
36 3 NGL ,ALDT ,TSTAR ,ISMSTR ,
37 4 EPSXX ,EPSYY ,EPSZZ ,EPSXY ,EPSYZ ,EPSZX ,
38 5 SIGNXX ,SIGNYY ,SIGNZZ ,SIGNXY ,SIGNYZ ,SIGNZX ,
39 6 EPSP ,UVAR ,OFF ,DFMAX ,TDELE ,
40 7 MFXX ,MFXY ,MFXZ ,MFYX ,MFYY ,MFYZ ,
41 8 MFZX ,MFZY ,MFZZ ,DMG_SCALE)
47#include "implicit_f.inc"
80 INTEGER :: NEL,NUPARAM,NUVAR,ISMSTR
81 INTEGER ,
DIMENSION(NEL) :: NGL
82 my_real :: TIME,TIMESTEP
83 my_real ,
DIMENSION(NUPARAM) :: UPARAM
84 my_real ,
DIMENSION(NEL) :: SIGNXX,SIGNYY,SIGNZZ,SIGNXY,SIGNYZ,SIGNZX,
85 . EPSXX,EPSYY,EPSZZ,EPSXY,EPSYZ,EPSZX,EPSP,ALDT,TSTAR,
86 . MFXX,MFXY,MFXZ,MFYX,MFYY,MFYZ,MFZX,MFZY,MFZZ
87 my_real,
DIMENSION(NEL),
INTENT(INOUT) :: DMG_SCALE
91 my_real uvar(nel,nuvar), off(nel), dfmax(nel),tdele(nel)
95 INTEGER NPF(*), IFUNC(NFUNC),NFUNC
96 my_real FINTER ,TF(*),DF
108 INTEGER I,J,NINDXD,NINDXF,S_FLAG,STRDEF,STRFLAG
109 INTEGER ,
DIMENSION(NEL) :: IFLAG,INDXD,INDXF
110 my_real :: E1,E2,E3,E4,E5,E6,RFAC,RFAC2,E42,E52,E62,C,D,EPST,EPST2,
111 . R1,R2,Y,YP,DAV,DYDX,IE_SP,P,SCALE,CC,Y1,I1,I2,I3,Q,R,PHI,
112 . R_INTER,EL_REF,SC_EL,,EPSP2,FAC,SCALE_TEMP,
113 . E11,E22,E33,EPSF1,EPSF2,LAMBDA,UNIT_T,EPSP_UNIT
114 my_real,
DIMENSION(NEL) :: EPS11,EPS22,EPS33,EPS12,EPS23,EPS31,
115 . EPS_MAX,DAMAGE,RIEF1,RIEF2
123 scale_temp = uparam(7)
124 s_flag = int(uparam(8))
126 strdef = int(uparam(10))
136 IF (uvar(1,1) == zero)
THEN
142 IF (ifunc(2) > 0)
THEN
143 lambda = aldt(i) / el_ref
144 fac = sc_el * finter(ifunc(2),lambda,npf,tf,df)
150 IF (ifunc(2) > 0)
THEN
151 lambda = aldt(i) / el_ref
152 fac = sc_el * finter(ifunc(2),lambda,npf,tf,df)
162 IF (off(i) < em01) off(i)=zero
163 IF (off(i) < one) off(i)=off(i)*four_over_5
168 IF (strdef == 2)
THEN
169 IF (ismstr == 10 .or. ismstr == 12)
THEN
171 ELSE IF (ismstr == 0 .or. ismstr == 2 .or. ismstr == 4)
THEN
175 ELSE IF (strdef == 3)
THEN
176 IF (ismstr == 1 .or. ismstr == 3 .or. ismstr == 11)
THEN
179 ELSE IF (ismstr == 10 .or. ismstr == 12)
THEN
189 IF (strflag == 1)
THEN
195 eps12(i) = mfxy(i) + mfyx(i)
196 eps23(i) = mfzy(i) + mfyz(i)
197 eps31(i) = mfxz(i) + mfzx(i)
199 ELSE IF (strflag == 2)
THEN
202 eps11(i) = log(epsxx(i) + one)
203 eps22(i) = log(epsyy(i) + one)
204 eps33(i) = log(epszz(i) + one)
205 eps12(i) = log(epsxy(i) + one)
206 eps23(i) = log(epsyz(i) + one)
207 eps31(i) = log(epszx(i) + one)
209 ELSE IF (strflag == 3)
THEN
212 eps11(i) = log(epsxx(i) + one)
213 eps22(i) = log(epsyy(i) + one)
214 eps33(i) = log(epszz(i) + one)
215 eps12(i) = log(epsxy(i) + one)
216 eps23(i) = log(epsyz(i) + one)
217 eps31(i) = log(epszx(i) + one)
219 ELSE IF (strflag == 4)
THEN
222 eps11(i) = log(mfxx(i) + one)
223 eps22(i) = log(mfyy(i) + one)
224 eps33(i) = log(mfzz(i) + one)
225 eps12(i) = log(mfxy(i) + mfyx(i) + one)
226 eps23(i) = log(mfxz(i) + mfzx(i) + one)
227 eps31(i) = log(mfzy(i) + mfyz(i) + one)
230 eps11(1:nel) = epsxx(1:nel)
231 eps22(1:nel) = epsyy(1:nel)
232 eps33(1:nel) = epszz(1:nel)
233 eps12(1:nel) = epsxy(1:nel)
234 eps23(1:nel) = epsyz(1:nel)
235 eps31(1:nel) = epszx(1:nel)
239 IF (off(i) == one )
THEN
240 dav = (eps11(i)+eps22(i)+eps33(i))*third
250 c = (e1*e2 + e1*e3 + e2*e3) - e42 - e52 - e62
251 d = - e1*e2*e3 + e1*e52 + e2*e62 + e3*e42 - two*e4*e5*e6
255 y = (epst2 + c)* epst + d
256 y1 = -(epst2 + c)* epst + d
257 IF(abs(y) > em8 .OR.(abs(y) < em8 .AND. abs(y1) < abs(y)))
THEN
260 y = (epst2 + c)* epst + d
262 IF(yp /= zero)epst = epst - y/yp
264 y = (epst2 + c)* epst + d
266 IF(yp /= zero)epst = epst - y/yp
268 y = (epst2 + c)* epst + d
270 IF(yp /= zero)epst = epst - y/yp
273 y = (epst2 + c)* epst + d
275 IF(yp /= zero)epst = epst - y/yp
286 IF (off(i) == one)
THEN
288 IF (ifunc(1) > 0)
THEN
289 epsp_unit = epsp(i) * unit_t
290 rfac = finter(ifunc(1),epsp_unit,npf,tf,dydx)
291 rfac =
max(rfac,em20)
296 IF(eps_max(i) > r1.AND.r1 < r2)
THEN
297 IF (dfmax(i) == zero)
THEN
301 WRITE(iout, 2002) ngl(i),eps_max(i)
302 WRITE(istdo,2002) ngl(i),eps_max(i)
303#include "lockoff.inc"
305 damage(i)= (eps_max(i)-r1)/(r2-r1)
306 damage(i)=
min(one,damage(i))
308 IF (eps_max(i) >= r2)
THEN
315 WRITE(iout, 3000) ngl(i),eps_max
316 WRITE(istdo,3100) ngl(i),eps_max(i),time
317#include "lockoff.inc"
320 IF (epsp1 > zero .OR. epsp2 > zero)
THEN
333 i2 = e1*e2 + e2*e3 + e3*e1 - e4*e4 - e5*e5 - e6*e6
334 i3 = e1*e2*e3 - e1*e52 - e2*e62 - e3*e42 + two
336 q = (three*i2 - i1*i1)/nine
337 r = (two*i1*i1*i1-nine*i1*i2+twenty7*i3)/cinquante4
339 r_inter =
min(r/sqrt(
max(em20,(-q**3))),one)
340 phi = acos(
max(r_inter,-one))
342 e11 = two*sqrt(-q)*cos(phi/three)+third*i1
343 e22 = two*sqrt(-q)*cos((phi+two*pi)/three)+third*i1
344 e33 = two*sqrt(-q)*cos((phi+four*pi)/three)+third*i1
361 dfmax(i) =
min(one,(e11 / uvar(i,1)))
363 IF(e11 >= uvar(i,1))
THEN
370 WRITE(iout, 6000) ngl(i),e11
371 WRITE(istdo,6100) ngl(i),e11,time
372#include "lockoff.inc"
375 IF (uvar(i,1) < zero .AND. abs(e11) >= abs(uvar(i,1)))
THEN
382 WRITE(iout, 6000) ngl(i),e11
383 WRITE(istdo,6100) ngl(i),e11,time
384#include "lockoff.inc"
388 IF(abs(e22) >= epsp2)
THEN
395 WRITE(iout, 7000) ngl(i),e22
396 WRITE(istdo,7100) ngl(i),e22,time
397#include "lockoff.inc"
408 IF (strflag == 1)
THEN
414 eps12(i) = mfxy(i) + mfyx(i)
415 eps23(i) = mfzy(i) + mfyz(i)
416 eps31(i) = mfxz(i) + mfzx(i)
418 ELSE IF (strflag == 2)
THEN
421 eps11(i) = log(epsxx(i) + one)
422 eps22(i) = log(epsyy(i) + one)
423 eps33(i) = log(epszz(i) + one)
424 eps12(i) = log(epsxy(i) + one)
425 eps23(i) = log(epsyz(i) + one)
426 eps31(i) = log(epszx(i) + one)
428 ELSE IF (strflag == 3)
THEN
431 eps11(i) = log(epsxx(i) + one)
432 eps22(i) = log(epsyy(i) + one)
433 eps33(i) = log(epszz(i) + one)
434 eps12(i) = log(epsxy(i) + one)
435 eps23(i) = log(epsyz(i) + one)
436 eps31(i) = log(epszx(i) + one)
438 ELSE IF (strflag == 4)
THEN
441 eps11(i) = log(mfxx(i) + one)
442 eps22(i) = log(mfyy(i) + one)
443 eps33(i) = log(mfzz(i) + one)
444 eps12(i) = log(mfxy(i) + mfyx(i) + one)
445 eps23(i) = log(mfxz(i) + mfzx(i) + one)
446 eps31(i) = log(mfzy(i) + mfyz(i) + one)
449 eps11(1:nel) = epsxx(1:nel)
450 eps22(1:nel) = epsyy(1:nel)
451 eps33(1:nel) = epszz(1:nel)
452 eps12(1:nel) = epsxy(1:nel)
453 eps23(1:nel) = epsyz(1:nel)
454 eps31(1:nel) = epszx(1:nel)
458 IF (off(i) == one )
THEN
459 dav = (eps11(i)+eps22(i)+eps33(i))*third
469 c = (e1*e2 + e1*e3 + e2*e3) - e42 - e52 - e62
470 d = - e1*e2*e3 + e1*e52 + e2*e62 + e3*e42 - two*e4*e5*e6
474 y = (epst2 + c)* epst + d
475 y1 = -(epst2 + c)* epst + d
476 IF(abs(y) > em8 .OR.(abs(y) < em8 .AND. abs(y1) < abs(y)))
THEN
479 y = (epst2 + c)* epst + d
481 IF(yp /= zero)epst = epst - y/yp
483 y = (epst2 + c)* epst + d
485 IF(yp /= zero)epst = epst - y/yp
487 y = (epst2 + c)* epst + d
489 IF(yp /= zero)epst = epst - y/yp
492 y = (epst2 + c)* epst + d
494 IF(yp /= zero)epst = epst - y/yp
504 IF (off(i) == one)
THEN
507 epsp_unit = epsp(i) * unit_t
508 rfac = finter(ifunc(1),epsp_unit,npf,tf,dydx)
509 rfac =
max(rfac,em20)
512 rfac2 = finter(ifunc(3),tstar(i),npf,tf,dydx)
513 rfac2 =
max(rfac2,em20)
518 r2 = epsf2*rfac*rfac2*uvar(i,1)
525 IF (eps_max(i) >= r2)
THEN
532 WRITE(iout, 3000) ngl(i),eps_max(i)
533 WRITE(istdo,3100) ngl(i),eps_max(i),time
534#include "lockoff.inc"
542 IF (off(i) == one )
THEN
555 i2 = e1*e2 + e2*e3 + e3*e1 - e4*e4 - e5*e5 - e6
556 i3 = e1*e2*e3 - e1*e52 - e2*e62 - e3*e42 + two*e4*e5*e6
557 q = (three*i2 - i1*i1)/nine
558 r = (two*i1*i1*i1-nine*i1*i2+twenty7*i3)/cinquante4
560 r_inter =
min(r/sqrt(
max(em20,(-q**3))),one)
561 phi = acos(
max(r_inter,-one))
563 e11 = two*sqrt(-q)*cos(phi/three)+third*i1
564 e22 = two*sqrt(-q)*cos((phi+two*pi)/three)+third*i1
565 e33 = two*sqrt(-q)*cos((phi+four*pi)/three)+third*i1
567 IF (strflag == 1)
THEN
568 e11 = sqrt(e11 + one) - one
569 e22 = sqrt(e22 + one) - one
570 e33 = sqrt(e33 + one) - one
571 ELSE IF (strflag == 2)
THEN
575 ELSE IF (strflag == 3)
THEN
579 ELSE IF (strflag == 4)
THEN
580 e11 = log(sqrt(e11+one))
581 e22 = log(sqrt(e22+one))
582 e33 = log(sqrt(e33+one))
605 IF (off(i) == one )
THEN
608 IF (ifunc(1) > 0)
THEN
609 epsp_unit = epsp(i) * unit_t
610 rfac = finter(ifunc(1),epsp_unit,npf,tf,dydx)
611 rfac =
max(rfac,em20)
615 IF (ifunc(3) > 0)
THEN
616 rfac2 = finter(ifunc(3),tstar(i),npf,tf,dydx)
617 rfac2 =
max(rfac2,em20)
622 IF (eps_max(i) > r1 .AND. r1 < r2 .AND. eps_max(i) > zero)
THEN
623 IF (dfmax(i) == zero)
THEN
627 WRITE(iout, 2001) ngl(i),eps_max(i)
628 WRITE(istdo,2001) ngl(i),eps_max(i)
629#include "lockoff.inc"
631 damage(i) = (eps_max(i)-r1)/(r2-r1)
632 damage(i) =
min(one,damage(i))
634 IF (eps_max(i) >= r2 .AND. eps_max(i) > zero)
THEN
641 WRITE(iout, 6000) ngl(i),eps_max(i)
642 WRITE(istdo,6100) ngl(i),eps_max(i),time
643#include "lockoff.inc"
652 IF (nindxf > 0 .AND. imconv == 1)
THEN
655 WRITE(iout, 1000) ngl(indxf(j))
656 WRITE(istdo,1100) ngl(indxf(j)),time
657#include "lockoff.inc"
665 dmg_scale(i) = one - damage(i)
667 dfmax(i) =
max(dfmax(i),damage(i))
670 1000
FORMAT(1x,
'DELETE SOLID ELEMENT NUMBER ',i10)
671 1100
FORMAT(1x,
'DELETE SOLID ELEMENT NUMBER ',i10,
' AT TIME :',1pe20.13)
672 2001
FORMAT(1x,
'START DAMAGE (TENS) OF ELEMENT ',i10,
', 1st PRINCIPAL STRAIN = ',g11.4)
673 2002
FORMAT(1x,
'START DAMAGE (TENS) OF ELEMENT ',i10,
', EQUIVALENT STRAIN = ',g11.4)
674 3000
FORMAT(1x,
'FAILURE (TENS) OF ELEMENT ',i10,
', MAX EQUIVALENT STRAIN =',g11.4)
675 3100
FORMAT(1x,
'FAILURE (TENS) OF ELEMENT ',i10,
', MAX EQUIVALENT STRAIN =',g11.4,
676 .
' AT TIME :',1pe12.4)
677 6000
FORMAT(1x,
'FAILURE (TENS) OF ELEMENT ',i10,
', 1st PRINCIPAL STRAIN = ',g11.4)
678 6100
FORMAT(1x,
'FAILURE (TENS) OF ELEMENT ',i10,
', 1st PRINCIPAL STRAIN = ',g11.4,
679 .
' AT TIME :',1pe12.4)
680 7000
FORMAT(1x,
'FAILURE (TENS) OF ELEMENT ',i10,
', 2nd PRINCIPAL STRAIN = ',g11.4)
681 7100
FORMAT(1x,
'FAILURE (TENS) OF ELEMENT ',i10,
', 2nd PRINCIPAL STRAIN = ',g11.4,
682 .
' AT TIME :',1pe12.4)