今天完成了一些节点性工作,下午有些时间,回答一个后台有网友的提问:
这个问题具有一定的普遍性和通用性,普遍性是很多人都会遇到,通用性是指应用场景很广泛,尤其是现在很多人赶时髦搞深度学习和机器学习什么的,需要进行大量计算和数据处理来构建数据集,这就不可避免的要进行批量化处理了,因此对这些问题进行基本的讲解也就有了意义,我原来也写过一些相关文章,点击下面图片可以跳转。
该网友的问题,实际上是两个问题:
问题1是如何批量提交job;
问题2是如何从ODB结果文件中读取计算结果数据。
因此本文也从两个方面来进行介绍。
问题1 如何批量提交job——计算任务
批量提交计算任务这个问题实际上是老生常谈了,可以用两种基本的方式实现。
方法1:在cmd中使用命令行的方式,这种方式也可以保存为bat文件的方式运行,这个方式我并不常用,可参考帮助文档中的如下部分,很详细。
方法2 采用python程序进行批量提交
如果你的若干个job已经在job界面建好了,并且打算每算完一个job自动的进行后处理的话,采用python脚本会很方便。
批量提交的核心是需要等待当前计算任务的结束,上图中若干个job的提交代码如下:
代码语言:javascript复制# coding: utf-8
#微信公众号:ABAQUS二次开发
#作者:阿信老师CAE
#email:axin_cae@163.com
#2022.03.17
from abaqus import *
from abaqusConstants import *
jobList = mdb.jobs.keys() #获取所有计算任务的jobName
for jobName in jobList:
mdb.jobs[jobName].submit(consistencyChecking=OFF) #提交计算
mdb.jobs[jobName].waitForCompletion() #等待计算完成
print jobName , "is completed"
不过在实际的操作过程中,我们可能会需要避开一些job不提交,或者job窗口事先并没有建立job,等等,总之实际问题永远比任何教程都复杂,不过只需要灵活面对就可以了,处理起来并不难。
问题2 如何从ODB结果文件中读取计算结果数据
第二个问题是大家经常要面对的,常规的数据提取采用ABAQUS自带的后处理工具已经能满足需求了,但是如果我们需要进行一些写出文本,数据筛选,数据的二次计算处理。。。,我们就需要用程序语言的帮助了。
针对今天的问题——提取结果并写出到文本,如果用自带的工具,可以导出abaqus.rpt文件,不过这种方式并不能满足我们较为苛刻的要求,用python程序会的自由度会更大一些。
另外需要说明的是,如果我们仅仅只是看看某单元或者节点的各种计算结果,或者简要的数据处理,临时用一用,可以采用如下方式,不必费心写复杂的程序,不值当浪费时间,青春易逝,头发宝贵。当然了,通过阿信这里给出的基本程序改一改,能省几根头发。
限于时间关系,这里只列出基本的应力提取程序,写入文本比较简单,随意百度即可实现,不再给出。
代码语言:javascript复制# coding: utf-8
#微信公众号:ABAQUS二次开发
#作者:阿信老师CAE
#email:axin_cae@163.com
#2022.03.17
from odbAccess import *
from visualization import *
frame_num = 20 #定义需要输出的帧
odbName = 'X:/***/***.odb' #odb路径和名称
elemSetName = '***' #单元set
odb = openOdb(path=odbName)#打开odb
region = odb.rootAssembly.elementSets[elemSetName]
frameRps = odb.steps['Step-1'].frames
f_S1 = frameRps[frame_num].fieldOutputs['S'] #需要输出的场变量
sub_f_S1 = f_S1.getSubset(region=region)
S_Value = sub_f_S1.values
#读取所有单元的应力值
for i in range(len(S_Value)):
Stress =S_Value[i].data
print Stress
odb.close()
若有缘,江湖再会。
阿信
2022.3.17