利用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()

 

 

 

 

  • 12
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
更新内容:1.增加了设置命令流字体背景和边框颜色的功能;2.增加了可保存整个命令流为文本的功能;3.调整了部分右键菜单的位置和快捷键;4.修正了个别情况下打开命令流显示错误的问题;5.修正了一些情况下垂直滚动条出错的问题;6.修正自动滚屏低部留有空白的问题;7.修正不能实时读取命令流的问题。 操作提示: 1、该程序无须放在ABAQUS的工作目录下,可随意放置。另外程序可以随时打开,无须考虑与ABAQUS CAE的打开次序; 1、程序第一次运行时需要指定abaqus.rpy的位置,以后运行会自动加载上一次设置; 2、在窗口中拖动右键可以移动窗口位置; 3、把鼠标移动到窗口边缘可以拖动改变窗口大小。 该程序主要是给使用ABAQUS的朋友们学习Python用的,可以作为ABAQUS PDE的辅助工具, 对于ABAQUSPython的关系我就不多说了,在ABAQUS CAE中的每一个菜单或按钮操作都是被解释为Python语句,然后才提交上去。 而这些Python语句被适时地保存在工作目录下的abaqus.rpy文件中,这就给我们提供了一个绝好的Python学习途径:进行CAE的操作,然后查看abaqus.rpy文件中的对应的Python语句// 该程序会适时的读取abaqus.rpy文件,以便你把相应的CAE操作对照起来// 如果对该程序有什么好的建议或意见,或需要添加什么样的功能, 或者发现什么bug,可以直接给我联系, Email:ck436#126.com(把#改为@). ========================================================== 如果你根本就不能运行本程序,那很有可能你还没有安装.NET Framework 2.0以上的平台. .NET Framework是在Microsoft .NET平台上进行程序开发和程序运行的基础. 给出解决方法: 你可以通过以下几个网址下载: http://www.onlinedown.net/soft/38669.htm http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&DisplayLang=zh-cn#QuickInfoContainer 如果安装.NET Framework时提示installer错误,则你需要先安装Windows Installer(一般不会遇到): http://www.onlinedown.net/soft/12668.htm http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=889482fc-5f56-4a38-b838-de776fd4138c
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值