标题: 浅谈定义场子程序 UFIELD 和 USDFLD 的应用及作用关系 [打印本页]
作者: even2004 标题:浅谈定义场子程序 UFIELD 和 USDFLD 的应用及作用关系 时间: 2009/07/31/08:44
最近花了几天时间学习和总结了ABAQUS中子程序 UFIELD 与 USDFLD 的应用,在此简单总结一下,仅供参考。
为便于理解,采用半白话文。
UFIELD 与 USDFLD 是abaqus中常用的定义场变量的子程序。
所谓预定义场,简单理解的话可看作是一种与温度场类似的场,比如可以理解成电磁场,浓度场,化学势场等等,只要你在子程序中需要用到类似变量,均可以视其为预定义场。
1. UFIELD(User subroutine to specify predefined field variables.) 用于指定预定义场变量。
需要说明的是 UFIELD定义的场是直接定义到节点上的,所定义的节点场变量可以在分析中随时更新。 有两种更新方法:独立更新 和同时更新。
a)独立更新, 就是在分析过程中,多个场变量可一个一个地更新数值。
在abaqus中默认的变量更新就是独立更新的方式,也就是一次只有一个变量得到更新,如果有多个变量都需要更新,则需要调用多次UFIELD子程序,更新几个变量就调用几次UFIELD子程序。这种独立更新方式常用于场变量相互独立的情况。
独立更新的inp 结构如下:
*INITIAL CONDITIONS,TYPE=FIELD,VARIABLE=1
NALL,100.
*INITIAL CONDITIONS,TYPE=FIELD,VARIABLE=2
NALL,200.
*INITIAL CONDITIONS,TYPE=FIELD,VARIABLE=3
NALL,100.
*STEP
*STATIC
*BOUNDARY
***
***
***
*FIELD,USER,VARIABLE=2
NALL,
*FIELD,USER,VARIABLE=2
NALL,
*FIELD,USER,VARIABLE=3
NALL,
子程序结构:
SUBROUTINE UFIELD(FIELD,KFIELD,NSECPT,KSTEP,KINC,TIME,NODE,COORDS,(
1 TEMP,DTEMP,NFIELD)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION FIELD(NSECPT,NFIELD),COORDS(3),TIME(2),TEMP(NSECPT),
1 DTEMP(NSECPT)
C
IF(***) THEN
FIELD(1,1)=***
ELSE IF(***) THEN
FIELD(1,1)=***
ELSE IF(***) THEN
FIELD(1,1)=***
ENDIF
RETURN
END
b)同时更新,所谓同时更新,就是在分析中多个变量通过UFIELD子程序同时得到更新,也就是一次有多个变量同时得到更新。
这种同时更新方式常用于场变量相互依赖的情况。在这种更新方式中,在inp中必须指定需要同时更新场变量的数目。
同时更新的inp 结构如下:
*INITIAL CONDITIONS,TYPE=FIELD,VARIABLE=1
NALL,100.
*INITIAL CONDITIONS,TYPE=FIELD,VARIABLE=2
NALL,200.
*INITIAL CONDITIONS,TYPE=FIELD,VARIABLE=3
NALL,100.
*STEP
*STATIC
*BOUNDARY
***
***
***
*FIELD,USER, NUMBER=3
NALL,
子程序结构:
SUBROUTINE UFIELD(FIELD,KFIELD,NSECPT,KSTEP,KINC,TIME,NODE,COORDS,
1 TEMP,DTEMP,NFIELD)
C
INCLUDE 'ABA_PARAM.INC'
C ,
DIMENSION FIELD(NSECPT,NFIELD),COORDS(3),TIME(2),TEMP(NSECPT),
1 DTEMP(NSECPT)
C y'
FIELD(1,1)=***
FIELD(1,2)=***
FIELD(1,3)=***
c
RETURN
END
2. USDFLD(User subroutine to redefine field variables at a material point.) 用于对积分点的场变量进行重定义。
这点与UFIELD显著不同,它只是对积分点处的场变量进行重定义,之所以称之为重定义是因为在应用USDFLD子程序之前,尽管 initial conditions, predefined field variables, 或者 ubroutine UFIELD 并没有指定积分点处的场变量(initial conditions, predefined field variables, 或者 ubroutine UFIELD 只是给定的节点处的场变量值),但积分点处的场变量可以通过相应节点处的场变量插值得到,也就是说默认是对节点场变量值插值以得到积分点处的场变量值。
但可能插值锁得到的积分点处的场变量值 不是我们分析所需要的,比如,你想在一个积分点上定义场变量作为时间的函数,或是任何可用的积分点变量(在输出变量标识符表中列出的那些,但是不包括用户自己定义的UVARM and UVARMn中的那些输出变量)的函数。这时就可以通过USDFLD对积分点场变量进行重新指定,因此我们称之为重定义积分点场变量,也就是覆盖插值得到的值,生成自己需要的值。
需要指出的是
a)调用的USDFLD子程序适用在所有的单元积分点上,因为材料定义包括用户定义的场变量。
b)如果想得到材料的具体积分点数据,须调用应用程序GETVRM来提取。
c)在用户子程序中对场变量的任何改变对于是局限于积分点的:节点的场变量值不受影响,仍然保持initial conditions, predefined field variables, 或者 ubroutine UFIELD所定义的场变量值。
d)在USDFLD中定义的场变量的值被用于计算材料属性的值,并传送到其他的需在积分点上调用的用户子程序中,比如
CREEP,HETVAL,UEXPAN,UHARD,UHYPEL,UMAT,UMATHT,UTRS (注意: 这些子程序的中场变量都是作用于积分点上的而不是节点上)
e)状态变量可以在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)
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(*)
C
C 当前应变的绝对值:
CALL GETVRM('E',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP, !材料点量的值通过调用GETVRM 得到
MATLAYO,LACCFLA)
EPS = ABS( ARRAY(1) )
C 积分点应变的最大值:
CALL GETVRM('SDV',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,
MATLAYO,LACCFLA)
EPSMAX = ARRAY(1)
C 这里的场变量指的是EPS , EPSMAX二者之间的最大值。
FIELD(1) = MAX( EPS , EPSMAX )
C 将最大应变存储为一个状态变量
STATEV(1) = FIELD(1) !定义的状态变量,可以传递到如上面所列出的那些其他用户子程序中去
C If error, write comment to .DAT file:
IF(JRCD.NE.0)THEN
WRITE(6,*) 'REQUEST ERROR IN USDFLD FOR ELEMENT NUMBER ',
1 NOEL,'INTEGRATION POINT NUMBER ',NPT
ENDIF
C
RETURN
END
3 UFIELD 与 USDFLD的关系:
a) 他们所定义的对象是不同的,UFIELD针对 节点 定义场变量, USDFLD针对积分点重定义场变量。
b) 在一个分析中,可以联合使用UFIELD 与 USDFLD,不过注意他们的含义和作用范围,USDFLD对积分点场变量进行重定义后并不影响UFIELD所定义的节点场变量值, 也就是节点场值 不会对 积分点处的场变量值进行插值,而仍是采用原来UFIELD(或initial conditions, predefined field variables)所定义的节点场变量值。
c)虽然说在一个分析中UFIELD 与 USDFLD可以联合使用,但并不意味着 UFIELD 与 USDFLD可以互相嵌套,二者不能嵌套。在ABAQUS中任何用户子程序都不能调用任何其他用户子程序,但可以调用用户自己编写的FORTRAN子程序和ABAQUS应用程序,比如上文中的 CALL GETVRM('SDV',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP, MATLAYO,LACCFLA)
d)需在积分点上调用的用户子程序中,比如
CREEP,HETVAL,UEXPAN,UHARD,UHYPEL,UMAT,UMATHT,UTRS ,虽然它们需要场变量是作用在积分点上的,但如果没有用USDFLD, 它们仍可以调用UFIELD(或initial conditions, predefined field variables)所指定的节点场变量值,子程序会自动将节点场变量插值为所需的积分点场变量值。 即如果没有对积分点场变量进行重定义时,CREEP,HETVAL,UEXPAN,UHARD,UHYPEL,UMAT,UMATHT,UTRS等需在积分点调用的子程序仍然可以调用节点场变量值。
如果定义了 USDFLD 子程序,则需要在 inp中 激活USDFLD的场变量, 需要用*material, 或 intial condition 或*field 激活。
阳光精品论坛 - Powered By BMForum v5.0