0. 本人最近开始学习ABAQUS二次开发,无耐无老师、无师兄师姐指点迷津,进展缓慢,深感当一名“网线博士”的悲哀。最近深感ABAQUS无法直接连接Visual Studio调试子程序而带来的不便,往日积累的程序调试经验也基本上毫无用武之地。已检索本论坛,发现本论坛尚无前辈给出用Visual Studio调试abaqus的方法,仅有几个这方面的求助帖。故将本人最近摸索总结的经验贴出来,作为本人的处女作。如有谬误,望各位前辈不吝指正。废话已表,下文进入正题。
1. 安装、配置ABAQUS User Subroutine的开发环境,本人使用的开发工具组合为Windows 7 (x64) +
ABAQUS 6.12-1 (x64) + Visual Studio 2008 + Intel Visual Fortran 11.1.060 + IMSLFortran Library 6.0 (可选项)。首先使用ABAQUS官方所建议的方法编译、运行简单的示例子程序,确保开发环境能正常工作。
2. 用文本编辑器打开 “C:\SIMULIA\Abaqus\6.12-1\SMA\site\abaqus_v6.env”(文件的路径和内容可能因软件版本、安装路径等因素会略有差异,请根据自己的实际情况作相应调整,下同) 。3.找到 "compile_fortran" 参数,添加 ‘/Od’ 和 ‘/Zi’ 选项以使得Intel Visual Fortran compiler 在编译期生成
调试符号信息。本人的修改结果为: compile_fortran=['ifort', '/c','/DABQ_WIN86_64', '/iface:cref','/recursive', '/Qauto-scalar', '/QxW', '/nologo', '/heap-arrays:1', '/Od','/include:%I', '/free', '/Od', '/Zi'] 4. 找到 "link_sl" 参数, 添加 ‘/DEBUG’ 选项以使得IntelVisual Fortran linker 在链接期链接调试符号信息
到 .obj 文件。本人的修改结果为 link_sl=['LINK', '/DEBUG', '/nologo', '/INCREMENTAL:NO', '/subsystem:console','/machine:AMD64', '/NODEFAULTLIB IBC.LIB','/NODEFAULTLIB IBCMT.LIB','/DEFAULTLIB:OLDNAMES.LIB', '/DEFAULTLIB IBIFCOREMD.LIB','/DEFAULTLIB IBIFPORTMD','/DEFAULTLIB IBMMD.LIB','/DEFAULTLIB:MSVCRT.LIB', '/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib','/DEFAULTLIB:advapi32.lib', '/FIXED:NO', '/dll', '/def:%E', '/out:%U', '%F','%A', '%L', '%B', 'oldnames.lib', 'user32.lib', 'ws2_32.lib', 'netapi32.lib','advapi32.lib'] 5. 找到 "link_exe" 参数, 添加 ‘/DEBUG’ 选项以使得Intel Visual Fortranlinker 在链接期链接调试符号信息。
本人的修改结果为:
link_exe=['LINK', '/DEBUG','/nologo', '/INCREMENTAL:NO', '/subsystem:console', '/machine:AMD64','/STACK:20000000', '/NODEFAULTLIBIBC.LIB', '/NODEFAULTLIBIBCMT.LIB','/DEFAULTLIB:OLDNAMES.LIB', '/DEFAULTLIBIBIFCOREMD.LIB','/DEFAULTLIBIBIFPORTMD', '/DEFAULTLIBIBMMD.LIB', '/DEFAULTLIB:MSVCRT.LIB','/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib','/DEFAULTLIB:advapi32.lib', '/FIXED:NO', '/LARGEADDRESSAWARE', '/out:%J', '%F','%M', '%L', '%B', '%O', 'oldnames.lib', 'user32.lib', 'ws2_32.lib','netapi32.lib', 'advapi32.lib'] 6. 准备好job文件 (*.inp) 和子程序源代码文件 (*.for); 7. 在子程序源代码文件的变量声明段和可执行代码段之间添加一些可以使ABAQUS暂停执行的代码,并在适当的位置设置断点。有多种方案,如用Sleep函数、或read语句等等。本人所使用的方案如下所示: subroutinesigini(sigma,coords,ntens,ncrds,noel,npt, & layer,kspt,lrebar,names) implicit none integer,parameter:: single=4, double=8 real(kind=double),intent(in):: coords(ncrds) integer,intent(in)::ntens,ncrds,noel,npt,layer,kspt,lrebar character(len=80),intent(in):: names(2) real(kind=double),intent(out):: sigma(ntens) ! ------------------------------------------ logical, save :: FirstCall=.true. integer :: dummyVar if (FirstCall==.true.) then ! 仅在第一次使用read暂停ABAQUS的执行,后续暂停均使用断点 FirstCall = .false. read(*,*) dummyVar end if dummyVar = 1234 ! 设置断点 ! ------------------------------------------ ! ! your own executive statement here ! return end 8. 启动 “ABAQUS Command”,提交命令 “ABAQUSjob=JOB_NAME user=SUBROUTINE_NAME interactive “;
当 “standard.exe” 进程启动,并且开始等待用户键盘输入时,在Visual Studio点击菜单Debug =>Attach to Process…,在弹出的对话框中找到“standard.exe” 进程,最后Attach,此时Visual Studio会启动调试器。 9. 在ABAQUS Command 窗口中输入任意整数并回车,VisualStudio即打开一个临时生成的和源文件内容完全相同的临时代码文件,并在设置断点的位置暂停,此时即可开始正常的调试过程了。
以前编写普通应用程序所使用的调试技巧也都可以派上用场,这可比打开巨大、繁杂的.msg
和.dat数据文件查找有用信息要方便的多。 10. Enjoy code, enjoy life! 参考文献
|