c J. Grogan, 2012 c ------------------------------------------------------------------- subroutine vusdfld( * nblock,nstatev,nfieldv,nprops,ndir,nshr,jElem,kIntPt, * kLayer,kSecPt,stepTime,totalTime,dt,cmname,coordMp, * direct,T,charLength,props,stateOld,stateNew,field) c include 'vaba_param.inc' c dimension jElem(nblock),stateNew(nblock,nstatev), * field(nblock,nfieldv),stateOld(nblock,nstatev), * charLength(nblock),rPEEQ(maxblk,1), * Stress(nblock*6),jData(nblock*6), * eigVal(nblock,3),coordMp(nblock,3) c ------------------------------------------------------------------- c Common blocks store element status and random number assigment. common active(600000) common rnum(600000) common ibcheck integer active integer rnum integer ibcheck character*256 outdir c if (ibcheck/=5)then call vgetoutdir(outdir,lenoutdir) open(unit=105,file=outdir(1:lenoutdir)//'/NBOPTP.inc', * status='old') do while (ioe==0) read(105,*,iostat=ioe)ielnum,frnum if(ioe==0)rnum(ielnum)=frnum enddo close(unit=105) ibcheck=5 endif do k=1,nblock c ------------------------------------------------------------------- c Update SDVs do i=1,7 stateNew(k,i)=stateOld(k,i) enddo stateNew(k,11)=stateOld(k,11) c ------------------------------------------------------------------- c Determine Characteristic Element Length damage=stateOld(k,8) if(steptime<2.*dt)then randE=rnum(statenew(k,1)) else randE=stateOld(k,9) endif activeE=stateOld(k,10) c ------------------------------------------------------------------- c Check if element is on exposed surface. do i=2,7 nNum=stateNew(k,i) if(nNum==0.)cycle if(active(nNum)==1)then activeE=1. if(rnum(nNum)*0.94>randE)randE=rnum(nNum)*0.94 endif enddo c ------------------------------------------------------------------- c Recover Corrosion Parameters ukinetic=0.000025d0 c randE=1.d0 if(activeE>0.99d0)then if(totaltime>1.5d0)then dam_inc=(ukinetic/charlength(k))*randE*dt damage=damage+dam_inc endif endif c ------------------------------------------------------------------- c Remove Fully Damaged Elements if(damage>=0.999)then damage=1.d0 stateNew(k,11)=0.d0 active(statenew(k,1))=1.d0 rnum(statenew(k,1))=randE endif c ------------------------------------------------------------------- stateNew(k,8)=damage field(k,1)=damage stateNew(k,9)=randE stateNew(k,10)=activeE c ------------------------------------------------------------------- end do return end subroutine vusdfld subroutine vuanisohyper_inv(nblock,nFiber,nInv,jElem,kIntPt, * kLayer,kSecPt,cmname,nstatev, nfieldv, nprops,props,tempOld, * tempNew,fieldOld,fieldNew,stateOld,sInvariant,zeta,uDev,duDi, * d2uDiDi,stateNew) c include 'vaba_param.inc' c dimension props(nprops),tempOld(nblock), * fieldOld(nblock,nfieldv),stateOld(nblock,nstatev), * tempNew(nblock), fieldNew(nblock,nfieldv), * stateNew(nblock,nstatev),sInvariant(nblock,nInv), * zeta(nblock,nFiber*(nFiber-1)/2),uDev(nblock), * duDi(nblock,nInv),d2uDiDi(nblock,nInv*(nInv+1)/2) c parameter(zero = 0.d0, one = 1.d0, two = 2.d0, three = 3.d0) common active(600000) common rnum(600000) common ibcheck integer active integer rnum integer ibcheck c Material Properties u = props(1) rkap = props(2) rk1 = props(3) rk2 = props(4) rp = props(5) c c Loop Over Each Element do k = 1,nblock c Index Each Invariant according to Abaqus Convention i1 = 1 i1i1 = 1 i3 = 3 i3i3 = 6 i4 = 4 i1i4 = 7 i4i4 = 10 i6 = 8 i1i6 = 29 i6i6 = 36 c Get Values of each Invariant ri1 = sinvariant(k,i1) ri4 = sinvariant(k,i4) ri6 = sinvariant(k,i6) c Get Fibre Contributions to UDEV t = (one - rp) * (ri1 - three) * (ri1 - three) if(ri4>1.)then t1 = rk2 * (t + rp * (ri4 - one) * (ri4 - one)) else t1=0. endif if(ri6>1.)then t2 = rk2 * (t + rp * (ri6 - one) * (ri6 - one)) else t2=0. endif et1 = exp(t1) et2 = exp(t2) term1 = rk1 / (two * rk2) ufibres = term1 * (et1 + et2 - two) c Get UDEV udev(k) = u * (ri1 - three) + ufibres c Get dUdI1 dt1di1 = rk2 * two * (one - rp) * (ri1 - three) dudi(k,i1) = term1 * dt1di1 * (et1 + et2) + u c Get dUdI4 and dUdI6 if(ri4>1.)then dt1di4 = rk2 * two * rp * (ri4 - one) else dt1di4 = 0. endif if(ri6>1.)then dt2di6 = rk2 * two * rp * (ri6 - one) else dt2di6 = 0. endif dudi(k,i4) = term1 * dt1di4 * et1 dudi(k,i6) = term1 * dt2di6 * et2 c Get d2UdI1dI1 d2t1di1di1 = rk2 * two * (one - rp) d2udidi(k,i1i1) = term1 * (d2t1di1di1 + dt1di1 * dt1di1) d2udidi(k,i1i1) = d2udidi(k,i1i1) * (et1 + et2) c Get d2UdI1dI4 and d2UdI4dI4 d2udidi(k,i1i4) = term1 * dt1di4 * dt1di1 * et1 d2t1di4di4 = rk2 * two * rp d2udidi(k,i4i4) = term1 * (dt1di4 * dt1di4 + d2t1di4di4) d2udidi(k,i4i4) = d2udidi(k,i4i4) * et1 c Get d2UdI1dI6 and d2UdI6dI6 d2udidi(k,i1i6) = term1 * dt2di6 * dt1di1 * et2 d2t2di6di6 = rk2 * two * rp d2udidi(k,i6i6) = term1 * (dt2di6 * dt2di6 + d2t2di6di6) d2udidi(k,i6i6) = d2udidi(k,i6i6) * et2 end do c For the compressible case if(rkap > zero) then do k = 1,nblock rj = sInvariant(k,i3) dudi(k,i3) = rkap * (rj-one) c duDi(k,i3) = (rkap/two) * (rj - one/rj) d2udidi(k,i3i3) = rkap c d2uDiDi(k,i3i3)= (rkap/two) * (one + one/ rj / rj) end do end if return end