UFIELD和USDFLD是Abaqus极具迷惑性的两个子程序,这两个家伙长得就比较像兄弟,而且都是用来自定义场变量的,同时还有一个状态变量state variable掺和在中间,再加上帮助里面的解释也基本上不是人话,很容易就把人搞二了,今天帖主就来撸一撸这两个子程序。
1、自定义场变量
Abaqus中场变量可以先简单的理解为每个单元或者每个节点都有一个值的变量,像结果输出中的温度、应力和应变等。有时候我们也需要定义Abaqus中不存在的一些稀奇古怪,有意义或无意义的场变量,比如浓度场,固化度场,损伤度。场变量最场用于定义变化的材料参数,即让材料属性如密度,弹性模量和一个场变量相关,通过更新场变量的值来改变材料参数(这一点和温度相关的材料参数本质上是一致的),而场变量的更新在这两个子程序中均可以完成,UFIELD是用来指定预定义场变量的,USDFLD对积分点的场变量重新定义。UFIELD和USDFLD的本质上的区别是一个是定义在节点上的,一个是定义在单元材料积分点上的,同时这两个又可以相互搭配,干活不累
2、简单实例
先通过一个小例子来领会一下它们的要义,本实例通过自定义场变量来定义随时间变化的弹性模量,如图所示,定义弹性常数的时候,number of field variable设为1,下面两行参数表示Field变量为1时,弹性模量为10000,Field变量为2时,弹性模量为20000
inp中定义Ufield和Usdfld的关键字和Ufield代码如下:
如下应力应变曲线可以看出,时间步0.5s之前弹性模量为10000,0.5s后弹性模量为20000,确实是按照预期效果改变的。
通过给定field不同的值,研究弹性模量的变化,发现当场变量小于1的时候,取的是1对的值,大于2的时候,是2对应的值,在1和2之间,则是通过插值得到。
当然这个例子比较简单,可以不用子程序,直接通过*field 来实现
最后,我看很多人通过USDFLD来实现单元生死,其实这也没什么玄妙的,通过场变量把弹性模量降为一个非常小的量不就可以了吗。
3、UFIELD子程序
Abaqus中可以通过关键字*Field来定义预定义场变量,对于简单的问题,可以直接通过数据行的形式来定义场变量值,如下小例子,可以通过inp文件直接给定节点场变量的值,在field output中可以选上FV,就可以在后处理中查看场变量云图了,但需要注意的是云图显示的并非节点值而是插值得到的积分点的值。对于较为复杂的场变量,往往没办法直接通过数据行的形式定义,这个时候就需要用到自定义场变量子程序了,即UFIELD子程序。
在UFIELD中可以随时更新场变量,有两种更新方法,独立更新方法(Individual variable updates)和同时更新方法(Simultaneous variable updates),独立更新就是每次调用子程序只更新一个场变量,如果有多个场变量需要更新,就调用多次。同时更新就是一次调用子程序时,更新多个场变量,独立更新是默认的更新方法,同时更新一般用于场变量之间相互关联的时候,两者的子程序格式和inp文件中的接口略有差异,说明如下:
独立更新时,FIELD(NSECPT,NFIELD)的大小为FIELD(1,1),但是可以通过KFIELD的值来判别这个场变量属于哪一个,Inp中*FIELD,USER中也需要指定哪一个场变量,下图中为三个场变量,所以需要添加三行,子程序中通过IF(KFIELD=1or2or3)来判断对应关系。
*Field,user,variable=1
*Field,user,variable=2
*Field,user,variable=3.
同时更新时,FIELD(NSECPT,NFIELD)的大小为FIELD(1,NFIELD),例子中定义了3个场变量,这时NFIELD=3,FIELD(1,1),FIELD(1,2),FIELD(1,3)之间是相互关联的,用独立更新的办法显然比较难实现,在Inp中,子程序关键字则为*FIELD,user,number=3
4、USDFLD子程序
USDFLD子程序我已在之前的一篇帖子[Abaqus传热分析HETVAL和USDFLD子程序联合]中详细介绍过,它与UFIELD不同的地方是,它是对积分点的场变量进行重新定义。通过*initial condition或者*field定义的预定义场变量是定义在节点上的,在调用USDFLD之前,积分点处的场变量值是通过节点处的值插值得到的(插值方法和温度场插值一样),在调用USDFLD后,积分点处的场变量被重新定义
1)UFIELD可以指定预定义场,并且可以更新节点处场变量,并且可以插值到积分点
2)USDFLD可以直接重定义结分店的值,而不影响节点处的值
3)依赖于场变量的材料属性是根据积分点处的场变量值来更新材料参数的
USDFLD还有一个比较有用的功能就是可以和其他子程序联合使用,以达到传递数据的作用,USDFLD提供的STATEV()数组可以传递到CREEP,HETVAL,UEXPAN,UMAT, UMATHT,和UTRS等子程序,详见HETVAL和USDFLD子程序联合这篇帖子。
5、USDFLD和DFIELD联合使用
当同时定义了这两个子程序的时候,让人较为困惑的是场变量到底根据那个子程序来更新呢,这就和先调用哪一个程序关系很大了,我们通过输出场变量的值和时间进行测试:
我们可以发现,abaqus是先调用UFIELD再调用USDFLD的,由于材料参数是用在材料积分点上的,因而场变量相关的材料参数,依赖积分点的场变量,而不是节点的场变量,也就当同时通过UFIELD和USDFLD来定义场变量时,实际是根据USDFLD来更新材料参数了。下图说明了UFIELD和USDFLD调用的情况,USDFLD调用于增量步开始,UFIELD调用于增量步结束
6、几点总结
UFIELD是指定预定义节点场变量的、USDFLD是用来重新定义材料积分点的场变量,当没有用USDFLD定义材料积分点的场变量时,会通过节点场变量插值得到。当改变材料积分点场变量时,节点值不会改变。
USDFLD定义后是没有激活的,必须通过*Field或*initial condition,type=field关键字来激活,或者定义场变量依赖的材料参数也可以激活
*field和*initial condition关键字都不支持abaqus CAE操作的,可以编辑inp或者edit keyword
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删