简单介绍一个命令:Abaqus make
几种可能的场景:
1)你自己编写的Abaqus子程序,例如UMAT,想要交给其他人使用,但不希望泄露源代码;
2)你需要使用如Isight一类的软件,修改参数多次运行分析,不想每次分析之前都重复执行编译步骤。
3)你需要在另一台没有安装Visual Studio和Fortran等编译器的电脑上,调用子程序来运行Abaqus分析。
在这些情况下,你可以在配置好Abaqus - Fortran编译器的电脑上使用abaqus make命令来编译子程序。
abaqus make命令
打开cmd命令提示符,切换到包含.for源文件的目录下。
比如当前你在 C:\Windows\system32,其实你直接输入 D: 即可切换到D盘。标准的命令是
cd /d D:
一路cd,进入你准备好的文件夹。比如你的子程序文件叫 user.for,那么编译命令默认应该为:
abaqus make library=source-file.for
完整的语法是这样。
在帮助文档页里有详细介绍:
Abaqus > Execution > Execution Procedures > Making User-Defined Executables and Subroutines
https://help.3ds.com/2023/english/dssimulia_established/SIMACAEEXCRefMap/simaexc-c-makeproc.htm
如上图所示,还可以指定directory,为编译好的文件存放的目录。
编译完成后,会生成一个user-std.obj(对于Explicit求解器,后缀为-xpl和-xplD),以及一个standardU.dll 或 explicitU / explicitU-D.dll文件。
这个.obj文件,可以在安装了Fortran编译器的电脑上,在Abaqus运行时指定为用户子程序,代替.for文件。
而另外一个.dll文件,就可以在完全没安装Fortran的电脑上运行了。
配置方法
想要在没有安装Fortran的电脑上调用.dll形式的子程序,还需要做一些配置。
以2020版本为例,在以下目录里找到Abaqus的环境文件:
X:\SIMULIA\EstProducts\2020\win_b64\SMA\site\custom_v6.env
这里是因为在abaqus_v6.env的注释里提示了,用户对这个环境文件做的修改最好写在custom_v6.env当中,所以我们听人劝吃饱饭,去改用户环境文件。
对于6.14这种比较早的版本,目录位置要更简化。比如就没有win_b64这一步,而且6.14的环境文件还没有被拆分,直奔abaqus.env去就行。
在这个env环境文件中,添加两行内容:
import os
usub_lib_dir=os.getcwd()
当然你也可以为usub_lib_dir指定一个固定的目录,看你喜好。比如:
usub_lib_dir="D:\\compile\\custom"
注意这里要用双斜线。
这个os.getcwd()函数会将当前工作目录指定为用户子程序所在目录。后面运行计算的时候,只需要在当前目录下放入上一步你编译好的.dll文件,不需要指定用户子程序,不需要安装和关联Fortran,就可以调用你的用户子程序进行计算了。
问题
在小喵自己尝试的过程中,遇到了一个普遍问题。
事实上,在电脑A上面编译、链接成功的standardU.dll,经过配置以后,在电脑A自身上面,可以不带Fortran编译器的运行(即删除掉Fortran关联后仍然能正常运行),而切换到电脑B后,系统版本不同、软件\编译器版本不同,或者各种水土不服就可能出现报错。毫无营养的错误提示,工作目录下根本找不到message file.
所以,如果各位读者想实现前面说的第一个目标(不泄露源代码与他人分享Abaqus子程序),比较安全的方法是使用.obj文件,并让对方也安装和配置好对应于自己版本的Visual Studio与Fortran编译器。两台电脑的Abaqus和Fortran版本一般不必相同。
如果想不带Fortran编译器运行子程序,那一定要确保第二台电脑的系统、版本等一切条件和第一台 完全一致。这件事还是挺麻烦的,况且出错后找不到可用的错误提示信息。所以……