3. 弹性本构UMAT实现
各向同性线弹性是UMAT开发中最基础、也最适合用来打通“公式—代码—验证”闭环的本构模型。它的物理含义清晰:应力与弹性应变之间通过四阶弹性张量线性映射,材料只有两个独立常数,通常取弹性模量 E 和泊松比 ν,或取体积模量 K 与剪切模量 G。本节从应力更新公式出发,推导Jacobian矩阵,给出可直接编译的Fortran实现,并用单轴拉伸算例验证。
一、应力更新公式
在增量有限元中,UMAT在每个积分点接收上一步收敛的应力 STRESS、总应变增量 DSTRAN,以及状态变量 STATEV。线弹性无历史依赖,因此应力更新为:
σ(n+1) = σ(n) + C : Δε
其中 C 为四阶弹性张量。对三维问题,用Lamé常数表示最简洁:
λ = Eν / [(1+ν)(1-2ν)]
μ = G = E / [2(1+ν)]
C_ijkl = λ δ_ij δ_kl + μ (δ_ik δ_jl + δ_il δ_jk)
展开为Voigt记法的6×6矩阵(工程剪应变约定):
D11 = D22 = D33 = λ + 2μ
D12 = D13 = D23 = λ
D44 = D55 = D66 = μ
其余分量为零。注意:ABAQUS的UMAT中剪应变分量为工程剪应变 γ = 2ε,因此剪切刚度项直接为 μ,不需要额外乘2。这是初学者最容易出错的地方之一。
二、Jacobian矩阵推导
Jacobian矩阵 DDSDDE(i,j) 定义为应力增量对应变增量的偏导:
DDSDDE(i,j) = ∂Δσ_i / ∂Δε_j
对线弹性本构,应力增量与应变增量严格线性,因此Jacobian就是弹性张量本身,且在整个增量步内为常数。这意味着:
- Jacobian不随当前应力或应变变化,无需迭代更新;
- 它是对称正定矩阵,保证Newton迭代的收敛性;
- 在UMAT中只需在增量步开始时赋值一次。
若采用 K-G 形式,矩阵元素为:
D11 = K + 4G/3
D12 = K - 2G/3
D44 = G
两种写法等价,选择哪种取决于输入参数。工程中常直接给 E、ν,因此代码里先算 λ、μ 更自然。
三、Fortran代码实现
下面给出一个完整的UMAT子程序,适用于三维实体单元。代码中所有变量按ABAQUS约定声明,DDSDDE 先清零再赋值。
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)
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)
REAL*8 E, ENU, ELAM, EMU, D11, D12
E = PROPS(1)
ENU = PROPS(2)
ELAM = E*ENU/((1.0D0+ENU)*(1.0D0-2.0D0*ENU))
EMU = E/(2.0D0*(1.0D0+ENU))
D11 = ELAM + 2.0D0*EMU
D12 = ELAM
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
IF (I.EQ.J) THEN
DDSDDE(I,J) = D11
ELSE
DDSDDE(I,J) = D12
END IF
END DO
END DO
DO I=4,NTENS
DDSDDE(I,I) = EMU
END DO
DO I=1,NTENS
DO J=1,NTENS
STRESS(I) = STRESS(I) + DDSDDE(I,J)*DSTRAN(J)
END DO
END DO
SSE = 0.0D0
DO I=1,NTENS
SSE = SSE + 0.5D0*STRESS(I)*STRAN(I)
END DO
SPD = 0.0D0
SCD = 0.0D0
RETURN
END
代码要点:NTENS 对三维单元为6,对平面应变单元为4,对平面应力单元为3。若用于平面应力,需将 DDSDDE 改为平面应力矩阵,或采用ABAQUS的平面应力单元自动处理。本代码按三维/平面应变通用写法,NDI=3、NSHR=3 时正确。
四、单轴拉伸验证
验证模型:一个100 mm×10 mm×10 mm的立方体单元,左端固定,右端施加 u_x = 0.1 mm 的位移。材料参数取 E = 210000 MPa、ν = 0.3。理论解为:
ε_x = 0.1/100 = 1.0e-3
σ_x = E ε_x = 210 MPa
ε_y = ε_z = -ν ε_x = -3.0e-4
在ABAQUS中提交后,检查积分点的 STRESS(1) 是否等于210 MPa,STRESS(2)、STRESS(3) 是否接近0(自由边界),STRAN(2)、STRAN(3) 是否为-3.0e-4。若偏差超过1%,优先检查单位一致性、泊松比符号、以及是否误用了工程剪应变。
- 轴向应力 σ_x = E·ε_x,误差应小于0.1%;
- 横向应变 ε_y = ε_z = -ν·ε_x;
- DDSDDE 对称且正定,行列式大于0;
- SSE 与 0.5·σ:ε 一致,量级合理;
- 改变网格密度,结果不变(线弹性无网格依赖)。
通过单轴拉伸后,可进一步做纯剪切验证:施加 γ_xy = 1.0e-3,检查 τ_xy = G·γ_xy,其中 G = E/[2(1+ν)] = 80769.2 MPa。这一步能有效暴露剪应变约定错误。完成这两个算例,各向同性线弹性UMAT即可视为正确,可作为后续塑性、损伤等本构的开发基线。