# abaqus standard子程序能直接挪到explicit里用吗?
Syntax error in UMAT,换成Explicit提交之后,编译报的第一条就是这个。把UMAT文件后缀改成.for直接拿去编VUMAT,编译器一脸懵。答案很直接:不能直接挪。UMAT和VUMAT是两个完全不同的接口,FORTRAN的subroutine名字、参数列表、调用机制全都不一样,源码贴过去第一步就编不过。
UMAT的接口长这样:subroutine UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT,DRPLDE,DRPLDT,STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC)。VUMAT的接口是:subroutine VUMAT(NBLOCK,NDIR,NSHR,NSTATEV,VARS,COORDMP,CHARLENGTH,VEL,STRESSOLD,STATEOLD,ENERINTERN,ENERINELAS,STRESSNEW,STATENEW,STRAININC,DFGRD0,DFGRD1,TIME,TIMEINC,STEPTIME,CMNAME,ORNAME,NPROPS,PROPS,COORDS,NOEL,NPT,LAYER,KSPT,JSTEP,KINC)。参数列表完全不同,UMAT里单个积分点调用一次,VUMAT是一次处理一个block的材料点。VUMAT的变量后缀带“Old”和“New”,对应时间增量步前后的状态,这个两态架构在UMAT里没有。
DDSDDE不用写了。UMAT里必须提供的一致性切线刚度矩阵,VUMAT里根本不需要,显式求解不做迭代,用不到这个矩阵。删掉DDSDDE相关的所有代码,包括矩阵的计算和赋值。UMAT里的DROT旋转增量在VUMAT里也没了,VUMAT提供DFGRD0和DFGRD1,需要自己做极分解提取旋转张量R,然后计算客观应力率。Jaumann应力率那一套在VUMAT里要重写,不是把DROT删掉就完了。
剪切应变的存储方式不一样。UMAT里剪切应变分量用的是工程剪应变,γ12=2ε12。VUMAT里用的是张量剪应变,ε12就是ε12,不乘2。从UMAT搬到VUMAT的时候,读入的应变增量STRAININC要先除以2再参与本构计算,输出的应力反过来,算完的剪应力分量乘不乘2看本构方程的具体形式。这一步错了,剪切响应会差一倍。

VUMAT是在corotational坐标系里算的,应力和应变都是相对于随材料旋转的局部坐标系,不是当前构型下的Cauchy应力。UMAT里通常直接输出Cauchy应力,VUMAT里如果要跟ODB里的结果对,需要做坐标变换,S_true=R·S·R^T,R从DFGRD1极分解得到。小变形下差别不大,大变形剪切工况下误差会很明显。
状态变量的管理也不同。UMAT里STATEV是单点数组,VUMAT里STATEOLD和STATENEW按block组织,维度是NBLOCK×NSTATEV,每个block内的材料点循环处理。NSTATEV的定义方式一样,在*DEPVAR里设,但初始化要注意,VUMAT里所有内部变量默认初始化为零,损伤变量如果以0表示完好状态,初始值不用改,如果以1表示完好就需要在第一步手动赋值。UMAT里循环写习惯了的do i=1,npt之类,在VUMAT里改成do k=1,nblock,然后内层再处理每个材料点。
有一次帮同事迁移一个晶体塑性UMAT到VUMAT。他直接把UMAT源码改了个名字,删了DDSDDE,其他照搬,编译过了,跑起来应力全乱。打开他的代码一看,剪切应变增量没除以2,剪应力结果偏大了一倍;Jaumann应力率的旋转项还在用DROT,那个变量在VUMAT里根本不存在,相当于没做旋转修正。那天下午他在我工位上改代码,旁边同事开视频会,声音外放,叽叽喳喳的,他戴着耳机皱着眉一行一行看。改完剪切应变那步之后,单轴拉伸的结果跟UMAT对上了,但纯剪切工况还是对不上。后来又发现极分解那步他的R提反了,用的是U不是R,改过来才对上。整个迁移花了两天,代码量其实不多,但每个变量的含义都要重新理解一遍。
编译方式也不一样。UMAT编出来的是standardU.dll,VUMAT编出来的是explicitU.dll和explicitU-D.dll,后者是双精度版本。abaqus make library=usub.for命令会根据子程序类型自动生成对应的dll,但如果是混合了UMAT和VUMAT的同一个文件,得拆开分别编译。INP文件里*USER MATERIAL的用法一样,但UMAT需要额外加*DEPVAR和*USER MATERIAL, CONSTANTS,VUMAT也是,*DEPVAR的数量要跟NSTATEV一致。
子程序里调用的ABAQUS工具函数也不通用。UMAT里常用的GETVRM、SINV、SPRINC这些在VUMAT里没有直接对应的替代,需要自己用FORTRAN写。VUMAT里没有UMAT里那种逐点调用的机制,想输出中间变量只能靠STATEV往ODB里存,后处理的时候用ABQ_STATE_j读出来。
迁移之前先做一个单单元模型验证。一个C3D8R单元,单轴拉伸,跟UMAT的结果逐点对比应力应变曲线;再做一个纯剪切工况,验证剪切应变和旋转修正那部分。单单元过了再上多单元模型。VUMAT的调试比UMAT麻烦,Explicit不写msg里的迭代信息,出了错只能靠write(*,*)往屏幕打,或者存到STATEV里后处理看。D:\temp\vumat_test\single_elem.inp,*USER MATERIAL, CONSTANTS=8,*DEPVAR,*SOLID SECTION, ELSET=ALL, MATERIAL=USERMAT。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删