⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ansys-umat.for

📁 ansys或ABAQUS二次材料属性的开发,实现材料非线性.
💻 FOR
字号:
*****************************************************************top*****: <Fully implicit integration of the Combined OW-AF model**:  for 3D/axisymmetric solid and plane strain elements>**************************************************************************:**:  Notice!**:**:  Set '*depvar'=ntens*(mah+1)+1 in input file.**:**************************************************************************: <ABAQUS user subroutine, UMAT>**************************************************************************:**: <UMAT heading>**:      subroutine umat(ss,statev,ddsdde,sse,spd,scd,     & rpl,ddsddt,drplde,drpldt,     & sn,dsn,time,dtime,temp,dtemp,predef,dpred,cmname,     & ndi,nshr,ntens,nstatv,props,nprops,coords,drot,pnewdt,     & celent,dfgrd0,dfgrd1,noel,npt,layer,kspt,kstep,kinc)      include 'aba_param.inc'      character*8 cmname      dimension ss(ntens),statev(nstatv),     & ddsdde(ntens,ntens),ddsddt(ntens),drplde(ntens),     & sn(ntens),dsn(ntens),time(2),predef(1),dpred(1),     & props(nprops),coords(3),drot(3,3),dfgrd0(3,3),dfgrd1(3,3)**:**************************************************************************: <Local variable definitions>**************************************************************************:**: <elastic constants>      double precision yg,pn,sg      parameter (yg=1.65d5,pn=0.3d0,sg=0.5d0*yg/(1.0d0+pn))**:**: <yield stress>      double precision sy      parameter (sy=2.40d2)**:**: <kinematic hardening parameters>      integer mah      parameter (mah=4)      double precision zi(mah),ri(mah)      data zi(1),ri(1)/2.0d3,5.0d1/      data zi(2),ri(2)/5.0d2,5.0d1/      data zi(3),ri(3)/2.0d2,4.0d1/      data zi(4),ri(4)/5.0d1,1.0d2/      double precision owaf      parameter (owaf=0.0d0)      save zi,ri**:      double precision em(6,6),vem(6,6)      double precision snp(6),dsnp(6),dp,pacc      double precision bhi(mah,6),tah(6),tbhi(mah,6),thi(mah),fbi(mah)      double precision tvs(6),vsa(6),fy      double precision pm(6,6),khm(6,6)      integer ite,itemax      parameter (itemax=25)      integer fakn      double precision odp,xakn(3)      integer i,j,k      double precision xx**:***************************************************main routine start*****: <Labeling on state variables>**************************************************************************:      k=1      pacc=statev(k)      k=k+1      do 10 j=1,ntens         snp(j)=statev(k)         k=k+1   10 continue      do 30 i=1,mah         do 20 j=1,ntens            bhi(i,j)=statev(k)            k=k+1   20    continue   30 continue**:**************************************************************************: <Elastic stiffness>**************************************************************************:      call kmkem( em,sg,pn,ndi,nshr )      call kmkvem( vem,sg,ntens,ndi )**:**************************************************************************: <Elastic predictor>**************************************************************************:**: <trial deviatoric stress>      do 120 i=1,ntens         tvs(i)=0.0d0         do 110 j=1,ntens            tvs(i)=tvs(i)+vem(i,j)*(sn(j)+dsn(j)-snp(j))  110    continue  120 continue**:**: <trial back stress>      do 140 j=1,ntens         tah(j)=0.0d0         do 130 i=1,mah            tah(j)=tah(j)+ri(i)*bhi(i,j)  130    continue  140 continue**:**************************************************************************: <Yield function>**************************************************************************:      xx=0.0d0      do 210 j=1,ndi         xx=xx+(tvs(j)-tah(j))**2  210 continue      do 220 j=ndi+1,ndi+nshr,1         xx=xx+0.5d0*(tvs(j)-tah(j))**2  220 continue      fy=sqrt( 1.5d0*xx )-1.0001d0*sy**:**************************************************************************: <Plastic corrector>**************************************************************************:      if (fy .gt. 0.0d0) then         ite=1         fakn=0         odp=0.0d0         do 310 i=1,mah            thi(i)=1.0d0  310    continue**:**: <return mapping> 1000    call krmap( dp,dsnp,vsa,tvs,bhi,thi,zi,ri,sg,sy,     &               mah,ndi,nshr,ntens )         call kaccel( dp,dsnp,xakn,fakn,ntens )**:**: <hardening parameters correction>         call kkinh( thi,tbhi,fbi,bhi,dsnp,dp,owaf,zi,     &               mah,ntens,ndi,nshr )         if ((abs( dp-odp ) .gt. 1.0d-5*dp)      &       .and. (ite .lt. itemax)) then            ite=ite+1            odp=dp            goto 1000         endif      endif**:**************************************************************************: <internal variable update>**************************************************************************:      if (fy .gt. 0.0d0) then         do 410 j=1,ntens            snp(j)=snp(j)+dsnp(j)  410    continue         pacc=pacc+dp         do 430 j=1,ntens            do 420 i=1,mah               bhi(i,j)=thi(i)*tbhi(i,j)  420       continue  430    continue      endif**:**************************************************************************: <Stress update>**************************************************************************:      do 520 i=1,ntens         ss(i)=0.0d0         do 510 j=1,ntens            ss(i)=ss(i)+em(i,j)*(sn(j)+dsn(j)-snp(j))  510    continue  520 continue**:**************************************************************************: <Tangent operator for global Newton iteration>**************************************************************************:      if (fy .gt. 0.0d0) then         call kpm( pm,vsa,sy,dp,ntens,ndi,nshr )         call kkhm( khm,owaf,zi,ri,thi,bhi,fbi,vsa,sy,     &              ntens,ndi,nshr,mah )         call kctop( em,pm,khm,vem,ntens )      endif      do 620 i=1,ntens         do 610 j=1,ntens            ddsdde(i,j)=em(i,j)  610    continue  620 continue**:**************************************************************************: <State variables update>**************************************************************************:      k=1      statev(k)=pacc      k=k+1      do 710 j=1,ntens         statev(k)=snp(j)         k=k+1  710 continue      do 730 i=1,mah         do 720 j=1,ntens            statev(k)=bhi(i,j)            k=k+1  720    continue  730 continue**:*****************************************************main routine end*****: <End of UMAT>**************************************************************************:      return      end**************************************************************************: <User-defined local functions and subroutines>**************************************************************************:**: <Return mapping>**:      subroutine krmap( dp,dsnp,vsa,tvs,bhi,thi,zi,ri,sg,sy,     &                  mah,ndi,nshr,ntens )      include 'aba_param.inc'      integer mah,ndi,nshr,ntens      double precision dp,dsnp(6),vsa(6),tvs(6)      double precision bhi(mah,6),thi(mah),zi(mah),ri(mah)      double precision sg,sy      integer i,j      double precision tvsa(6),ahn(6),tsef,hh      do 20 j=1,ntens         ahn(j)=0.0d0         do 10 i=1,mah            ahn(j)=ahn(j)+thi(i)*ri(i)*bhi(i,j)   10    continue   20 continue      hh=0.0d0      do 30 i=1,mah         hh=hh+thi(i)*ri(i)*zi(i)   30 continue      tsef=0.0d0      do 40 j=1,ndi         tvsa(j)=tvs(j)-ahn(j)         tsef=tsef+tvsa(j)**2   40 continue      do 50 j=ndi+1,ndi+nshr,1         tvsa(j)=tvs(j)-ahn(j)         tsef=tsef+0.5d0*tvsa(j)**2   50 continue      tsef=sqrt( 1.5d0*tsef )      dp=(tsef-sy)/(3.0d0*sg+hh)      do 60 j=1,ntens         vsa(j)=sy*tvsa(j)/tsef         dsnp(j)=1.5d0*dp*tvsa(j)/tsef   60 continue      end**:**: <Aitken's acceleration>**:      subroutine kaccel( dp,dsnp,xakn,fakn,ntens )      include 'aba_param.inc'      integer fakn,ntens      double precision dp,dsnp(6),xakn(3)      integer j      xakn(1)=xakn(2)      xakn(2)=xakn(3)      xakn(3)=dp      if (fakn .ne. 3) then         fakn=fakn+1      elseif (abs( xakn(3)-xakn(2) ) .gt. 1.0d-10*dp) then         dp=xakn(3)-(xakn(3)-xakn(2))     &               /(1.0d0-(xakn(2)-xakn(1))/(xakn(3)-xakn(2)))         if (dp .lt. 0.0d0) then            dp=xakn(3)         else            do 10 j=1,ntens               dsnp(j)=dsnp(j)*dp/xakn(3)   10       continue            xakn(3)=dp            fakn=2         endif      endif      end**:**: <Kinematic hardening>**:      subroutine kkinh( thi,tbhi,fbi,bhi,dsnp,dp,owaf,zi,     &                  mah,ntens,ndi,nshr )      include 'aba_param.inc'      integer mah,ntens,ndi,nshr      double precision thi(mah),tbhi(mah,6),fbi(mah)      double precision bhi(mah,6),dsnp(6),dp,owaf,zi(mah)      integer i,j      double precision ci,bbari      do 30 i=1,mah         bbari=0.0d0         do 10 j=1,ndi            tbhi(i,j)=bhi(i,j)+zi(i)*dsnp(j)/1.5d0            bbari=bbari+tbhi(i,j)**2   10    continue         do 20 j=ndi+1,ndi+nshr,1            tbhi(i,j)=bhi(i,j)+zi(i)*dsnp(j)/1.5d0            bbari=bbari+0.5d0*tbhi(i,j)**2   20    continue         bbari=sqrt( 1.5d0*bbari )         ci=1.0d0/(1.0d0+owaf*zi(i)*dp)         fbi(i)=ci*bbari-1.0d0         if (fbi(i) .ge. 0.0d0) then            thi(i)=1.0d0/bbari         else            thi(i)=ci         endif   30 continue      end**:**: <Elastic stiffness matrix>**:      subroutine kmkem( em,sg,pn,ndi,nshr )      include 'aba_param.inc'      integer ndi,nshr      double precision em(6,6),sg,pn       integer i,j      double precision xx      xx=2.0d0*sg/(1.0d0-2.0d0*pn)      do 20 i=1,ndi         em(i,i)=(1.0d0-pn)*xx         do 10 j=i+1,ndi            em(i,j)=pn*xx            em(j,i)=em(i,j)   10    continue   20 continue      do 40 i=ndi+1,ndi+nshr,1         em(i,i)=sg         do 30 j=i+1,ndi+nshr            em(i,j)=0.0d0            em(j,i)=em(i,j)   30    continue   40 continue      do 60 i=1,ndi         do 50 j=ndi+1,ndi+nshr,1            em(i,j)=0.0d0            em(j,i)=em(i,j)   50    continue   60 continue      end**:**: <Deviatoric elastic stiffness matrix>**:      subroutine kmkvem( vem,sg,ntens,ndi )      include 'aba_param.inc'      integer ntens,ndi      double precision vem(6,6),sg      integer j,k      double precision xx      xx=2.0d0*sg      do 20 j=1,ntens         do 10 k=1,ntens            vem(j,k)=0.0d0   10    continue         vem(j,j)=xx   20 continue      xx=2.0d0*sg/3.0d0      do 40 j=1,ndi         do 30 k=1,ndi            vem(j,k)=vem(j,k)-xx   30    continue   40 continue      end**:**: <Consistent tangent stiffness matrix>**:      subroutine kctop( em,pm,khm,vem,ntens )      include 'aba_param.inc'      integer ntens      double precision em(6,6),pm(6,6),khm(6,6),vem(6,6)      integer j,k      double precision lm(6,6),lminv(6,6)      double precision xm(6,6),ym(6,6)      do 20 j=1,ntens         do 10 k=1,ntens            lm(j,k)=vem(j,k)+pm(j,k)+khm(j,k)   10    continue   20 continue      call kminv( lm,lminv,ntens )      call kmprod( lminv,vem,ym,ntens )      call kmprod( em,ym,xm,ntens )      do 40 j=1,ntens         do 30 k=1,ntens            em(j,k)=em(j,k)-xm(j,k)   30    continue   40 continue      end**:**: <Kinematic hardening tangent operator>**:      subroutine kkhm( khm,owaf,zi,ri,thi,bhi,fbi,vsa,sy,     &                 ntens,ndi,nshr,mah )      include 'aba_param.inc'      integer ntens,ndi,nshr,mah      double precision khm(6,6),owaf,zi(mah),ri(mah),thi(mah)      double precision bhi(mah,6),fbi(mah)      double precision vsa(6),sy      integer i,j,k      double precision xx      xx=0.0d0      do 10 i=1,mah         xx=xx+ri(i)*thi(i)*zi(i)/1.5d0   10 continue      do 30 j=1,ntens         do 20 k=1,ntens            khm(j,k)=0.0d0   20    continue         khm(j,j)=xx   30 continue      do 300 i=1,mah         if (fbi(i) .ge. 0.0d0) then            xx=ri(i)*thi(i)*zi(i)            do 130 j=1,ntens               do 110 k=1,ndi                  khm(j,k)=khm(j,k)-xx*bhi(i,j)*bhi(i,k)  110          continue               do 120 k=ndi+1,ndi+nshr,1                  khm(j,k)=khm(j,k)-0.5d0*xx*bhi(i,j)*bhi(i,k)  120          continue  130       continue         else            xx=ri(i)*thi(i)*owaf*zi(i)            do 230 j=1,ntens               do 210 k=1,ndi                  khm(j,k)=khm(j,k)-xx*bhi(i,j)*vsa(k)/sy  210          continue               do 220 k=ndi+1,ndi+nshr,1                  khm(j,k)=khm(j,k)-0.5d0*xx*bhi(i,j)*vsa(k)/sy  220          continue  230       continue         endif  300 continue      end**:**: <Perfectly plastic tangent operator>**:      subroutine kpm( pm,vsa,sy,dp,ntens,ndi,nshr )      include 'aba_param.inc'      integer ntens,ndi,nshr      double precision pm(6,6),vsa(6),sy,dp      integer j,k      do 30 j=1,ntens         do 10 k=1,ndi            pm(j,k)=-sy/dp*vsa(j)/sy*vsa(k)/sy   10    continue         do 20 k=ndi+1,ndi+nshr,1            pm(j,k)=-0.5d0*sy/dp*vsa(j)/sy*vsa(k)/sy   20    continue         pm(j,j)=pm(j,j)+sy/(1.5d0*dp)   30 continue      end**:**: <Inversion of matricies>**:      subroutine kminv( am,invm,nsize )      include 'aba_param.inc'      integer nsize      double precision am(6,6),invm(6,6)      integer i,j,k      double precision xx,xm(6,6)      do 20 i=1,nsize         do 10 j=1,nsize            xm(i,j)=am(i,j)            invm(i,j)=0.0d0   10    continue         invm(i,i)=1.0d0   20 continue      do 60 k=1,nsize-1         do 50 j=k+1,nsize            xx=xm(k,j)/xm(k,k)            do 30 i=k+1,nsize               xm(i,j)=xm(i,j)-xm(i,k)*xx   30       continue            do 40 i=1,nsize               invm(i,j)=invm(i,j)-invm(i,k)*xx   40       continue   50    continue   60 continue      do 90 k=1,nsize         do 80 j=nsize,1,-1            xx=invm(k,j)            do 70 i=j+1,nsize               xx=xx-xm(i,j)*invm(k,i)   70       continue            invm(k,j)=xx/xm(j,j)   80    continue   90 continue      end**:**: <Matrix production>**:      subroutine kmprod( am,bm,cm,ntens )      include 'aba_param.inc'      integer ntens      double precision am(6,6),bm(6,6),cm(6,6)      integer i,j,k      do 30 j=1,ntens         do 20 k=1,ntens            cm(j,k)=0.0d0            do 10 i=1,ntens               cm(j,k)=cm(j,k)+am(j,i)*bm(i,k)   10       continue   20    continue   30 continue      end***************************************************************bottom***

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -