在 Abaqus 中运行连续作业时只编译一次用户子程序

Posted

技术标签:

【中文标题】在 Abaqus 中运行连续作业时只编译一次用户子程序【英文标题】:Compile user subroutine only once when running consecutive jobs in Abaqus 【发布时间】:2016-06-28 11:59:27 【问题描述】:

我有一个用 Python 编写的脚本,它根据上一个作业的输出来校准材料参数,也就是说,它在 Abaqus 中连续运行许多作业,直到误差足够小。

我使用一个 Fortran 子例程,它在每个作业之前编译。

问题在于,对于我提交的每个作业,都会编译用户子例程。即使输入参数与上一个作业不同,用户子程序也不必再次编译。子程序的编译大约需要运行作业的 80% 时间。

我如何指定只编译一次用户子例程并将其用于所有连续运行?

以下是用Python编写的相关代码的sn-ps。我通过键入来执行我的脚本

abaqus cae nogui=script.py

在终端中。该代码使用 Abaqus 脚本接口。

创建工作:

mdb.Job(name=self.jobName, model='Model-1', description='', type=ANALYSIS, 
        atTime=None, waitMinutes=0, waitHours=0, queue=None, memory=90, 
        memoryUnits=PERCENTAGE, getMemoryFromAnalysis=True, 
        explicitPrecision=SINGLE, nodalOutputPrecision=SINGLE, echoPrint=OFF, 
        modelPrint=OFF, contactPrint=OFF, historyPrint=OFF,
        userSubroutine=self.userSubroutinePath, 
        scratch='', resultsFormat=ODB, multiprocessingMode=DEFAULT, numCpus=1, 
        numGPUs=0)

提交并等待作业完成:

mdb.jobs[self.jobName].submit(consistencyChecking=OFF)
mdb.jobs[self.jobName].waitForCompletion()

每次我使用上次运行的数据运行连续作业时都会运行此代码。

编译器是 Intel 64 Fortran Compiler XE,版本 15.0.0.090 Build 20140723。

【问题讨论】:

在手册中查找abaqus make @agentp 是的,我使用命令 'abaqus make library=umat.f' 但我收到提示'缺少必需的参数:job=',这可以说没有意义,因为根据在手册中我可以使用'abaqus make job= OR library='。谢谢 我的猜测是您的“abaqus”命令实际上是一个脚本,它试图在将您的参数传递给真正的 abaqus 命令之前进行一些预处理。尝试确定 abaqus 可执行文件的实际完整路径并运行它。 @agentp 谢谢你的建议。我现在按如下方式运行命令'/path/abaqus make library=umat.f',它尝试开始编译,而不是之前的,所以这是正确的一步。但是,我收到一个命令行错误,上面写着“sh: ifort: command not found”。我想我的 .env 文件有问题。我已经使用选项指定了 compile_fortran 变量,并且在运行作业时进行编译时,我能够即时编译子例程。谢谢 好吧,如果我对脚本的看法是正确的,那么该脚本可能会将 ifort 放在您的路径上。找出 ifort 的路径并将其添加到您的环境中不会太难。 【参考方案1】:

通过输入

module add abaqus
module add intel
module add gcc

然后被允许进入

abaqus make library=usub.f

编译子程序。

【讨论】:

对于可能遇到此问题的其他人,此答案是系统特定的。 @agentp 是的,我可以补充一点,我在运行 CentOS 6.7 的 Gridcore Gompute 集群上运行所有这些【参考方案2】:

对于 Windows 平台:

首先,使用“abaqus make library”命令创建一个“.dll”文件。您可以在 ABAQUS 目录中找到它。

其次,通过添加以下行来编辑环境文件(例如“abaqus_v6”)

usub_dir_lib="xxx"

其中 xxx 是“.dll”文件(此处为 ABAQUS 目录)的路径。

现在,您可以执行 Python 代码了

【讨论】:

以上是关于在 Abaqus 中运行连续作业时只编译一次用户子程序的主要内容,如果未能解决你的问题,请参考以下文章

链接 Abaqus/标准用户子程序的问题

我如何使用Sidekiq运行连续的后台作业?

如何使用 Sidekiq 运行连续的后台作业?

为啥我的函数在每次页面加载时只运行一次?

ABAQUS子程序编译

让 `didFailLoadWithError:` 在启动时只运行一次