You are on page 1of 9

一起学习 UMAT

ZHANG chunyu

1、什么时候用用户定义材料(User-defined material, UMAT)?

很简单,当 ABAQUS 没有提供我们需要的材料模型时。所以,在决定自己定义
一种新的材料模型之前,最好对 ABAQUS 已经提供的模型心中有数,并且尽量使
用现有的模型,因为这些模型已经经过详细的验证,并被广泛接受。

2、好学吗?需要哪些基础知识?

先看一下 ABAQUS 手册(ABAQUS Analysis User's Manual)里的一段话:

Warning: The use of this option generally requires
considerable expertise. The user is cautioned that the
implementation of any realistic constitutive model requires
extensive development and testing. Initial testing on a
single element model with prescribed traction loading is
strongly recommended.

但这并不意味着非力学专业,或者力学基础知识不很丰富者(就如我本人)
就只能望洋兴叹,因为我们的任务不是开发一套完整的有限元软件,而只是提供一
个描述材料力学性能的本构方程(Constitutive equation)而已。当然,最
基本的一些概念和知识还是要具备的,比如
应 力 (stress), 应 变 ( strain ) 及 其 分 量 ; volumetric part 和
deviatoric part;模量(modulus)、泊松比(Poisson’s ratio)、拉美
常数(Lame constant);矩阵的加减乘除甚至求逆;还有一些高等数学知识如
积分、微分等。

3、UMAT 的基本任务?

我们知道,有限元计算(增量方法)的基本问题是:
已知第 n 步的结果(应力,应变等) σ n , ε n ; 然后给出一个应变增量 dε n +1 ,
计 算 新 的 应 力 σ n +1 。 UMAT 要 完 成 这 一 计 算 , 并 要 计 算 Jacobian 矩 阵
DDSDDE(I,J) = 。 是应力增量矩阵(张量或许更合适), 是应
变增量矩阵。DDSDDE(I,J) 定义了第 J 个应变分量的微小变化对第 I 个应力分
量带来的变化。该矩阵只影响收敛速度,不影响计算结果的准确性(当然,不收敛
自然得不到结果)。

4、UMAT 到底起什么作用?为什么 Jacobian 矩阵不影响计算结果的准确性却影响
收敛速度?

有限元计算的中心问题就是求得节点的位移(进而应变、应力),以使内力和
外力达到平衡:

DDSDDE.经常采用的办法是先研究材料 单向应力-应变规律(如单向拉伸、压缩试验),并用一数学公式加以描述,然后 把讲该规律推广到各应力分量。这叫做“泛化“(generalization)。 6、一个完整的例子及解释 下面这个 UMAT 取自 ABAQUS 手册,是一个用于大变形下的弹塑性材料模型。 希望我的注释能帮助初学者理解。需要了解 J2 理论。 SUBROUTINE UMAT(STRESS.STATEV.SCD.SSE. F int = A ∫B T σ ni +1 dV e (4) e =1 e (所以,程序不在乎新的应力是由增量方法得到,还是全量方法得到,而只在乎新 应力是否准确!)。然后回到(2),如此循环,直至(2)右端为 0,也即满足 (1)。 这样第 n+1 步就完成了,然后开始第 n+2 步,即将外力加上一点点,按同 样的方法求解新的位移。直至整个外力全部施加并得到满足(1)的位移。至于一 点点是多少,怎么计算,不在讨论之内 。 5、怎样建立自己的材料模型? 本构方程就是描述材料应力应变(增量)关系的数学公式,不是凭空想象出来 的,而是根据实验结果作出的合理归纳。比如对弹性材料,实验发现应力和应变同 步线性增长,所以用一个简单的数学公式描述。为了解释弹塑性材料的实验现象, 又提出了一些弹塑性模型,并用数学公式表示出来。 对各向同性材料(Isotropic material). F int (d ) =F ext (1) d 是节点位移矩阵,黑体字表示矩阵或矢量。除了小变形、线弹性问题,方程 (1)是非线性的,要用迭代的方法解出: K T ∆d = Fnext +1 − F int d ni +1 ( ) (2) d ni ++11 = d ni +1 + ∆d (3) i 表示一个增量步内的第 i 次迭代,n 表示第 n 个增量步。 K T 是切线刚度,由材料 的 Jacobian 矩阵结合单元计算组装而得。刚度矩阵其实就是力对位移的 梯度。要 想快速收敛,位移增量应沿该梯度方向变化,也就是说,如果 Jacobian 矩阵不是 那么准确,自然 K T 也不怎么准确,那么满足(1)式的位移被找到的速度也就变 慢,甚至发散,根本找不到。但收敛速度无论慢快,(1)式才是判断结果准确与 否的唯一标准。所以 Jacobian 矩阵不影响结果的准确性,只影响收敛速度的快慢。 以大变形、非线性材料为例,整个计算步骤是这样的: 整个外力不是一次加上,而是一点点加上的,不然会发散得不到结果的。所以, 每一个增量步开始时就是在原来的外力上加上一点点,得到 Fnex+t1 。根据(2)得 到位移增量 ∆d ,此时要知道力对位移的梯度 K T (以尽快找到满足平衡条件的位 移),由材料的 Jacobian 矩阵和单元结合起来组装得到(此处使用 UMAT 提供的 Jacobian 矩阵)。然后可计算应变增量 dε in +1 ,调用 UMAT,得到新的应力,进而 得到新的内力: # el .RPL. .SPD.DDSDDT.

2 PREDEF(1).TEMP.TIME.3).NDI.DRPLDT.DTEMP.NOEL. 3 DFGRD0(3.23) , 轴 对 称 问 题 是 1(12);已知。 NTENS=NTENS+ NSHR,已知。 PROPS 材料常数矩阵,如模量啊,粘度系数啊等等;作为已知量传入,已知。 DROT—对 finite strain 问题,应变应该排除旋转部分,该矩阵提供了旋转矩 阵,详见下面的解释。已知。 PNEWDT—可用来控制时间步的变化。如果设置为小于 1 的数,则程序放弃当前计 算,并用新的时间增量 DTIME X PNEWDT 作为新的时间增量计算;这对时间相关 的材料如聚合物等有用;如果设为大余 1 的数,则下一个增量步加大 DTIME 为 DTIME X PNEWDT。可以更新。 其他变量含义可参看手册,暂时用不到。 C INCLUDE 'ABA_PARAM.DSTRAN(NTENS).COORDS(3).NSTATV.NPROPS.STRAN.33),平 面问题是 2(11.DDSDDE(NTENS.DPR ED.NSHR.PROPS(NPROPS).DRPLDE(NTENS).DFGRD0.NPT.INC' 定义了一些参数,变量什么的,不用管 C CHARACTER*8 CMNAME C DIMENSION STRESS(NTENS).对三维问题、轴对称问题自然是 3(11.STRAN(NTENS).22);已知。 NSHR — 剪 切 应 力 、 应 变 个 数 , 三 维 问 题 时 3(12.DTIME.22.DPRED(1). 1 DRPLDE.PROPS.KSPT.STATEV(NSTATV).NTENS. 2 CMNAME. 1 DDSDDT(NTENS). 3 PNEWDT.KSTEP.3) 矩阵的尺寸声明 C C LOCAL ARRAYS .13.LAYER.DFGRD1.PREDEF.DROT(3.NTENS).DFGRD1(3.COORDS.DROT.KINC) STRESS--应 力 矩 阵 , 在 增 量 步 的 开 始 , 保 存 σ n 并 作 为 已 知 量 传 入 UMAT ;在增量步的结束应该保存更新的应力 σ n +1 ; STRAN--当前应变 ε n ,已知 。 DSTRAN—应变增量 dε n +1 ,已知。 STATEV--状态变量矩阵,用来保存用户自己定义的一些变量,如累计塑性应变, 粘弹性应变等等。增量步开始时作为已知量传入,增量步结束应该更新; DDSDDE= 。需要更新 DTIME—时间增量 dt。已知。 NDI—直接应力、应变个数.DSTRAN.3).CELENT.

E C PROPS(2) .D0.4999D0.EPLAS(6). 1 ENUMAX=.ELASTIC STRAINS C EPLAS .NTENS .D0.SIX= 6.ONE=1.THREE=3.PLASTIC STRAINS C FLOW .DIRECTION OF PLASTIC FLOW C ----------------------------------------------------------- ----- C 局部变量,用来暂时保存弹性应变、塑性应变分量以及流动方向 DIMENSION EELAS(6).C ----------------------------------------------------------- ----- C EELAS .D0. PLASTIC STRAIN C ----------------------------------------------------------- ----- C C ELASTIC PROPERTIES C 获取杨氏模量,泊松比,作为已知量由 PROPS 向量传入 EMOD=PROPS(1) E ENU=PROPS(2) ν EBULK3=EMOD/(ONE-TWO*ENU) 3K EG2=EMOD/(ONE+ENU) 2G EG=EG2/TWO G EG3=THREE*EG 3G ELAM=(EBULK3-EG2)/THREE λ DO K1=1.SYIELD AN HARDENING DATA C CALLS HARDSUB FOR CURVE OF YIELD STRESS VS.0D-6) C C ----------------------------------------------------------- ----- C UMAT FOR ISOTROPIC ELASTICITY AND ISOTROPIC MISES PLASTICITY C CANNOT BE USED FOR PLANE STRESS C ----------------------------------------------------------- ----- C PROPS(1) .NEWTON=10.D0.TOLER=1.NU C PROPS(3.D0.) .FLOW(6) C PARAMETER(ZERO=0..TWO=2.

NDI.K2)=ZERO END DO END DO 弹性部分,Jacobian 矩阵很容易计算 λ+2G λ λ  λ λ + 2 G λ    λ λ λ+2G  J=    G   G     G 注意,在 ABAQUS 中,剪切应变采用工程剪切应变的定义 γ ij = u i.2.NDI DO K2=1.i ,所以剪 切部分模量是 G 而不是 2G! C C ELASTIC STIFFNESS C DO K1=1.K1)=EG END DO C C RECOVER ELASTIC AND PLASTIC STRAINS AND ROTATE FORWARD C ALSO RECOVER EQUIVALENT PLASTIC STRAIN C 读取弹性应变分量,塑性应变分量,并旋转(调用了 ROTSIG),分别保存在 EELAS 和 EPLAS 中; CALL ROTSIG(STATEV( 1).NSHR) 读取等效塑性应变 EQPLAS=STATEV(1+2*NTENS) .NTENS DDSDDE(K1.NTENS DDSDDE(K1. DO K2=1.NSHR) CALL ROTSIG(STATEV(NTENS+1).NDI DDSDDE(K2.EPLAS.NDI.DROT.EELAS.j + u j.K1)=EG2+ELAM END DO DO K1=NDI+1.DROT.K1)=ELAM END DO DDSDDE(K1.2.

GT.NTENS FLOW(K1)=STRESS(K1)/SMISES END DO C 根据 J2 理论并应用 Newton-Rampson 方法求得等效塑性应变增量 .EQPLAS.NTENS DO K2=1.(ONE+TOLER)*SYIEL0) THEN C C ACTIVELY YIELDING C SEPARATE THE HYDROSTATIC FROM THE DEVIATORIC STRESS C CALCULATE THE FLOW DIRECTION C SHYDRO=(STRESS(1)+STRESS(2)+STRESS(3))/THREE DO K1=1.NTENS STRESS(K2)=STRESS(K2)+DDSDDE(K2.先假设没有发生塑性流动,按完全弹性变形计算试算应力 ∆σ = J.NVALUE) C C DETERMINE IF ACTIVELY YIELDING C 如果 Mises 应力大余屈服应力,屈服发生,计算流动方向 IF (SMISES.NDI FLOW(K1)=(STRESS(K1)-SHYDRO)/SMISES END DO DO K1=NDI+1.PROPS(3).∆ε σ n +1 = σ n + ∆σ C C CALCULATE PREDICTOR STRESS AND ELASTIC STRAIN C DO K1=1.HARD.K1)*DSTRAN(K1) END DO EELAS(K1)=EELAS(K1)+DSTRAN(K1) END DO C 计算 Mises 应力 C CALCULATE EQUIVALENT VON MISES STRESS C SMISES=(STRESS(1)-STRESS(2))**2+(STRESS(2)- STRESS(3))**2 1 +(STRESS(3)- STRESS(1))**2 DO K1=NDI+1.NTENS SMISES=SMISES+SIX*STRESS(K1)**2 END DO SMISES=SQRT(SMISES/TWO) C 根据当前等效塑性应变,调用 HARDSUB 得到对应的屈服应力 C GET YIELD STRESS FROM THE SPECIFIED HARDENING CURVE C NVALUE=NPROPS/2-1 CALL HARDSUB(SYIEL0.

ELASTIC AND PLASTIC STRAINS AND C EQUIVALENT PLASTIC STRAIN C DO K1=1.NDI STRESS(K1)=FLOW(K1)*SYIELD+SHYDRO EPLAS(K1)=EPLAS(K1)+THREE/TWO*FLOW(K1)*DEQPL EELAS(K1)=EELAS(K1)-THREE/TWO*FLOW(K1)*DEQPL END DO DO K1=NDI+1.30X.NTENS STRESS(K1)=FLOW(K1)*SYIELD EPLAS(K1)=EPLAS(K1)+THREE*FLOW(K1)*DEQPL EELAS(K1)=EELAS(K1)-THREE*FLOW(K1)*DEQPL END DO EQPLAS=EQPLAS+DEQPL C C CALCULATE PLASTIC DISSIPATION C SPD=DEQPL*(SYIEL0+SYIELD)/TWO C C 计算塑性变形下的 Jacobian 矩阵 FORMULATE THE JACOBIAN (MATERIAL TANGENT) C FIRST CALCULATE EFFECTIVE MODULI C EFFG=EG*SYIELD/SMISES .TOLER*SYIEL0) GOTO 10 END DO C C WRITE WARNING MESSAGE TO THE .PROPS(3).EQPLAS+DEQPL.NVALUE) IF(ABS(RHS).MSG FILE C WRITE(7.NEWTON RHS=SMISES-EG3*DEQPL-SYIELD DEQPL=DEQPL+RHS/(EG3+HARD) CALL HARDSUB(SYIELD.' ITERATIONS') 10 CONTINUE C 更新应力 σn +1 ,应变分量 C UPDATE STRESS.2) NEWTON 2 FORMAT(//.LT. 1 'CONVERGE AFTER '.HARD.PLASTICITY ALGORITHM DID NOT '.I3.'***WARNING .C SOLVE FOR EQUIVALENT VON MISES STRESS C AND EQUIVALENT PLASTIC STRAIN INCREMENT USING NEWTON ITERATION C SYIELD=SYIEL0 DEQPL=ZERO DO KEWTON=1.

.001) go to 99 c. EFFG2=TWO*EFFG EFFG3=THREE/TWO*EFFG2 EFFLAM=(EBULK3-EFFG2)/THREE EFFHRD=EG3*HARD/(EG3+HARD)-EFFG3 c.K1)+EFFHRD*FLOW(K2)*FLO W(K1) END DO END DO c.NTENS DDSDDE(K1.NDI DO K2=1.NVALUE) C INCLUDE 'ABA_PARAM..INC' C DIMENSION TABLE(2.NTENS DDSDDE(K2. c....HARD. 99 continue c..K1)=EFFG2+EFFLAM END DO DO K1=NDI+1.子程序,根据等效塑性应变,利用插值的方法得到对应的屈服应力 SUBROUTINE HARDSUB(SYIELD.NVALUE) C .NTENS DO K2=1.K1)=EFFLAM END DO DDSDDE(K1..NDI DDSDDE(K2... DO K1=1.K1)=DDSDDE(K2..TABLE.EQPLAS.K1)=EFFG END DO DO K1=1.. if (props(7)... ENDIF C 将弹性应变,塑性应变分量保存到状态变量中,并传到下一个增量步 C STORE ELASTIC AND (EQUIVALENT) PLASTIC STRAINS C IN STATE VARIABLE ARRAY C DO K1=1.lt.NTENS STATEV(K1)=EELAS(K1) STATEV(K1+NTENS)=EPLAS(K1) END DO STATEV(1+2*NTENS)=EQPLAS C RETURN END c.

HARDENING TO ZERO C SYIELD=TABLE(1. 1 `ENTERED IN ASCENDING ORDER') CALL XIT ENDIF C C CURRENT YIELD STRESS AND HARDENING C DEQPL=EQPL1-EQPL0 SYIEL0=TABLE(1.NVALUE-1 EQPL1=TABLE(2.LT.K1) IF(EQPL1.D0) C C SET YIELD STRESS TO LAST VALUE OF TABLE.K1+1) DSYIEL=SYIEL1-SYIEL0 HARD=DSYIEL/DEQPL SYIELD=SYIEL0+(EQPLAS-EQPL0)*HARD GOTO 10 ENDIF END DO 10 CONTINUE ENDIF RETURN END .K1+1) IF(EQPLAS.30X.EQPL1) THEN EQPL0=TABLE(2.1) 1 FORMAT(//.GT. PARAMETER(ZERO=0.EQPL0) THEN WRITE(7.LE.NVALUE) HARD=ZERO C IF MORE THAN ONE ENTRY.K1) SYIEL1=TABLE(1. SEARCH TABLE C IF(NVALUE.1) THEN DO K1=1.'***ERROR .PLASTIC STRAIN MUST BE `.