利用Abaqus的Python脚本实现进行自动分析的方法

        当需要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()


猜你喜欢

转载自blog.csdn.net/qq_28969139/article/details/80714475