40 . FAIL ,MAT_ID ,FAIL_ID ,IRUPT ,
41 . TITR ,LSUBMODEL,UNITAB )
57#include "implicit_f.inc"
65 INTEGER ,
INTENT(IN) :: FAIL_ID
66 INTEGER ,
INTENT(IN) :: MAT_ID
67 INTEGER ,
INTENT(IN) :: IRUPT
68 CHARACTER(LEN=NCHARTITLE) ,
INTENT(IN) :: TITR
71 TYPE(fail_param_) ,
INTENT(INOUT) :: FAIL
75 INTEGER :: NANGLE,I,J,K,INFO,REG_FUNC,MFLAG,SFLAG,RATE_FUNC,NFUNC,NUPARAM,NUVAR
76 INTEGER :: IPIV2(2),IPIV3(3)
77 INTEGER ,
PARAMETER :: NSIZE = 2
78 INTEGER ,
DIMENSION(NSIZE) :: IFUNC
79 my_real :: pthk,ref_siz,ref_siz_unit,epsd0,cjc,rate_scale,ref_rate_unit,
80 . r1,r2,r4,r5,c5,c5_min,theta_myreal
81 my_real,
DIMENSION(:),
ALLOCATABLE :: c1,c2,c3,c4,inst
82 DOUBLE PRECISION A_1(2,2),B_1(2),A_2(3,3),B_2(3),
83 . triax_1_lin,triax_2_lin,triax_3_lin,
84 . triax_4_lin,triax_5_lin,triax_1_quad,
85 . triax_2_quad,triax_3_quad,triax_4_quad,
86 . triax_5_quad,cos2(10,10),xmin,ymin
87 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE :: THETA,THETA_RAD,Q_X11,Q_X12,Q_X13,
89 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: X_1,X_2,AMAT,BVEC
90 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IPIV
91 LOGICAL :: IS_AVAILABLE,IS_ENCRYPTED
92 DATA triax_1_lin, triax_2_lin, triax_3_lin, triax_4_lin,
94 . / -0.33333333, 0.0, 0.33333333, 0.577350269, 0.66666667 /
95 DATA triax_1_quad, triax_2_quad, triax_3_quad,
96 . triax_4_quad, triax_5_quad
97 . / 0.11111111, 0.0, 0.11111111, 0.33333333, 0.44444444 /
100 1 1. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,
101 2 0. ,1. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,
102 3 -1. ,0. ,2. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,
103 4 0. ,-3. ,0. ,4. ,0. ,0. ,0. ,0. ,0. ,0. ,
104 5 1. ,0. ,-8. ,0. ,8. ,0. ,0. ,0. ,0. ,0. ,
105 6 0. ,5. ,0. ,-20. ,0. ,16. ,0. ,0. ,0. ,0. ,
106 7 -1. ,0. ,18. ,0. ,-48. ,0. ,32. ,0. ,0. ,0. ,
107 8 0. ,-7. ,0. ,56. ,0. ,-112.,0. ,64. ,0. ,0. ,
108 9 1. ,0. ,-32. ,0. ,160. ,0. ,-256.,0. ,128. ,0. ,
109 a 0. ,9. ,0. ,-120.,0. ,432. ,0. ,-576 ,0. ,256. /
111 is_encrypted = .false.
112 is_available = .false.
125 CALL hm_get_floatv (
'Pthk' ,pthk ,is_available,lsubmodel,unitab)
126 CALL hm_get_intv (
'MAT_MFLAG' ,mflag ,is_available,lsubmodel)
127 CALL hm_get_intv (
'MAT_SFLAG' ,sflag ,is_available,lsubmodel)
128 CALL hm_get_intv (
'MAT_refanglemax',nangle ,is_available,lsubmodel)
130 IF (nangle > 10)
THEN
131 CALL ancmsg(msgid=2015,msgtype=msgerror,
132 . anmode=aninfo_blind_1,i1=mat_id,c1=titr)
134 CALL hm_get_intv (
'fct_IDel' ,reg_func ,is_available,lsubmodel)
135 CALL hm_get_floatv (
'EI_ref' ,ref_siz ,is_available,lsubmodel,unitab)
137 IF (pthk == zero) pthk = one - em06
138 pthk =
min(pthk, one)
139 pthk =
max(pthk,-one)
140 IF (sflag == 0) sflag = 2
142 IF ((ref_siz == zero).AND.(reg_func > 0))
THEN
144 ref_siz = one*ref_siz_unit
150 CALL hm_get_floatv (
'MAT_C5' ,c5 ,is_available,lsubmodel,unitab)
151 CALL hm_get_floatv (
'MAT_EPSD0' ,epsd0 ,is_available,lsubmodel,unitab)
152 CALL hm_get_floatv (
'MAT_CJC' ,cjc ,is_available,lsubmodel,unitab)
153 CALL hm_get_intv (
'fct_IDrate',rate_func ,is_available,lsubmodel)
154 CALL hm_get_floatv (
'RATE_scale',rate_scale ,is_available,lsubmodel,unitab)
156 IF ((rate_scale == zero).AND.(rate_func > 0))
THEN
157 CALL hm_get_floatv_dim(
'RATE_scale' ,ref_rate_unit ,is_available, lsubmodel, unitab)
158 rate_scale = ref_rate_unit*one
160 IF (rate_func > 0)
THEN
166 IF (cjc == zero .OR. epsd0 == zero)
THEN
174 IF (.NOT.
ALLOCATED(c1))
ALLOCATE(c1(nangle))
175 IF (.NOT.
ALLOCATED(c2))
ALLOCATE(c2(nangle))
176 IF (.NOT.
ALLOCATED(c3))
ALLOCATE(c3(nangle))
177 IF (.NOT.
ALLOCATED(c4))
ALLOCATE(c4(nangle))
179 IF (.NOT.
ALLOCATED(inst))
ALLOCATE(inst(nangle))
192 IF (c3(j) == zero) c3(j) = 0.6d0
193 IF (c1(j) == zero .AND. c2(j) == zero .AND. c4(j) == zero .AND. c5 == zero)
THEN
197 c5_min =
min(c5_min,1.5d0*c3(j))
202 IF (inst(j) <= zero)
THEN
203 CALL ancmsg(msgid=2016,msgtype=msgwarning,
204 . anmode=aninfo_blind_1,i1=mat_id,c1=titr)
206 ELSEIF (inst(j) >= c4(j))
THEN
207 CALL ancmsg(msgid=2017,msgtype=msgwarning,
208 . anmode=aninfo_blind_1,i1=mat_id,c1=titr)
220 ELSEIF (mflag == 2)
THEN
225 ELSEIF (mflag == 3)
THEN
230 ELSEIF (mflag == 4)
THEN
235 ELSEIF (mflag == 5)
THEN
240 ELSEIF (mflag == 6)
THEN
245 ELSEIF (mflag == 7)
THEN
250 ELSEIF (mflag == 99)
THEN
251 CALL hm_get_floatv (
'MAT_R1' ,r1 ,is_available,lsubmodel,unitab)
252 CALL hm_get_floatv (
'MAT_R2' ,r2 ,is_available,lsubmodel,unitab)
253 CALL hm_get_floatv (
'MAT_R4' ,r4 ,is_available,lsubmodel,unitab)
254 CALL hm_get_floatv (
'MAT_R5' ,r5 ,is_available,lsubmodel,unitab)
265 IF (c3(j) == zero)
THEN
268 ELSEIF (mflag == 2)
THEN
270 ELSEIF (mflag == 3)
THEN
272 ELSEIF (mflag == 4)
THEN
274 ELSEIF (mflag == 5)
THEN
276 ELSEIF (mflag == 6)
THEN
278 ELSEIF (mflag == 7)
THEN
286 c5_min =
min(c5_min,r5*c3(j))
290 IF (inst(j) <= zero)
THEN
291 CALL ancmsg(msgid=2016,msgtype=msgwarning,
292 . anmode=aninfo_blind_1,i1=mat_id,c1=titr)
294 ELSEIF (inst(j) >= c4(j))
THEN
295 CALL ancmsg(msgid=2017,msgtype=msgwarning,
296 . anmode=aninfo_blind_1,i1=mat_id,c1=titr)
303 IF (c5 == zero) c5 = c5_min
307 IF (.NOT.
ALLOCATED(x_1))
ALLOCATE(x_1(nangle,3))
308 IF (.NOT.
ALLOCATED(x_2))
ALLOCATE(x_2(nangle,3))
316 a_1(1,1) = triax_1_lin
317 a_1(1,2) = triax_1_quad
318 a_1(2,1) = triax_3_lin
319 a_1(2,2) = triax_3_quad
320 b_1(1) = c1(j) - c2(j)
321 b_1(2) = c3(j) - c2(j)
324#ifndef WITHOUT_LINALG
325 CALL dgesv(2, 1, a_1, 2, ipiv2, b_1, 2, info)
327 WRITE(6,*)
"Error: Blas/Lapack required"
330 x_1(j,2:3) = b_1(1:2)
335 a_2(1,2) = triax_3_lin
336 a_2(1,3) = triax_3_quad
338 a_2(2,2) = triax_4_lin
339 a_2(2,3) = triax_4_quad
341 a_2(3,2) = triax_5_lin
342 a_2(3,3) = triax_5_quad
348#ifndef WITHOUT_LINALG
349 CALL dgesv(3, 1, a_2, 3, ipiv3, b_2, 3, info)
351 x_2(j,1:3) = b_2(1:3)
359 IF (.NOT.
ALLOCATED(theta))
ALLOCATE(theta(nangle))
360 IF (.NOT.
ALLOCATED(theta_rad))
ALLOCATE(theta_rad(nangle))
365 theta(j) = (j-1)*(90.0d0/(nangle-1))
366 theta_rad(j) = theta(j)*(pi/180.0d0)
373 xmin = -x_1(j,2)/(two*x_1(j,3))
374 ymin = x_1(j,3)*(xmin**2) + x_1(j,2)*xmin + x_1(j,1)
375 IF (ymin < zero)
THEN
376 theta_myreal = theta(j)
378 . msgtype=msgwarning,
379 . anmode=aninfo_blind_1,
388 xmin = -x_2(j,2)/(two*x_2(j,3))
389 ymin = x_2(j,3)*(xmin**2) + x_2(j,2)*xmin + x_2(j,1)
390 IF (ymin < zero)
THEN
391 theta_myreal = theta(j)
393 . msgtype=msgwarning,
394 . anmode=aninfo_blind_1,
405 ALLOCATE (amat(nangle,nangle),ipiv(nangle))
412 amat(j,i) = amat(j,i) + cos2(k,i)*(cos(two*theta_rad(j)))**(k-1)
418 ALLOCATE(q_x11(nangle),q_x12(nangle),q_x13(nangle),
419 . q_x21(nangle),q_x22(nangle),q_x23(nangle))
422 q_x11(1:nangle) = zero
423 q_x12(1:nangle) = zero
424 q_x13(1:nangle) = zero
425 q_x21(1:nangle) = zero
426 q_x22(1:nangle) = zero
427 q_x23(1:nangle) = zero
429 ALLOCATE(q_inst(nangle))
430 q_inst(1:nangle) = zero
435 ALLOCATE (bvec(nangle,7))
437 ALLOCATE (bvec(nangle,6))
439 bvec(1:nangle,1) = x_1(1:nangle,1)
440 bvec(1:nangle,2) = x_1(1:nangle,2)
441 bvec(1:nangle,3) = x_1(1:nangle,3)
442 bvec(1:nangle,4) = x_2(1:nangle,1)
443 bvec(1:nangle,5) = x_2(1:nangle,2)
444 bvec(1:nangle,6) = x_2(1:nangle,3)
445 IF (sflag == 3) bvec(1:nangle,7) = inst(1:nangle)
451#ifndef WITHOUT_LINALG
453 CALL dgesv(nangle, 7, amat, nangle, ipiv, bvec, nangle, info)
455 CALL dgesv(nangle, 6, amat, nangle, ipiv, bvec, nangle, info)
458 WRITE(6,*)
"Error: Blas/Lapack required"
462 q_x11(1:nangle) = bvec(1:nangle,1)
463 q_x12(1:nangle) = bvec(1:nangle,2)
464 q_x13(1:nangle) = bvec(1:nangle,3)
465 q_x21(1:nangle) = bvec(1:nangle,4)
466 q_x22(1:nangle) = bvec(1:nangle,5)
467 q_x23(1:nangle) = bvec(1:nangle,6)
468 IF (sflag == 3) q_inst(1:nangle) = bvec(1:nangle,7)
474 nuparam = nuparam + 7*nangle
476 nuparam = nuparam + 6*nangle
480 IF (rate_func /= 0)
THEN
482 ifunc(nfunc) = rate_func
484 IF (reg_func /= 0)
THEN
486 ifunc(nfunc) = reg_func
493 fail%KEYWORD =
'ORTH-BIQUAD'
495 fail%FAIL_ID = fail_id
496 fail%NUPARAM = nuparam
504 ALLOCATE (fail%UPARAM(fail%NUPARAM))
505 ALLOCATE (fail%IPARAM(fail%NIPARAM))
506 ALLOCATE (fail%IFUNC (fail%NFUNC))
507 ALLOCATE (fail%TABLE (fail%NTABLE))
509 fail%IFUNC(1:nfunc) = ifunc(1:nfunc)
511 fail%UPARAM(1) = pthk
512 fail%UPARAM(2) = sflag
513 fail%UPARAM(3) = ref_siz
514 fail%UPARAM(4) = epsd0
516 fail%UPARAM(6) = rate_scale
517 fail%UPARAM(7) = nangle
520 fail%UPARAM(8 + 7*(j-1)) = q_x11(j)
521 fail%UPARAM(9 + 7*(j-1)) = q_x12(j)
522 fail%UPARAM(10 + 7*(j-1)) = q_x13(j)
523 fail%UPARAM(11 + 7*(j-1)) = q_x21(j)
524 fail%UPARAM(12 + 7*(j-1)) = q_x22(j)
525 fail%UPARAM(13 + 7*(j-1)) = q_x23(j)
526 fail%UPARAM(14 + 7*(j-1)) = q_inst(j)
530 fail%UPARAM(8 + 6*(j-1)) = q_x11(j)
531 fail%UPARAM(9 + 6*(j-1)) = q_x12(j)
532 fail%UPARAM(10 + 6*(j-1)) = q_x13(j)
533 fail%UPARAM(11 + 6*(j-1)) = q_x21(j)
534 fail%UPARAM(12 + 6*(j-1)) = q_x22(j)
535 fail%UPARAM(13 + 6*(j-1)) = q_x23(j)
541 IF (is_encrypted)
THEN
542 WRITE(iout,
'(5X,A,//)')
'CONFIDENTIAL DATA'
545 IF (mflag /= 0)
WRITE(iout, 1100) mflag
547 WRITE(iout,1200) theta(j),c1(j),c2(j),c3(j),c4(j),c5,
548 & x_1(j,3),x_1(j,2),x_1(j,1),x_2(j,3),x_2(j,2),x_2(j,1)
549 IF (sflag == 3)
WRITE(iout, 1900) inst(j)
551 WRITE(iout,1300) pthk,sflag
552 IF (reg_func > 0)
WRITE(iout,1400) reg_func,ref_siz
553 IF (epsd0 > zero)
THEN
554 WRITE(iout,1500) epsd0,cjc
555 ELSEIF (rate_func > 0)
THEN
556 WRITE(iout,1600) rate_func,rate_scale
563 IF (
ALLOCATED(c1))
DEALLOCATE(c1)
564 IF (
ALLOCATED(c2))
DEALLOCATE(c2)
565 IF (
ALLOCATED(c3))
DEALLOCATE(c3)
566 IF (
ALLOCATED(c4))
DEALLOCATE(c4)
567 IF (
ALLOCATED(inst))
DEALLOCATE(inst)
568 IF (
ALLOCATED(x_1))
DEALLOCATE(x_1)
569 IF (
ALLOCATED(x_2))
DEALLOCATE(x_2)
570 IF (
ALLOCATED(theta))
DEALLOCATE(theta)
571 IF (
ALLOCATED(theta_rad))
DEALLOCATE(theta_rad)
572 IF (
ALLOCATED(q_x11))
DEALLOCATE(q_x11)
573 IF (
ALLOCATED(q_x12))
DEALLOCATE(q_x12)
574 IF (
ALLOCATED(q_x13))
DEALLOCATE(q_x13)
575 IF (
ALLOCATED(q_x21))
DEALLOCATE(q_x21)
576 IF (
ALLOCATED(q_x22))
DEALLOCATE(q_x22)
577 IF (
ALLOCATED(q_x23))
DEALLOCATE(q_x23)
578 IF (
ALLOCATED(q_inst))
DEALLOCATE(q_inst)
579 IF (
ALLOCATED(amat))
DEALLOCATE(amat)
580 IF (
ALLOCATED(ipiv))
DEALLOCATE(ipiv)
583 & 5x,
' ------------------------------------------ ',/
584 & 5x,
' FAILURE CRITERION : ORTHOTROPIC BIQUAD ',/,
585 & 5x,
' ------------------------------------------ ',/)
587 & 5x,
'MATERIAL PARAMETER SELECTOR . . . . . . . . . . .=',i10)
589 & 5x,
'|| FAILURE STRAINS FOR ANGLE',f5.1,
' DEG',/,
590 & 5x,
' -------------------------------------------------',/,
591 & 5x,
' SIMPLE COMPRESSION C1 . . . . . . . . . . . . .=',1pg20.13/
592 & 5x,
' SHEAR C2 . . . . . . . . . . . . . . . . . . . .=',1pg20.13/
593 & 5x,
' SIMPLE TENSION C3 . . . . . . . . . . . . . . .=',1pg20.13/
594 & 5x,
' PLANE STRAIN C4 . . . . . . . . . . . . . . . .=',1pg20.13/
595 & 5x,
' BIAXIAL TENSION C5 . . . . . . . . . . . . . . .=',1pg20.13/
597 & 5x,
' LOW STRESS TRIAXIALITY PARABOLA PARAMETER A. . .=',1pg20.13/
598 & 5x,
' LOW STRESS TRIAXIALITY PARABOLA PARAMETER B. . .=',1pg20.13/
599 & 5x,
' LOW STRESS TRIAXIALITY PARABOLA PARAMETER C. . .=',1pg20.13/
601 & 5x,
' HIGH STRESS TRIAXIALITY PARABOLA PARAMETER D . .=',1pg20.13/
602 & 5x,
' HIGH STRESS TRIAXIALITY PARABOLA PARAMETER E . .=',1pg20.13/
603 & 5x,
' HIGH STRESS TRIAXIALITY PARABOLA PARAMETER F . .=',1pg20.13/)
605 & 5x,
'ELEMENT DELETION :',/,
606 & 5x,
'SHELL ELEMENT DELETION PARAMETER PTHICKFAIL. . . .=',1pg20.13,/,
607 & 5x,
' > 0.0 : FRACTION OF FAILED THICKNESS ',/,
608 & 5x,
' < 0.0 : FRACTION OF FAILED INTG. POINTS OR LAYERS',/,
609 & 5x,
'S-FLAG . . . . . . . . . . . . . . . . . . . . . .='
611 & 5x,
'ELEMENT LENGTH REGULARIZATION USED:',/,
612 & 5x,
'REGULARIZATION FUNCTION ID . . . . . . . . . . . .=',i10,/,
613 & 5x,
'REFERENCE ELEMENT LENGTH . . . . . . . . . . . . .=',1pg20.13,/)
615 & 5x,
'JOHNSON-COOK STRAIN-RATE DEPENDENCY:',/,
616 & 5x,
'REFERENCE STRAIN-RATE . . . . . . . . . . . . . .=',1pg20.13,/,
617 & 5x,
'JOHNSON-COOK PARAMETER . . . . . . . . . . . . . .=',1pg20.13,/)
619 & 5x,
'TABULATED STRAIN-RATE DEPENDENCY:',/,
620 & 5x,
'STRAIN-RATE DEPENDENCY FUNCTION ID . . . . . . . .=',i10,/,
621 & 5x,
'STRAIN-RATE SCALE FACTOR . . . . . . . . . . . . .=',1pg20.13,/)
623 & 5x,
' INSTABILITY STRAIN . . . . . . . . . . . . . . .=',1pg20.13,//)
625 & 5x,
' --------------------------------------------------',//)