首页/文章/ 详情

适合HCP mg合金的黄永刚umat的晶体塑性

24天前浏览237
参考文献:《Computational micromechanics of bioabsorbable magnesium stents》
文章的子程序中考虑了孪晶的影响,感兴趣的可以下载调试。子程序如下(部分子函数可以参考):

       subroutine umat(stress,statev,ddsdde,sse,spd,scd,rpl,

     1 ddsddt,drplde,drpldt,stran,dstran,time,dtime,

     2 temp,dtemp,predef,dpred,cmname,ndi,nshr,ntens,

     3 nstatv,props,nprops,coords,drot,pnewdt,celent,

     4 dfgrd0,dfgrd1,noel,npt,layer,kspt,kstep,kinc)

c

include 'aba_param.inc'

c modified from huang umat- jg:20/07/12

c *******************************************************************

c - only suitable for finite deformation isotropic elasticity 

c with fcc and hcp crystal slip.

c - most parameters are now hard-coded. 

c - most documentation from original umat removed.

c - constants converted to double precision

c - direction vectors must be orthogonal unit vectors

c *******************************************************************

parameter (zero=0.d0, one=1.d0, two=2.d0) 

character*8 cmname

dimension stress(ntens),statev(nstatv),ddsdde(ntens,ntens), 

     1          dstran(ntens),props(nprops),drot(3,3) 

dimension ispdir(3),ispnor(3),slpdir(3,18),slpnor(3,18),

     1          slpdef(6,18),slpspn(3,18),dspdir(3,18),dspnor(3,18),

     2          d(6,6),rotate(3,3),fslip(18),dfdxsp(18),ddemsd(6,18),

     3          h(18,18),ddgdde(18,6),dstres(6),delats(6),dspin(3),   

     4          dvgrad(3,3),dgamma(18),dtausp(18),dgslip(18),

     5          workst(18,18),indx(18),term(3,3),trm0(3,3),itrm(3)    

dimension fslip1(18),stres1(6),gamma1(18),tausp1(18),gslp1(18), 

     1         spnor1(3,18),spdir1(3,18),ddsde1(6,6),dsold(6), 

     2          dgamod(18),dtauod(18),dgspod(18),dspnro(3,18), 

     3          dspdro(3,18),dhdgdg(18,18),rwkdir(3,24),rwknor(3,24), 

     3 indxL(3),termd(3),termn(3),gamma(18),tauslpL(18)  

C-----  Elastic matrix in GLOBAL system

        gshear = props(1)/(2.*(1.+props(2)))

        e11 = 2.*gshear*(one-props(2))/(1.-2.*props(2))

        e12 = 2.*gshear*props(2)/(1.-2.*props(2))

d = 0.

do j = 1,3

            d(j,j) = e11

            do i = 1,3

                if(i.ne.j) d(i,j) = e12

            end do

d(j+3,j+3) = gshear

        end do

c------ Crystal Type:

ictype=nint(props(9))

if(ictype == 1)then

c FCC

nslptl = 12

elseif(ictype == 2)then

C HCP - Basal and Prism

nslptl = 6

elseif(ictype == 3)then

c HCP - Basal, Prism, Pyr

nslptl = 12

else

c HCP - Basal, Prism, Pyr, Twin

nslptl = 18

endif

adot=0.001

C-----  Implicit integration parameter: THETA

theta = 0.5

C-----  Iteration

itrmax = 1

gamerr = 1.e-5

nitrtn = -1

c

dsold = zero

dgamod = zero

dtauod = zero

dgspod = zero

dspnro = zero

dspdro = zero

C-----  Increment of spin associated with the material element: DSPIN

        do j = 1,3

            do i = 1,3

               term(i,j) = drot(j,i)

               trm0(i,j) = drot(j,i)

            end do

            term(j,j) = term(j,j)+one

            trm0(j,j) = trm0(j,j)-one

        end do

        call ludcmp(term, 3, 3, itrm, ddcmp)

        do j = 1,3

            call lubksb(term, 3, 3, itrm, trm0(1,j))

        end do

        dspin(1) = trm0(2,1)-trm0(1,2)

        dspin(2) = trm0(1,3)-trm0(3,1)

        dspin(3) = trm0(3,2)-trm0(2,3)

C-----  Increment of dilatational strain: DEV

dev = zero

do i = 1,ndi

dev = dev+dstran(i)

end do

C-----  Iteration starts

1000   continue

nitrtn = nitrtn+1

C-----  Check whether the current stress state is the initial state

if (statev(1) == 0.) then 

if (ictype == 1)then

c-----   generating all possible slip directions for fcc

rwkdir = 1./sqrt(2.)

do j = 1,6

do i = 1,3

if (i.eq.j.or.j-i.eq.3)rwkdir(i,j) = 0.

end do

end do

rwkdir(1,6) = -rwkdir(1,6)

rwkdir(2,4) = -rwkdir(2,4)

rwkdir(3,5) = -rwkdir(3,5)  

c-----   generating all possible slip planes for fcc

rwknor = 1./sqrt(3.)

do i = 1,3

do j = 1,4

if (j.eq.i+1)rwknor(i,j) = -rwknor(i,j)

end do

end do

c------ Generating all slip systems for FCC

nslip = 0

do j = 1,4

do i = 1,6

rdot = 0.

do k = 1,3

rdot = rdot+rwkdir(k,i)*rwknor(k,j)

end do

if (rdot.eq.0.) then

nslip = nslip+1

do k = 1,3

slpdir(k,nslip) = rwkdir(k,i)

slpnor(k,nslip) = rwknor(k,j)

end do

end if

end do

end do

else

c-----   generating slip directions and normals for hcp-basal

rwkdir = 0.

rwknor = 0.

angle = acos(-1.)/3.

cangle = cos(angle)

sangle = sin(angle)

rwkdir(1,1) = 1.

rwkdir(2,1) = 0.

rwkdir(1,2) = cangle

rwkdir(2,2) = sangle

rwkdir(1,3) = -cangle

rwkdir(2,3) = sangle

rwknor(3,1) = 1.

rwknor(3,2) = 1.

rwknor(3,3) = 1.

do i = 1,3

do k = 1,3

slpdir(k,i) = rwkdir(k,i)

slpnor(k,i) = rwknor(k,i)

enddo

enddo

c-----   generating slip directions and normals for hcp-prismatic

rwknor = 0.

rwknor(1,1) = 0.

rwknor(2,1) = -1.

rwknor(1,2) = sangle

rwknor(2,2) = -cangle

rwknor(1,3) = -sangle

rwknor(2,3) = -cangle

do i = 4,6

do k = 1,3

slpdir(k,i) = rwkdir(k,i-3)

slpnor(k,i) = rwknor(k,i-3)

enddo

enddo

endif

if(ictype >= 3)then

c ##### 2nd order pyramidal <a+c> #####

aspect = 1.624

c slip directions

do j = 1,6

rwkdir(3,j) = aspect

enddo

rwkdir(1,1) = -cangle

rwkdir(2,1) = -sangle

rwkdir(1,2) = cangle

rwkdir(2,2) = -sangle

rwkdir(1,3) = -2.*cangle

rwkdir(2,3) = 0.

do j = 4,6

rwkdir(1,j) = -rwkdir(1,j-3)

rwkdir(2,j) = -rwkdir(2,j-3)

enddo

rlength=sqrt(1.+aspect*aspect)

do j = 1,6

do i = 1,3

rwkdir(i,j) = rwkdir(i,j)/rlength

enddo

enddo

c slip normals

do j = 1,6

rwknor(3,j) = 4.*sangle*cangle

enddo

rwknor(1,1) = aspect*sangle

rwknor(2,1) = 3.*aspect*cangle

rwknor(1,2) = -aspect*sangle

rwknor(2,2) = 3.*aspect*cangle

rwknor(1,3) = 2.*aspect*sangle

rwknor(2,3) = 0.

do j = 4,6

rwknor(1,j) = -rwknor(1,j-3)

rwknor(2,j) = -rwknor(2,j-3)

enddo

rlength=sqrt(3.*(1.+aspect*aspect))

do j = 1,6

do i = 1,3

rwknor(i,j) = rwknor(i,j)/rlength

enddo

enddo

nslip = 6

do j = 1,6

nslip = nslip+1

do i = 1,3

slpdir(i,nslip) = rwkdir(i,j)

slpnor(i,nslip) = rwknor(i,j)

enddo

enddo

if(ictype == 4)then

c ###### twinning planes #####

c slip directions

do j = 1,6

rwkdir(3,j) = aspect

enddo

rwkdir(1,1) = 0.

rwkdir(2,1) = -2.*sangle

rwkdir(1,2) = -3.*cangle

rwkdir(2,2) = -1.*sangle

rwkdir(1,3) = -3.*cangle

rwkdir(2,3) = 1.*sangle

do j = 4,6

rwkdir(1,j) = -rwkdir(1,j-3)

rwkdir(2,j) = -rwkdir(2,j-3)

enddo

rlength=sqrt(3.+aspect*aspect)

do j = 1,6

do i = 1,3

rwkdir(i,j) = rwkdir(i,j)/rlength

enddo

enddo

c slip normals

do j = 1,6

rwknor(3,j) = 4.*sangle*cangle

enddo

rwknor(1,1) = 0.

rwknor(2,1) = 2.*aspect*cangle

rwknor(1,2) = aspect*sangle

rwknor(2,2) = aspect*cangle

rwknor(1,3) = aspect*sangle

rwknor(2,3) = -aspect*cangle

do j = 4,6

rwknor(1,j) = -rwknor(1,j-3)

rwknor(2,j) = -rwknor(2,j-3)

enddo

do j = 1,6

do i = 1,3

rwknor(i,j) = rwknor(i,j)/rlength

enddo

enddo

do j = 1,6

nslip = nslip+1

do i = 1,3

slpdir(i,nslip) = rwkdir(i,j)

slpnor(i,nslip) = rwknor(i,j)

enddo

enddo

endif

endif

C-----   Unit vectors in slip dirs and unit norms-Global system

c-----   Generate rotation matrix

do i = 1,3

term(i,1) = props(i+2)

term(i,2) = props(i+5)

enddo

term(1,3) = term(2,1)*term(3,2)-term(3,1)*term(2,2)

term(2,3) = term(3,1)*term(1,2)-term(1,1)*term(3,2)

term(3,3) = term(1,1)*term(2,2)-term(2,1)*term(1,2)

call ludcmp (term, 3, 3, indxL, dcmp)

rotate = 0.

do j = 1,3

do i = 1,3

if (i.eq.j)rotate(i,j) = 1.

end do

end do

do j = 1,3

call lubksb (term, 3, 3, indxL, rotate(1,j))

end do

c--- Rotate slip normals and directions to global system

do j = 1,nslptl

do i = 1,3

termd(i) = 0.

termn(i) = 0.

do k = 1,3

termd(i) = termd(i)+rotate(i,k)*slpdir(k,j)

termn(i) = termn(i)+rotate(i,k)*slpnor(k,j)

end do

end do

do i = 1,3

slpdir(i,j) = termd(i)

slpnor(i,j) = termn(i)

end do

end do

C-----   Get Slip deformation tensor: SLPDEF (Schmid factors)

do j=1,nslptl

slpdef(1,j)=slpdir(1,j)*slpnor(1,j)

slpdef(2,j)=slpdir(2,j)*slpnor(2,j)

slpdef(3,j)=slpdir(3,j)*slpnor(3,j)

slpdef(4,j)=slpdir(1,j)*slpnor(2,j)

     1 +slpdir(2,j)*slpnor(1,j)

slpdef(5,j)=slpdir(1,j)*slpnor(3,j)

     1 +slpdir(3,j)*slpnor(1,j)

slpdef(6,j)=slpdir(2,j)*slpnor(3,j)

     1 +slpdir(3,j)*slpnor(2,j)

end do

C-----   Store normals and directions

statev(nstatv)=nslptl

idnor=3*nslptl

iddir=6*nslptl

do j=1,nslptl

do i=1,3

idnor=idnor+1

iddir=iddir+1

statev(idnor)=slpnor(i,j)

statev(iddir)=slpdir(i,j)

end do

end do

C-----   Initial value of the current strength for all slip systems

do j=1,nslptl

if(ictype == 1)then

statev(j)=props(10)

else

if(j<=3)then

statev(j)=props(10)

elseif(j<=6)then

statev(j)=props(13)

elseif(j<=12)then

statev(j)=props(16)

else

statev(j)=props(19)

endif

endif

enddo

C-----   Initial value of shear strain in slip systems

do i=1,nslptl

statev(nslptl+i)=0.

end do

statev(9*nslptl+1)=0.

C-----   Initial value of the resolved shear stress in slip systems

do i=1,nslptl

term1=0.

do j=1,ntens

if (j.le.ndi) then

term1=term1+slpdef(j,i)*stress(j)

else

term1=term1+slpdef(j-ndi+3,i)*stress(j)

end if

end do

statev(2*nslptl+i)=term1

end do

else

C-----   Current stress state

idnor=3*nslptl

iddir=6*nslptl

do j=1,nslptl

do i=1,3

idnor=idnor+1

iddir=iddir+1

slpnor(i,j)=statev(idnor)

slpdir(i,j)=statev(iddir)

end do

end do

C-----   Slip deformation tensor: SLPDEF (Schmid factors)

do j=1,nslptl

slpdef(1,j)=slpdir(1,j)*slpnor(1,j)

slpdef(2,j)=slpdir(2,j)*slpnor(2,j)

slpdef(3,j)=slpdir(3,j)*slpnor(3,j)

slpdef(4,j)=slpdir(1,j)*slpnor(2,j)

     1 +slpdir(2,j)*slpnor(1,j)

slpdef(5,j)=slpdir(1,j)*slpnor(3,j)

     1 +slpdir(3,j)*slpnor(1,j)

slpdef(6,j)=slpdir(2,j)*slpnor(3,j)

     1 +slpdir(3,j)*slpnor(2,j)

end do

end if

C-----  Slip spin tensor: SLPSPN 

        do j=1,nslptl

            slpspn(1,j)=0.5*(slpdir(1,j)*slpnor(2,j)-

     2                       slpdir(2,j)*slpnor(1,j))

            slpspn(2,j)=0.5*(slpdir(3,j)*slpnor(1,j)-

     2                       slpdir(1,j)*slpnor(3,j))

            slpspn(3,j)=0.5*(slpdir(2,j)*slpnor(3,j)-

     2                       slpdir(3,j)*slpnor(2,j))

        end do

C-----  Double dot product of elastic moduli tensor with the slip 

C     deformation tensor

do j=1,nslptl

do i=1,6

ddemsd(i,j)=0.

do k=1,6

ddemsd(i,j)=ddemsd(i,j)+d(k,i)*slpdef(k,j)

end do

end do

end do

        do j=1,nslptl

            ddemsd(4,j)=ddemsd(4,j)-slpspn(1,j)*stress(1)

            ddemsd(5,j)=ddemsd(5,j)+slpspn(2,j)*stress(1)

            if (ndi.gt.1) then

               ddemsd(4,j)=ddemsd(4,j)+slpspn(1,j)*stress(2)

               ddemsd(6,j)=ddemsd(6,j)-slpspn(3,j)*stress(2)

            end if

            if (ndi.gt.2) then

               ddemsd(5,j)=ddemsd(5,j)-slpspn(2,j)*stress(3)

               ddemsd(6,j)=ddemsd(6,j)+slpspn(3,j)*stress(3)

            end if

            if (nshr.ge.1) then

               ddemsd(1,j)=ddemsd(1,j)+slpspn(1,j)*stress(ndi+1)

               ddemsd(2,j)=ddemsd(2,j)-slpspn(1,j)*stress(ndi+1)

               ddemsd(5,j)=ddemsd(5,j)-slpspn(3,j)*stress(ndi+1)

               ddemsd(6,j)=ddemsd(6,j)+slpspn(2,j)*stress(ndi+1)

            end if

            if (nshr.ge.2) then

               ddemsd(1,j)=ddemsd(1,j)-slpspn(2,j)*stress(ndi+2)

               ddemsd(3,j)=ddemsd(3,j)+slpspn(2,j)*stress(ndi+2)

               ddemsd(4,j)=ddemsd(4,j)+slpspn(3,j)*stress(ndi+2)

               ddemsd(6,j)=ddemsd(6,j)-slpspn(1,j)*stress(ndi+2)

            end if

            if (nshr.eq.3) then

               ddemsd(2,j)=ddemsd(2,j)+slpspn(3,j)*stress(ndi+3)

               ddemsd(3,j)=ddemsd(3,j)-slpspn(3,j)*stress(ndi+3)

               ddemsd(4,j)=ddemsd(4,j)-slpspn(2,j)*stress(ndi+3)

               ddemsd(5,j)=ddemsd(5,j)+slpspn(1,j)*stress(ndi+3)

            end if

        end do

C-----  Shear strain-rate in a slip system at the start of increment:

do i=1,nslptl

tauslp=statev(2*nslptl+i)

if(i>=13.and.tauslp<=0)then

yield=1.e6

else

yield=statev(i)

endif

x=tauslp/yield

fslip(i)=adot*((abs(x))**50.)*dsign(1.d0,x)

dfdxsp(i)=50.*adot*(abs(x))**(50.-1.0)

end do

C-----  Self- and latent-hardening

do i=1,nslptl

gamma(i)=statev(nslptl+1)

enddo

gamtol=statev(9*nslptl+1)

do iself = 1,nslptl

do latent = 1,nslptl

if(ictype == 1)then

c FCC

term1 = props(12)*gamtol/(props(11)-props(10))

term2 = 2.*exp(-term1)/

     * (1.+exp(-2.*term1))

hlatnt = props(12)*term2**2

else

C BASAL

if(iself <= 3)then

if(latent <= 3)then

q = 0.2

else

q = 0.5

endif

if(iself == latent)q = 1.

hlatnt = q*props(12)

C PRISM

elseif(iself <= 6)then

if(latent <= 12)then

q = 0.2

else

q = 0.5

endif

if(iself == latent)q = 1.

hlatnt = q*props(15)*(1.d0-(props(13)/

     * props(14)))*exp(-props(15)*(gamtol/

     * props(14)))

C PYRM  

elseif(iself <= 12)then

if(latent <= 6)then

q = 1.

elseif(latent <= 12)then

q = 0.2

else

q = 0.25

endif

if(iself == latent)q = 1.

hlatnt = q*props(18)*(1.d0-props(16)/

     * props(17))*exp(-props(18)*gamtol/

     * props(17))

C TWIN  

else

if(latent <= 6)then

q = 1.

else

q = 0.2

endif

if(iself == latent)q = 1.

if(gamtol <= props(21))then

hlatnt = q*props(20)

else

hlatnt = q*props(20)*((gamtol/props(21))

     * **(props(22)-1.))

endif

endif

endif

h(iself,latent) = hlatnt  

enddo

end do  

C-----  Solve the increment of shear strain in a slip system  

term1=theta*dtime

do i=1,nslptl

tauslp=statev(2*nslptl+i)

if(i>=13.and.tauslp<=0)then

yield=1.e6

else

yield=statev(i)

endif

gslip=yield

x=tauslp/gslip

term2=term1*dfdxsp(i)/gslip

term3=term1*x*dfdxsp(i)/gslip

do j=1,nslptl

term4=0.

do k=1,6

term4=term4+ddemsd(k,i)*slpdef(k,j)

end do

workst(i,j)=term2*term4+h(i,j)*term3*dsign(1.d0,fslip(j))

if(nitrtn.gt.0)workst(i,j)=workst(i,j)+term3*dhdgdg(i,j)

end do

workst(i,i)=workst(i,i)+1.

end do

call ludcmp (workst, nslptl, 18, indx, ddcmp)

c-----  increment of shear strain in a slip system: dgamma

term1=theta*dtime

do i=1,nslptl

if (nitrtn.eq.0) then

tauslp=statev(2*nslptl+i)

if(i>=13.and.tauslp<=0)then

yield=1.e6

else

yield=statev(i)

endif

gslip=yield

x=tauslp/gslip

term2=term1*dfdxsp(i)/gslip

dgamma(i)=0.

do j=1,ndi

dgamma(i)=dgamma(i)+ddemsd(j,i)*dstran(j)

end do

if (nshr.gt.0) then

do j=1,nshr

dgamma(i)=dgamma(i)+ddemsd(j+3,i)*dstran(j+ndi)

end do

end if

dgamma(i)=dgamma(i)*term2+fslip(i)*dtime

else

dgamma(i)=term1*(fslip(i)-fslip1(i))+fslip1(i)*dtime

     2                -dgamod(i)

end if

end do

call lubksb (workst, nslptl, 18, indx, dgamma)

do i=1,nslptl

dgamma(i)=dgamma(i)+dgamod(i)

end do

c-----  update the shear strain in a slip system: 

do i=1,nslptl

statev(nslptl+i)=statev(nslptl+i)+dgamma(i)-dgamod(i)

end do

C-----  Increment of current strength in a slip system: DGSLIP

do i=1,nslptl

dgslip(i)=0.

do j=1,nslptl

dgslip(i)=dgslip(i)+h(i,j)*abs(dgamma(j))

end do

end do  

C-----  Update the current strength in a slip system:

do i=1,nslptl

statev(i)=statev(i)+dgslip(i)-dgspod(i)

end do

C-----  Increment of strain associated with lattice stretching: DELATS

do j=1,6

delats(j)=0.

end do

do j=1,3

if (j.le.ndi) delats(j)=dstran(j)

do i=1,nslptl

delats(j)=delats(j)-slpdef(j,i)*dgamma(i)

end do

end do

do j=1,3

if (j.le.nshr) delats(j+3)=dstran(j+ndi)

do i=1,nslptl

delats(j+3)=delats(j+3)-slpdef(j+3,i)*dgamma(i)

end do

end do

C-----  Increment of deformation gradient associated with lattice stretching

        do j=1,3

            do i=1,3

if (i.eq.j) then

dvgrad(i,j)=delats(i)

else

dvgrad(i,j)=delats(i+j+1)

end if

            end do

        end do

        do j=1,3

            do i=1,j

if (j.gt.i) then

ij2=i+j-2

if (mod(ij2,2).eq.1) then

term1=1.

else

term1=-1.

end if

dvgrad(i,j)=dvgrad(i,j)+term1*dspin(ij2)

dvgrad(j,i)=dvgrad(j,i)-term1*dspin(ij2)

do k=1,nslptl

dvgrad(i,j)=dvgrad(i,j)-term1*dgamma(k)*

     2                                       slpspn(ij2,k)

dvgrad(j,i)=dvgrad(j,i)+term1*dgamma(k)*

     2                                       slpspn(ij2,k)

end do

end if

            end do

        end do

C-----  Increment of resolved shear stress in a slip system: DTAUSP

do i=1,nslptl

dtausp(i)=0.

do j=1,6

dtausp(i)=dtausp(i)+ddemsd(j,i)*delats(j)

end do

end do

C-----  Update the resolved shear stress in a slip system: 

do i=1,nslptl

statev(2*nslptl+i)=statev(2*nslptl+i)+dtausp(i)-dtauod(i)

end do

C-----  Increment of stress: DSTRES

        do i=1,ntens

            dstres(i)=-stress(i)*dev

        end do

do i=1,ndi

do j=1,ndi

dstres(i)=dstres(i)+d(i,j)*dstran(j)

end do

if (nshr.gt.0) then

do j=1,nshr

dstres(i)=dstres(i)+d(i,j+3)*dstran(j+ndi)

end do

end if

do j=1,nslptl

dstres(i)=dstres(i)-ddemsd(i,j)*dgamma(j)

end do

end do

if (nshr.gt.0) then

do i=1,nshr

do j=1,ndi

dstres(i+ndi)=dstres(i+ndi)+d(i+3,j)*dstran(j)

end do

do j=1,nshr

dstres(i+ndi)=dstres(i+ndi)+d(i+3,j+3)*dstran(j+ndi)

end do

do j=1,nslptl

dstres(i+ndi)=dstres(i+ndi)-ddemsd(i+3,j)*dgamma(j)

end do

end do

end if

C-----  Update the stress: STRESS

do i=1,ntens

stress(i)=stress(i)+dstres(i)-dsold(i)

end do

C-----  Increment of normal to a slip plane and a slip direction 

        do j=1,nslptl

            do i=1,3

               dspnor(i,j)=0.

               dspdir(i,j)=0.

               do k=1,3

                  dspnor(i,j)=dspnor(i,j)-slpnor(k,j)*dvgrad(k,i)

                  dspdir(i,j)=dspdir(i,j)+slpdir(k,j)*dvgrad(i,k)

               end do

            end do

        end do

C-----  Update the normal to a slip plane and a slip direction

        idnor=3*nslptl

        iddir=6*nslptl

        do j=1,nslptl

            do i=1,3

               idnor=idnor+1

               statev(idnor)=statev(idnor)+dspnor(i,j)-dspnro(i,j)

               iddir=iddir+1

               statev(iddir)=statev(iddir)+dspdir(i,j)-dspdro(i,j)

            end do

        end do

C-----  Derivative of shear strain increment in a slip system w.r.t. 

C     strain increment: DDGDDE

term1=theta*dtime

do i=1,ntens

do j=1,nslptl

tauslp=statev(2*nslptl+j)

if(j>=13.and.tauslp<=0)then

yield=1.e6

else

yield=statev(j)

endif

gslip=yield

x=tauslp/gslip

term2=term1*dfdxsp(j)/gslip

if (i.le.ndi) then

ddgdde(j,i)=term2*ddemsd(i,j)

else

ddgdde(j,i)=term2*ddemsd(i-ndi+3,j)

end if

end do

call lubksb (workst, nslptl, 18, indx, ddgdde(1,i))

end do

C-----  Derivative of stress increment w.r.t. strain increment

C-----  Jacobian matrix: elastic part

do j=1,ntens

do i=1,ntens

ddsdde(i,j)=0.

end do

end do

do j=1,ndi

do i=1,ndi

ddsdde(i,j)=d(i,j)

ddsdde(i,j)=ddsdde(i,j)-stress(i)

end do

end do

if (nshr.gt.0) then

do j=1,nshr

do i=1,nshr

ddsdde(i+ndi,j+ndi)=d(i+3,j+3)

end do

do i=1,ndi

ddsdde(i,j+ndi)=d(i,j+3)

ddsdde(j+ndi,i)=d(j+3,i)

ddsdde(j+ndi,i)=ddsdde(j+ndi,i)-stress(j+ndi)

end do

end do

end if

C-----  Jacobian matrix: plastic part (slip)

do j=1,ndi

do i=1,ndi

do k=1,nslptl

ddsdde(i,j)=ddsdde(i,j)-ddemsd(i,k)*ddgdde(k,j)

end do

end do

end do

if (nshr.gt.0) then

do j=1,nshr

do i=1,nshr

do k=1,nslptl

ddsdde(i+ndi,j+ndi)=ddsdde(i+ndi,j+ndi)-

     2                        ddemsd(i+3,k)*ddgdde(k,j+ndi)

end do

end do

do i=1,ndi

do k=1,nslptl

ddsdde(i,j+ndi)=ddsdde(i,j+ndi)-

     2                            ddemsd(i,k)*ddgdde(k,j+ndi)

ddsdde(j+ndi,i)=ddsdde(j+ndi,i)-

     2                            ddemsd(j+3,k)*ddgdde(k,i)

end do

end do

end do

end if

do j=1,ntens

do i=1,ntens

ddsdde(i,j)=ddsdde(i,j)/(1.+dev)

end do

end do

C-----  Save solutions (without iteration):

if (nitrtn.eq.0) then

idnor=3*nslptl

iddir=6*nslptl

do j=1,nslptl

tauslp=statev(2*nslptl+j)

if(j>=13.and.tauslp<=0)then

yield=1.e6

else

yield=statev(j)

endif

fslip1(j)=fslip(j)

gslp1(j)=yield

gamma1(j)=statev(nslptl+j)

tausp1(j)=statev(2*nslptl+j)

do i=1,3

idnor=idnor+1

spnor1(i,j)=statev(idnor)

iddir=iddir+1

spdir1(i,j)=statev(iddir)

end do

end do

do j=1,ntens

stres1(j)=stress(j)

do i=1,ntens

ddsde1(i,j)=ddsdde(i,j)

end do

end do

end if

C-----  Increments of stress DSOLD, and solution dependent state 

C     variables DGAMOD, DTAUOD, DGSPOD, DSPNRO, DSPDRO (for the next 

C     iteration)

do i=1,ntens

dsold(i)=dstres(i)

end do

do j=1,nslptl

dgamod(j)=dgamma(j)

dtauod(j)=dtausp(j)

dgspod(j)=dgslip(j)

do i=1,3

dspnro(i,j)=dspnor(i,j)

dspdro(i,j)=dspdir(i,j)

end do

end do

C-----  Check if the iteration solution converges

idback=0

        do j=1,nslptl

tauslp=statev(2*nslptl+j)

if(j>=13.and.tauslp<=0)then

yield=1.e6

else

yield=statev(j)

endif

            x=statev(2*nslptl+j)/yield

temp=(abs(x))**(50)

f=adot*temp*dsign(1.d0,x)

            residu=theta*dtime*f+dtime*(1.0-theta)*

     2                fslip1(j)-dgamma(j)

            if (abs(residu).gt.gamerr) idback=1

        end do

if (idback.ne.0.and.nitrtn.lt.itrmax) then

do i=1,nslptl

gamma(i)=statev(nslptl+1)

enddo

gamtol=statev(9*nslptl+1)

do iself = 1,nslptl

do kderiv = 1,nslptl

dhdgdg(iself,kderiv) = 0.

do latent = 1,nslptl

if(ictype == 1)then

c FCC

term1 = props(12)*gamtol/

     * (props(11)-props(10))

term2 = 2.*exp(-term1)/

     * (1.+exp(-2.*term1))

term3 = props(12)/(props(11)-props(10))

     * *dsign(1.d0,gamma(kderiv))

dhlatn = -2.*props(12)*term2**2

     * *tanh(term1)*term3

else

C BASAL

if(iself <= 3)then

dhlatn = 0.

C PRISM

elseif(iself <= 6)then

if(latent <= 12)then

q = 0.2

else

q = 0.5

endif

if(iself == latent)q = 1.

hlatnt = q*props(15)*(1.d0-(props(13)/

     * props(14)))*exp(-props(15)*(gamtol/

     * props(14)))

dhlatn = q*(-props(15)/props(14))*

     * dsign(1.d0,gamma(kderiv))*hlatnt

C PYRM  

elseif(iself <= 12)then

if(latent <= 6)then

q = 1.

elseif(latent <= 12)then

q = 0.2

else

q = 0.25

endif

if(iself == latent)q = 1.

hlatnt = q*props(18)*(1.d0-(props(16)/

     * props(17)))*exp(-props(18)*(gamtol/

     * props(17)))

dhlatn = q*(-props(18)/props(17))*

     * dsign(1.d0,gamma(kderiv))*hlatnt

C TWIN  

else

if(latent <= 6)then

q = 1.

else

q = 0.2

endif

if(iself == latent)q = 1.

if(gamtol <= props(21))then

dhlatn = 0.

else

dhlatn = q*dsign(1.d0,gamma(kderiv))*

     * (props(20)/(props(21)**(props(22)-1.)))

     * *(props(22)-1.)*(gamtol**(props(22)-2.))

endif

endif

endif

dhdgdg(iself,kderiv) =

     * dhdgdg(iself,kderiv)+dhlatn*

     * abs(dgamod(latent)) 

end do

enddo

end do  

go to 1000

elseif (nitrtn.ge.itrmax) then

C-----   Solution not converge within maximum number of iteration (the 

C     solution without iteration will be used)

do j=1,ntens

stress(j)=stres1(j)

do i=1,ntens

ddsdde(i,j)=ddsde1(i,j)

end do

end do

idnor=3*nslptl

iddir=6*nslptl

do j=1,nslptl

statev(j)=gslp1(j)

statev(nslptl+j)=gamma1(j)

statev(2*nslptl+j)=tausp1(j)

do i=1,3

idnor=idnor+1

statev(idnor)=spnor1(i,j)

iddir=iddir+1

statev(iddir)=spdir1(i,j)

end do

end do

end if

C-----  Total cumulative shear strains on all slip systems (sum of the 

C     absolute values of shear strains in all slip systems)

do i=1,nslptl

statev(9*nslptl+1)=statev(9*nslptl+1)+abs(dgamma(i))

end do

      return

      end

c----------------------------------------------------------------------

      subroutine ludcmp (a, n, np, indx, d)

        include 'aba_param.inc'

parameter (nmax=200, tiny=1.0e-20)

dimension a(np,np), indx(n), vv(nmax) 

d = 1.d0

do i = 1,n

aamax = 0.

do j = 1,n

if (abs(a(i,j)).gt.aamax) aamax = abs(a(i,j))

end do

if (aamax.eq.0.) pause 'singular matrix.'

vv(i) = 1./aamax

end do

do j = 1,n

do i = 1,j-1

sum = a(i,j)

do k = 1,i-1

sum = sum-a(i,k)*a(k,j)

end do

a(i,j) = sum

end do

aamax = 0.

do i = j,n

sum = a(i,j)

do k = 1,j-1

sum = sum-a(i,k)*a(k,j)

end do

a(i,j) = sum

dum = vv(i)*abs(sum)

if (dum.ge.aamax) then

imax = i

aamax = dum

end if

end do

if (j.ne.imax) then

do k = 1,n

dum = a(imax,k)

a(imax,k) = a(j,k)

a(j,k) = dum

end do

d = -d

vv(imax) = vv(j)

end if

indx(j) = imax

if (a(j,j).eq.0.) a(j,j) = tiny

if (j.ne.n) then

dum = 1./a(j,j)

do i = j+1,n

a(i,j) = a(i,j)*dum

end do

end if

end do

      return

      end

C----------------------------------------------------------------------

      subroutine lubksb (a, n, np, indx, b)

        include 'aba_param.inc'

dimension a(np,np), indx(n), b(n)

ii = 0

do i = 1,n

ll = indx(i)

sum = b(ll)

b(ll) = b(i)

if (ii.ne.0) then

do j = ii,i-1

sum = sum-a(i,j)*b(j)

end do

else if (sum.ne.0.) then

ii = i

end if

b(i) = sum

end do

do i = n,1,-1

sum = b(i)

if (i.lt.n) then

do j = i+1,n

sum = sum-a(i,j)*b(j)

end do

end if

b(i) = sum/a(i,i)

end do

      return

      end


来源:我的博士日记
ACTSystemDeformCONVERGEUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-05-19
最近编辑:24天前
此生君子意逍遥
博士 签名征集中
获赞 57粉丝 96文章 98课程 0
点赞
收藏
作者推荐

基于黄umat模拟不同取向FCC单晶微柱压缩响应情况

案例说明根据acta文献《Multiscale modeling of the mechanical behavior of IN718 superalloy based on micropillar compression and computational homogenization》,建立不同取向单晶微柱模型(微柱直径为10um,高度为12um)模拟初始不同取向的单晶在压缩过程中的应力应变响应以及滑移系开动情况(材料参数为黄原始的参数)1,建立微柱初始模型如下:2,赋予微柱响应的单晶材料材料参数,(本案例主要考虑在立方金属轧板中常见的典型取向)见下表(研究选取了前七种情况)3,进行网格划分,采用C3D8R单元,共包含网格为13536个单元,其中微柱部分网格进行对应的细化,底部采用相对粗糙的网格。4,根据文献的研究,采用类似的边界条件,下端支撑板完全固定,对微柱顶端Z的负方向施加20%的工程应变进行压缩模拟。5,后处理与结果展示(默认图片中单晶取向与表顺序相同)不同取向微柱压缩的应力分布云图‍不同取向微柱压缩的累计剪切应变分布云图FCC滑移系标号滑移系a1分剪切应力分布云图滑移系a2累计剪切应变分布云图滑移系a3累计剪切应变分布云图滑移系b1累计剪切应变分布云图滑移系b2累计剪切应变分布云图滑移系b3累计剪切应变分布云图滑移系c1累计剪切应变分布云图滑移系c2累计剪切应变分布云图滑移系c3累计剪切应变分布云图滑移系d1累计剪切应变分布云图滑移系d2累计剪切应变分布云图滑移系d3累计剪切应变分布云图

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈