用户子程序USDFLD:
(1)允许你将材料点的场变量定义为关于时间或输出变量定义列表(Abaqus/Standard outputvariable identifiers)中定义的任意材料点输出变量的函数,除了用户自定义输出变量UVARM和UVARMn。
(2)能够用于建立依赖于求解结果的材料属性,如将材料属性定义为关于场变量的函数;
(3)在材料定义中包含了用户自定义场变量的单元的所有积分点上该用户子程序都将被调用;
(4)必须通过调用子程序GETVRM来获取材料点数据;
(5)能够使用并更新状态变量;
(6)能够与用户子程序UFIELD联合使用来施加预定义场变量。
显式求解依赖性
由于该用户子程序只有在增量步的起始才能获取材料点数据,显然这样的求解方法是存在依赖性的:在一个给定的增量步下材料属性将保持不变。因此,结果的精度取决于时间增量步的大小。因此,你在该子程序中通过变量PNEWDT来控制时间增量步的大小。
定义场变量
在用户子程序USDFLD在调用之前,材料点的场变量的取值将通过定义在节点上的值插值得到。在该子程序中的场变量的任意改变都是局限在材料点上的,即在节点上的场变量的取值将不随材料点取值的改变而改变,而是保持通过初始条件,预定义场变量或在用户子程序UFIELD中定义的值。在该子程序中定义的场变量的取值将用于计算依赖于场变量取值的材料属性或者被传递到在其他材料点上被调用的用户子程序,如:
CREEP
HETVAL
UEXPAND
UHARD
UHYPEL
UMAT
UMATHT
UTRS
在材料点上的用户自定义场变量的输出可以通过单元积分点输出变量FV(参见Element integration pointvariables)获得。
获取材料点数据
在增量步起始时刻你可以通过子程序GETVRM来获取材料点的取值。材料点的取值可以通过在调用GETVRM时使用适当的输出变量键值来获得。材料点数据的取值将会被备份到数组ARRAY,JARRAY和FLGRAY中,三个数组分别对应浮点,整型和字符窜数据。对于一些没有定义在增量步起始时刻的材料点数据你可能无法获得其取值,如,ER。
状态变量
由于在用户子程序中场变量的重定义都是局限于当前增量步(在每个增量步的起始时刻场变量的取值都将恢复为通过节点取值插值得到的取值),任何通过使用该子程序来实现依赖于历程的材料属性更新都必须通过引入用户自定义状态变量来实现。
状态变量可以在USDFLD中被更新然后传递到其他能够在该材料点被调用的子程序上,例如列举在上面的子程序。你需要指定状态变量的数量,例如在本节最后给出的示例(参见Allocating space)。
用户子程序界面
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
CMNAME,ORNAME
FLGRAY(15)
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2)
DIMENSION ARRAY(15),JARRAY(15),JMAC(*),JMATYP(*),COORD(*)
user coding to define FIELD and, if necessary, STATEV and PNEWDT
RETURN
END
需要被定义的场变量
FIELD(NFIELD)
一个包含有当前材料点上的场变量数据的数组。该数组中的值是由在当前增量步结束时通过节点插值得到的取值传递过来的,这些节点上的取值是通过初始条件,预定义场变量或用户子程序UFIELD定义的。该插值方法同样用于温度的插值:对于线性单元将使用平均值,二次单元将使用近似的线性变化(参见Solid(continuum) element)。更新后的值将用于计算被定义为依赖于场变量取值的材料属性,随后被传递到将在该材料点上调用的其他用户子程序(CREEP,HETVAL,UEXPAND,UHARD,UHYPEL,UMAT,UMATHT和UTRS)中。
可以被更新的变量
STATEV(NSTATV)
一个含有求解状态变量的数组。在增量步的起始时刻这些变量将会被传递到该子程序中。在该子程序中所有的STATEV都将会被更新,更新后的取值将会被传递到其他将会在该材料点被调用的用户子程序(CREEP,HETVAL,UEXPAND,UHARD,UHYPEL,UMAT,UMATHT和UTRS)中。该材料点上的状态变量的数量的定义参见Allocating space。
该变量用于定义建议采用的新的时间增量与当前使用的时间增量间的比值(DTIME,如下所述)。该变量允许你更改Abaqus/Standard的自动时间积分算法的增量取值(如果选择了自动时间增量)。
在调用子程序USDFLD之前PNEWDT被设定为一个非常大的值。
如果PNEWDT被重新定义为一个小于1.0的值,Abaqus/Standard必须终止时间增量并尝试使用一个更小的时间增量。因此,在自动时间积分算法中推荐采用的新的时间增量步为PNEWDT×DTIME,其中PNEWDT的取值为本次迭代中所有允许调用该子程序并重新定义PNEWDT的材料点中的取值的最小值。
如果在本次迭代中对于所有调用该子程序的材料点其PNEWDT的取值均大于1.0,并且在本次迭代中该增量步是收敛的,则Abaqus/Standard可能会提高时间增量步的取值。提供给自动时间积分算法的建议建议采用的新的时间增量步的取值为PNEWDT×DTIME,其中PNEWDT的取值为本次迭代中所有调用该子程序的材料点中的PNEWDT取值的最小值。
如果在分析过程中没有选择自动时间增量,则大于1.0的PNEWDT的取值将会被忽略,小于1.0的PNEWDT的取值将会导致计算终止。
传递过来用于观测的变量
DIRECT(3,3)
一个相对于全局基本方向有关的包含有材料方向余弦的数组。DIRECT(1,1), DIRECT(2,1),DIRECT(3,1)给出了第一材料方向的(1,2,3)分量;DIRECT(1,2), DIRECT(2,2),DIRECT(3,2)给出了第二材料方向的(1,2,3)分量,等等。对于壳单元和膜单元,第一方向和第二方向为面内方向,第三方向为法向方向。该信息对于梁单元是不可用的。
T(3,3)
一个相对于单元基本方向的包含有材料方向余弦的数组。这个数组相对于单元基本方向定义了材料方向(DIRECT)。对于连续单元T和DIRECT是相同的。对于壳单元和膜单元,T(1,1)=cosθ,T(1,2)=-sinθ,T(2,1)=sinθ,T(2,2)=cosθ,T(3,3)=1.0,其他的所有分量为0,其中θ为围绕法向矢量逆时针选择的方向。如果没有使用单元方向,则T是一个单位矩阵。对于梁单元该方向同样不可用。
CELENT
特征单元长度。对于一阶单元该长度为穿过一个单元的典型长度;对于二阶单元,该长度为与一阶单元相同的典型长度的一半。对于梁单元和杆单元,该长度为单元的轴向长度。对于膜单元和壳单元,该长度为参考面的特征长度。对于轴对称单元,该长度仅为(r,z)平面的特征长度。
TIME(1)
当前增量步起始时刻的分析步时间的取值。
TIME(2)
当前增量步起始时刻的总时间的取值。
DTIME
时间增量
CMNAME
用户定义的材料名称
ORNAME
用户定义的局部方向名称。
NFIELD
在该材料点定义的场变量的数量。
NSTATV
用户定义的依赖于求解的状态变量(参见Allocation space)。
NOEL
单元号。
NPT
积分点号。
LAYER
层号(用于复合壳单元或分层实体)。
KSPT
当前层的截面点号。
KSTEP
分析步号。
KINC
增量号。
NDI
在当前材料点正应力分量的数量。
NSHR
在当前材料点的剪应力分量的数量。
COORD
当前材料点的坐标。
JMAC
为了获取输出变量必须被传递到子程序GETVARM的变量。
JMATYP
为了获取输出变量必须被传递到子程序GETVARM的变量。
MATLAYO
为了获取输出变量必须被传递到子程序GETVARM的变量。
LACCFLA
为了获取输出变量必须被传递到子程序GETVARM的变量。
示例:弹性损伤模型
下面为使用用户子程序USDFLD的一个示例。在该示例中一个杆单元承受由拉伸载荷。有限元模型中引入了一个弹性损伤模型:在加载历程中模量将会以一个关于最大拉伸应变的函数下降。最大拉伸应变将会以依赖于求解的状态变量的形式存储。参见预定义场中的“定义依赖于求解的场变量”。
输入文件
HEADING
DAMAGED ELASTICITY MODEL WITH USER SUBROUTINE USDFLD
ELEMENT, TYPE=T2D2, ELSET=ONE
1, 1, 2
NODE
1, 0., 0.
2, 10., 0.
SOLID SECTION, ELSET=ONE, MATERIAL=ELASTIC
1.
MATERIAL, NAME=ELASTIC
ELASTIC, DEPENDENCIES=1
** Table of modulus values decreasing as a function
** of field variable 1.
2000., 0.3, 0., 0.00
1500., 0.3, 0., 0.01
1200., 0.3, 0., 0.02
1000., 0.3, 0., 0.04
USER DEFINED FIELD
DEPVAR
1
BOUNDARY
1, 1, 2
2, 2
STEP
STATIC
0.1, 1.0, 0.0, 0.1
CLOAD
2, 1, 20.
END STEP
STEP
STATIC
0.1, 1.0, 0.0, 0.1
CLOAD
2, 1, 0.
END STEP
STEP, INC=20
STATIC
0.1, 2.0, 0.0, 0.1
CLOAD
2, 1, 40.
END STEP
用户子程序
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)
C
INCLUDE 'ABA_PARAM.INC'
C
CMNAME,ORNAME
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(*)
C
C Absolute value of current strain:
CALL GETVRM('E',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,
MATLAYO,LACCFLA)
EPS = ABS( ARRAY(1) )
C Maximum value of strain up to this point in time:
CALL GETVRM('SDV',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,
MATLAYO,LACCFLA)
EPSMAX = ARRAY(1)
C Use the maximum strain as a field variable
MAX( EPS , EPSMAX ) =
C Store the maximum strain as a solution dependent state
C variable
FIELD(1) =
C If error, write comment to .DAT file:
IF(JRCD.NE.0)THEN
'REQUEST ERROR IN USDFLD FOR ELEMENT NUMBER ',
1 NOEL,'INTEGRATION POINT NUMBER ',NPT
ENDIF
C
RETURN
END