Abaqus API 中的 waitForCompletion(timeout) 在超时过后实际上并没有终止作业

waitForCompletion(timeout) in Abaqus API does not actually kill the job after timeout passes

我正在对一些 Abaqus 模拟进行参数化扫描,因此我正在使用 waitForCompletion() 函数来防止脚本过早地继续运行。然而,有时参数的组合会导致模拟在扫描中的一个或两个参数上停留大约半小时到一个小时,而大多数参数组合只需要大约 10 分钟。我不需要所有的数据点,所以我宁愿牺牲一两个结果来为那段时间的更多模拟提供动力。因此,我尝试使用 waitForCompletion(timeout) 作为记录 here。但它不起作用 - 它最终就像一个不确定的 waitForCompletion 一样运行,无论我将等待时间设置多低。我使用的是 Abaqus 2017,我想知道是否还有其他人可以使用此功能,如果可以,如何使用?

虽然我可以使用解决方法,例如添加自定义超时函数并在作业中使用 kill() 函数,但我更愿意使用 Abaqus API 的内置功能,所以非常感谢任何帮助!

似乎从某个版本开始,timeOut 可选参数已从此方法中删除:比较 v6.7 and v6.14.

文档中的“脚本参考手册”条目

您有几个选择:

  1. 来自 Abaqus API: 检查仿真过程中 my_abaqus_script.023 文件是否仍然存在:
import os, time

timeOut = 600
total_time = 60
time.sleep(60)

# whait untill the the job is completed
while os.path.isfile('my_job_name.023') == True:
    if total_time > timeOut:
        my_job.kill()
    total_time += 60
    time.sleep(60)
  1. 从外部: 使用 subprocess
  2. 启动作业

Note: don't use interactive keyword in your command because it blocks the execution of the script while the simulation process is active.

import subprocess, os, time

my_cmd = 'abaqus job=my_abaqus_script analysis cpus=1'
proc = subprocess.Popen(
   my_cmd,
   cwd=my_working_dir,
   stdout='my_study.log',
   stderr='my_study.err',
   shell=True
)
timeOut = 600
total_time = 60
time.sleep(60)

# whait untill the the job is completed
while proc.poll() is None:
    if total_time > timeOut:
        proc.terminate()
    total_time += 60
    time.sleep(60)

  • 或使用 wait()
  • 等到超时
timeOut = 600

try:
    proc.wait(timeOut)
except subprocess.TimeoutExpired:
    print('TimeOut reached!')

Note: I know that terminate() and wait() methods should work in theory but I haven't tried this solution myself. So maybe there will be some additional complications (like looking for all children processes created by Abaqus using psutil.Process(proc.pid) )