ABAQUS子程序USDFLD(User subroutine to redefine field variables at a material point.),提供了用户自定义场变量的功能。USDFLD所有功能均可采用UMAT实现,但是相对而言其应用方式较UMAT更为简单,并不需要用户去重新开发材料本构模型,可以借助于ABAQUS自带的本构,通过读取计算过程中积分点上的场变量信息,在经过一定的计算之后上传新的自定义场变量结果即可,同时也可以通过这种机制反作用自带本构模型。
ABAQUS子程序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,LACCFLA)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME,ORNAME
CHARACTER*3 FLGRAY(15)
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2)
DIMENSION ARRAY(15),JARRAY(15),JMAC(*),JMATYP(*),COORD(*)
C user coding to define FIELD and, if necessary, STATEV and PNEWDT
RETURN
END
ABAQUS帮助文档对USDFLD子程序中各个哑元的说明很详细,本文不再一一复述,仅列出一个较为重要的数组FIELD,帮助文档介绍如下。
FIELD(NFIELD)
An array containing the field variables at the current material point. These are passed in with the values interpolated from the nodes at the end of the current increment, as specified with initial condition definitions, predefined field variable definitions, or user subroutine UFIELD. The interpolation is performed using the same scheme used to interpolate temperatures: an average value is used for linear elements; an approximate linear variation is used for quadratic elements (also see “Solid (continuum) elements,” Section 28.1.1 of the Abaqus Analysis User's Guide). The updated values are used to calculate the values of material properties that are defined to depend on field variables and are passed into other user subroutines (CREEP, HETVAL, UEXPAN, UHARD, UHYPEL, UMAT, UMATHT, and UTRS) that are called at this material point.
下面我们采用一个小例子来演示一下USDFLD的使用,模型如图所示,为一简单的轧制过程仿真模型,采用平面应变单元。
图1 计算模型
在本文中定义一个状态变量SDV1来表征工件中应力分量S22绝对值大于360MPa的区域,SDV1为固定值,设定为1。
总的来说实现这个入门级任务的子程序并不复杂,读者朋友可以尝试编写更为复杂的程序,比如进行相变仿真和材料属性的改变等等,限于篇幅,本文不再进行更为深入的介绍。
本文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 laccflg)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME,ORNAME
CHARACTER*3 FLGRAY(15)
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2)
DIMENSION ARRAY(15),JARRAY(15),JMAC(*),JMATYP(*),
1 COORD(*)
real S22
C 获取积分点应力张量
CALL GETVRM('S',ARRAY,JARRAY,FLGRAY,jrcd,
$ jmac, jmtyp, matlayo, laccflg)
S22 = ABS( ARRAY(2) )
C 更新状态变量
FIELD(1) = 0.5D0
STATEV(1) = 0.d0
IF (S22 .GE. 3.6D8) THEN
STATEV(1) = 1.D0
END IF
C
RETURN
END
计算结果云图如下:
图2 S22云图
图3 自定义TEST_S22状态变量云图
从计算结果云图看,本文USDFLD子程序很好的实现了预定目标。
补充说明内容:
(1)在USDFLD中用到的子程序GETVRM,可以读取积分点的所有状态变量,详情请查阅帮助文档。
(2)在结果中显示自定义状态变量SDV的名称。通常而言,我们子程序中会有较多的自定义状态变量SDV,在结果中显示为SDV1、SDV2。。。,很不方便,记不清楚。如需显示状态变量的名称,则可按照下图所示,按照1,SDV名称,2,SDV名称。。对应续行即可。下图为在ABAQUS/CAE界面修改关键字方式,也可以直接在inp文件中修改。
图4 修改结果文件中自定义状态变量SDV的显示名称
【阿信ABAQUS子程序系列文章——未完待续】