最近,笔者在使用Abaqus的过程中遇到了需要重复计算多种工况的问题,并且需要提取每一个工况下的时间历程数据。如果采用手动提交的方式,则提交过程非常繁琐,并且只能等到前一个模型计算完成之后才能进行后续的计算。因此,笔者很快想到能否在Abaqus中实现inp文件的批量提交。
通过查阅相关资料,笔者发现目前inp文件的批量运算主要有两种实现方法:Bat文件提交方法和Python提交方法。Bat文件提交方法主要是利用了Abaqus Command中的任务提交语句。例如,一个最简单的inp文件提交格式如下所示:
abaqus job=case1.inp cpus=4 inter
为了批量提交inp文件,可以将多个inp文件的提交语句汇总到一个批处理文件(.bat)中,通过执行该bat文件即可完成计算。一个包含多个inp文件的提交命令如下所示:
cmd/c abaqus job=case1.inp cpus=4 intercmd/c abaqus job=case2.inp cpus=4 intercmd/c abaqus job=case3.inp cpus=4 inter
注意,为了保证inp文件顺序提交,必须使用cmd/c而非call关键字,并且需要使用int关键字(int为interactive的缩写,int关键字用于在运行过程中反馈进程,在隐式计算中输出log文件,还可以保证inp文件顺序提交,防止同时提交时导致计算机资源耗尽)。
Bat文件提交方法使用较为简单,但在计算过程中无法实现其他交互式操作。另一种方法为采用Python脚本批量提交inp文件进行计算,一个最简单的计算脚本如下所示:
# -*- coding: UTF-8 -*-from abaqus import *from abaqusConstants import *#inp文件列表Jobs_list = ['case1', 'case2', 'case3']#利用for循环批量提交计算for i in Jobs_list: mdb.JobFromInputFile(name = i, inputFileName = i + '.inp', numCpus = 4, numDomains = 4) mdb.jobs[i].submit() mdb.jobs[i].waitForCompletion()
上述脚本的计算原理为将inp文件名存放在一个名为Jobs_list的列表中,随后通过mdb对象中的JobFromInputFile方法读取inp文件并创建一个jobs对象,并利用jobs对象中的submit方法提交任务进行计算。注意在提交之后必须使用waitForCompletion方法保证只有当计算完成之后才执行后续语句,否则程序将直接进入下一轮循环,导致inp文件被同时提交计算。
在Abaqus中,Python脚本可以通过两种方式被执行:一种为在打开Abaqus/CAE的情况下,通过菜单栏中的File→Run Script直接运行脚本;另一种方式为在Abaqus Command中执行如下语句:
abaqus cae noGUI=xxx.py
该语句可以在不打开Abaqus/CAE的情况下执行Python脚本。
尽管上述语句给出了利用python批量提交inp文件的实现原理,但在使用过程中仍存在一定的局限性。例如在计算队列中若某一个计算任务意外终止,则会导致整个计算队列终止,无法完成后续计算。此外,笔者还需要在计算完成后顺序输出每一个模型中的时间历程数据。为了解决上述问题,本文拟通过Python脚本实现下述功能:
基于inp文件名顺序提交计算,并检测计算状态,当计算意外终止时自动开始后续任务的计算;
每次计算完成后实时输出该模型对应的时间历程数据。
在利用Python批量处理Abaqus时间历程数据一文中,笔者详细介绍了通过Abaqus中的Session对象获取时间历程数据的实现原理。在本文中,笔者将介绍提取时间历程数据的另一种方法:通过Odb对象直接获取时间历程数据或场输出结果。为了对Odb对象有一个更为清楚的认识,本文给出了输出数据库(Output database)对象的模型图,如图1.1所示。通过该模型图,可以帮助我们理解模型中父对象与子对象之间的关系。
例如,当我们打开或创建一个输出数据库(.odb文件)时,Abaqus会自动创建一个Odb对象。从图1.1中可以看出,Odb对象中包含有模型数据(Model Data)和结果数据(Results Data)。模型数据包含有用于组成装配的部件(Part)和部件实例(Part instance),如节点坐标和单元类型等;结果数据则包含有模型的分析结果,如应力、应变和位移等数据,本文需要提取的时间历程数据同样包含在结果数据中。从图1.1中可以看出,所有的结果数据都包含在Odb对象的成员——Step对象中,而Step对象又同时拥有Frame对象和historyRegion对象,分别用于存储场输出结果和时间历程输出结果。
为了对Abaqus中的Odb对象有更为清晰的认识,本文依照利用Python批量处理Abaqus时间历程数据一文中的方法,通过对象名.__members__命令来输出对象中的所有成员。首先,通过如下命令打开数据库文件(.odb),并输出Odb对象的所有成员:
# -*- coding: UTF-8 -*-from odbAccess import *Work_directory = 'C:/Users/Desktop/'Job_name = 'Model_Case'odb = openOdb(path = Work_directory + Job_name + '.odb')odb.__members__>>['analysisTitle', 'closed', 'customData','description', 'diagnosticData','isReadOnly', 'jobData', 'materials', 'name','parts', 'path', 'profiles', 'readInternalSets','rootAssembly', 'sectionCategories', 'sections','sectorDefinition', 'steps', 'userData']
除了使用
Odb对象中的
__members__方法来输出对象所有成员,还可以使用
print(对象名)来获得更为全面的信息:
print(odb)>>({'analysisTitle': '', 'closed': False, 'customData': None, 'description': 'DDB object', 'diagn