Abaqus 子程序

SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
     1 RPL, DDSDDT, DRPLDE, DRPLDT,
     2 STRAN, DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,
     3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,
     4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC)      ! 共37个参数
      INCLUDE 'ABA_PARAM.INC'
      CHARACTER*80 CMNAME
      DIMENSION STRESS(NTENS),STATEV(NSTATV),
     1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS),
     2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1),
     3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3)
      ! user coding to define DDSDDE, STRESS, STATEV, SSE, SPD, SCD 
      ! and, if necessary, RPL, DDSDDT, DRPLDE, DRPLDT, PNEWDT
      RETURN
END SUBROUTINE UMAT

! ------------------------------------------------------------------------------
! COORDS 当前积分点的坐标
! DDSDDE ( NTENS,NTENS) 大小为 NTENS×NTENS 的 Jacobian 矩阵( Δσ / Δε ),
! DDSDDE (I,J) 定义了第 J 个应变分量的微小变化对第 I 个应力分量带来的变化。通常 Jacobian 矩阵是一个对称矩阵,
! 除非在“ *USER MATERIAL”语句中加入了“ UNSYMM”参数;需要更新 DROT
! 对 Finite strain 问题,应变应该排除旋转部分,该矩阵提供了旋转矩阵,详见下面的解释;已知
! DSTRAN (NTENS) 应变增量 dε[n+1],已知
! DTIME 增量步的时间增量 dt ;已知
! KSTEP,KINC 传到用户子程序当前的 STEP 和 INCREMENT 值   KSTEP为载荷时间步;KINC为增量步
! NDI 直接应力(正应力)、应变个数,对三维问题、轴对称问题自然是 3( 11,22,33),平面问题是 2(11,22);已知
! NOEL,NPT 积分点所在单元的编号和积分点的编号
! NSHR 剪切应力(剪应力)、应变个数,三维问题时 3(12,13,23),轴对称问题是 1(12);已知
! NTENS =NDI+ NSHR,总应力分量的个数;已知
! PNEWDT 可用来控制时间步的变化。如果设置为小于 1 的数,则程序放弃当前计算,并用新的时间增量 DTIME X PNEWDT
! 作为新的时间增量计算;这对时间相关的材料如聚合物等有用;
! 如果设为大余 1 的数,则下一个增量步加大 DTIME 为 DTIME X PNEWDT。可以更新。
! PROPS (NPROPS) 材料常数数组,如模量啊,粘度系数等等;
! 材料参数的个数,等于关键词“ *USER MATERIAL”中“ CONSTANT S”常数设定的值;
! 矩阵中元素的数值对应于关键词“ USER MATERIAL”下面的数据行。作为已知量传入;已知
! SSE,SPD,SCD 分别定义每一增量步的弹性应变能,塑性耗散和蠕变耗散。它们对计算结果没有影响,仅仅作为能量输出
! STATEV (NSTATEV) 状态变量矩阵,用来保存用户自己定义的一些变量,如累计塑性应变,粘弹性应变等等。
! 增量步开始时作为已知量传入,增量步结束应该更新
! STRAN (NTENS) 当前应变数组ε[n],已知
! STRESS (NTENS) 应力张量数组,对应 NDI 个直接分量和 NSHR 个剪切分量。
! 在增量步的开始,应力张量矩阵σ[n]中的数值通过 UMAT 和主程序之间的接口传递到 UMAT 中,
! 在增量步的结束, UMAT 将对应力张量矩阵更新为σ[n+1]。
! 对于包含刚体转动的有限应变问题,一个增量步调用 UMAT 之前就
! 已经对应力张量进行了刚体转动,因此 UMAT 中只需处理应力张量的共旋部分。 UMAT 中应力张量的度量为柯
! 西(真实)应力。
! ------------------------------------------------------------------------------
! 下面这个 UMAT 取自 ABAQUS 手册,是一个用于大变形下的弹塑性材料模型,注意的是这里需要了解 J2 理论。
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT,
     1 DRPLDE,DRPLDT,STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,
     2 CMNAME,NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,
     3 PNEWDT,CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC)
C
      INCLUDE 'ABA_PARAM.INC'
! 定义了一些相关参数与变量什么,从 ABAQUS 安装目录下的子文件夹“… \site”中可找到
C
       CHARACTER*8 CMNAME
C
       DIMENSION STRESS(NTENS),STATEV(NSTATV),DDSDDE(NTENS,NTENS),
    1 DDSDDT(NTENS)(应变矩阵),DRPLDE(NTENS),STRAN(NTENS),DSTRAN(NTENS)    ! (应变增量矩阵) ,
    2 PREDEF(1),DPRED(1),PROPS(NPROPS)(材料常数矩),COORDS(3),DROT(3,3)    ! (旋转矩阵) ,
    3 DFGRD0(3,3),DFGRD1(3,3)
! 声明矩阵的尺寸
C
C LOCAL ARRAYS
C ----------------------------------------------------------------
C EELAS - ELASTIC STRAINS
C EPLAS - PLASTIC STRAINS
C FLOW - DIRECTION OF PLASTIC FLOW
C ----------------------------------------------------------------
C
! 局部变量,用来暂时保存弹性应变、塑性应变分量以及流动方向
      DIMENSION EELAS(6),EPLAS(6),FLOW(6)
C
      PARAMETER(ZERO=0.D0,ONE=1.D0,TWO=2.D0,THREE=3.D0,SIX=6.D0,1 ENUMAX=.4999D0,NEWTON=10,TOLER=1.0D-6)
C
C ----------------------------------------------------------------
C UMAT FOR ISOTROPIC ELASTICITY AND ISOTROPIC MISES PLASTICITY
C CANNOT BE USED FOR PLANE STRESS
C ----------------------------------------------------------------
C PROPS(1) - E
C PROPS(2) - NU
C PROPS(3..) - SYIELD AN HARDENING DATA
C CALLS HARDSUB FOR CURVE OF YIELD STRESS VS. PLASTIC STRAIN
C ----------------------------------------------------------------
C
C ELASTIC PROPERTIES
C
! 获取杨氏模量,泊松比,作为已知量由 PROPS 向量传入
      EMOD=PROPS(1)              !   E
      ENU=PROPS(2)               !   ν
      EBULK3=EMOD/(ONE-TWO*ENU)  !   3K , 3k = E /(1-2ν )
      EG2=EMOD/(ONE+ENU)         !   2G , 2G = E /(1+υ)
      EG=EG2/TWO                 !   G  , G = E /2(1+υ)
      EG3=THREE*EG               !   3G
      ELAM=(EBULK3-EG2)/THREE    !   λ  ,  λ = (3k-2G)/3
      DO K1=1,NTENS
        DO K2=1,NTENS
           DDSDDE(K1,K2)=ZERO
        END DO
      END DO                            
! 弹性部分,Jacobian矩阵很容易计算
!   |λ+2G   λ      λ          |
!   |λ      λ+2G   λ          |
! J=|λ      λ      λ+2G       | 
!   |                    G      |
!   |                       G   |
!   |                          G|
! 注意,在ABAQUS中,剪切应变采用工程剪切应变的定义γ(ij)=u(ij)+u(ji),所以剪切部分模量是G而不是2G!
C  
C        ELASTIC  STIFFNESS  C  
      DO K1=1,NDI
        DO K2=1,NDI
          DDSDDE(K2,K1)=ELAM
        END DO
        DDSDDE(K1,K1)=EG2+ELAM
      END DO
      DO K1=NDI+1,NTENS
        DDSDDE(K1,K1)=EG
      END DO
C
C RECOVER ELASTIC AND PLASTIC STRAINS AND ROTATE FORWARD
C ALSO RECOVER EQUIVALENT PLASTIC STRAIN
C
! 读取弹性应变分量,塑性应变分量,并旋转(调用了 ROTSIG),分别保存在 EELAS和 EPLAS 中;
      CALL ROTSIG(STATEV( 1),DROT,EELAS,2,NDI,NSHR)
      CALL ROTSIG(STATEV(NTENS+1),DROT,EPLAS,2,NDI,NSHR)
! 读取等效塑性应变
      EQPLAS=STATEV(1+2*NTENS)
! 先假设没有发生塑性流动,按完全弹性变形计算试算应力Δσ = J.Δε, σ[n+1]=σ[n]+Δσ
CC CALCULATE PREDICTOR STRESS AND ELASTIC STRAIN
C
      DO K1=1,NTENS
        DO K2=1,NTENS
          STRESS(K2)=STRESS(K2)+DDSDDE(K2,K1)*DSTRAN(K1)
        END DO
        EELAS(K1)=EELAS(K1)+DSTRAN(K1)  ! 弹性应变分量
      END DO
C 计算 Mises 应力
C CALCULATE EQUIVALENT VON MISES STRESS
C
      SMISES=(STRESS(1)-STRESS(2))**2+(STRESS(2)-STRESS(3))**2
     1 +(STRESS(3)-STRESS(1))**2
      DO K1=NDI+1,NTENS
        SMISES=SMISES+SIX*STRESS(K1)**2
      END DO
      SMISES=SQRT(SMISES/TWO)
C 根据当前等效塑性应变,调用 HARDSUB 得到对应的屈服应力
C GET YIELD STRESS FROM THE SPECIFIED HARDENING CURVE
C
      NVALUE=NPROPS/2-1
      CALL HARDSUB(SYIEL0,HARD,EQPLAS,PROPS(3),NVALUE)
C
C DETERMINE IF ACTIVELY YIELDING
C 如果 Mises 应力大余屈服应力,屈服发生,计算流动方向
      IF (SMISES.GT.(ONE+TOLER)*SYIEL0) THEN
C
C ACTIVELY YIELDING
C SEPARATE THE HYDROSTATIC FROM THE DEVIATORIC STRESS
C CALCULATE THE FLOW DIRECTION
C
      SHYDRO=(STRESS(1)+STRESS(2)+STRESS(3))/THREE
        DO K1=1,NDI
          FLOW(K1)=(STRESS(K1)-SHYDRO)/SMISES
        END DO
        DO K1=NDI+1,NTENS
          FLOW(K1)=STRESS(K1)/SMISES
        END DO
C 根据 J2 理论并应用 Newton-Rampson 方法求得等效塑性应变增量
C SOLVE FOR EQUIVALENT VON MISES STRESS
C AND EQUIVALENT PLASTIC STRAIN INCREMENT USING NEWTON ITERATIO
C
C
      SYIELD=SYIEL0
      DEQPL=ZERO
        DO KEWTON=1,NEWTON
          RHS=SMISES-EG3*DEQPL-SYIELD
          DEQPL=DEQPL+RHS/(EG3+HARD)
          CALL HARDSUB(SYIELD,HARD,EQPLAS+DEQPL,PROPS(3),NVALUE)
             IF(ABS(RHS).LT.TOLER*SYIEL0) GOTO 10
        END DO
C
C WRITE WARNING MESSAGE TO THE .MSG FILE
C
      WRITE(7,2) NEWTON
     2 FORMAT(//,30X,'***WARNING - PLASTICITY ALGORITHM DID NOT ',
     1 'CONVERGE AFTER ',I3,' ITERATIONS')
10    CONTINUE
C 更新应力σ n+1,应变分量
C UPDATE STRESS, ELASTIC AND PLASTIC STRAINS AND
C EQUIVALENT PLASTIC STRAIN
C
       DO K1=1,NDI
         STRESS(K1)=FLOW(K1)*SYIELD+SHYDRO
         EPLAS(K1)=EPLAS(K1)+THREE/TWO*FLOW(K1)*DEQPL
         EELAS(K1)=EELAS(K1)-THREE/TWO*FLOW(K1)*DEQPL
       END DO
       DO K1=NDI+1,NTENS
         STRESS(K1)=FLOW(K1)*SYIELD
         EPLAS(K1)=EPLAS(K1)+THREE*FLOW(K1)*DEQPL
         EELAS(K1)=EELAS(K1)-THREE*FLOW(K1)*DEQPL
       END DO
      EQPLAS=EQPLAS+DEQPL
C
C CALCULATE PLASTIC DISSIPATION 
C
      SPD=DEQPL*(SYIEL0+SYIELD)/TWO
C
C 计算塑性变形下的 Jacobian 矩阵
      FORMULATE THE JACOBIAN (MATERIAL TANGENT)
C FIRST CALCULATE EFFECTIVE MODULI
C
      EFFG=EG*SYIELD/SMISES
      EFFG2=TWO*EFFG
      EFFG3=THREE/TWO*EFFG2
      EFFLAM=(EBULK3-EFFG2)/THREE
      EFFHRD=EG3*HARD/(EG3+HARD)-EFFG3
c...
      if (props(7).lt..001) go to 99
c...
      DO K1=1,NDI
        DO K2=1,NDI
          DDSDDE(K2,K1)=EFFLAM
        END DO
        DDSDDE(K1,K1)=EFFG2+EFFLAM
      END DO
      DO K1=NDI+1,NTENS
        DDSDDE(K1,K1)=EFFG
      END DO
      DO K1=1,NTENS
        DO K2=1,NTENS
          DDSDDE(K2,K1)=DDSDDE(K2,K1)+EFFHRD*FLOW(K2)*FLOW(K1)
        END DO
      END DO
c...
99    continue
c...
      END IF
C 将弹性应变,塑性应变分量保存到状态变量中,并传到下一个增量步
C STORE ELASTIC AND (EQUIVALENT) PLASTIC STRAINS
C IN STATE VARIABLE ARRAYC
      DO K1=1,NTENS
         STATEV(K1)=EELAS(K1)
         STATEV(K1+NTENS)=EPLAS(K1)
      END DO
      STATEV(1+2*NTENS)=EQPLAS
C
      RETURN
END SUBROUTINE UMAT
c...
c...子程序,根据等效塑性应变,利用插值的方法得到对应的屈服应力
SUBROUTINE HARDSUB(SYIELD,HARD,EQPLAS,TABLE,NVALUE)
      INCLUDE 'ABA_PARAM.INC'
      DIMENSION TABLE(2,NVALUE)
      PARAMETER(ZERO=0.D0)
C
C SET YIELD STRESS TO LAST VALUE OF TABLE, HARDENING TO ZERO
C
      SYIELD=TABLE(1,NVALUE)
      HARD=ZERO
C IF MORE THAN ONE ENTRY, SEARCH TABLE
C
      IF(NVALUE.GT.1) THEN
      DO K1=1,NVALUE-1
         EQPL1=TABLE(2,K1+1)
         IF(EQPLAS.LT.EQPL1) THEN
            EQPL0=TABLE(2,K1)
         IF(EQPL1.LE.EQPL0) THEN
      WRITE(7,1)
     1 FORMAT(//,30X,'***ERROR - PLASTIC STRAIN MUST BE ',
     1     'ENTERED IN ASCENDING ORDER')
      CALL XIT
         END IF
CC CURRENT YIELD STRESS AND HARDENING
C
      DEQPL=EQPL1-EQPL0
      SYIEL0=TABLE(1,K1)
      SYIEL1=TABLE(1,K1+1)
      DSYIEL=SYIEL1-SYIEL0
      HARD=DSYIEL/DEQPL
      SYIELD=SYIEL0+(EQPLAS-EQPL0)*HARD
      GOTO 10
         END IF
      END DO
10    CONTINUE
      END IF
      RETURN
END SUBROUTINE HARDSUB

Leave a Reply