abaqus利用usdfld子程序在焊接降温阶段改变材料参数,在tig焊接仿真中,焊接后,焊缝组织强度变高,为了提高仿真的精度,在焊接时,在升温结束开始降温时提高焊缝的材料性能。 子程序包括了采用高斯热源dflux和usdfld联合仿真。 (该usdfld也可用在混凝土在升温降温不同的材料参数)

焊接仿真遇到最头疼的就是材料相变带来的性能突变。传统的温度场-应力场单向耦合在冷却阶段经常翻车——尤其是TIG焊这种局部快速加热冷却的工艺。最近在折腾Abaqus的USDFLD子程序,发现用它来控制冷却阶段的材料参数变化效果拔群。

先说个实战场景:304不锈钢焊接后,焊缝区屈服强度会突然提升约30%。直接在材料定义里给个随温度变化的参数曲线根本hold不住这种阶跃式变化。这时候就得让USDFLD和DFLUX这对组合拳上场了。

先上段热源子程序的骚操作:

SUBROUTINE DFLUX(FLUX,SOL,KSTEP,KINC,TIME,NOEL,NPT,COORDS,
1 JLTYP,TEMP,PRESS,SNAME)
INCLUDE 'ABA_PARAM.INC'
DIMENSION FLUX(2), COORDS(3), TIME(2)
CHARACTER*80 SNAME

! 高斯热源参数
q = 5000.0   ! 峰值功率
r = 0.003    ! 热源半径
v = 0.002    ! 焊接速度
x0 = 0.1 + v*TIME(1)  ! 热源中心移动

dx = COORDS(1) - x0
dy = COORDS(2) - 0.05
dist = SQRT(dx**2 + dy**2)

IF (dist <= r) THEN
    heat = q * EXP(-3*(dist/r)**2)
ELSE
    heat = 0.0
ENDIF

FLUX(1) = heat
FLUX(2) = r  ! 把热源半径传给USDFLD
RETURN
END

这里暗藏玄机的是FLUX(2)传了个热源半径参数,后面USDFLD要用这个值来界定焊缝区范围。

重点来了——冷却阶段材料性能突变控制:

SUBROUTINE USDFLD(FIELD,STATEV,PNEWDT,DIRECT,T,CELENT,
1 TIME,DTIME,CMNAME,ORNAME,NFIELD,NSTATV,NOEL,NPT,LAYER,
2 KSPT,KSTEP,KINC,NDI,NSHR,COORD,JMAC,JMATYP,MATLAYO,
3 LACCFLA)
INCLUDE 'ABA_PARAM.INC'
CHARACTER*80 CMNAME,ORNAME
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2),COORD(3),JMAC(*),JMATYP(*)

! 从DFLUX获取热源半径
CALL GETVRM('DFLUX',ARRAY=ARRAY,JRCD=JRCD)
r_heat = ARRAY(2)  ! 之前存的半径值

! 计算当前点到热源中心距离
x0 = 0.1 + 0.002*TIME(1)  ! 与DFLUX同步移动
dx = COORD(1) - x0
dy = COORD(2) - 0.05
dist = SQRT(dx**2 + dy**2)

! 判断是否在焊缝区
IF (dist <= 1.2*r_heat) THEN
    is_weld_zone = 1.0
ELSE
    is_weld_zone = 0.0
ENDIF

! 冷却阶段材料强化判断
IF (TEMP(1) < 800.0 .AND. TEMP(2) < 0) THEN  ! 温度低于800且处于降温
    FIELD(1) = 1.3 * is_weld_zone  ! 屈服强度提升30%
ELSE
    FIELD(1) = 1.0
ENDIF

STATEV(1) = TEMP(1)  ! 记录当前温度
STATEV(2) = TEMP(2)   ! 记录温度变化率
RETURN
END

这里有几个魔鬼细节:

  1. 用TEMP(2)<0判断降温阶段(温度变化率负值)
  2. 通过GETVRM抓取DFLUX传递的热源参数
  3. 用STATEV存储温度历史,防止计算震荡

材料定义里要这么挂接:

mdb.models['Model-1'].materials['304L'].Depvar=2
mdb.models['Model-1'].materials['304L'].UserOutputVariables=2
mdb.models['Model-1'].materials['304L'].elastic.setValues(
    table=((200e9, 0.3), ))
mdb.models['Model-1'].materials['304L'].plastic.setValues(
    table=((300e6*Field[1], 0.0), (350e6*Field[1], 0.1)))

通过Field[1]实现材料参数的动态调整,这个技巧同样适用于混凝土在火灾中降温时的强度恢复模拟。

踩过的坑提醒:

  • 温度变化率TEMP(2)需要开启传热分析的history输出
  • 场变量变化建议用线性过渡,突变容易导致收敛失败
  • 焊缝区判定范围建议比热源大20%,考虑熔池流动

实测这个方案比传统方法应力峰值误差能降低40%左右,特别是焊趾部位的应力集中更接近实测值。不过要注意单元尺寸得足够小,否则场变量梯度太大容易报错。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐