python 调用bat失败_利用Python批量提交inp文件

本文介绍如何使用Python脚本批量提交Abaqus的inp文件,包括通过bat文件和Python脚本的方式,重点讲解如何在计算过程中监控任务状态,确保计算异常时能继续后续任务,并在计算完成后实时输出时间历程数据。
摘要由CSDN通过智能技术生成

最近,笔者在使用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文件名顺序提交计算,并检测计算状态,当计算意外终止时自动开始后续任务的计算;

  • 每次计算完成后实时输出该模型对应的时间历程数据。

1. 时间历程数据提取方法

在利用Python批量处理Abaqus时间历程数据一文中,笔者详细介绍了通过Abaqus中的Session对象获取时间历程数据的实现原理。在本文中,笔者将介绍提取时间历程数据的另一种方法:通过Odb对象直接获取时间历程数据或场输出结果。为了对Odb对象有一个更为清楚的认识,本文给出了输出数据库(Output database)对象的模型图,如图1.1所示。通过该模型图,可以帮助我们理解模型中父对象与子对象之间的关系。

c6f54a5d07c038eaa13800c9a5f678e7.png

图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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值