PYTHON实现abaqus后处理(1)

PYTHON实现abaqus后处理(1)

读取多个result的应变最大最小值

最近在用abaqus做仿真的时候,需要一次性提交多个Job,并在处理完成后,读取每个result的应变的最大最小值。在abaqus中重复如下操作:

1.Job management中点击Results,跳转到Visuilization
2.将Field Output Dialog中设置Primary | U | U1 |
3.Option | Contours | Limits |
PYTHON实现abaqus后处理(1)_第1张图片
PYTHON实现abaqus后处理(1)_第2张图片
PYTHON实现abaqus后处理(1)_第3张图片

代码片

用Python程序实现:(这里导入了xlrd、numpy、pandas的库,来读写数据,定义数组,如何安装pandas库请看文末链接 Abaqus安装python第三方库函数)。

##查看可视化中的最大最小应变自动计算值
##以下为abaqus内部库,不要问有什么用,加载就对了。
from abaqusConstants import *
import __main__

import section
import regionToolset
import displayGroupMdbToolset as dgm
import part
import material
import assembly
import step
import interaction
import load
import mesh
import optimization
import job
import sketch
import visualization
import xyPlot
import displayGroupOdbToolset as dgo
import connectorBehavior
#numpy数组是少有的几个Abaqus自带的第三方库。注意,不要妄想对Numpy库进行版本更新。惨痛的教训告诉我,更新Numpy者,Abaqus必崩。
import numpy as np
import pandas as pd

##自定义函数来查看可视化option>>>contour>>>limit中的自动计算的最大最小应变
def get_autoMaxValue_and_autoMinValue_from_Visualization_contourOptions(Modelname, Jobname):
    a = mdb.models[Modelname].rootAssembly
    session.viewports['Viewport: 1'].setValues(displayedObject=a)
    session.mdbData.summary()
    #在Job管理器中打开相应的Job和其Result。job的存储位置,一般在工作目录下
    o3 = session.openOdb(name=Jobname)
    session.viewports['Viewport: 1'].setValues(displayedObject=o3)
    #打开option>>>contour>>>
    session.viewports['Viewport: 1'].odbDisplay.display.setValues(plotState=CONTOURS_ON_DEF)
    session.viewports['Viewport: 1'].odbDisplay.setPrimaryVariable(variableLabel='U', 
                                                                   outputPosition=NODAL, 
                                                                   refinement=(COMPONENT, 'U1'),
                                                                  )
    max_Transforming=session.viewports['Viewport: 1'].odbDisplay.contourOptions.autoMaxValue
    min_Transforming=session.viewports['Viewport: 1'].odbDisplay.contourOptions.autoMinValue
    return max_Transforming, min_Transforming 



#查看所提交的21个job
max_Transforming_array=np.array([])
min_Transforming_array=np.array([])
Sum_Transforming_array=np.array([])
for i in range(0, 21):
    Modelname = 'Model-1'
    Jobname = 'Job-%s'%(i+ 1) + '.odb'
    Max_Trans, Min_Trans = get_autoMaxValue_and_autoMinValue_from_Visualization_contourOptions(Modelname, Jobname)
    Sum_Trans = Max_Trans - Min_Trans
    #将多组Job的autoMaxValue和autoMinValue存入Numpy数组。
    max_Transforming_array = np.append(max_Transforming_array, Max_Trans)
    min_Transforming_array = np.append(min_Transforming_array, Min_Trans)
    Sum_Transforming_array = np.append(Sum_Transforming_array, Sum_Trans)

    
    

data1 = pd.DataFrame(max_Transforming_array,
                     columns=list({'MaxStrain'}))
data2 = pd.DataFrame(min_Transforming_array, 
                     columns=list({'MinStrain'}))
data3 = pd.DataFrame(Sum_Transforming_array, 
                     columns=list({'SumStrain'}))
data = data1.join(data2)
data = data.join(data3)
#DataFrame的index默从0开始.为了好看,把index偏移一下
#index从1开始,也可以写作data.index = np.arrange(1.len(data))
data.index += 1
writer = pd.ExcelWriter('计算结果.xls')
data.to_excel(writer, 'sheet2')
writer.save()

#查看一下DataFrame表
data

MaxStrain MinStrain SumStrain
1 0.016961 -1.208323 1.225285
2 0.019672 -1.386049 1.405721
3 0.016752 -1.426562 1.443315
4 0.011843 -1.334408 1.346251
5 0.007040 -1.145580 1.152620
6 0.003372 -0.904825 0.908196
7 0.060886 -0.641037 0.701923
8 0.079771 -0.386002 0.465773
9 0.060134 -0.168450 0.228583
10 0.062153 -0.024123 0.086277
11 0.143359 -0.037822 0.181181
12 0.216004 -0.087246 0.303250
13 0.260713 -0.122249 0.382962
14 0.294058 -0.134628 0.428686
15 0.331707 -0.118624 0.450332
16 0.384074 -0.070906 0.454980
17 0.453653 -0.007736 0.461389
18 0.535037 -0.011745 0.546782
19 0.618738 -0.014687 0.633425
20 0.697928 -0.016342 0.714270
21 0.797918 -0.015837 0.813755

问题回溯

  1. 在编写代码过程中,被代码第38行
session.viewports['Viewport: 1'].setValues(displayedObject=odb)

卡住。导致for语句所有的循环都只能读取Job1的数据。那么,我们来分析一下这一句。
Abaqus 6.6 Manual>>9.4 Viewport object中如此定义:
Viewport对象是一个图像容器,其中存储着图像的各种设置以及显示效果,可以设置字体、图例、边界等等。其中setValues(…)用来修改Viewport对象。

setValues(…)参数 含义(或使用前提)
displayedObject 显示的对象的名称 -
displayMode Single、OVERLAY, -
visibleLayers 层的序号 when displayMode=OVERLAY
viewManipLayers ALL 、CURRENT when displayMode=OVERLAY
currentLayer - when displayMode=OVERLAY而且这个参数只影响CURRENT layer
layerOffset 数值 沿着z方向偏移一定的层数

Viewport对象还包括一些子对象Viewport(…),bringToFront(),disableMultipleColors(),disableRefresh(),enableMultipleColors(),enableRefresh(), getActiveElementLabels(…),getActiveNodeLabels(…),makeCurrent(),maximize(),minimize(),offset(…),restore(),sendToBack(),setColor(…),forceRefresh(),setValues(…)。
同时还可以调用一些通用的成员对象如displayedObject(…),layers(…),view(…),odbDisplaypart(…),Displayassembly(…),Displayviewport(…),AnnotationOptions(…)等等。受限于篇幅,不再赘述,具体请见手册。
2. 查看Contours | Limits |中的自动计算值。这里用到了OdbDisplay模块(对象)中ContourOptions 对象中AutoMaxValue和AutoMinValue。
3. 这里再次希望伟大的博友能慷慨的分享其他版本的Abaqus手册。因为参考文献中的手册不能提供检索功能。只能按书签去寻找相应对象。

参考文献

  1. Abaqus 6.6 手册-32.3 ContourOptions object
  2. 高金凤.Python语言在Abaqus中的应用
  3. Abaqus安装python第三方库函数

你可能感兴趣的:(abaqus开发,python)