GTN 模型参考vumat

   subroutine vumat(

! Read only -

   .  nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,

   .  stepTime, totalTime, dt, cmname, coordMp, charLength,

   .  props, density, strainInc, relSpinInc,

   .  tempOld, stretchOld, defgradOld, fieldOld,

   .  stressOld, stateOld, enerInternOld, enerInelasOld,

   .  tempNew, stretchNew, defgradNew, fieldNew,

! Write only -

   .  stressNew, stateNew, enerInternNew, enerInelasNew)

   include 'vaba_param.inc'

   DIMENSION PROPS(NPROPS), DENSITY(NBLOCK), COORDMP(NBLOCK),

   . CHARLENGTH(NBLOCK), STRAININC(NBLOCK, NDIR+NSHR),

   . RELSPININC(NBLOCK, NSHR), TEMPOLD(NBLOCK),

   . STRETCHOLD(NBLOCK, NDIR+NSHR),DEFGRADOLD(NBLOCK,NDIR+NSHR+NSHR),

   . FIELDOLD(NBLOCK, NFIELDV), STRESSOLD(NBLOCK, NDIR+NSHR),

   . STATEOLD(NBLOCK, NSTATEV), ENERINTERNOLD(NBLOCK),

   . ENERINELASOLD(NBLOCK), TEMPNEW(NBLOCK),

   . STRETCHNEW(NBLOCK, NDIR+NSHR),DEFGRADNEW(NBLOCK,NDIR+NSHR+NSHR),

   . FIELDNEW(NBLOCK, NFIELDV), STRESSNEW(NBLOCK,NDIR+NSHR),

   . STATENEW(NBLOCK, NSTATEV), ENERINTERNNEW(NBLOCK),

   . ENERINELASNEW(NBLOCK)

!

   CHARACTER*8 CMNAME

!

!-----------------------------------------------------------------------

!  Internal VUMAT variables

!-----------------------------------------------------------------------

   REAL*8, PARAMETER :: PI = 3.1415927

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

   . third = 1.d0 / 3.d0, half = 0.5d0, op5 = 1.5d0)

   REAL*8 SigDevOld(6)     ! Old deviatoric stress

   REAL*8 SigDevNew(6)     ! New deviatoric stress

   REAL*8 kappa, Eff_Void

   REAL*8 stresstr(6)

!

!

!-----------------------------------------------------------------------

!  Read parameters from ABAQUS material card

!-----------------------------------------------------------------------

   YOUNG = props(1)   ! Elastic/Youngs Modulus (e.g: E=210MPa for steel)

   POISS = props(2)   ! Poisson's ratio (often: \mu=0.33)

   SIGMA0 = props(3)   ! Initial Yield stress (at EpsPEqv=0)

   BETA1 = props(4)   ! Modified Gursons 1st constant: q_1

   BETA2 = props(5)   ! Modified Gursons 2nd constant: q_2

   BETA3 = props(6)   ! Modified Gursons 3rd constant: q_3

   TOL  = props(8)   ! TOLerance on the plastic return mapping

   MXITER = props(9)   ! Maximum number of iterations in the return map

   T_1  = props(10)  ! 

   Q_1  = props(11)  ! 3 term Voce hardening rule...

   T_2  = props(12)  ! T_i * (1 - EXP(-Q_i*EpsPEqv))

   Q_2  = props(13)  ! ... "" ...

   T_3  = props(14)

   Q_3  = props(15)

   FN  = props(16)  ! f_N, the volume fraction of void nucleating particles.

   SN  = props(17)  ! S_N, i.e the standard deviation in the nucleation distribution.

   EPSN = props(18)  ! \epsilon_N, i.e mean plastic strain for the distribution.

   f_c  = PROPS(19)  ! Void volume fraction upon which coalescence occurs.

   f_f  = PROPS(20)  ! Critical void volume fraction upon which failure occurs.

   k_s  = PROPS(21)  ! Shear damage term, k_s=0 means no contribution

!   

!   

!-----------------------------------------------------------------------

!  Compute elasticity matrix

!-----------------------------------------------------------------------    

   G   = 0.5*YOUNG/(1.0+POISS)

   K   = YOUNG/(3.0*(1.0-2.0*POISS))

! Elastic constants:

   twomu = YOUNG / ( one + POISS )

   alamda = POISS * twomu / ( one - two * POISS )

   thremu = op5 * twomu

!

!---- Calculate the preprocessor step --------------------------------------------         

   IF ((totalTime.eq.0.0).and.(stepTime.eq.0.0)) THEN

    DO km = 1, NBLOCK

     trace = strainInc(km,1) + strainInc(km,2) + strainInc(km,3)

     stressNew(km,1) = stressOld(km,1)

   .     + twomu * strainInc(km,1) + alamda * trace

     stressNew(km,2) = stressOld(km,2)

   .     + twomu * strainInc(km,2) + alamda * trace

     stressNew(km,3) = stressOld(km,3)

   .     + twomu * strainInc(km,3) + alamda * trace

     stressNew(km,4)=stressOld(km,4) + twomu * strainInc(km,4)

     IF ( nshr .gt. 1 ) THEN

      stressNew(km,5)=stressOld(km,5) + twomu * strainInc(km,5)

      stressNew(km,6)=stressOld(km,6) + twomu * strainInc(km,6)

     END IF

    END DO

   ELSE

!   

!--------------------------------------------------------------------------------------

!  Continue with the return mapping algorithm:

!--------------------------------------------------------------------------------------   

   DO km = 1, nblock

    trace = strainInc(km,1) + strainInc(km,2) + strainInc(km,3)

    stresstr(1) = stressOld(km,1)

   .    + twomu * strainInc(km,1) + alamda * trace

    stresstr(2) = stressOld(km,2)

   .    + twomu * strainInc(km,2) + alamda * trace

    stresstr(3) = stressOld(km,3)

   .    + twomu * strainInc(km,3) + alamda * trace

    stresstr(4)=stressOld(km,4) + twomu * strainInc(km,4)

    IF ( nshr .gt. 1 ) THEN

     stresstr(5)=stressOld(km,5) + twomu * strainInc(km,5)

     stresstr(6)=stressOld(km,6) + twomu * strainInc(km,6)

    END IF   

!   

!-----------------------------------------------------------------------

!   Read the void content either from material card or memory:

!-----------------------------------------------------------------------

    IF (totalTime.eq.dt) THEN !read the void content from material properties, as it is the first increment in the simulation

     VoidTr = PROPS(7)

    ELSE

     VoidTr = STATEOLD(km, 1)

    END IF

!    

!-----------------------------------------------------------------------

!   Calculate pTr

!-----------------------------------------------------------------------

    SigHNew = (stresstr(1)+stresstr(2)+stresstr(3))/3.0 

    pTr = -SigHNew 

!  

!-----------------------------------------------------------------------

!   Calculate qTr

!-----------------------------------------------------------------------  

    SigDevNew(1) = stresstr(1)-SigHNew

    SigDevNew(2) = stresstr(2)-SigHNew

    SigDevNew(3) = stresstr(3)-SigHNew

    SigDevNew(4) = stresstr(4)

    IF ( nshr .gt. 1 ) THEN

     SigDevNew(5) = stresstr(5)

     SigDevNew(6) = stresstr(6)

    END IF   

    IF ( nshr .eq. 1 ) THEN

     SigEqv = sqrt((3.0/2.0)*(SigDevNew(1)*SigDevNew(1)

   .     +SigDevNew(2)*SigDevNew(2)

   .     +SigDevNew(3)*SigDevNew(3))

   .   +3.0*(SigDevNew(4)*SigDevNew(4)))

    ELSE 

     SigEqv = sqrt((3.0/2.0)*(SigDevNew(1)*SigDevNew(1)

   .     +SigDevNew(2)*SigDevNew(2)

   .     +SigDevNew(3)*SigDevNew(3))

   .   +3.0*(SigDevNew(4)*SigDevNew(4)

   .     +SigDevNew(5)*SigDevNew(5)

   .     +SigDevNew(6)*SigDevNew(6)))    

    END IF

    qTr = SigEqv 

!

!-----------------------------------------------------------------------

!   Third deviatoric stress invariant

!-----------------------------------------------------------------------    

    IF ( nshr .eq. 1 ) THEN

     J_3 = SigDevNew(1)*SigDevNew(2)*SigDevNew(3) 

   .    - SigDevNew(4)*SigDevNew(4)*SigDevNew(3)

    ELSE IF (nshr .gt. 1) THEN 

     J_3 = SigDevNew(1)*SigDevNew(2)*SigDevNew(3) 

   .    - SigDevNew(1)*SigDevNew(5)*SigDevNew(5) 

   .    - SigDevNew(4)*SigDevNew(4)*SigDevNew(3)

   .    + 2*SigDevNew(4)*SigDevNew(5)*SigDevNew(6) 

   .    - SigDevNew(2)*SigDevNew(6)*SigDevNew(6)

    END IF    

!    

!-----------------------------------------------------------------------

!   State variable from previous time step

!-----------------------------------------------------------------------

    EpsPEqvTr = STATEOLD(km,2)

!    

!-----------------------------------------------------------------------

!   Update yield stress

!-----------------------------------------------------------------------

    CALL VOCE(SigM, SIGMA0, EpsPEqvTr, T_1, Q_1, T_2, 

   .     Q_2, T_3, Q_3)

!    

!-----------------------------------------------------------------------

!   Calculate the effective void volume fraction f^*

!-----------------------------------------------------------------------

    IF ((VoidTr .ge. f_c).and.(f_f.ne.0)) THEN

     C_Factor = ((1.0/BETA1) - f_c) / (f_f - f_c)

     Eff_Void = f_c + C_Factor * (VoidTr - f_c)

    ELSE 

     Eff_Void = VoidTr

    END IF     

!

!---------- In order to avoid numerical errors -------------------------       

    IF (Eff_Void .ge. 0.99*(1.0/BETA1)) THEN

     Eff_Void = 0.99*(1.0/BETA1)

    END IF  

!    

!-----------------------------------------------------------------------

!   Compute Bracket Term

!-----------------------------------------------------------------------

    TH=(-3.0*BETA2*pTr)/(2.0*SigM)

!    

!-----------------------------------------------------------------------

!  Compute Yield Function

!-----------------------------------------------------------------------

    F = (qTr**2.0/SigM**2.0)+(2.0*Eff_Void*BETA1*cosh(TH))

   .  -1.0-BETA3*Eff_Void**2.0

!

!-----------------------------------------------------------------------

!   Check for plasticity

!-----------------------------------------------------------------------

    IF(F.GT.0.0)THEN ! Plastic flow

!-----------------------------------------------------------------------

!    Initialize Variables

!-----------------------------------------------------------------------

     p = pTr

     q = qTr

     Void = VoidTr

     EpsPEqv = EpsPEqvTr

     DeltaEpsP = 0.

     DeltaEpsQ = 0.

     omega_shear = 1.0 - (27*J_3 / (2.0*qTr**3))**2

     IF(q.LE.1.0E-20)THEN

      q=1.0E-20

     ENDIF

!

!-----------------------------------------------------------------------

!    Start iteration

!-----------------------------------------------------------------------

     DO ITER=1,MXITER

      IF(q.LE.1.0E-20)THEN

       q=1.0E-20

      ENDIF

!-----------------------------------------------------------------------

!     Calculate Derivatives

!-----------------------------------------------------------------------

      SigMDerivX2 = T_1*Q_1*EXP(-Q_1*EpsPEqv)          ! dSigM / deps_eq_p

   .         + T_2*Q_2*EXP(-Q_2*EpsPEqv)

   .         + T_3*Q_3*EXP(-Q_3*EpsPEqv)

      GDerivQ = 2.0*q/SigM**2.0                 ! dG/dq

      GDerivP = -3.0*Eff_Void*BETA1*BETA2/SigM*SINH(TH)     ! dG/dp

      GDerivX1 = 2.0*BETA1*COSH(TH)-2.0*BETA3*Eff_Void      ! dG/df^*

      GDerivX2 = -2.0*q**2.0 * SigMDerivX2 /SigM**3.0      ! dG/deps_eq_p

   .        + 3.0*Eff_Void*BETA1*BETA2*p*SigMDerivX2

   .        / SigM**2.0*SINH(TH)

      G2DerivPQ = 0.0

      G2DerivP2 = (9.0*Eff_Void*BETA1*BETA2**2.0)/(2.0*SigM**2.0)

   .         *COSH(TH)

      G2DerivQ2 = 2.0/SigM**2.0

      G2DerivQX1 = 0.0

      G2DerivQX2 = -4.0*q*SigMDerivX2/SigM**3.0

      G2DerivPX1 = -3.0*BETA1*BETA2/SigM*SINH(TH)

      G2DerivPX2 = (3.0*SigMDerivX2*Eff_Void*BETA1*BETA2/SigM**2.0)

   .        *(SINH(TH)+TH*COSH(TH))

      h1DerivDeltaEpsP = 1.0-Void

      h1DerivP = 0.0

      h2DerivDeltaEpsP = (-p)/((1-Void)*SigM)

      h2DerivP = -DeltaEpsP/((1-Void)*SigM)

      h1DerivDeltaEpsQ = k_s*Void*omega_shear  ! 0 Initially

      h1DerivQ = 0.0

      h2DerivDeltaEpsQ = q/((1-Void)*SigM)

      h2DerivQ = (DeltaEpsQ) /((1-Void)*SigM)

      h1DerivX1 = -DeltaEpsP

      IF((p.LE.0.0).and.(FN.ne.0))THEN

        h1DerivX2 = -DeltaEpsPEqv*FN/(SN*sqrt(2.0*PI))

   .  *(EpsPEqv-EPSN)/(SN**2.0)*exp(-0.5*((EpsPEqv-EPSN)/SN)**2.0)

      ELSE

        h1DerivX2 = 0.0

      ENDIF

      h2DerivX1 = (-p*DeltaEpsP+q*DeltaEpsQ)

   .         /(SigM*(1.0-Void)**2.0)

      h2DerivX2 = SigMDerivX2*(p*DeltaEpsP-q*DeltaEpsQ)

   .        /((1.0-Void)*SigM**2.0)

      C11Inv = 1.0-h1DerivX1

      C12Inv = h1DerivX2

      C21Inv = h2DerivX1

      C22Inv = 1.0-h2DerivX2

      DetC = C11Inv*C22Inv-C12Inv*C21Inv

      C11 = C22Inv/DetC

      C12 = -C12Inv/DetC

      C21 = -C21Inv/DetC

      C22 = C11Inv/DetC

      X1DerivDeltaEpsP =

   .    +C11*((h1DerivDeltaEpsP)+K*(h1DerivP))

   .    +C12*((h2DerivDeltaEpsP)+K*(h2DerivP))

      X2DerivDeltaEpsP =

   .    +C22*((h2DerivDeltaEpsP)+K*(h2DerivP))

   .    +C21*((h1DerivDeltaEpsP)+K*(h1DerivP))

      X1DerivDeltaEpsQ =

   .    +C11*((h1DerivDeltaEpsQ)-3.0*G*(h1DerivQ))

   .    +C12*((h2DerivDeltaEpsQ)-3.0*G*(h2DerivQ))

      X2DerivDeltaEpsQ =

   .    +C22*((h2DerivDeltaEpsQ)-3.0*G*(h2DerivQ))

   .    +C21*((h1DerivDeltaEpsQ)-3.0*G*(h1DerivQ))

!-----------------------------------------------------------------------

!     Calculate Constants For Update

!-----------------------------------------------------------------------

      A11 = GDerivQ+DeltaEpsP*(K*G2DerivPQ

   .       +G2DerivQX1*X1DerivDeltaEpsP

   .       +G2DerivQX2*X2DerivDeltaEpsP)

   .       +DeltaEpsQ*(K*G2DerivP2

   .       +G2DerivPX1*X1DerivDeltaEpsP

   .       +G2DerivPX2*X2DerivDeltaEpsP)

      A12 = GDerivP+DeltaEpsP*(-3.0*G*G2DerivQ2

   .       +G2DerivQX1*X1DerivDeltaEpsQ

   .       +G2DerivQX2*X2DerivDeltaEpsQ)

   .       +DeltaEpsQ*(-3.0*G*G2DerivPQ

   .       +G2DerivPX1*X1DerivDeltaEpsQ

   .       +G2DerivPX2*X2DerivDeltaEpsQ)

      A21 = K*GDerivP+GDerivX1*X1DerivDeltaEpsP

   .           +GDerivX2*X2DerivDeltaEpsP

      A22 = -3.0*G*GDerivQ+GDerivX1*X1DerivDeltaEpsQ

   .              +GDerivX2*X2DerivDeltaEpsQ

      b1 = -DeltaEpsP*GDerivQ-DeltaEpsQ*GDerivP

      b2 = -F

      T1 = b2-A21*b1/A11

      T2 = A22-A21*A12/A11

      Cq = T1/T2

      Cp = (b1-A12*Cq)/A11

!

!-----------------------------------------------------------------------

!     Update Values

!-----------------------------------------------------------------------

      DeltaEpsP = DeltaEpsP+Cp

      DeltaEpsQ = DeltaEpsQ+Cq

!

!---------- Update pressure and eqv stress ----------------------------------       

      p=pTr+K*DeltaEpsP

      q=qTr-3.0*G*DeltaEpsQ

!

!---------- Update equivalent plastic strain ----------------------------------       

      DeltaEpsPEqv = (-p*DeltaEpsP+q*DeltaEpsQ)/((1.0-Void)*SigM)

!   

!---------- Update Void Growth term ----------------------------------  

      DeltaVoidG = DeltaEpsP*(1.0-Void)

!       

!---------- Update Void Nucleation term ---------------------------------- 

      IF ((p.LE.0.0).and.(FN.ne.0)) THEN

       DeltaVoidN = DeltaEpsPEqv*FN/(SN*sqrt(2.0*PI))

   .         * exp(-0.5*((EpsPEqv-EPSN)/SN)**2)

      ELSE

       DeltaVoidN = 0.0

      END IF

!

!---------- Update Void Shear term ---------------------------------- 

      IF (k_s .ne. 0) THEN

       DeltaVoidS = k_s*VoidTr*omega_shear*DeltaEpsQ

      ELSE

       DeltaVoidS = 0.   

      END IF 

!

!---------- Update the equivalent plastic strain ---------------------------------------

      EpsPEqv = EpsPEqvTr + DeltaEpsPEqv

!       

!---------- Update yield strength ------------------------------------------------ 

      CALL VOCE(SigM, SIGMA0, EpsPEqv, T_1, Q_1, T_2, Q_2, T_3, Q_3)

!---------- Update bracket term ------------------------------------------------ 

      TH = (-3.0*BETA2*p)/(2.0*SigM)

!

!----------- Sum all void contributions ------------------------------------------------       

      DeltaVoid = DeltaVoidG + DeltaVoidN + DeltaVoidS

      Void = VoidTr+DeltaVoid

!

!      

!     VOID COALESCENCE!       

!----------- Calculate the effective void volume fraction f^* --------------------------  

      IF ((Void .ge. f_c).and.(f_f.ne.0)) THEN

       C_Factor = ((1/BETA1) - f_c) / (f_f - f_c)

       Eff_Void = f_c + C_Factor * (Void - f_c)

      ELSE 

       Eff_Void = Void

      END IF     

!

!---------- In order to avoid numerical errors -------------------------       

      IF (Eff_Void .ge. 0.99*(1/BETA1)) THEN

       Eff_Void = 0.99*(1/BETA1)

      END IF  

!      

!---------- Check the modified yield function --------------------------

      F = (q**2.0/SigM**2.0)+

   .      (2.0*Eff_Void*BETA1*COSH(TH))     

   .      -1.0-BETA3*Eff_Void**2.0 

!   

!-----------------------------------------------------------------------

!     Compute convergence criterion

!-----------------------------------------------------------------------

      RESNOR = ABS(F/SigM)

!-----------------------------------------------------------------------

!     Check for convergence

!-----------------------------------------------------------------------

      IF(RESNOR.LE.TOL)THEN ! RMAP has converged

!-----------------------------------------------------------------------

! Now, introducing the \kappa parameter in order to speed up the void deformations.

! This code is only executed if there are plastic deformations in the element, which is correct.

! The adjusted update in the void volume fraction is local, but the rate is adjusted dependent on its 

! neighbors plastics increments...

!-----------------------------------------------------------------------       

! Based on the plastic increment ratio NL/L, we will speed up / slow down the void growth:

!

        kappa = 1.   !If \kappa=1 is used, the local solution is obtained

        Void = VoidTr + kappa * DeltaVoid

!        

!-------------- In order to avoid numerical errors -----------------------  

        IF (f_f.ne.0) THEN ! Then we have coalescence, and Void should be less than f_f

         IF (Void .ge. 0.99*f_f) THEN

          Void = 0.99*f_f

         END IF 

        ELSE 

         IF (Void .ge. 0.99*(1.0/BETA1)) THEN

          Void = 0.99*(1.0/BETA1)

         END IF 

        END IF

!

!-----------------------------------------------------------------------

!       Update the stress tensor

!-----------------------------------------------------------------------

        STRESSNEW(km,1) = (stresstr(1)+pTr)*(q/qTr) - p

        STRESSNEW(km,2) = (stresstr(2)+pTr)*(q/qTr) - p

        STRESSNEW(km,3) = (stresstr(3)+pTr)*(q/qTr) - p

        STRESSNEW(km,4) = stresstr(4)*(q/qTr)

        IF ( nshr .gt. 1 ) THEN

         STRESSNEW(km,5) = stresstr(5)*(q/qTr)

         STRESSNEW(km,6) = stresstr(6)*(q/qTr)

        END IF

!-----------------------------------------------------------------------

!       Update the history variables

!-----------------------------------------------------------------------

        IF(abs(Void).LE.1.0E-10)THEN

         Void=0.0         

        ENDIF

        STATENEW(km,1) = Void   ! VoidFrac

        STATENEW(km,2) = EpsPEqv ! EpsPEqv

        STATENEW(km,3) = q    ! SigEqv

        STATENEW(km,4) = p    ! SigH

        STATENEW(km,5) = SigM   ! SigM

        STATENEW(km,6) = F    ! F

        STATENEW(km,8) = EpsPEqv ! Local plastic strain

!---------------------------------------------------------------------------

! Delete the element if the void content has reached the critical value: 

        IF (STATEOLD(km,7) .eq. 1) THEN    ! If the element hasn't been deleted yet

         IF (f_f .ne. 0) THEN 

          IF (Void .ge. 0.98*f_f) THEN 

           STATENEW(km,7) = 0

          ELSE 

           STATENEW(km,7) = 1

          END IF 

         ELSE 

          IF (Void.ge.(0.98*(1/BETA1))) THEN

           STATENEW(km,7) = 0         ! If critical void content: delete the element

          ELSE 

           STATENEW(km,7) = 1

          END IF 

         END IF 

        ELSE  

         STATENEW(km,7) = 0          ! The element was deleted in an earlier increment..

        END IF     

!---------------------------------------------------------------------------        

        GOTO 90

       ELSE ! RMAP has not converged yet

        IF(ITER.eq.(MXITER-1))THEN

         PRINT*, "RMAP has not converged!"

         PRINT*, "Convergence: ", RESNOR

         PRINT*, Void

         STOP

        ENDIF

       ENDIF

      ENDDO !The plastic convergence loop in the vumat

     ELSE

!

!-----------------------------------------------------------------------

! If this case, the element has undergone purely elastic deformation: 

!-----------------------------------------------------------------------

!    Update the stress tensor

!-----------------------------------------------------------------------

      STRESSNEW(km,1) = stresstr(1)

      STRESSNEW(km,2) = stresstr(2)

      STRESSNEW(km,3) = stresstr(3)

      STRESSNEW(km,4) = stresstr(4)

      IF ( nshr .gt. 1 ) THEN

       STRESSNEW(km,5) = stresstr(5)

       STRESSNEW(km,6) = stresstr(6)

      END IF

!-----------------------------------------------------------------------

!    Update the history variables

!-----------------------------------------------------------------------

      STATENEW(km,1) = VoidTr    ! VoidFrac

      STATENEW(km,2) = EpsPEqvTr   ! EpsPEqv

      STATENEW(km,3) = SigEqv    ! SigEqv

      STATENEW(km,4) = pTr      ! SigH

      STATENEW(km,5) = SigM     ! SigM

      STATENEW(km,6) = F       ! F

      STATENEW(km,7) = 1       ! Delete the element or not..

      STATENEW(km,9) = EpsPEqvTr   ! EpsPEqv

     ENDIF

 90 CONTINUE

!-----------------------------------------------------------------------

!   Store the specific internal energy -

!----------------------------------------------------------------------- 

     if ( nshr .eq. 1 ) then

      stressPower = half * (

   .   ( stressOld(km,1) + stressNew(km,1) ) * strainInc(km,1) +

   .   ( stressOld(km,2) + stressNew(km,2) ) * strainInc(km,2) +

   .   ( stressOld(km,3) + stressNew(km,3) ) * strainInc(km,3) ) +

   .   ( stressOld(km,4) + stressNew(km,4) ) * strainInc(km,4)

     else

      stressPower = half * (

   .   ( stressOld(km,1) + stressNew(km,1) ) * strainInc(km,1) +

   .   ( stressOld(km,2) + stressNew(km,2) ) * strainInc(km,2) +

   .   ( stressOld(km,3) + stressNew(km,3) ) * strainInc(km,3) ) +

   .   ( stressOld(km,4) + stressNew(km,4) ) * strainInc(km,4) +

   .   ( stressOld(km,5) + stressNew(km,5) ) * strainInc(km,5) +

   .   ( stressOld(km,6) + stressNew(km,6) ) * strainInc(km,6)

     end if

     enerInternNew(km) = enerInternOld(km) + stressPower / density(km) 

!     

!-----------------------------------------------------------------------

!  END the material point loop and vumat branch:

!-----------------------------------------------------------------------

   END DO        ! End of the material point loop

   END IF        ! End of the preprocessor / vumat branch

!

!-----------------------------------------------------------------------

!  END SUBROUTINE

!-----------------------------------------------------------------------

   RETURN

   END

!   

!   

!

!

! 3 term Voce hardening rule:

   SUBROUTINE VOCE(sigma_new, sigma0, peeqOld, T_1, Q_1, T_2, 

   .Q_2, T_3, Q_3)

    include 'vaba_param.inc'

!

    term1 = T_1 * (1 - EXP(-Q_1 * peeqOld))

    term2 = T_2 * (1 - EXP(-Q_2 * peeqOld))

    term3 = T_3 * (1 - EXP(-Q_3 * peeqOld))

    sigma_new = sigma0 + term1 + term2 + term3

   RETURN 

   END

!

!

材料卡片

GTN 模型参考vumat的图1

登录后免费查看全文
立即登录
App下载
技术邻APP
工程师必备
  • 项目客服
  • 培训客服
  • 平台客服

TOP