找回密码
 注册
Simdroid-非首页
查看: 236|回复: 1

[复合材料] 根据论坛最大应力准则改写VUMAT,计算结果不对,大佬们帮忙看看

[复制链接]
发表于 2020-10-20 21:59:37 | 显示全部楼层 |阅读模式 来自 中国
************************************************************
*   define the material of matrix            *
************************************************************
      subroutine VUMAT(
     1  nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,
     2  stepTime, totalTime, dt, cmname, coordMp, charLength,
     3  props, density, strainInc, relSpinInc,
     4  tempOld, stretchOld, defgradOld, fieldOld,
     5  stressOld, stateOld, enerInternOld, enerInelasOld,
     6  tempNew, stretchNew, defgradNew, fieldNew,
c Write only -
     7  stressNew, stateNew, enerInternNew, enerInelasNew )
c
      include 'vaba_param.inc'
      dimension props(nprops), density(nblock),
     1  coordMp(nblock,*),
     2  charLength(*), strainInc(nblock,ndir+nshr),
     3  relSpinInc(nblock,nshr), tempOld(nblock),
     4  stretchOld(nblock,ndir+nshr), defgradOld(nblock,ndir+nshr+nshr),
     5  fieldOld(nblock,nfieldv), stressOld(nblock,ndir+nshr),
     6  stateOld(nblock,nstatev), enerInternOld(nblock),
     7  enerInelasOld(nblock), tempNew(*),
     8  stretchNew(nblock,ndir+nshr), defgradNew(nblock,ndir+nshr+nshr),
     9  fieldNew(nblock,nfieldv), stressNew(nblock,ndir+nshr),
     1  stateNew(nblock,nstatev),
     2  enerInternNew(nblock), enerInelasNew(nblock)   
c
       character*80 cmname
   
      parameter( zero = 0.d0, one = 1.d0, two = 2.d0, half = .5d0 )
*
      parameter(
     *     i_svd_DmgMatrixT       = 1,
     *     i_svd_DmgMatrixC       = 2,
     *     i_svd_DmgMatrixS       = 3,
     *     i_svd_statusMp    = 4,
     *     i_svd_dampStress  = 5,
c     *    i_svd_dampStressXx = 5,
c     *    i_svd_dampStressYy = 6,
c     *    i_svd_dampStressZz = 7,
c     *    i_svd_dampStressXy = 8,
c     *    i_svd_dampStressYz = 9,
c     *    i_svd_dampStressZx = 10,
     *     i_svd_Strain   = 11,
c     *    i_svd_StrainXx = 11,
c     *    i_svd_StrainYy = 12,
c     *    i_svd_StrainZz = 13,
c     *    i_svd_StrainXy = 14,
c     *    i_svd_StrainYz = 15,
c     *    i_svd_StrainZx = 16,
     *     n_svd_required = 16 )
*
      parameter(
     *     i_s33_Xx = 1,
     *     i_s33_Yy = 2,
     *     i_s33_Zz = 3,
     *     i_s33_Xy = 4,
     *     i_s33_Yz = 5,
     *     i_s33_Zx = 6 )
*
*  the metarial of matrix is ragard as isotropic
*
      parameter (
     *     i_pro_E         = 1,
     *     i_pro_nu        = 2,
     *     i_pro_sigu1t    = 3,            
     *     i_pro_sigu1c    = 4,            
     *     i_pro_sigus     = 5,
*
     *     i_pro_beta  = 6)
*
*     *     i_pro_rate   = 7,               
*     *     i_pro_c      = 8 )               

* Temporary arrays
*
* Read material properties
*
      E     = props(i_pro_E)
      xnu   = props(i_pro_nu)
*
      beta = props(i_pro_beta)
*      
      G=half*E/(one+xnu)
      gg = one / ( one - xnu*xnu - xnu*xnu - xnu*xnu
     *     - two*xnu*xnu*xnu )
      C11  = E * ( one - xnu*xnu ) * gg
      C22  = E * ( one - xnu*xnu ) * gg
      C33  = E * ( one - xnu*xnu ) * gg
      C12  = E * ( xnu + xnu*xnu ) * gg
      C13  = E * ( xnu + xnu*xnu ) * gg
      C23  = E * ( xnu + xnu*xnu ) * gg
*
      f1t = props(i_pro_sigu1t)
      f1c = props(i_pro_sigu1c)
      f1s = props(i_pro_sigus)

*
* Assume purely elastic material at the beginning of the analysis
*      
      if ( totalTime .eq. zero ) then
         if (nstatev .lt. n_svd_Required) then
            call xplb_abqerr(-2,'Subroutine VUMAT requires the '//
     *           'specification of %I state variables. Check the '//
     *           'definition of *DEPVAR in the input file.',
     *           n_svd_Required,zero,' ')
            call xplb_exit
         end if
         call isoelastic ( nblock,
     *        stateOld(1,i_svd_DmgMatrixT),
     *        stateOld(1,i_svd_DmgMatrixC),stateOld(1,i_svd_DmgMatrixS),
     *        strainInc, stressNew,
     *        C11, C22, C33, C12, C23, C13, G)
         return
      end if
*
*  应变更新
      call strainUpdate ( nblock,strainInc,
     *     stateOld(1,i_svd_strain), stateNew(1,i_svd_strain) )
*
* 应力更新
      call isoelastic ( nblock,     
     *     stateOld(1,i_svd_DmgMatrixT),
     *     stateOld(1,i_svd_DmgMatrixC),
     *     stateOld(1,i_svd_DmgMatrixS),
     *     stateNew(1,i_svd_strain), stressNew,
     *     C11, C22, C33, C12, C23, C13, G)
* Failure evaluation
      call copyr ( nblock,
     *     stateOld(1,i_svd_DmgMatrixT), stateNew(1,i_svd_DmgMatrixT) )
      call copyr ( nblock,
     *     stateOld(1,i_svd_DmgMatrixC), stateNew(1,i_svd_DmgMatrixC) )
      call copyr ( nblock,
     *     stateOld(1,i_svd_DmgMatrixS), stateNew(1,i_svd_DmgMatrixS) )
      nDmg = 0
      call Failure3d  ( nblock, nDmg,
     *     f1t, f1c, f1s,
     *     stateOld(1,i_svd_DmgMatrixT),
     *     stateOld(1,i_svd_DmgMatrixC),
     *     stateOld(1,i_svd_DmgMatrixS),      
     *     stateOld(1,i_svd_statusMp),
     *     stressNew)
*     -- Recompute stresses if new Damage is occurring
      if ( nDmg .gt. 0 ) then
         call isoelastic ( nblock,
     *        stateNew(1,i_svd_DmgMatrixT),
     *        stateNew(1,i_svd_DmgMatrixC),
     *        stateNew(1,i_svd_DmgMatrixS),
     *        stateNew(1,i_svd_strain), stressNew,
     *        C11, C22, C33, C12, C23, C13, G)
      end if
*
* Beta damping
      if ( beta .gt. zero ) then
         call betaDamping3d ( nblock,
     *        beta, dt, strainInc,
     *        stressOld, stressNew,
     *        stateNew(1,i_svd_statusMp),
     *        stateOld(1,i_svd_dampStress),
     *        stateNew(1,i_svd_dampStress) )
      end if
*
* Integrate the internal specific energy (per unit mass)
*
      call EnergyInternal3d ( nblock, stressOld, stressNew,
     *   strainInc, density, enerInternOld, enerInternNew )
*
      return
      end

*
      
************************************************************
*   OrthoEla3dExp: Orthotropic elasticity - 3d             *
************************************************************
      subroutine isoelastic ( nblock, strain, stress,
     *     DmgMatrixC, DmgMatrixS,DmgMatrixT,
     *     C11, C22, C33, C12, C23, C13, G)
*
      include 'vaba_param.inc'
      DOUBLE PRECISION :AMAGE,MaxDam
*  isotropic elasticity, 3D case - (刚度退化计算)
*
      parameter( zero = 0.d0, one = 1.d0, two = 2.d0,ten=10.d0)
      parameter(
     *     i_s33_Xx = 1,
     *     i_s33_Yy = 2,
     *     i_s33_Zz = 3,
     *     i_s33_Xy = 4,
     *     i_s33_Yz = 5,
     *     i_s33_Zx = 6,
     *     n_s33_Car = 6 )
*
      dimension  strain(nblock,n_s33_Car), stress(nblock,n_s33_Car),
     *     DmgMatrixT(nblock), DmgMatrixC(nblock), DmgMatrixS(nblock)
*     
      DAMAGE = ZERO
      MaxDam = ZERO
      do k = 1, nblock
*     -- Stress update
          MaxDam=max(DmgMatrixT(k),DmgMatrixT(k),DmgMatrixT(k))
          if (MaxDam.eq.one)then
              DAMAGE=one/ten  
          else
              DAMAGE=ZERO
          endif
*        
         dC11 = ( one - DAMAGE ) * C11
         dC22 = ( one - DAMAGE ) * C22
         dC33 = ( one - DAMAGE ) * C33
         dC12 = ( one - DAMAGE ) * C12
         dC23 = ( one - DAMAGE ) * C23
         dC13 = ( one - DAMAGE ) * C13
         dG = ( one - DAMAGE ) * G
         dG = ( one - DAMAGE ) * G
         dG = ( one - DAMAGE ) * G
*     -- Stress update
         stress(k,i_s33_Xx) = dC11 * strain(k,i_s33_Xx)
     *        + dC12 * strain(k,i_s33_Yy)
     *        + dC13 * strain(k,i_s33_Zz)
         stress(k,i_s33_Yy) = dC12 * strain(k,i_s33_Xx)
     *        + dC22 * strain(k,i_s33_Yy)
     *        + dC23 * strain(k,i_s33_Zz)
         stress(k,i_s33_Zz) = dC13 * strain(k,i_s33_Xx)
     *        + dC23 * strain(k,i_s33_Yy)
     *        + dC33 * strain(k,i_s33_Zz)
         stress(k,i_s33_Xy) = two * dG * strain(k,i_s33_Xy)
         stress(k,i_s33_Yz) = two * dG * strain(k,i_s33_Yz)
         stress(k,i_s33_Zx) = two * dG * strain(k,i_s33_Zx)
      end do
*     
      return
      end      
************************************************************
*   strainUpdate: Update total strain                      *
************************************************************
      subroutine strainUpdate ( nblock,
     *     strainInc, strainOld, strainNew )
*
      include 'vaba_param.inc'
*
      parameter(
     *     i_s33_Xx = 1,
     *     i_s33_Yy = 2,
     *     i_s33_Zz = 3,
     *     i_s33_Xy = 4,
     *     i_s33_Yz = 5,
     *     i_s33_Zx = 6,
     *     n_s33_Car = 6 )
*
      dimension strainInc(nblock,n_s33_Car),
     *     strainOld(nblock,n_s33_Car),
     *     strainNew(nblock,n_s33_Car)
*
      do k = 1, nblock
         strainNew(k,i_s33_Xx)= strainOld(k,i_s33_Xx)
     *                        + strainInc(k,i_s33_Xx)
         strainNew(k,i_s33_Yy)= strainOld(k,i_s33_Yy)
     *                        + strainInc(k,i_s33_Yy)
         strainNew(k,i_s33_Zz)= strainOld(k,i_s33_Zz)
     *                        + strainInc(k,i_s33_Zz)
         strainNew(k,i_s33_Xy)= strainOld(k,i_s33_Xy)
     *                        + strainInc(k,i_s33_Xy)
         strainNew(k,i_s33_Yz)= strainOld(k,i_s33_Yz)
     *                        + strainInc(k,i_s33_Yz)
         strainNew(k,i_s33_Zx)= strainOld(k,i_s33_Zx)
     *                        + strainInc(k,i_s33_Zx)
      end do
*
      return
      end      
************************************************************
*                 (失效判据)
************************************************************
      subroutine Failure3d ( nblock, nDmg,
     *     f1t, f1c, f1s, DmgMatrixT, DmgMatrixC,DmgMatrixS,  
     *     statusMp, stress)
*
      include 'vaba_param.inc'
      PARAMETER (ONE=1.0D0,TWO=2.0D0,THREE=3.0D0,NINE=9.0D0,FOUR=4.D0)
      PARAMETER (PI=3.141592653589,TOL=0.0001)   
      DOUBLE PRECISION :: I1,I2,I3,A,B,C,E1,E2,Fai,SP1,SP2,SP3,SSP1,
     1                    SSP2,SSP3,S1,S2,ST
      parameter ( eMax = 1.d0, eMin = -0.5d0 )
*
      parameter(
     *     i_s33_Xx = 1,
     *     i_s33_Yy = 2,
     *     i_s33_Zz = 3,
     *     i_s33_Xy = 4,
     *     i_s33_Yz = 5,
     *     i_s33_Zx = 6,
     *     n_s33_Car = 6 )
*
      parameter(i_v3d_X=1,i_v3d_Y=2,i_v3d_Z=3 )
      parameter(n_v3d_Car=3 )
*     
      dimension  DmgMatrixS(nblock),
     *     DmgMatrixT(nblock), DmgMatrixC(nblock),
     *     stress(nblock,n_s33_Car),
     *     statusMp(nblock)      
c      
c  
      do k = 1, nblock
        if ( statusMp(k) .eq. one ) then
            
         I1 = stress(k,1)+stress(k,2)+stress(k,3)
         I2 = stress(k,1)*stress(k,2)
     1        +stress(k,2)*stress(k,3)
     2        +stress(k,1)*stress(k,3)
     3        -stress(k,4)**TWO-stress(k,5)**TWO
     4        -stress(k,6)**TWO
         I3 = stress(k,1)*stress(k,2)*stress(k,3)
     1        -stress(k,1)*stress(k,5)**TWO
     2        -stress(k,2)*stress(k,6)**TWO
     3        -stress(k,3)*stress(k,4)**TWO
     4        +TWO*stress(k,4)*stress(k,5)*stress(k,6)
C
C calculate principal stress
         A = I1/THREE
         E1 = I1**TWO-THREE*I2
         IF(E1.GT.TOL)THEN
            B=SQRT(E1)
         ELSE
C         WRITE(*,*) 'Warning: B is less than 0.01,set to 0'
            B=ZERO
         ENDIF
C      
         IF(B.GT.0)THEN
            E2=(TWO*I1**THREE-NINE*I1*I2+NINE*THREE*I3)/
     1          (B**(THREE/TWO)*TWO)
           IF(E2.GT.ONE)THEN
C          WRITE(*,*) 'Warning:cos(Fai)>1,E2= ', E2, 'adjust to 1'
              E2=ONE
           ELSEIF(E2.LT.-ONE)THEN
C           WRITE(*,*) 'Warning:cos(Fai)<-1,E2= ', E2, 'adjust to -1'
              E2=-ONE
           ENDIF
           Fai=ACOS(E2)/THREE
           SP1=A+TWO*B*COS(Fai)/THREE
           SP2=A+TWO*B*COS(Fai+TWO*PI/THREE)/THREE
           SP3=A+TWO*B*COS(Fai+FOUR*PI/THREE)/THREE
         ELSE
           SP1=A
           SP2=A
           SP3=A
         ENDIF
         S1=SP1+SP2+SP3
         S2=SP1*SP2+SP2*SP3+SP3*SP1
         ST=SQRT(ABS(TWO*S1**TWO/NINE-TWO*S2/THREE))
C
C  make sure SP1>=SP2>=SP3   
         IF((SP1.GT.SP2).and.(SP2.GT.SP3))THEN
            SSP1=SP1
            SSP2=SP2
            SSP3=SP3
         ELSEIF ((SP1.GT.SP3).and.(SP3.GT.SP2))THEN
            SSP1=SP1
            SSP2=SP3
            SSP3=SP2
         ELSEIF ((SP2.GT.SP1).and.(SP1.GT.SP3))THEN
            SSP1=SP2
            SSP2=SP1
            SSP3=SP3
         ELSEIF ((SP2.GT.SP3).and.(SP3.GT.SP1))THEN
            SSP1=SP2
            SSP2=SP3
            SSP3=SP1
         ELSEIF ((SP3.GT.SP1).and.(SP1.GT.SP2))THEN
            SSP1=SP3
            SSP2=SP1
            SSP3=SP2
         ELSEIF ((SP3.GT.SP2).and.(SP2.GT.SP1))THEN
            SSP1=SP3
            SSP2=SP2
            SSP3=SP1
         ENDIF
C         write(*,*),'A=',SSP1,SSP2,SSP3
c   
         IF (SSP3.GT.ZERO.AND.SSP1.GT.f1t) THEN
             matrixdmg = one
             DmgMatrixT(k) = one
         END IF
C
         IF (SSP1.LT.ZERO.AND.ABS(SSP3).GT.f1c) THEN
             matrixdmg = one
             DmgMatrixC(k) = one
         END IF
c      
         IF (ABS(ST).GT.f1s) THEN
             matrixdmg = one
             DmgMatrixS(k) = one
         END IF
*
         nDmg =  matrixdmg
*            
         if (DmgMatrixT(k).eq.one.or.
     *       DmgMatrixT(k).eq.one.or.
     *       DmgMatrixT(k).eq.one)then
             statusMp(k) = zero
         end if
       end if
*
      end do
*
      return
      end
************************************************************
*   betaDamping: Add beta damping                          *
************************************************************
      subroutine betaDamping3d ( nblock,
     *     beta, dt, strainInc, sigOld, sigNew,
     *     statusMp, sigDampOld, sigDampNew )
*
      include 'vaba_param.inc'
*
      parameter(
     *     i_s33_Xx = 1,
     *     i_s33_Yy = 2,
     *     i_s33_Zz = 3,
     *     i_s33_Xy = 4,
     *     i_s33_Yz = 5,
     *     i_s33_Zx = 6,
     *     n_s33_Car = 6 )
*
      dimension  sigOld(nblock,n_s33_Car),
     *     sigNew(nblock,n_s33_Car),
     *     strainInc(nblock,n_s33_Car),
     *     statusMp(nblock),
     *     sigDampOld(nblock,n_s33_Car),
     *     sigDampNew(nblock,n_s33_Car)      
*
      parameter ( zero = 0.d0, one = 1.d0, two=2.0d0,
     *     half = 0.5d0, third = 1.d0/3.d0 )
      parameter ( asmall = 1.d-16 )
*     
      betaddt =  beta / dt
*
      do k =1 , nblock
         sigDampNew(k,i_s33_Xx) = betaddt * statusMp(k) *
     *        ( sigNew(k,i_s33_Xx)
     *        - ( sigOld(k,i_s33_Xx) - sigDampOld(k,i_s33_Xx) ) )
         sigDampNew(k,i_s33_Yy) = betaddt * statusMp(k) *
     *        ( sigNew(k,i_s33_Yy)
     *        - ( sigOld(k,i_s33_Yy) - sigDampOld(k,i_s33_Yy) ) )
         sigDampNew(k,i_s33_Zz) = betaddt * statusMp(k) *
     *        ( sigNew(k,i_s33_Zz)
     *        - ( sigOld(k,i_s33_Zz) - sigDampOld(k,i_s33_Zz) ) )
         sigDampNew(k,i_s33_Xy) = betaddt * statusMp(k) *
     *        ( sigNew(k,i_s33_Xy)
     *        - ( sigOld(k,i_s33_Xy) - sigDampOld(k,i_s33_Xy) ) )
         sigDampNew(k,i_s33_Yz) = betaddt * statusMp(k) *
     *        ( sigNew(k,i_s33_Yz)
     *        - ( sigOld(k,i_s33_Yz) - sigDampOld(k,i_s33_Yz) ) )
         sigDampNew(k,i_s33_Zx) = betaddt * statusMp(k) *
     *        ( sigNew(k,i_s33_Zx)
     *        - ( sigOld(k,i_s33_Zx) - sigDampOld(k,i_s33_Zx) ) )
*
         sigNew(k,i_s33_Xx) = sigNew(k,i_s33_Xx)+sigDampNew(k,i_s33_Xx)
         sigNew(k,i_s33_Yy) = sigNew(k,i_s33_Yy)+sigDampNew(k,i_s33_Yy)
         sigNew(k,i_s33_Zz) = sigNew(k,i_s33_Zz)+sigDampNew(k,i_s33_Zz)
         sigNew(k,i_s33_Xy) = sigNew(k,i_s33_Xy)+sigDampNew(k,i_s33_Xy)
         sigNew(k,i_s33_Yz) = sigNew(k,i_s33_Yz)+sigDampNew(k,i_s33_Yz)
         sigNew(k,i_s33_Zx) = sigNew(k,i_s33_Zx)+sigDampNew(k,i_s33_Zx)
*
      end do
*     
      return
      end


************************************************************
*   EnergyInternal3d: Compute internal energy for 3d case  *
************************************************************
      subroutine EnergyInternal3d(nblock, sigOld, sigNew ,
     *   strainInc, curDensity, enerInternOld, enerInternNew)
*
      include 'vaba_param.inc'
*
      parameter(
     *     i_s33_Xx = 1,
     *     i_s33_Yy = 2,
     *     i_s33_Zz = 3,
     *     i_s33_Xy = 4,
     *     i_s33_Yz = 5,
     *     i_s33_Zx = 6,
     *     n_s33_Car = 6 )
*
      parameter( two = 2.d0, half = .5d0 )
*
      dimension sigOld (nblock,n_s33_Car), sigNew (nblock,n_s33_Car),
     *     strainInc (nblock,n_s33_Car), curDensity (nblock),
     *     enerInternOld(nblock), enerInternNew(nblock)
*
      do k = 1, nblock
         stressPower  = half * (
     *        ( sigOld(k,i_s33_Xx) + sigNew(k,i_s33_Xx) )
     *        * ( strainInc(k,i_s33_Xx) )
     *        +       ( sigOld(k,i_s33_Yy) + sigNew(k,i_s33_Yy) )
     *        * ( strainInc(k,i_s33_Yy))
     *        +       ( sigOld(k,i_s33_Zz) + sigNew(k,i_s33_Zz) )
     *        * ( strainInc(k,i_s33_Zz))
     *        + two * ( sigOld(k,i_s33_Xy) + sigNew(k,i_s33_Xy) )
     *        * strainInc(k,i_s33_Xy)
     *        + two * ( sigOld(k,i_s33_Yz) + sigNew(k,i_s33_Yz) )
     *        * strainInc(k,i_s33_Yz)
     *        + two * ( sigOld(k,i_s33_Zx) + sigNew(k,i_s33_Zx) )
     *        * strainInc(k,i_s33_Zx) )
*     
         enerInternNew(k) = enerInternOld(k) + stressPower/curDensity(k)
      end do
*     
      return  
      end  

************************************************************
*   CopyR: Copy from one array to another                  *
************************************************************
      subroutine CopyR(nCopy, from, to )
*
      include 'vaba_param.inc'
*
      dimension from(nCopy), to(nCopy)
*
      do k = 1, nCopy
         to(k) = from(k)
      end do
*
      return
      end

 楼主| 发表于 2020-10-21 19:23:42 | 显示全部楼层 来自 中国
Simdroid开发平台
有大佬帮忙看下么
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-1 17:23 , Processed in 0.033482 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表