Win + Linux ABAQUS UMAT / DEBUG

时间:2023-06-10 11:31:00       来源:哔哩哔哩

分享一下在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 及以前的版本。

谢绝任何方式的转载,谢谢!

能力所限,可能文中会存在错误和不当之处,敬请包涵!

请多多提出指正、疑问或者建议,非常感谢!

关键词: