35 1 NEL ,NUVAR ,NFUNC ,IFUNC ,NPF ,
36 2 TF ,TIME ,UPARAM ,RHO0 ,
37 3 EPSPXX ,EPSPYY ,EPSPZZ ,EPSPXY ,EPSPYZ ,EPSPZX ,
38 4 EPSXX ,EPSYY ,EPSZZ ,EPSXY ,EPSYZ ,EPSZX ,
39 5 SIGOXX ,SIGOYY ,SIGOZZ ,SIGOXY ,SIGOYZ ,SIGOZX ,
40 5 SIGNXX ,SIGNYY ,SIGNZZ ,SIGNXY ,SIGNYZ ,SIGNZX ,
41 6 SOUNDSP,VISCMAX,UVAR ,NVARTMP ,VARTMP ,ISMSTR ,
42 7 ISRATE ,ASRATE ,OFFG ,IHET ,ET ,EPSD ,
47 use file_descriptor_mod
51#include "implicit_f.inc"
96 INTEGER,
INTENT(IN) :: NEL,NUVAR,ISMSTR,ISRATE,IHET
97 INTEGER,
INTENT(IN) :: NVARTMP,NGL()
99 my_real
INTENT(IN)DIMENSION(NEL)
105 my_real,
INTENT(IN) :: time,uparam(*),asrate
109 my_real,
INTENT(OUT)::
110 . signxx(nel),signyy(nel),signzz(nel),
111 . signxy(nel),signyz(nel),signzx(nel),
112 . soundsp(nel),viscmax(nel),et(nel),epsd(nel),off(nel)
116 my_real,
INTENT(INOUT) :: uvar(nel,nuvar)
117 INTEGER,
DIMENSION(NEL,NVARTMP),
INTENT(INOUT) :: VARTMP
121 INTEGER,
INTENT(IN) :: NPF(*), NFUNC, IFUNC(NFUNC)
122 my_real,
INTENT(IN) :: TF(*)
126 INTEGER :: I,J,K,II,KK,I1,J1,J2,IFLAG,IDAM,NE_L,,TFLAG,NINDX,
128 INTEGER :: ILOAD(MVSIZ,3),INDX_L(MVSIZ),INDX_UNL(MVSIZ),INDX(MVSIZ),
130 INTEGER ,
DIMENSION(NEL) :: IAD,ILEN,IPOS,JJ,UNLOAD
132 . e0,aa,g,nu,shape,hys,
133 . yfac1,yfacj1,yfacj2,ratej1,ratej2, epse,ep1,
134 . ep2,ep3,ep4,ep5,ep6,ert11,ert12,ert13,ert21,
135 . ert22,ert23,ert31,ert32,ert33,sj1,sj2,fac,t1,t2,t3,
136 . dam,epe,e_min(mvsiz),delta,
alpha,tcut,de,rateeps,
137 . deps,e_max,e_new,e_old,epss,tcut0
138 my_real :: df(3),epsp(3)
140 my_real ,
DIMENSION(NEL) :: dydx,stmp1,stmp2
141 my_real,
DIMENSION(NEL,3) :: strain,strainrate,s,sqstat
142 my_real,
DIMENSION(NEL,2) :: rate,yfac
143 my_real,
DIMENSION(MVSIZ) :: quasi_eint,emax,emin,
145 . yld(mvsiz),epst(mvsiz)
146 my_real,
DIMENSION(MVSIZ,6) :: av
147 my_real,
DIMENSION(MVSIZ,6) :: evv,ev
148 my_real,
DIMENSION(MVSIZ,3,3) :: dirprv
159 e_max = uparam(2*nfunc + 11)
160 alpha = uparam(2*nfunc + 13)
161 tflag = uparam(2*nfunc + 14)
162 fail = nint(uparam(2*nfunc + 15))
163 tcut0 = uparam(2*nfunc + 16)
165 IF(time == zero )
THEN
176 indx_print(1:nel) = 0
178 IF(off(i) == zero )
THEN
186 aa = e_old*(one-nu)/(one + nu)/(one - two*nu)
187 soundsp(i) = sqrt(aa/rho0(i))
188 ELSEIF(off(i) < one )
THEN
189 off(i) = off(i)*four_over_5
190 signxx(i) = sigoxx(i)*off(i)
191 signyy(i) = sigoyy(i)*off(i)
192 signzz(i) = sigozz(i)*off(i)
193 signxy(i) = sigoxy(i)*off(i)
194 signyz(i) = sigoyz(i)*off(i)
195 signzx(i) = sigozx(i)*off(i)
196 IF(off(i) < em01)
THEN
205 aa = e_old*(one-nu)/(one + nu)/(one - two*nu
206 soundsp(i) = sqrt(aa/rho0(i))
208 nindx_print = nindx_print + 1
209 indx_print(nindx_print) = i
217 IF (nindx_print > 0)
THEN
220 WRITE(iout, 1000) ngl(indx_print(j))
221 WRITE(istdo,1100) ngl(indx_print(j)),time
222#include "lockoff.inc"
225 IF(nindx == 0 )
RETURN
228#include "vectorize.inc"
234 av(n,4) = half*epsxy(i
235 av(n,5) = half*epsyz(i
236 av(n,6) = half*epszx(i)
249 IF(ismstr==0.OR.ismstr==2.OR.ismstr==4)
THEN
250#include "vectorize.inc"
254 ev(n,1)=exp(evv(n,1))
255 ev(n,2)=exp(evv(n,2))
256 ev(n,3)=exp(evv(n,3))
258 ELSEIF(ismstr==10.OR.ismstr==12)
THEN
261 IF(offg(i)<=one)
THEN
262 ev(n,1)=sqrt(evv(n,1) + one )
263 ev(n,2)=sqrt(evv(n,2) + one )
264 ev(n,3)=sqrt(evv(n,3) + one )
266 ev(n,1)=evv(n,1)+ one
267 ev(n,2)=evv(n,2)+ one
268 ev(n,3)=evv(n,3)+ one
273#include "vectorize.inc"
276 ev(n,1)=evv(n,1) + one
277 ev(n,2)=evv(n,2) + one
278 ev(n,3)=evv(n,3) + one
282#include "vectorize.inc"
287 strain(i,1) = one - ev(i,1)
288 strain(i,2) = one - ev(i,2)
289 strain(i,3) = one - ev(i,3)
291 epst(i) = sqrt(strain(i,1)**2 + strain(i,2)**2 + strain(i,3)**2)
296 ep4 = half*epspxy(ii)
297 ep5 = half*epspyz(ii)
298 ep6 = half*epspzx(ii)
300 ert11 =dirprv(i,1,1)*ep1 + dirprv(i,2,1)*ep4 + dirprv(i,3,1)*ep6
301 ert12 =dirprv(i,1,2)*ep1 + dirprv(i,2,2)*ep4 + dirprv(i,3,2)*ep6
302 ert13 =dirprv(i,1,3)*ep1 + dirprv(i,2,3)*ep4 + dirprv(i,3,3)*ep6
304 ert21 =dirprv(i,1,1)*ep4 + dirprv(i,2,1)*ep2 + dirprv(i,3,1)*ep5
305 ert22 =dirprv(i,1,2)*ep4 + dirprv(i,2,2)*ep2 + dirprv(i,3,2)*ep5
306 ert23 =dirprv(i,1,3)*ep4 + dirprv(i,2,3)*ep2 + dirprv(i,3,3)*ep5
308 ert31 =dirprv(i,1,1)*ep6 + dirprv(i,2,1)*ep5 + dirprv(i,3,1)*ep3
309 ert32 =dirprv(i,1,2)*ep6 + dirprv(i,2,2)*ep5 + dirprv(i,3,2)*ep3
310 ert33 =dirprv(i,1,3)*ep6 + dirprv(i,2,3)*ep5 + dirprv(i,3,3)*ep3
312 epsp(1) = dirprv(i,1,1)*ert11 + dirprv(i,2,1)*ert21
313 . + dirprv(i,3,1)*ert31
314 epsp(2) = dirprv(i,1,2)*ert12 + dirprv(i,2,2)*ert22
315 . + dirprv(i,3,2)*ert32
316 epsp(3) = dirprv(i,1,3)*ert13 + dirprv(i,2,3)*ert23
317 . + dirprv(i,3,3)*ert33
319 strainrate(i,1) = epsp(1)*(one - strain(i,1))
320 strainrate(i,2) = epsp(2)*(one - strain(i,2))
321 strainrate(i,3) = epsp(3)*(one - strain(i,3))
325 yfac1 = uparam(nfunc + 11)
326 quasi_eint(1:nindx)= zero
332 ipos(i) = vartmp(ii,kk)
333 iad(i) = npf(ifunc(1)) / 2 + 1
334 ilen(i) = npf(ifunc(1)+1) / 2 - iad(i) - ipos(i)
336 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,sqstat(1,k))
340 vartmp(ii,kk) = ipos(i)
341 sqstat(i,k) = yfac1 * sqstat(i,k)
345 IF (tflag == 2 .AND. strain(i,k) < zero ) sqstat(i,k) = e0*strain(i,k)
346 quasi_eint(i) = quasi_eint(i) + half*strain(i,k)*sqstat(i,k)
352 deint(i) = quasi_eint(i) - uvar(ii,9)
353 uvar(ii,9) = quasi_eint(i)
360 epe = epsp(k)*strain(i,k)
362 IF(epe > em10 )iload(i,k) = -1
369 rateeps = sqrt(strainrate(i,1)**2 + strainrate(i,2)**2 + strainrate(i,3)**2)
371 rateeps = asrate*rateeps + (one - asrate)*uvar(ii,3)
377 indx_unl(1:nindx) = 0
384 deps = epst(i) - uvar(ii,6)
386 IF(deint(i) >= zero .OR. deps >= zero)
THEN
389 uvar(ii,3) = epsd(ii)
391 epsd(ii) =
min(epsd(ii), uvar(ii,3))
394 uvar(ii,3) = epsd(ii)
397 strainrate(i,1) = epsd(ii)
398 strainrate(i,2) = epsd(ii)
399 strainrate(i,3) = epsd(ii)
406 yfac1 = uparam(nfunc + 11)
417 ipos(i) = vartmp(ii,kk)
418 iad(i) = npf(ifunc(1)) / 2 + 1
419 ilen(i) = npf(ifunc(1)+1) / 2 - iad(i) - ipos(i)
421 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,s(1,k))
424 s(i,k) = yfac1 * s(i,k)
425 IF (tflag == 2 .AND. strain(i,k) < zero ) s(i,k) = e0*strain(i,k)
426 emax(i) =
max(emax(i), yfac1*dydx(i))
427 emin(i) =
max(emin(i), yfac1*dydx(i))
428 vartmp(ii,kk) = ipos(i)
435 yld(i) = sqrt(s(i,1)**2 + s(i,2)**2 + s(i,3)**2)
447 IF (strainrate(i,k) >= uparam(10 + j)) jj
452 rate(i,2) = uparam(10 + jj(i)+1)
453 yfac(i,1) = uparam(10 + nfunc + jj(i))
454 yfac(i,2) = uparam(10 + nfunc + jj(i)+1)
460 kk = (k-1)*nfunc + j1
461 ipos(i) = vartmp(ii,kk)
462 iad(i) = npf(ifunc(j1)) / 2 + 1
463 ilen(i) = npf(ifunc(j1)+1) / 2 - iad(i) - ipos(i)
465 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,stmp1)
469 kk = (k-1)*nfunc + jj(i)
470 stmp1(i) = yfac(i,1) * stmp1(i)
471 emax(i) =
max(emax(i), yfac(i,1)*dydx(i))
472 emin(i) =
max(emin(i), yfac(i,1)*dydx(i))
473 vartmp(ii,kk) = ipos(i)
479 kk = (k-1)*nfunc + j2
480 ipos(i) = vartmp(ii,kk)
481 iad(i) = npf(ifunc(j2)) / 2 + 1
482 ilen(i) = npf(ifunc(j2)+1) / 2 - iad(i) - ipos(i)
484 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,stmp2)
488 kk = (k-1)*nfunc + jj(i)+1
489 stmp2(i) = yfac(i,2) * stmp2(i)
490 emax(i) =
max(emax(i), yfac(i,2)*dydx(i))
491 emin(i) =
max(emin(i), yfac(i,2)*dydx(i))
492 vartmp(ii,kk) = ipos(i)
496 fac = (strainrate(i,k) - rate(i,1)) / (rate(i,2) - rate(i,1))
497 s(i,k) = stmp1(i) + fac*(stmp2(i) - stmp1(i))
498 IF (tflag == 2 .AND. strain(i,k) < zero ) s(i,k) = e0*strain(i,k)
504 e(i) =
max(e0,emax(i))
507 yld(i) = sqrt(s(i,1)**2 + s(i,2)**2 + s(i,3)**2)
516 yfac1 = uparam(nfunc + 11)
528 iad(i) = npf(ifunc(1)) / 2 + 1
529 ipos(i) = vartmp(ii,kk)
530 ilen(i) = npf(ifunc(1)+1) / 2 - iad(i) - ipos(i)
533 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,sqstat(1,k))
537 sqstat(i,k) = yfac1 * sqstat(i,k)
538 IF (tflag == 2 .AND. strain(i,k) < zero) sqstat(i,k) = e0*strain(i,k)
541 emin(i) =
min(emin(i), yfac1*dydx(i))
543 ecurent(i) = ecurent(i) + half*strain(i,k)*sqstat(i,k)
544 vartmp(ii,kk) = ipos(i)
550 e(i) =
max(e0,emax(i))
552 yld(i) = sqrt(s(i,1)**2 + s(i,2)**2 + s(i,3)**2)
555 ELSEIF (nfunc > 1)
THEN
557 yfac1 = uparam(nfunc + 11)
568 iad(i) = npf(ifunc(1)) / 2 + 1
569 ipos(i) = vartmp(ii,kk)
570 ilen(i) = npf(ifunc(1)+1) / 2 - iad(i) - ipos(i)
573 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,stmp1)
578 sqstat(i,k) = yfac1*stmp1(i)
579 IF (tflag == 2 .AND. strain(i,k) < zero ) sqstat(i,k) = e0*strain(i,k)
581 emax(i) =
max(emax(i), yfac1*dydx(i))
582 emin(i) =
min(emin(i), yfac1*dydx(i))
584 ecurent(i) = ecurent(i) + half*strain(i,k)*sqstat(i,k)
585 vartmp(ii,kk) = ipos(i)
591 IF (strainrate(i,k) >= uparam(10 + j)) jj(i) = j
595 rate(i,1) = uparam(10 + jj(i))
596 rate(i,2) = uparam(10 + jj(i)+1)
597 yfac(i,1) = uparam(10 + nfunc + jj(i))
598 yfac(i,2) = uparam(10 + nfunc + jj(i)+1)
604 kk = (k-1)*nfunc + j1
605 ipos(i) = vartmp(ii,kk)
606 iad(i) = npf(ifunc(j1)) / 2 + 1
607 ilen(i) = npf(ifunc(j1)+1) / 2 - iad(i) - ipos(i)
609 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,stmp1)
614 kk = (k-1)*nfunc + j1
615 vartmp(ii,kk) = ipos(i)
616 stmp1(i) = yfac(i,1) * stmp1(i)
617 emax(i) =
max(emax(i), yfac(i,1)*dydx(i))
618 emin(i) =
max(emin(i), yfac(i,1)*dydx(i))
624 kk = (k-1)*nfunc + j2
625 ipos(i) = vartmp(ii,kk)
626 iad(i) = npf(ifunc(j2)) / 2 + 1
627 ilen(i) = npf(ifunc(j2)+1) / 2 - iad(i) - ipos(i)
629 CALL vinter2(tf,iad,ipos,ilen,nindx,strain(1,k),dydx,stmp2)
633 kk = (k-1)*nfunc + j2
634 vartmp(i,kk) = ipos(i)
635 stmp2(i) = yfac(i,2) * stmp2(i)
636 emax(i) =
max(emax(i), yfac(i,2)*dydx(i))
637 emin(i) =
max(emin(i), yfac(i,2)*dydx(i))
638 vartmp(ii,kk) = ipos(i)
643 fac = (strainrate(i,k) - rate(i,1)) / (rate(i,2) - rate(i,1))
645 IF (tflag == 2 .AND. strain(i,k) < zero ) s(i,k) = e0*strain(i,k)
652 e(i) =
max(e0,emax(i))
655 yld(i) = sqrt(s(i,1)**2 + s(i,2)**2 + s(i,3)**2)
660#include "vectorize.inc"
663 delta = epst(n) - uvar(i,6)
664 uvar(i,4) = uvar(i,4) + half*(yld(n) + uvar(i,1))*delta
665 uvar(i,4) =
max(zero, uvar(i,4))
669 ecurent(n) = uvar(i,4)
674#include "vectorize.inc"
678 IF (uvar(i,2) > zero)
THEN
679 dam = one - (ecurent(ii)/uvar(i,2))**shape
681 dam = one - (one - hys)*dam
693#include
"vectorize.inc"
697 IF (uvar(i,2) > zero)
THEN
698 dam = one - (ecurent(ii)/uvar(i,2))**shape
699 dam = one - (one - hys)*dam
702 IF(iload(ii,k) < 0)s(ii,k) = dam*s(ii,k)
711#include "vectorize.inc"
719 IF(t1 >= tcut0 .OR. t2 >= tcut0 .OR. t3 >= tcut0 ) off(ii) = four_over_5
720 t1 = t1/ev(i,2)/ev(i,3)
721 t2 = t2/ev(i,1)/ev(i,3)
722 t3 = t3/ev(i,1)/ev(i,2)
726 signxx(ii) = dirprv(i,1,1)*dirprv(i,1,1)*t1
727 . + dirprv(i,1,2)*dirprv(i,1,2)*t2
728 . + dirprv(i,1,3)*dirprv(i,1,3)*t3
730 signyy(ii) = dirprv(i,2,2)*dirprv(i,2,2)*t2
731 . + dirprv(i,2,3)*dirprv(i,2,3)*t3
732 . + dirprv(i,2,1)*dirprv(i,2,1)*t1
734 signzz(ii) = dirprv(i,3,3)*dirprv(i,3,3)*t3
735 . + dirprv(i,3,1)*dirprv(i,3,1)*t1
736 . + dirprv(i,3,2)*dirprv(i,3,2)*t2
737 signxy(ii) = dirprv(i,1,1)*dirprv(i,2,1)*t1
738 . + dirprv(i,1,2)*dirprv(i,2,2)*t2
739 . + dirprv(i,1,3)*dirprv(i,2,3)*t3
741 signyz(ii) = dirprv(i,2,2)*dirprv(i,3,2)*t2
742 . + dirprv(i,2,3)*dirprv(i,3,3)*t3
743 . + dirprv(i,2,1)*dirprv(i,3,1)*t1
745 signzx(ii) = dirprv(i,3,3)*dirprv(i,1,3)*t3
746 . + dirprv(i,3,1)*dirprv(i,1,1)*t1
747 . + dirprv(i,3,2)*dirprv(i,1,2)*t2
751 epss = epst(i) - yld(i)/ e_old
752 epss =
max(zero, epss)
753 epss =
min(one, epss)
755 de = aa*(epss - uvar(ii,10))
757 e_new=
min(e_max, e_new)
760 aa = e_new*(one-nu)/(one + nu)/(one - two*nu)
761 soundsp(ii) = sqrt(aa/rho0(ii))
764 ELSEIF(fail == 0)
THEN
765#include "vectorize.inc"
774 IF(unload(i) == 1 ) tcut = uvar(ii,7)*tcut0
778 t1 = t1/ev(i,2)/ev(i,3)
780 t3 = t3/ev(i,1)/ev(i,2)
784 signxx(ii) = dirprv(i,1,1)*dirprv(i,1
785 . + dirprv(i,1,2)*dirprv(i,1,2)*t2
786 . + dirprv(i,1,3)*dirprv(i,1,3)*t3
788 signyy(ii) = dirprv(i,2,2)*dirprv(i,2,2)*t2
789 . + dirprv(i,2,3)*dirprv(i,2,3)*t3
790 . + dirprv(i,2,1)*dirprv(i,2,1)*t1
792 signzz(ii) = dirprv(i,3,3)*dirprv(i,3,3)*t3
793 . + dirprv(i,3,1)*dirprv(i,3,1)*t1
794 . + dirprv(i,3,2)*dirprv(i,3,2)*t2
795 signxy(ii) = dirprv(i,1,1)*dirprv(i,2,1)*t1
796 . + dirprv(i,1,2)*dirprv(i,2,2)*t2
797 . + dirprv(i,1,3)*dirprv(i,2,3)*t3
799 signyz(ii) = dirprv(i,2,2)*dirprv(i,3,2)*t2
800 . + dirprv(i,2,3)*dirprv(i,3,3)*t3
801 . + dirprv(i,2,1)*dirprv(i,3,1)*t1
803 signzx(ii) = dirprv(i,3,3)*dirprv(i,1,3)*t3
804 . + dirprv(i,3,1)*dirprv(i,1,1)*t1
805 . + dirprv(i,3,2)*dirprv(i,1,2)*t2
808 epss = epst(i) - yld(i)/ e_old
809 epss =
max(zero, epss)
810 epss =
min(one, epss)
812 de = aa*(epss - uvar(ii,10))
814 e_new=
min(e_max, e_new)
817 aa = e_new*(one-nu)/(one + nu)/(one - two*nu)
818 soundsp(ii) = sqrt(aa/rho0(ii))
823 IF (impl_s > 0 .OR. ihet > 1)
THEN
824#include
"vectorize.inc"
827 et(i) = yld(n)/
max(em20,epst(n))
828 et(i) =
min(one , et(i)/e_max)
829 IF(et(i) == zero) et(i) = one
833 1000
FORMAT(1x,
'TCUT REACHED, DELETED SOLID ELEMENT ',i10)
834 1100
FORMAT(1x,
'TCUT REACHED, DELETED SOLID ELEMENT ',i10,1x,
'AT TIME :',1pe12.4)