|
|
浅谈定义场子程序 UFIELD 和 USDFLD 的应用及作用关系
(这条文章已经被阅读了 8082 次) 时间:2009/07/31/08:44
来源:even2004
最近花了几天时间学习和总结了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 激活。
|
|