Davvife 发表于 2010-3-4 21:01:08

UMAT全过程-"技术篇"[by Davvife

本帖最后由 Davvife 于 2010-3-22 11:20 编辑

[写在前面:
   
    这篇文章是UMAT全过程-感想篇的姊妹篇,答应要给大家写的一篇帖子,同时也是为了记录自己的学习过程,与大家分享!首先指出,俺的"技术篇"--是加了引号的,因为确实称不上有多么大的技术含量,还望大家莫笑偶http://home.simwe.com/image/face/5.gif!只不过一是跟那个感想篇形成一个对照,同时主要内容为自己编子程序过程中涉及的技术边边上的小问题的一些解决方法,供仿友们参考!偶不是谦虚,也不是一个低调的人,大家谢谢和支持的话,我先行谢过啦!更希望大家能提出质疑或者别的更好的办法,大家相互交流,共同进步!http://home.simwe.com/image/face/2.gif]


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


*转*入*正*题*第一部分:相关知识[特别声明,这部分来自于华中科技大学杨曼娟同学的硕士学位论文,在此对作者表示感谢!--大家可以去知网下载]----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.ABAQUS中材料非线性问题的处理

       ABAQUS中材料非线性问题用Newton-Raphson法来求解。首先将载荷分为若干个微小增量,结构受到一个微小增量△P。ABAQUS用与初始结构位移相对应的初始刚度矩阵K0和荷载增量△P计算出结构的在这一步增量后的位移修正Ca、修正后的位移值Ua和相应的新的刚度矩阵Ka。ABAQUS用新的刚度矩阵计算结构的内力Ia,荷载P和Ia的差值为迭代的残余力Ra,即Ra=P-Ia。如果Ra在模型内的每个自由度上的值都为零,如图2-2中的a点,则结构处于平衡状态。但在非线性问题中,通常Ra是不可能为零,ABAQUS为此设置了一个残余力容差。如果Ra小于这个数字,ABAQUS就认为结构的内外力是平衡的。一般这个缺省值取为平均内力的0.5%(如图2-2)。
http://home.simwe.com/image/zoom.gifhttp://home.simwe.com/attachment/201003/4/450247_12677070948zMO.png


   
      在Ra满足小于残余力容差的条件后,ABAQUS还要检查位移修正系数Ca是否远远小于结构的位移增量△Ua=Ua-Uo.如果大于位移增量的1%,ABAQUS将自动继续进行迭代。第二次迭代时,ABAQUS用刚度矩阵Ka和第一次迭代的残余力Ra计算,得到一个新的位移修正值。同理,第二次迭代中ABAQUS用新的残余力、新的位移系数,继续验证收敛性,直到收敛为止(如图2-3)。因此非线性问题的计算量要比线性问题的计算量大得多,计算的时候需要分配更多的内存和磁盘空间。

http://home.simwe.com/image/zoom.gifhttp://home.simwe.com/attachment/201003/4/450247_126770709644TV.png

       ABAQUS会自动调整荷载增量的大小,用户只需合理的设置一个第一次迭代的增量值即可,如果用户不给出第一次迭代的增量值,ABAQUS会在第一次迭代的过程中把设置的所有荷载都加到结构上去,然后不断的试算自动调整第一次迭代的增量大小。寻找一个增量值的收敛解迭代的次数取决于系统非线性的程度。ABAQUS中缺省的设置是,如果在一个增量值的作用下,迭代16次以后结果仍不收敛,ABAQUS将放弃这个增量值,把增量取为前一次增量值的25%再进行计算。如果ABAQUS在迭代次数小于5次的情况下就找到了收敛解,ABAQUS就自动把增量值增加50%再进行计算,得到更为合理的增量值。



2.用户子程序接口

      ABAQUS不仅提供标准的有限元分析程序,且具有良好的开放性,可利用它提供的用户子程序接口生成非标准的分析程序来满足用户的需要,在实际工程中得到广泛应用。ABAQUS允许用户通过子程序以代码的形式来扩展主程序的功能,并给用户提供了强大而又灵活的用户子程序接口和应用程序接口(Utility Routine),ABAQUS 6.4一共有42个用户子程序接口,15个应用程序接口,用户可以定义包括边界条件、荷载条件、接触条件、材料特性以及利用用户子程序和其它应用软件进行数值交换等等。这些用户子程序接口使得用户解决一些问题时有很大的灵活性,同时大大的扩充了ABAQUS的功能。例如:
    通过用户定义单元接口,用户自定义的任何类型的线性或非线性单元都可以被引入模型中,对于线性单元刚度矩阵和质量矩阵可以直接确定。同时,用户子程序也可被用来定义这些单元的线性和非线性特性。
    通过用户材料子程序接口,用户可定义任何补充的材料模型,不但任意数量的材料常数都可以作为资料被读取,而且ABAQUS对于任何数量的与解相关的状态变量在每一材料计数点都提供了存储功能,以便在这些子程序中应用。



3.用户子程序和主程序的结合

    ABAQUS的用户子程序是根据ABAQUS提供的相应接口,按照Fortran语法,用户自己编写的代码。它是一个独立的程序单元,可以独立的被存储和编译,也能被其它程序单元引用,因此,利用它可带回大量数据供引用程序使用,也可以用它来完成各种特殊的功能。它的一般结构形式是:
      
      SUBROUTINE S(x1,x2,……,xn)
      INCLUDE‘ABA_PARAM.INC’(用于ABAQUS/Standard用户子程序中)
      OR INCLUDE‘VABA_PARAM.INC’)(用于ABAQUS/Explicit用户子程序中)
      ……
      RETURN
      END

       x1,x2,……,xn是ABAQUS提供的用户子程序的接口参数,有些参数是ABAQUS传到用户子程序中的,例如SUBROUTINE DLOAD中的KSTEP、KINC、COORDS;有些是需要用户自己定义的,例如F。文件aba_param.inc和vaba_param.inc随着ABAQUS软件的安装而包含在操作系统中,它们含有重要的参数,帮助ABAQUS主求解程序对用户子程序进行编译和链接。当控制遇到RETURN语句时便返回到引用程序单元中去,END语句是用户子程序结束的标志。
在一个算例中,用户可以用到多个用户子程序,但必须把它们放在一个以.for为扩展名的文件中。运行带有用户子程序的算例同时有两种方法:一是在CAE中运行,在EDIT JOB菜单中的GENERAL子菜单的USER SUBROUTINE FILE对话框中选择用户子程序所在的文件即可;另外是在ABAQUS.COMMAND中运行,语法如下:

      abaqus job=job-name user={source-file|object-file}

编制用户子程序时应注意:

1)用户子程序相互之间不能调用,但可以调用用户自己编写的Fortran子程序和ABAQUS应用程序。ABAQUS应用程序必须由用户子程序调用。当用户编写Fortran子程序时,建议子程序名以K开头,以免和ABAQUS内部程序冲突。

(2)当用户在用户子程序中利用OPEN打开外部文件时,要注意以下两点:一是设备号的选择是有限制的,只能取15~18和大于100的设备号,其余的都已被ABAQUS占用;二是用户需提供外部文件的绝对路径而不是相对路径。

(3)对于不同的用户子程序ABAQUS调用的时间是不同的,有的是在每个STEP的开始,有的是STEP的结尾,有的是在每INCREMENT的开始等等。当ABAQUS调用用户子程序时,都会把当前的STEP和INCREMENT利用用户子程序的两个实参KSTEP和KINC传给用户子程序,用户可把它们输出到外部文件中,这样就可清楚的知道ABAQUS何时调用该用户子程序。

    为保证用户子程序的正确执行,子程序的书写必须遵循ABAQUS的相关规定.



4.用户材料子程序UMAT接口的原理

      用户材料子程序(User-defined Material Mechanical Behavior,简称UMAT)是ABAQUS提供给用户定义自己的材料属性的Fortran程序接口,使用户能使用ABAQUS材料库中没有定义的材料模型。用户材料子程序UMAT通过与ABAQUS主求解程序的接口实现与ABAQUS的资料交流.在输入文件中,使用关键词“*USER MATERIAL”表示定义用户材料属性。[更详细相关知识,请看帖子ABAQUS-UMAT-自学知识整理贴[已经初步完成,不断完善更新,请跟帖讨论] http://forum.simwe.com/viewthread.php?tid=914547&fromuid=450247]
       由于UMAT子程序在单元的积分点上调用,增量步开始时,主程序路径将通过UMAT的接口进入UMAT,单元当前积分点必要变量的初始值将随之传递给UMAT的相应变量。在UMAT结束时,变量的更新值将通过接口返回主程序。ABAQUS调用UMAT过程及次数如图2-4所示。ps:迭代步应翻译为iteration!
http://home.simwe.com/image/zoom.gifhttp://home.simwe.com/attachment/201003/4/450247_1267707095CHe4.png





5.UMAT子程序流程
   
      UMAT子程序采用Fortran语言编制,可以包括以下几个部分:子程序定义语句、ABAQUS定义的参数说明、用户定义的局部变量说明、用户编制的程序主体、子程序返回和结束语句。
主要求解过程:每一个增量加载步开始时,ABAQUS主程序在单元的积分点上调用UMAT子程序,并传入应变增量、时间步长及荷载增量,同时也传入当前已知状态的应力、应变及其它与求解过程相关的变量;UMAT子程序根据本构方程求解应力增量并更新应力及其它相关的变量,提供Jacobian矩阵给ABAQUS主程序以形成整体刚度矩阵;主程序结合当前荷载增量求解位移增量,继而进行平衡校核;如果不满足指定的误差,ABAQUS将进行迭代直到认为收敛,然后进行下一增量步的求解。
    ABAQUS中应力σ采用Cauchy应力张量描述,剪应变分量εij按照工程剪应变的定义存储。在求解的过程中,需记录保存与求解过程相关的变量,这可以储存在UMAT子程序的STATEV数组中,并且可以定义储存的数量。




Davvife 发表于 2010-3-4 21:13:23

本帖最后由 Davvife 于 2010-3-6 17:02 编辑

*第二部分:子程序知识*

[写在前面:这部分主要是写我的子程序验证\运行过程中出现的问题,不是概论,仅仅是个例]


1.关于子程序验证

    重点是在将安装完visual studio和Intel Fortran的两个bat文件包含到path下,具体操作有很多精华帖,大家搜搜就可以了!



2.子程序未通过验证出现的问题

    如果job提交后出现类似"problem during compilation - df.exe not found in PATH." 之类的涉及到.exe文件找不到的问题,就是没有成功将Fortran[或者visual studio]的路径加入到path当中,需要重新加入.


3.子程序通过验证,提交job出现的问题

[*]"problem during compilation" :这个就是你的.for文件本身有错误,无法编译,你可以找出来好好检查;注意,.for文件单独编译时,会提示你有一个错误,很多个警告,你要看懂这些信息,比如
[*][*]*******:error FOR2934: lexical error: Cannot open INCLUDE file "ABA_PARAM.INC": No such file or directory 这个是正常错误信息,不用解释了吧!
[*]********:warning FOR4269: unused dummy argument KINC:这个是因为你声明的变量没有定义,也属于正常,因为子程序不一定会用到所有接口中声明的变量.要注意看看你要用到的变量是否定义了,如果没有定义,那么这是一个相当于错误的警告,要修改;其他的你不需要的就不用管它!
[*]其他基本'顾名思义'就能搞定
[*]"problem during link-*********mismatch******" :我的出现这个原因是因为我编译好的.for文件被我移动到一个文件夹下面,但是我没有同时移动相应的VC++ workspace文件和Program Debug Database文件!其他可能的原因就可能是你安装的visual studio和Intel Fortran版本与你的ABAQUS版本不匹配,这个情况可以搜索论坛相应帖子!

Davvife 发表于 2010-3-4 21:14:05

本帖最后由 Davvife 于 2010-3-13 19:33 编辑

不好意思,大家,真是忙得不可开交了!这个帖子,预留了很多楼层,不过最近忙得一直没有更新!还望大家体谅!,没办法,忙的我不行不行的了:( !O(∩_∩)O~,现在都知道要写点什么了!其实我做的东西很简单,所以太深入的我也说不出来!现在分享点,我的本构里面的小细节吧!--请进入下一个楼层

Davvife 发表于 2010-3-4 21:14:28

本帖最后由 Davvife 于 2010-3-13 19:47 编辑

[本构:多线性一维本构---UMAT编写细节]

[*]加载\卸载判断:根据你的本构关系,用应力\应变\应力增量\应变增量的其中一种或组合来判断加载\卸载,当然前提是这个判断条件要唯一的判断出加载\卸载起始点和终止点;譬如可以用应力增量大于0来表示加载,                IF (DSTRESS.GT.ZERO)THEN--------加载
                           .......
                ELSE-----------------------卸载

[*]利用好状态变量:如果你想保存子程序计算过程的某个值,譬如卸载那一点处的应力\应变,则可以设计一个状态变量,用于存贮这个值,当然这个点判断很重要!给定一个条件,如若满足,更新此状态变量!否则不更新!比如,想记录卸载处的应力\应变值:               IF(DSTRAN(1).GE.ZERO)THEN
               STATEV(NTENS*2+1)=STRESS(1)
               STATEV(NTENS*2+2)=EELAS(1)[你想存储的应变]
      另外,你存储的状态变量也可以拿来赋值\使用的:如
               SB=STATEV(NTENS*2+1)
                         .......
                           ........

hill03 发表于 2010-3-4 21:24:59

楼主辛苦,我先收藏了

flyingbee07 发表于 2010-3-5 14:54:31

收藏备用,楼主辛苦,:)

吴聊SP 发表于 2010-3-5 17:03:27

正在学习UMAT中,关注楼主的帖子

Mesh_Li 发表于 2010-3-5 17:07:20

写的不错,持续关注~~~~~

liliangwo1101 发表于 2010-3-5 22:29:35

持续关注中……

cj2006n 发表于 2010-3-6 12:32:47

好高深的东西,差距太大了!

2005hsw 发表于 2010-3-6 16:56:07

楼主辛苦,学习中

千里马1898 发表于 2010-3-6 22:13:18

有知道怎么把ststev(i),按照一点的格式,甚至和积分点对应着输出的吗?本人做了个umat,想得到所有单元中的积分点上的状态变量值,但是用write(7,*)或者write(6,*)得到的没有和积分点或者节点对应起来。那位过路大侠指点一下啊?

Davvife 发表于 2010-3-7 11:07:59

这个问题论坛中有相关帖子,可以查查看
18# 千里马1898

Aaronjessi 发表于 2010-3-8 14:49:39

楼主,好像有一部分摘自“ABAQUS用户材料子程序开发及应用”不知道方不方便也上传一下,我下载的缺少了好多页

Davvife 发表于 2010-3-8 19:25:48

没明白你说的哪部分?
一楼的内容是一篇硕士论文,你下载下吧
二楼的内容是原创
20# Aaronjessi

Davvife 发表于 2010-3-13 19:50:11

今天更新了第四楼层哦,O(∩_∩)O~

ylj1986 发表于 2010-3-16 19:21:26

本帖最后由 ylj1986 于 2010-3-16 19:30 编辑

好东西啊,我正在学习UMAT。楼主,UMAT接口程序中好像只有DSTRAN,没有DSTRESS,这个应该自己定义吧

yh198574 发表于 2010-3-16 21:23:13

好啊~~谢谢了

敦诚 发表于 2010-3-17 00:08:47

这个傻丫头片子,我给你讲过的东西都给分享了啊!呵呵

Davvife 发表于 2010-3-17 11:14:29

这个傻丫头片子,我给你讲过的东西都给分享了啊!呵呵
敦诚 发表于 2010-3-17 00:08 http://forum.simwe.com/images/common/back.gif

:lol ,;P .:loveliness:
页: [1] 2 3 4
查看完整版本: UMAT全过程-"技术篇"[by Davvife