【发布时间】: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 的路径并将其添加到您的环境中不会太难。
标签: python compilation fortran subroutine abaqus