分享一下在Windows以及Linux上的ABAQUS UMAT开发及调试的一点点心得。
1 平台及版本:
Win 10 + Vs 2022 + Intel Fortran 2022 + ABAQUS 2019
(相关资料图)
Ubuntu 18 + GCC 7.5 + ABAQUS 2019
2 UMAT语法及平台特性:
Fortran:
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)
C++:
extern "C"
void umat_(double *stress, double *statev, double *ddsdde, double *sse, double *spd,
double *scd, double *rpl, double *ddsddt, double *drplde, double *drpldt,
double *stran, double *dstran, double *time, double *dtime, double *temp,
double *dtemp, double *predef, double *dpred, char *cmname, int *ndi,
int *nshr, int *ntens, int *nstatv, double *props, int *nprops,
double *coords, double *drot, double *pnewdt, double *celent, double *dfgrd0,
double *dfgrd1, int *noel, int *npt, int *layer, int *kspt,
int *kstep, int *kinc)
无论在Fotran还是C++,umat各个参数以指针形式读写。
需要注意的是,考虑到c++的mangling技术的使用,在某些系统中,UMAT的大小写以及symbol可能不同。
以Ubuntu18为例,UMAT实际的名字为umat_。
若要甄别umat在编译后的symbol名字,建议使用如下操作:
对一个简单的fortran umat文件进行编译:
gfortran -c test.o umat_example.for
导出symbol :
nm test.o > symbol.log
从而准确获取umat的symbol。
注:C++版本umat也可应用于Windows系统。
3 UMAT编译及其链接:
对于给定的umat.f, umat.for或者umat.cpp,abaqus分两步对其操作。
第一步编译:将源码编译为obj或者o文件。
第二部链接:将obj或者o文件与ABAQUS内置动态链接库链接,形成stadardU.dll
在abaqus实际运算阶段,standard.exe将链接到新生成的standardU.dll,以此来完成最终操作。
如上编译+链接的逻辑,允许我们可以写多种语言版本的umat。
若选择c++版本,则可手动利用msvc-cl/clang/GCC完成对cpp文件的编译,仅在链接阶段提供给ABAQUS。
若选择fortran版本,则可直接提供.for源代码,将编译和链接都交给ABAQUS来完成。
4 UMAT Debug:
虽然PRINT大法直观且易于实现,但某些时候可能需要更为细致的debug。
Windows上可以利用VS + Intel Fortran完成调试,
Linux上可利用gdb调试,不过此部分内容尚未测试,可能会在稍后开展。
本此测试选取较新的vs 2022 以及oneapi 2022对abaqus 2019进行debug。
关于版本的选取,尚无更多建议,但是提醒大家较老的vs可能存在debug symbol未加载的情况。
Release vs Debug
Release与Debug相对,为代码编译及链接的状态描述。
若代码为Release模式,则代码内部无调试信息,且代码的执行经过编译器优化。
若代码为Debug模式,在代码编译及链接过程中,编译器会额外加入调试信息,允许用户以多种形式对代码进行测试,包括但不限于,查看变量取值,查看段错误等。
在编译阶段:intel fortran编译器 ifort允许用户输入 /Zi 和 /debug来启用debug调试。
/Zi: 允许调试信息与代码单独存在,调试信息文件可能为vc xx.pdb形式,xx为数字编号,屈居于vs版本。
/debug: 允许编译器额外增加调试信息。
在链接阶段:microsfot 链接器 link 允许用户输入 /debug 来启用debug调试。
ABAQUS的编译及链接:
ABAQUS的编译与链接配置,路径为:
C:\Program Files\Dassault Systemes\SimulationServices\V6R2019x\win_b64\SMA\site
文件名为win86_64.env (windows) 或者 lnx86_64.env (linux)。
用户可将该配置拷贝至当前工作目录下的 abaqus_v6.env用于覆盖原设置。
5 UMAT VS Debug:
假设用户有如下inp文件以及umat:
若要开始DEBUG,可能需要在umat.for适当位置加入, read(*,*)variables
通过IO读写,来阻塞umat以及standard.exe,便于vs attach到对应进程。
在开始菜单打开intel oneapi内置的 intel oneapi prompt x64 (这是一个配置好的命令行)
切换到当前工作路径,并执行如下操作
abaqus job=model user=umat.for verbose=3 int
verbose=3 为了最大化显示abaqus操作记录,便于正确分析是否umat已被编译。
int为了使得命令行可与abaqus进行io通信,利用阻塞来开始abaqus debug。
图6中那个 block 字样是我自己写的,你们可以替换为任意字样。
若standard.exe发生阻塞
此时利用vs打开umat.for,准备attach到进程
当attach成功后,在umat.for合理位置打入断点。
在intel prompt中随意输入一个数字,取消阻塞。
在 step into/step over按钮中,开始你的debug历程吧。
例子中,使用了Elastic umat材料。
模量为10000,可见 locals已经成功捕捉到了该变量。
6 小结:
umat 在c++版本中,可能名字为 umat_
umat在win中的编译器默认为 ifort,链接器为 msvc-link
umat在linux中编译器为 gcc/g++/gfortran,链接器为 ld
用户可编写cpp或者for文件,可任意选择在编译或者链接期,将umat传输给ABAQUS
DEBUG过程中,合理的IO阻塞允许VS方便的调试umat。
最后,vs ifort以及abaqus版本之间的适配:
对于 abaqus 2017及以后的版本,不推荐使用 vs 2013 及以前的版本。
谢绝任何方式的转载,谢谢!
能力所限,可能文中会存在错误和不当之处,敬请包涵!
请多多提出指正、疑问或者建议,非常感谢!
关键词: