2. UMAT接口参数精讲

UMAT(User Material)子程序是Abaqus/Standard中用户自定义材料本构的入口。它的接口签名看似冗长,但每一个参数都对应着求解器与本构计算之间的一次明确“交接”:求解器把当前积分点的变形、时间、增量信息交给你,你负责返回更新后的应力、切线刚度,以及需要跨增量保存的状态变量。理解这些参数,本质上是在理解Abaqus在每一个积分点上如何驱动本构计算。

接口签名与参数分组

标准UMAT的Fortran接口形式如下(Abaqus 2020及以后版本):

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,JSTEP,KINC)

按职责可以把这些参数分成四组:输入量(求解器告诉你什么)、输出量(你必须回填什么)、状态变量(跨增量记忆)、材料常数与能量变量(参数化与能量核算)。下面逐组展开。

输入量:求解器交给你的当前状态

STRAN(NTENS)是增量步开始时的总应变(对数应变,小变形下近似为工程应变),DSTRAN(NTENS)是本增量步的应变增量。注意Abaqus传入的是总应变而非弹性应变,弹性应变需要你自己用STRAN+DSTRAN减去塑性、蠕变等非弹性部分得到。

TIME(1)是当前分析步时间,TIME(2)是总时间;DTIME是本次增量步的时间增量。做率相关本构(如粘塑性)时,DTIME直接进入粘性流动方程。TEMP和DTEMP分别是增量开始时的温度和温度增量,用于热-力耦合或温度相关参数插值。

DFGRD0和DFGRD1是增量开始和结束时的变形梯度张量(3×3),有限变形本构必须用它们计算变形率张量D和旋转率张量W。DROT是旋转增量矩阵,用于把应力从局部坐标系旋转到全局坐标系。COORDS是积分点坐标,CELENT是单元特征长度,做非局部或梯度增强本构时会用到。

NOEL、NPT、LAYER、KSPT、JSTEP、KINC分别是单元号、积分点号、层号、截面点号、分析步号和增量步号。它们主要用于调试输出和条件分支,例如只在某个单元或某个增量步打印中间量。

输出量:你必须回填的应力与切线刚度

STRESS(NTENS)是增量结束时的应力张量,必须由你更新。Abaqus约定:对于三维单元,NTENS=6,存储顺序为σ11, σ22, σ33, σ12, σ13, σ23;对于平面应变,NTENS=4,顺序为σ11, σ22, σ33, σ12。这个顺序必须与DDSDDE的行列顺序严格一致,否则切线刚度会错位。

DDSDDE(NTENS,NTENS)是材料切线刚度矩阵∂Δσ/∂Δε。它决定Newton-Raphson迭代的收敛速度:给对了是二次收敛,给错了可能收敛缓慢甚至发散。对于弹性段,DDSDDE就是弹性刚度矩阵;对于塑性段,它是弹塑性切线模量(连续切线或算法切线)。一个常见错误是只更新STRESS而忘记更新DDSDDE,导致收敛困难。

PNEWDT是建议的新时间增量比。如果本构计算中出现了较大的误差或迭代困难,可以把它设为小于1的值,Abaqus会据此缩小下一步的DTIME。默认值为1.0,表示不干预。

状态变量:跨增量的记忆载体

STATEV(NSTATV)是状态变量数组,NSTATV由*DEPVAR关键字定义。它的核心语义是:进入UMAT时,STATEV保存的是增量开始时的值;退出UMAT时,你必须把它更新为增量结束时的值。求解器会在下一个增量步把更新后的值再传回来。

对于经典J2塑性,典型的状态变量安排是:STATEV(1)等效塑性应变,STATEV(2:7)塑性应变分量,STATEV(8:13)背应力分量(如果采用随动强化)。对于损伤本构,可以增加损伤变量d和累积塑性应变。状态变量的数量要按实际需要定义,过多会浪费内存,过少则无法完整记录历史。

调试建议:在UMAT开头用WRITE(6,*)打印KINC, NPT, STATEV(1),可以快速确认状态变量是否按预期传递和更新。注意只在调试时开启,正式计算中大量I/O会显著拖慢速度。

材料常数与能量变量

PROPS(NPROPS)是材料常数数组,NPROPS由*USER MATERIAL, CONSTANTS=定义。例如线弹性可以定义PROPS(1)=E、PROPS(2)=ν;J2塑性可以定义PROPS(1)=E、PROPS(2)=ν、PROPS(3)=σ_y0、PROPS(4)=H。在UMAT内部,建议先把PROPS赋给有意义的局部变量(如E=PROPS(1)),避免满篇PROPS(3)导致可读性下降。

能量变量有三个:SSE是弹性应变能密度,SPD是塑性耗散率,SCD是蠕变耗散率。它们用于能量平衡检查和后处理。对于弹性计算,SSE应等于0.5*σ:ε_e;对于塑性,SPD应等于σ:ε_p的累积。如果能量变量不更新,Abaqus的能量输出会不准确,但通常不影响求解收敛。

RPL、DDSDDT、DRPLDE、DRPLDT是热-力耦合相关的变量:RPL是体积热生成率,DDSDDT是应力对温度的偏导,DRPLDE是热生成率对应变的偏导,DRPLDT是热生成率对温度的偏导。纯力学问题中这些量通常置零即可。

接口参数速查表

下表按“方向—变量—含义—典型用途”整理,可作为编写UMAT时的快速对照。

方向 变量 含义 典型用途
输入STRAN(NTENS)增量开始总应变计算弹性应变
输入DSTRAN(NTENS)应变增量驱动本构更新
输入TIME(1), TIME(2)步时间、总时间率相关、蠕变
输入DTIME时间增量粘塑性流动
输入TEMP, DTEMP温度、温度增量热耦合、参数插值
输入DFGRD0, DFGRD1变形梯度有限变形
输入DROT旋转增量坐标旋转
输入NOEL, NPT, KINC单元、积分点、增量号调试、条件分支
输出STRESS(NTENS)更新后应力必须回填
输出DDSDDE(NTENS,NTENS)切线刚度Newton收敛
输出PNEWDT建议时间增量比自适应步长
状态STATEV(NSTATV)状态变量塑性应变、损伤等
常数PROPS(NPROPS)材料常数E、ν、σ_y0、H
能量SSE, SPD, SCD弹性能、塑性耗散、蠕变耗散能量平衡
热耦合RPL, DDSDDT, DRPLDE, DRPLDT热生成与偏导耦合分析

一个最小可运行的参数使用示例

下面是一段线弹性UMAT的核心片段,展示参数如何被读取和回填。假设PROPS(1)=E、PROPS(2)=ν,NSTATV=0。

      E  = PROPS(1)
      ENU = PROPS(2)
      C10 = E/(1.0D0+ENU)
      C20 = E*ENU/((1.0D0+ENU)*(1.0D0-2.0D0*ENU))
      DO I=1,NTENS
        DO J=1,NTENS
          DDSDDE(I,J) = 0.0D0
        END DO
      END DO
      DO I=1,3
        DO J=1,3
          DDSDDE(I,J) = C20
        END DO
        DDSDDE(I,I) = C10
      END DO
      DO I=4,NTENS
        DDSDDE(I,I) = C10*0.5D0
      END DO
      DO I=1,NTENS
        STRESS(I) = STRESS(I) + DDSDDE(I,1)*DSTRAN(1)
     1             + DDSDDE(I,2)*DSTRAN(2)
     2             + DDSDDE(I,3)*DSTRAN(3)
     3             + DDSDDE(I,4)*DSTRAN(4)
        IF (NTENS.GE.5) STRESS(I) = STRESS(I)
     1             + DDSDDE(I,5)*DSTRAN(5)
        IF (NTENS.GE.6) STRESS(I) = STRESS(I)
     1             + DDSDDE(I,6)*DSTRAN(6)
      END DO

这段代码的关键点在于:DDSDDE按三维6分量顺序填充,前3×3块是正应力-正应变耦合,第4~6对角项是剪切刚度G=E/(2(1+ν))。应力更新用矩阵乘法Δσ = DDSDDE · Δε。如果NTENS=4(平面应变),第5、6分量不存在,循环会自动跳过。

UMAT 接口参数数据流与职责分区 求解器传入当前状态 → UMAT 更新本构 → 回填应力、切线刚度与状态变量 Abaqus 求解器 (每个积分点、每个增量步调用) STRAN, DSTRAN 总应变 + 应变增量 TIME, DTIME, TEMP 时间与温度信息 DFGRD0, DFGRD1, DROT 变形梯度与旋转 PROPS, NPROPS 材料常数数组 STATEV(进入时) 增量开始的历史值 NOEL, NPT, KINC 单元/积分点/增量标识 UMAT 子程序 (用户编写的本构核心) 1. 读取输入 E=PROPS(1), ν=PROPS(2) ε_e = ε_total - ε_p 2. 本构积分 塑性流动、损伤演化 更新 STATEV 3. 计算切线刚度 DDSDDE = ∂Δσ/∂Δε 弹性段 = 弹性矩阵 4. 能量核算 SSE = 0.5σ:ε_e SPD += σ:Δε_p PNEWDT 自适应步长建议 回填给求解器 (必须由用户更新) STRESS(NTENS) 增量结束应力 DDSDDE(NTENS,NTENS) 切线刚度矩阵 STATEV(更新后) 跨增量记忆 SSE, SPD, SCD 能量变量 PNEWDT 时间增量比 STATEV 在下一增量步回传 约定:STRESS 与 DDSDDE 的存储顺序必须一致;三维 NTENS=6,平面应变 NTENS=4

参数使用中的常见陷阱

第一,应力与切线刚度顺序不一致。Abaqus对三维问题使用11,22,33,12,13,23的顺序,如果DDSDDE按11,22,33,12,23,13填充,剪切耦合项就会错位,导致结果异常但未必报错。第二,状态变量未初始化。首次进入UMAT时STATEV全为零,但如果你的本构假设某个状态变量有非零初值(如初始屈服面大小),必须在UMAT内部用IF (KINC.EQ.1 .AND. NPT.EQ.1)之类的条件初始化,或者通过*INITIAL CONDITIONS, TYPE=SOLUTION预置。第三,忘记更新DDSDDE。只更新应力不更新切线刚度,Newton迭代会退化为线性收敛,大变形问题可能直接不收敛。第四,能量变量符号。SPD和SCD是耗散率,应为非负值;如果计算出负值,说明本构积分有误。

把这张速查表和上面的数据流图放在手边,编写UMAT时先确认“哪些是输入、哪些必须回填、状态变量如何传递”,再进入本构公式的实现,可以避免大量低级错误。