用户登录

你在这里

调试ABAQUS的标准用户子例程

你好,

我设法找到了一步一步调试UMAT的方法。我在ABAQUS 6.9上使用英特尔fortran 11.0测试了它,它与运行在win7 /x64上的Visual Studio 2005或2008集成在一起。对于其他版本和其他用户子例程,该过程是相同的(相同的过程也应该在linux中工作,但使用不同的调试器)。

整个思想是将“ABAQUS标准”流程附加到调试器。为此,必须在调试模式下编译并链接UMAT代码。
因此,您应该编译您的用户子例程文件,就像您想要创建一个exe控制台应用程序一样,不要注意最后一个链接器错误,即您的文件不包含主子例程。在这里,在运行abaqus作业时使用预编译的obj文件而不是原始的fortran文件要容易得多(因为调试信息文件是在固定位置创建的,而不是在abaqus每次在不同文件夹中创建的临时文件夹中)。

为了在调试模式下创建目标文件,我使用了这样一个命令(你可能需要根据VS的路径稍微修改一下):

ifort /nologo /debug:full /Od /根-interfaces /warn:interfaces /module:"compiled\modules\\" /object:"compiled\\" /traceback /check:bounds /libs:static /threads /dbglibs /Qvc8 /Qlocation,link,"c:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin\amd64" "Umat-Test.f90"

在我的文件夹中,我说编译器在“compiled\modules”中创建模块文件,在这个文件夹中创建目标文件:“compiled”。你可能有你自己的。通过运行这个命令,链接器还创建了调试所需的文件,这(在MS-VS中)是一个扩展名为pdb的文件。

编译完成后,您可以找到“Umat-Test”文件。Pdb”和你的FORTRAN文件在同一个文件夹。

我应该说,Abaqus将每个创建的obj文件链接到“standardud .dll”文件,该文件在提交每个作业后重新创建。该文件是abaqus_v6中链接器命令的主要输出。env文件,由Abaqus加载。因此,您必须修改链接器命令以在调试模式下创建它。为此,我从主abaqus_v6中复制了link_sl和link_exe。Env文件,并把它放在我的用户级别abaqus_v6。env文件。然后我在原来的命令中添加了switch /debug:full。你的命令应该是这样的:

link_sl='cmd /c "LINK /nologo /debug:full /INCREMENTAL:NO /subsystem:console /machine:AMD64 /NODEFAULTLIB:LIBC. "LIB / NODEFAULTLIB: LIBCMT。LIB / DEFAULTLIB: OLDNAMES。LIB / DEFAULTLIB: LIBIFCOREMD。LIB / DEFAULTLIB: LIBIFPORTMD。LIB / DEFAULTLIB: LIBMMD。LIB / DEFAULTLIB: MSVCRT。LIB / DEFAULTLIB: kernel32。lib / DEFAULTLIB: user32。lib / DEFAULTLIB: advapi32。lib /FIXED:NO /dll /def:%E /out:%U %F %A %B oldnames。自由user32。自由ws2_32。自由netapi32。自由advapi32。lib && mt /manifest %U;manifest /outputresource:%U;2 && del %U.manifest"'

link_exe='cmd /c "LINK /nologo /debug:full /INCREMENTAL:NO /subsystem:console /machine:AMD64 /NODEFAULTLIB:LIBC。LIB / NODEFAULTLIB: LIBCMT。LIB / DEFAULTLIB: OLDNAMES。LIB / DEFAULTLIB: LIBIFCOREMD。LIB / DEFAULTLIB: LIBIFPORTMD。LIB / DEFAULTLIB: LIBMMD。LIB / DEFAULTLIB: MSVCRT。LIB / DEFAULTLIB: kernel32。lib / DEFAULTLIB: user32。lib / DEFAULTLIB: advapi32。lib /FIXED:NO /LARGEADDRESSAWARE /out:%J %F %M %L %B %O oldnames。自由user32。自由ws2_32。自由netapi32。自由advapi32。lib && mt /manifest %J。manifest /outputresource:%J;1 && del %J.manifest"'

然后设置就准备好了。转到VS,创建fortarn项目,并将fortran源代码文件添加到项目中。请记住,在调试时编译的文件必须与代码匹配。

然后转到工具- >选项- >调试- >符号,将pdb文件的路径添加到“符号文件(.pdb)位置”部分。

这些程序只需要做一次。

现在提交作业,等待一段时间,在进程列表中看到Standard.exe(例如使用win的任务管理器),然后切换到VS并转到调试->附加到进程
从正在运行的进程列表中选择standard.exe。如果您完美地完成了所有步骤,VS将成功地从pdb文件加载调试符号,您必须能够一行一行地调试代码,就像我做的那样。

这里有一些有用的提示:放置一个一次性的延迟命令(比如sleep)来争取一些时间切换到VS环境,并将调试器附加到进程(standard.exe)。你可以把断点放在这条线后面。如果你在完成这些步骤时有困难,你可以给我发电子邮件。

下面是将进程附加到调试器后的截图:

截图

解释:在我上面的代码中,InitializationDone是一个常见的变量,我使用它在10秒睡眠后捕获进程。

这里有一个简单的示例,你可以尝试(Umat-Test.f90):

子程序UMAT(stress,statev,ddsdde,sse,spd,scd,rpl, ddsddt, drplde, drpldt, &
stran, dstran、时间dtime、临时dtemp, predef, dpr, cmname, ndi, nshr nten, nstatv, &
道具、nprops、坐标、drot pnewdt, celent dfgrd0, dfgrd1,诺埃尔,不扩散核武器条约》,层,kspt, kstep kinc)

包括“aba_param.inc”
整数:nTestNum

nTestNum = 0

!等待10秒
调用睡眠(10)

!把你的断点放在这里:
nTestNum = nTestNum + 1

!您可以使用add watch来检查这些值。享受吧!

返回
结束子程序umat

--

欢呼,

Hamidreza,

评论

你可以上传一个完整的版本,我们是更新的子调试。

你好,我正试图按照你描述的步骤,但我有一些困难。第一个:我没有看到任何。pdb扩展文件在我的fortran文件。第二:我没有在调试>中找到任何standard.exe附加到进程部分。你能给我一些建议吗?

谢谢,

伊姆兰

嗨,这是windows系统,但是对于linux我们该怎么做呢?

谢谢。

先生哈米德。Mirkhani你能告诉我如何在visual studio中获得standard.exe编译器,因为它在“调试>>附加到进程”中丢失了吗??

订阅“调试ABAQUS的标准用户子例程”评论

更多的评论

辛迪加

订阅辛迪加