Abaqus/Standard analysis exited with an error,msg里就这一行,子程序编没编过根本看不出来,还得翻log。子程序配好没配好,跑一个最简单的单单元模型验证,别直接上大模型,崩了都不知道是配置问题还是模型问题。
D:\temp\verify_sub\single_elem.inp,一个C3D8R单元,1×1×1mm,弹性模量206000,泊松比0.3,一端固定,另一端加100MPa压力。USER MATERIAL, CONSTANTS=2,DEPVAR,NSTATEV=10,SOLID SECTION, ELSET=ALL, MATERIAL=USERMAT。UMAT里就写线弹性,DDSDDE按各向同性填,STRESS用DDSDDE乘以DSTRAN累加。DFLUX验证就换成一个热传导步,表面加1000W/m²热流,子程序里按Q=FLUX(1)AREA算生热率写进RPL。UEL验证要单独建模型,一个单元两个节点,刚度矩阵自己组装,边界条件自己处理。
abaqus job=single_elem user=umat_test.for cpus=1 interactive,命令行敲下去,屏幕刷出“Abaqus JOB single_elem”和“Begin Compiling”,这两行出来说明编译器在动了。编译报错行里找“error”,链接报错行里找“LNK”,这两个是配置没配好。编过了之后跑完看msg,最后一行“THE ANALYSIS HAS COMPLETED SUCCESSFULLY”才算真过了。sta文件里看增量步和迭代次数,dat文件里看单元刚度和应力输出,odb里看云图跟手算对一下。
Abaqus 2022、VS2019、oneAPI 2021.4、ifort 2021.4.0、D:\SIMULIA\EstProducts\2022\win_b64\SMA\site\win86_64.env、D:\SIMULIA\EstProducts\2022\win_b64\SMA\site\abaqus_v6.env、D:\temp\verify_sub\umat_test.for、D:\temp\verify_sub\single_elem.inp、D:\temp\verify_sub\single_elem.log、D:\temp\verify_sub\single_elem.msg。
有一次帮新来的同事配环境,他装完VS2019和oneAPI之后直接拿一个混凝土的UMAT提交,崩了。当时他工位旁边的窗户开着,楼下有人在用割草机,声音嗡嗡的。第一反应是UMAT代码有问题,把代码拿到我机器上跑,编过了,结果也对,排除了代码。回到他机器上查环境变量,PATH里ifort的路径写的是oneAPI的编译器目录,但LIB和INCLUDE指向的是老版本IVF的目录,两套库混着链接。他之前装过IVF2020没卸干净,oneAPI装的时候又没覆盖全。把IVF2020卸了,oneAPI重新modify一遍,PATH、LIB、INCLUDE全部统一到oneAPI,再跑单单元验证,过了。前后折腾了三个多小时,真正改代码一行都没动。

编译产物在D:\temp\verify_sub\下,Standard生成standardU.dll和standardU.exp,Explicit生成explicitU.dll和explicitU-D.dll。dll文件在说明编译链接成功了,但能不能用还得看运行结果。有时候dll生成了但UMAT根本没被调用,原因通常是inp里忘了写USER MATERIAL或者SOLID SECTION的MATERIAL名字跟UMAT里的CMNAME对不上,程序不报错,直接拿默认材料属性算,结果看起来正常但其实错了。验证的时候在UMAT第一行加一个STATEV(1)=1.0,后处理看SDV1,全是1才说明子程序被调了,全0就是没调。
dll的时间戳跟log里编译的时间对一下,能确认是不是这次提交编的。CPU数大于1的时候子程序会多线程调用,UMAT必须是线程安全的,里面用了SAVE或COMMON块存状态的,多线程下会互相覆盖,单单元单CPU验证过了不代表多CPU就没问题。跑通单单元之后换一个20单元的梁模型,cpus=4再验一遍。D:\temp\verify_sub\standardU.dll
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删