标题: 浅谈定义场子程序 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