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

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

 

 

 

 

你可能感兴趣的:(利用Abaqus的Python脚本实现进行自动分析的方法)