高温环境下金属构件的蠕变裂纹扩展分析是工程仿真中的难点问题。以汽轮机叶片为例,在600℃以上长期运行时,材料会发生明显的蠕变现象,导致裂纹尖端应力场重新分布,传统静态断裂力学分析方法已不再适用。
蠕变裂纹扩展的物理机制主要包含三个阶段:
在Abaqus中实现这类分析通常需要用户子程序(UMAT)的介入,主要原因有:
UMAT子程序的标准Fortran接口包含以下关键参数组:
fortran复制SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
1 RPL,DDSDDT,DRPLDE,DRPLDT,
2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,
3 CMNAME,NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,
4 DROT,PNEWDT,CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,
5 KSPT,JSTEP,KINC)
其中核心变量功能如下:
以Norton蠕变定律为例,具体实现流程如下:
fortran复制A = PROPS(1) ! 蠕变系数(1/MPa^n/s)
n = PROPS(2) ! 应力指数
Q = PROPS(3) ! 激活能(J/mol)
R = 8.314 ! 气体常数(J/mol/K)
fortran复制VMSTRESS = SQRT(1.5*(STRESS(1)**2 + STRESS(2)**2 + STRESS(3)**2
& + 2*(STRESS(4)**2 + STRESS(5)**2 + STRESS(6)**2)))
fortran复制CREEP_RATE = A * (VMSTRESS**n) * exp(-Q/(R*TEMP))
fortran复制STATEV(1) = STATEV(1) + CREEP_RATE * DTIME ! 累积蠕变应变
注意:显式积分存在稳定性问题,建议设置自动时间步长:
*CONTROLS, ANALYSIS=CREEP, DIRECT
0.01, 0.01, , , ,
对于小变形蠕变分析,通常采用弹性-蠕变解耦方法:
fortran复制DO K1=1, NTENS
DO K2=1, NTENS
DDSDDE(K2,K1) = 0.0
END DO
END DO
! 弹性部分(各向同性)
E = PROPS(4) ! 弹性模量
ANU = PROPS(5) ! 泊松比
EG = E/(1+ANU)
EK = E/(1-2*ANU)/(1+ANU)
DDSDDE(1,1) = EK + 4*EG/3
...
在裂纹尖端附近区域(通常取2-3倍特征长度),需要增强蠕变效应:
fortran复制! 计算到裂尖距离
X_tip = STATEV(10) ! 裂尖X坐标
Y_tip = STATEV(11) ! 裂尖Y坐标
R = SQRT( (COORDS(1)-X_tip)**2 + (COORDS(2)-Y_tip)**2 )
! 裂尖增强因子
IF(R < 0.1) THEN ! 0.1mm范围内
ENHANCE = 1.0 + 4.0*(1.0 - R/0.1)
CREEP_RATE = CREEP_RATE * ENHANCE
ENDIF
结合XFEM技术时,需在UMAT中处理富集单元:
code复制*FRACTURE CRITERION, TYPE=VCCT
*ENRICHMENT, TYPE=CRACK
fortran复制CALL GETENRICHINFO(NOEL,NPT,ENRICHFLAG,ENRICHCOEFF)
IF(ENRICHFLAG > 0) THEN
! 处理富集单元的本构关系
ENDIF
为提高数值稳定性,可采用隐式积分算法:
fortran复制RES = STATEV(1) - STATEV_OLD(1) - DTIME*CREEP_RATE
fortran复制TOL = 1.0E-6
DO ITER=1, 10
CALL JACOBIAN_CALC(...) ! 计算雅可比
CALL SOLVE_LINEAR_SYSTEM(...) ! 解线性系统
IF(NORM(RES) < TOL) EXIT
END DO
材料参数设置示例:
code复制*MATERIAL, NAME=IN718
*ELASTIC
200.E3, 0.3 ! E(MPa), ν
*CREEP, LAW=USER
1.2E-15, 5.5, 2.8E5 ! A(1/MPa^n/s), n, Q(J/mol)
边界条件设置关键点:
典型后处理流程:
python复制odb = session.odbs['Crack.odb']
step = odb.steps['Step-1']
frame = step.frames[-1]
field = frame.fieldOutputs['U']
tipNode = 1024 # 裂尖节点号
disp = field.values[tipNode].data[1] # Y方向位移
code复制*EL PRINT, POSITION=AVERAGED AT NODES
CREEP
*EL FILE, POSITION=AVERAGED AT NODES
CREEP
bash复制debug=1
args="-debug -stack 2000000000"
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 负蠕变速率 | 数组越界 | 检查STATEV维度 |
| 计算发散 | 时间步长过大 | 减小初始增量步 |
| 裂纹路径异常 | 网格依赖性 | 启用自适应网格 |
| 能量不守恒 | 雅可比矩阵错误 | 验证DDSDDE计算 |
fortran复制! 不推荐
DO I=1,3
A(I) = B(I)*C(I)
END DO
! 推荐
A(1:3) = B(1:3)*C(1:3)
code复制*PARALLEL
NUMCPUS=4