joyce_chen 发表于 2006-12-6 11:30:25

UMAT中应变增量是如何给定的?

  前面先啰嗦两句,ABAQUS在每个积分点调用UMAT,在计算开始,第一增量步时,会调用UMAT四轮,以C3D8单元为例,共8个积分点,调用顺序为1,2,3,4,5,6,7,8;1,2,3,...一共4*8=32次,前两轮ABAQUS传递给UMAT的应变增量DSTRAN和应力STRESS的值都为0。从第二增量步起,ABAQUS会调用UMAT两轮。
  近日编写了一个UMAT子程序,属弹塑性本构模型,应力更新算法为完全隐式的,采用NEWTON迭代法,为了验证子程序的正确性,应先以单个单元来作初始测试,我以单个C3D8单元为模型进行纯剪切和单向拉伸测试。纯剪切问题可以计算。在计算单向拉伸问题时:当屈服函数小于等于零,预测应力即为真实应力,此时程序可以正常运算,但当屈服函数大于零时,在第一轮调用UMAT时也可运算,可是在第二轮调用UMAT时出现了错误,以积分点1为例:见下面数据:

第一轮调用UMAT时,计算第一个积分点时的输入信息:
应变增量:
-5.994964230046753E-005  -5.994964230046753E-005  1.997802417340925E-004
-2.964615315390051E-021 5.929230630780102E-021  1.355252715606881E-020
应力:

-5.204370268074854E-011  -5.204014996706974E-011  199.900065951007
-1.075080279207381E-015  -1.368216435567813E-015   -1.039962198903765E-015

预测应力;
-5.988377067343009E-003 -5.988377067339457E-003    239.852521271617
-1.303127611160462E-015 -9.121217716616515E-016    2.539890024604234E-018


第二轮调用UMAT时,计算第一个积分点时的输入信息:
应变增量:
  5.992829636050281E-0025.992829636050284E-002    1.997802417340787E-004
-3.903127820947816E-018 -5.637851296924623E-018    -6.938893903907228E-018
应力:

 -5.204370268074854E-011-5.204014996706974E-011   199.900065951007
-1.075080279207381E-015-1.932312485403628E-015   -1.734859448949146E-015
预测应力:
23072.3963203934            23072.3963203934            14083.2939065339
-3.013156818905778E-013   -4.356131814796054E-013   -5.354959289802744E-013
  
  可以看出输入的应力数据在前后两轮的迭代中变化不大,但是应变增量DSTRAN在第二轮计算时突然增大,导致预测应力太大,NEWTON迭代不收敛,无法继续计算。
请问高手:      1.为什么ABAQUS在每个增量步内要调用UMAT两轮呢?
      2.应变增量的输入数据不是由位移变化而自动给出的吗?为什么还会在同一增量步内,针对同一积分点发生变化呢?
      3.什么因素对应变增量有影响呢?
      4.如何解决上述问题?
  谢谢!!!

[ 本帖最后由 joyce_chen 于 2006-12-6 20:18 编辑 ]

boseshow 发表于 2006-12-9 00:03:28

我的理解是strain增量是系统给的一个假设,然后后面的stress就是在这个假设上进行计算,如果收敛,则假设成立,否则就要尝试不同的strain 增量假设了。

看看下面的,调用次数是很复杂,要分情况讨论。

UMAT在每一个增量步的第一个iteration的时候,会为每一个积分点调用两次,接下来的iteration只调用一次。

默认情况下,在 transient implicit dynamic analyses 分析的时候,在刚刚开始计算的时候,还会额外调用UMAT两次,也就是第一个增量步的第一个iteration会调用四次。当然如果不使用initial acceleration calculations,则不会额外多调用两次。------搂住学习很仔细,问题也问的很清楚,赞!!

具体要分很多情况讨论,具体见http://××××:2080/v6.5/books/usb/default.htm


User subroutine calls

Most of the user subroutines available in ABAQUS are called at least once for each increment during an analysis step. However, as discussed below, many subroutines are called more or less often.

Subroutines that define material, element, or interface behavior
Most user subroutines that are used to define material, element, or interface behavior are called twice per material point, element, or slave surface node in the first iteration of every increment such that the model's initial stiffness matrix can be formulated appropriately for the step procedure chosen. The subroutines are called only once per material point, element, or slave surface node in each succeeding iteration within the increment.

By default, in transient implicit dynamic analyses (“Implicit dynamic analysis using direct integration,” Section 6.3.2) ABAQUS/Standard calculates accelerations at the beginning of each dynamic step. ABAQUS/Standard must call user subroutines that are used to define material, element, or interface behavior two extra times for each material point, element, or slave surface node prior to the zero increment. The extra calls to the user subroutines are not made if the initial acceleration calculations are suppressed. If the half-step residual tolerances are being checked in a transient implicit dynamic step, ABAQUS/Standard must call these user subroutines one extra time for each material point, element, or slave surface node at the end of each increment. If the calculation of the half-step residual is suppressed, the extra call to the user subroutines is not made.

User subroutines UHARD, UHYPEL, UHYPER, and UMULLINS, when used in plane stress analyses, are called more often

joyce_chen 发表于 2006-12-7 22:10:13

为什么还没有回复呢?各位版主和高手帮帮忙呀!!!

aresaran 发表于 2006-12-7 22:17:44

1。你有几个单元?,增量步要遍历单元和积分点, 一个增量步那的
UMAT调用次数=单元数×积分点数
2。自动增量步,线性载荷,是系统自动给出的,阶越载荷是你设置的位移值
3。。。。收敛速度,收敛效果好,增量越大
4。。。。把你的模型只分一个单元,然后计算,输出所有数据,再认真分析。

joyce_chen 发表于 2006-12-8 10:32:46

谢谢你的回复,可是我上面说了是一个C3D8单元,而且从第二个增量步后调用UMAT的次数=2×单元数×积分点数;
你的意思是应变增量是系统自动给出的,是吗?其它因素对它有影响吗?比如说DDSDDE?

aresaran 发表于 2006-12-8 12:09:08

检查
自动增量都是系统分配的,随着收敛速度改善,而增大增量步
不过umat里面也可以控制,权限不是很大

什么是DDSDDE??

joyce_chen 发表于 2006-12-8 13:18:27

 本构模型的Jacobian矩阵DDSDDE就是一致切线模量,也叫算法模量,引用Ted Belytschko书中论述:在隐式方法中,需要合适的切线模量。 由于在屈服时突然转化为塑性行为,连续体弹塑性切线模量可能引起伪加载和卸载。为了避免这点,采用了一个基于本构积分算法的系统线性化的算法模量(也称为一致切线模量)。

aresaran 发表于 2006-12-8 13:34:44

没看清楚,哈哈 DDSDDE

Jacobian的与增量选择多少没有直接关系。
称为切线模量只是一维的说法,广义多维的张量本构。
但是Jacobian的这个正确性,是UMAT本构最重要的一部分。就是说如果你的jacobian错了,所有的都错了。
DDSDDE是用来更新应力增量,Belytschko或者庄的译本里面有关于应力更新算法的讨论。

你的问题好要多测试一下
我通常的测试方法:本构在一个单元上测试,就是建立一个正方形,分一个单元,重新测试本构,测完了再去算你的问题。
尽量把问题简单化
你把增量步号,积分点好,单元号都打印到dat里面。
应该是 每个增量步调用UMAT次数=单元数×积分点数才对

检查积分点号是否和manual一致,我遇到过不一致的单元。abaqus会犯这样的错误。

joyce_chen 发表于 2006-12-8 13:48:01

  我就是用三维的一个C3D8单元来测试子程序的,你的建议不错,下面我再用一个正方形,即二维平面应变单元试一下;
  我也是把增量步号,积分点号等都打印到dat文件中看结果的,但请你核实一下,我看到的确从第二个增量步后调用UMAT的次数=2×单元数×积分点数

aresaran 发表于 2006-12-9 01:06:02

根据abaqus的这段文档,应该是在 一些单元 和   一些USER Subroutine 会发生在第一次跌代调用2次的问题,为了abaqus选择合适的初始刚度矩阵。
瞬态分析也是为了让abaqus有效的进行分析,在初始和结尾调用多余的1或2次。
但是当系统认为合理的情况,仍然只是调用一次。


楼主和楼上都加分鼓励!

技术积分+1
贡献积分+10

[ 本帖最后由 aresaran 于 2006-12-9 03:31 编辑 ]

joyce_chen 发表于 2006-12-9 11:10:16

  非常感谢aresaran版主、boseshow的解答与鼓励,接下来我再仔细看看ABAQUS手册,检查子程序错误。

shawn2008 发表于 2006-12-10 12:44:05

我前些日子调试Chaboche hardening model + Barlat89 yield function时的UMAT,也遇到过这样的问题, DSTRAN突然增加很大,导致求解塑性屈服的Newton-Raphson迭代不收敛, 后来我发现是塑性条件下的DDSDDE定义错了, 修改后程序收敛很快.
估计你的问题也是出在塑性屈服时的DDSDDE定义.
也可能是其它问题. 细心检查一下.

joyce_chen 发表于 2006-12-10 16:13:25

  十分感谢shawn2008 的回复,可我检查了塑性屈服后的DDSDDE,应该也没有错,你遇到同样问题时,DSTRAN是在一进入塑性状态就突然增大呢,还是在所有积分点被调用一轮后出现这样现象呢?

aakkaa 发表于 2006-12-10 17:28:04

这里返回的应力数值一定要准确,ddsdde影响反而不是特别大,最多多迭代几次。
试试一直用弹性的ddsdde,看结果怎么样

joyce_chen 发表于 2006-12-10 19:31:29

  非常感谢aakkaa,正如你所说,我用弹性的DDSDDE代替塑性部分的,反而能顺利完成计算。说明塑性部分的DDSDDE还是不正确的,得继续检查。

aakkaa 发表于 2006-12-11 17:36:58

这里重要的不是ddsdde ,而是应力。ddsdde只影响迭代的次数,不修改它就相当于有限元的常刚度法,计算得到的应力就是准确值。
如果你不是一定要塑性的ddsdde,我想弹性ddsdde的结果可以满足精度要求了。

shawn2008 发表于 2006-12-12 13:40:02

正如aakkaa所说,在umat中最重要的是应力更新要准确,ddsdde只影响收敛速度。但不是说ddsdde的定义不重要,错误的塑性ddsdde有可能导致dstran过大,我在调试umat程序时发现,有时候等效trail stress达到了10e+5MPa, 显然这个初始值对Newton-Raphson迭代来说有点太困难了,我的迭代次数使用200次仍然发散。
在保证塑性应力更新收敛时,塑性ddsdde就不是很重要了,但对迭代的收敛性有很大影响,时间步长有可能比二阶收敛步长小2-3个数量级,这个计算时间对复杂问题分析显然是不能忍受的。
所以consistent tangent modular matrix尽可能要与算法一致,才能保证有很好的收敛精度。

另外在做umat时,有一些编程的小问题也要注意,比如:fortran默认的以I-N开头的变量为整型,inp文件中,材料性能定义参数每行不能超过8个。这些细节不注意有可能导致未知结果。

我不知道你的本构模型是什么,如果方便可以把详细的更新算法帖出来。

joyce_chen 发表于 2006-12-13 14:14:00

  佩服!我以前认为DSTRAN是输入数据,只和位移增量有关,没有想到DDSDDE还会导致DSTRAN突然变大。我的email:zhychen72@163.com,shawn2008,你的呢,希望以后有问题再讨教!
  
  昨天我又检查了程序,发现在计算塑性部分DDSDDE的参数中有个符号错了,真是太不仔细了,这下可以计算一个单元模型问题了,但是对于一相对复杂的轴对称拉伸问题就又出现错误了。原因还在找。
  
  小结一下:
  1.用弹性的DDSDDE代替塑性部分的DDSDDE可以作为初步检查应力更新算法的一种方法,但也不能保证应力更新算法一定是正确的,而且这只适用于简单问题的求解,我想对于复杂问题,DDSDDE还是应该采用与本构模型相适应的一致切线模量(即算法模量),更易收敛;
  2.inp文件中材料性能定义参数的确是每行不能超过8个,而且最后一个参数后不能加逗号,为了保证准确性,最好用CAE调入后再检查一遍材料参数。

willnessless 发表于 2006-12-13 14:24:54

请问楼上的大佬们,对于屈服和硬化是通过call UHARD实现吗?还是直接在UMAT里写?

boseshow 发表于 2006-12-13 14:32:26

硬化可以单独写在UHARD里面,事实上,就算用UMAT,很多人也习惯在UMAT里调用UHARD,也就是说你写两个subroutine放到同一个文件里面。

分开写条理更清楚一些。
页: [1] 2
查看完整版本: UMAT中应变增量是如何给定的?