当需要Abaqus处理很多(大于20个)作业时。如果手动的一个一个地去提交作业,需要大量重复的操作,会浪费很多的时间;而如果同时提交所有作业,则会使CPU占有率很高,导致人们不能同时利用计算机进行其他工作。
实现原理:
考虑在Python脚本中设计一个运行队列(Runlist)。
1.将提交的任务放入队列直到队满;
2.如果队列已满则检查队列中的任务是否完成或者错误,将已完成或错误的任务踢出序列,加入新的任务,若任务错误则将错误的任务名加入错误队列中;
3.输出错误队列到txt文件。
其中判断完成或者错误,是通过查找Temp文件夹中的.log文件实现的。
完成时,.log文件中有‘COMPLETED’字符串;失败时,有‘exited with an error’字符串
代码框架:
#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()