当需要Abaqus处理很多(大于20个)作业时。如果手动的一个一个地去提交作业,需要大量重复的操作,会浪费很多的时间;而如果同时提交所有作业,则会使CPU占有率很高,导致人们不能同时利用计算机进行其他工作。
考虑在Python脚本中设计一个运行队列(Runlist)。
1.将提交的任务放入队列直到队满;
2.如果队列已满则检查队列中的任务是否完成或者错误,将已完成或错误的任务踢出序列,加入新的任务,若任务错误则将错误的任务名加入错误队列中;
3.输出错误队列到txt文件。
其中判断完成或者错误,是通过查找Temp文件夹中的.log文件实现的。
完成时,.log文件中有‘COMPLETED’字符串;失败时,有‘exited with an error’字符串
"""
程序步骤如下:
(这个只是借助 python 写了过程思路,并不能直接运行)
(但是照着这个稍微改改就能用了)
"""
import time
# 根据 log 文件判断 job 运行的状态
def statusOfRunningJob(running_job):
# 目录文件.每个人都不一样需要修改
root_dir = "D:/abaqus/temp/"
# 读取这个正在运行的任务的日志文件
file = open(+ running_job + ".log", "r", encoding="utf-8")
content = file.read()
file.close()
# 如果完成返回 "finish",失败返回 "error",正在运行返回 "running"
if "COMPLETED" in content:
return "finish"
if "exited with an error" in content:
return "error"
return "running"
# 先构造任务列表,失败列表
job_name_list = ['job(1)_name', 'job(2)_name', 'job(k)_name', 'job(k+1)_name', 'jobN_name']
error_job_list = []
# 再构造运行队列
running_job_queue = []
# 设置队列最大长度
max_len = 6
# 循环遍历任务列表
for job_name in job_name_list:
# 先检查运行队列的状态,如果队列已满,进入循环
while len(running_job_queue) == max_len:
# 循环遍历正在运行的任务
for running_job in running_job_queue:
# 查看该任务运行状态
tag = statusOfRunningJob(running_job)
# 如果任务不运行了,处于完成或者错误状态
# 就从 running 列表中剔除它
if tag != "running":
running_job_queue.remove(running_job)
# 如果任务失败了,我们还要用 error_job_list 来记录它
if tag == "error":
error_job_list.append(running_job)
# 每一次循环需要停 5s ,不然 cpu 全用在循环上了.
time.sleep(5)
# 直到队列不非满时,
# 1 通过 abaqus 接口提交任务
mdb.jobs[job_name].submit()
# 2 把任务名加入到running_job_queue中
running_job_queue.append(job_name)
# 记录错误任务名到 error.log 文件中
file = open("error.log", "w", encoding="utf-8")
file.write("\n".join(error_job_list))
file.close()
(这个可以不看。只是我的源码的一部分,不能运行。
而且源码写的很乱,还是看上面的逻辑部分比较好)
#1 Open Abaqus
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
import time
###粘贴后,请把所有的中文删掉才能使用###
executeOnCaeStartup()
#文件地址的全局变量,
local = 'D:\\SIMULIA\\Temp\\' + pre
#同时运行任务的最大数量,最好小于计算机核数2-3
rnum = 6
#类似与指针,指向runlist的最后一个空位
rtag = 0
#记录错误任务
wjob = []
#运行队列
rlist = [0,0,0,0,0,0,0,0]
#2 判断函数
def judge(x):
#运行中 返回0
a = 0
adress = local + str(x) + '.log'
fid = open(adress,'r')
strdata = fid.read()
#错误 返回-1
if strdata.find('exited with an error') > -1:
a = -1
#完成 返回1
if strdata.find('COMPLETED') > -1:
a = 1
fid.close()
return a
#导入数据表
DATA_TABLE =
#3 Circle
for i in range(first,last):
#4 Runlist
j = 0
#循环查看任务运行队列的.log文件
while rtag == rnum:
#如果错误,加入错误队列
if judge(rlist[j]) == -1:
wjob.append(rlist[j])
#如果错误或成功,退出队列
if judge(rlist[j]) == -1 or judge(rlist[j]) == 1:
rlist[j:rnum] = rlist[j + 1:rnum + 1]
rtag = rtag - 1
break
j = (j + 1) % rnum
if j == 0:
time.sleep(5)
#5 Set
#建模的数据设置(不管这部分)
R1 = DATA_TABLE[i][0]*1.0
R2 = DATA_TABLE[i][1]*1.0
T = DATA_TABLE[i][2]*1.0
JX = DATA_TABLE[i][3]*1.0
MOCA = DATA_TABLE[i][4]*1.0
PRESS = DATA_TABLE[i][5]*1.0
NAme = str(i+1)
MO = 'Mo-' + NAme
NAme = pre + NAme
###建模部分省略,
#9 submit
mdb.Job(name=NAme, model=MO, description='', type=ANALYSIS,
atTime=None, waitMinutes=0, waitHours=0, queue=None, memory=90,
memoryUnits=PERCENTAGE, explicitPrecision=SINGLE,
nodalOutputPrecision=SINGLE, echoPrint=OFF, modelPrint=OFF,
contactPrint=OFF, historyPrint=OFF, userSubroutine='', scratch='',
resultsFormat=ODB, parallelizationMethodExplicit=DOMAIN, numDomains=1,
activateLoadBalancing=False, multiprocessingMode=DEFAULT, numCpus=1)
mdb.jobs[NAme].submit(consistencyChecking=OFF)
rlist[rtag] = i + 1 #任务加入运行队列
rtag = rtag + 1 #空位指针+1
time.sleep(3) #生成.log文件需要1-2秒左右
#输出错误任务
fid = open('C:\\Users\\37989\\Desktop\\wrong.txt','w')
fid.write(str(wjob))
fid.close()