Andy Cohen
Andy Cohen

Reputation: 113

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

I'm doing a parametric sweep of some Abaqus simulations, and so I'm using the waitForCompletion() function to prevent the script from moving on prematurely. However, occassionally the combination of parameters causes the simulation to hang on one or two of the parameters in the sweep for something like half an hour to an hour, whereas most parameter combos only take ~10 minutes. I don't need all the data points, so I'd rather sacrifice one or two results to power through more simulations in that time. Thus I tried to use waitForCompletion(timeout) as documented here. But it doesn't work - it ends up functioning just like an indefinite waitForCompletion, regardless of how low I set the wait time. I am using Abaqus 2017, and I was wondering if anyone else had gotten this function to work and if so how?

While I could use a workaround like adding a custom timeout function and using the kill() function on the job, I would prefer to use the built-in functionality of the Abaqus API, so any help is much appreciated!

Upvotes: 2

Views: 893

Answers (1)

Roman Zh.
Roman Zh.

Reputation: 1049

It seems like starting from a certain version the timeOut optional argument was removed from this method: compare the "Scripting Reference Manual" entry in the documentation of v6.7 and v6.14.

You have a few options:

  1. From Abaqus API: Checking if the my_abaqus_script.023 file still exists during simulation:
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. From outside: Launching the job using the subprocess

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
)
  • and checking the return code of the child process suing poll() (see also returncode):
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)

  • or waiting until the timeOut is reached using 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) )

Upvotes: 3

Related Questions