2016-09-23 123 views
1

我正在使用Abaqus(6.13)来运行FEM热模拟。我需要获得该模型的总外部热通量。我的搜索表明,获得它的唯一方法是在整个模型中总结de RFLE历史输出,并且它工作正常。问题是我有一个〜300 000个元素模型,而Report/XY窗口的简单打开需要几个小时。将Abaqus宏转换为python脚本

为了简化我的导出,我使用Abaqus的宏管理器创建了一个导出宏。记录在abaqus中导入odb之前开始,并在导出包含X/Y数据的报告之后结束。 这产生的宏观大(〜900万行),所以我给你在这里它的修剪版本:

# -*- coding: mbcs -*- 
# Do not delete the following import lines 
from abaqus import * 
from abaqusConstants import * 
import __main__ 

def OdbMacro1(): 
    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 
    import os 
    os.chdir(r"C:\FolderPath") 
    session.mdbData.summary() 
    o1 = session.openOdb(name='C:\FolderPath\odb.odb') 
    session.viewports['Viewport: 1'].setValues(displayedObject=o1) 
    odb = session.odbs['C:\FolderPath\odb.odb'] 
    xy0 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Nodal temperature: NT11 PI: PAD-1 Node 10 in NSET PADSURF_BACK', 
     steps=('Step-2',), suppressQuery=True) 
    xy1 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Nodal temperature: NT11 PI: PAD-1 Node 10053 in NSET PADSURF_BACK', 
     steps=('Step-2',), suppressQuery=True) 
    xy2 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Nodal temperature: NT11 PI: PAD-1 Node 10054 in NSET PADSURF_BACK', 
     steps=('Step-2',), suppressQuery=True) 
    xy3 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Nodal temperature: NT11 PI: PAD-1 Node 10055 in NSET PADSURF_BACK', 
     steps=('Step-2',), suppressQuery=True) 
    xy4 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Nodal temperature: NT11 PI: PAD-1 Node 10056 in NSET PADSURF_BACK', 
     steps=('Step-2',), suppressQuery=True) 
    xy5 = avg((xy0, xy1, xy2, xy3, xy4,),) 
    session.XYData(name='x0.nt11', objectToCopy=xy5, 
     sourceDescription='avg((Nodal temperature: NT11 PI: PAD-1 Node 10 in NSET PADSURF_BACK, Nodal temperature: NT11 PI: PAD-1 Node 10053 in NSET PADSURF_BACK, Nodal temperature: NT11 PI: PAD-1 Node 10054 in NSET PADSURF_BACK, Nodal temperature: NT11 PI: PAD-1 Node 10055 in NSET PADSURF_BACK, Nodal temperature: NT11 PI: PAD-1 Node 10056 in NSET PADSURF_BACK,),)') 
    odb = session.odbs['C:\FolderPath\odb.odb'] 
    xy0 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='RFLE11: RFLE11 PI: PAD-1 Node 1', steps=('Step-2', 
     ), suppressQuery=True) 
    xy1 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='RFLE11: RFLE11 PI: PAD-1 Node 2', steps=('Step-2', 
     ), suppressQuery=True) 
    xy2 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='RFLE11: RFLE11 PI: PAD-1 Node 3', steps=('Step-2', 
     ), suppressQuery=True) 
[...] 
    xy280068 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='RFLE11: RFLE11 PI: SLIDER-1 Node 210034', steps=(
     'Step-2',), suppressQuery=True) 
    xy280069 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='RFLE11: RFLE11 PI: SLIDER-1 Node 210035', steps=(
     'Step-2',), suppressQuery=True) 
    xy280070 = sum((xy0, xy1, xy2, xy3, xy4, xy5, xy6, xy7, xy8, xy9, xy10, xy11, 
     xy12, xy13, xy14, xy15, xy16, xy17, xy18, xy19, xy20, xy21, xy22, xy23, 
     xy24, xy25, xy26, xy27, xy28, xy29, xy30, xy31, xy32, xy33, xy34, xy35, 
[...] 
     xy280057, xy280058, xy280059, xy280060, xy280061, xy280062, xy280063, 
     xy280064, xy280065, xy280066, xy280067, xy280068, xy280069,),) 
    session.XYData(name='model.RFLE', objectToCopy=xy280070, 
     sourceDescription='sum((RFLE11: RFLE11 PI: PAD-1 Node 1, RFLE11: RFLE11 PI: PAD-1 Node 2, RFLE11: RFLE11 PI: PAD-1 Node 3, 
[...] 
RFLE11: RFLE11 PI: SLIDER-1 Node 210033, RFLE11: RFLE11 PI: SLIDER-1 Node 210034, RFLE11: RFLE11 PI: SLIDER-1 Node 210035,),)') 
    odb = session.odbs['C:\FolderPath\odb.odb'] 
    xy0 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 5', 
     steps=('Step-2',), suppressQuery=True) 
    xy1 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 6', 
     steps=('Step-2',), suppressQuery=True) 
    xy2 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12 
[................................................................] 
=True) 
    xy6000 = xyPlot.XYDataFromHistory(odb=odb, 
     outputVariableName='Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18048', 
     steps=('Step-2',), suppressQuery=True) 
    xy6001 = sum((xy0, xy1, xy2, xy3, xy4, xy5, xy6, xy7, xy8, xy9, xy10, xy11, 
     xy12, xy13, xy14, xy15, xy16, xy17, xy18, xy19, xy20, xy21, xy22, xy23, 

[................................................................] 
     xy5991, xy5992, xy5993, xy5994, xy5995, xy5996, xy5997, xy5998, xy5999, 
     xy6000,),) 
    session.XYData(name='surf.hfla', objectToCopy=xy6001, 
     sourceDescription='sum((Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 5, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 6, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12050, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12051, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12052, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12053, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12054, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12055, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12056, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12057, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12058, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12059, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12060, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12061, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 12062, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ 
[................................................................] 
37, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18038, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18039, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18040, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18041, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18042, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18043, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18044, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18045, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18046, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18047, Heat flux: HFLA  ASSEMBLY_SLIDERSURF/ASSEMBLY_PADSURF PI: SLIDER-1 Node 18048,),)') 
    x0 = session.xyDataObjects['surf.hfla'] 
    x1 = session.xyDataObjects['model.RFLE'] 
    x2 = session.xyDataObjects['x0.nt11'] 
    session.xyReportOptions.setValues(interpolation=ON) 
    session.writeXYReport(fileName='C:\FolderPath\report.rpt', 
     appendMode=OFF, xyData=(x0, x1, x2)) 

OdbMacro1() 

我添加了调用OdbMacro1末,继搜索结果我在这里和那里。

我想在python文件的GUI外部运行该宏(或至少是有用的部分)。当我这样做(用 “C:\路径\为\ python的\文件\文件夹> ABAQUS蟒蛇macro.py”),我得到一个错误:

Traceback (most recent call last): 
    File "macro.py", line 3, in <module> 
    from abaqus import * 
    File "SMAPyaModules\SMAPyaAbqPy.m\src\abaqus.py", line 15, in <module> 
ImportError: abaqus module may only be imported in the Abaqus kernel process 

。我不明白问题是什么。我试着在文件的开头添加“import odbAccess”,但是我得到了同样的错误。我想我应该在开始的时候添加一些代码,但是我无法绕过它。你可以帮帮我吗?

顺便说一句,这是次要的,但我觉得我可以简化功能:在函数的开始

  • 其中一堆进口的我不 确保所有需要我可以删除一些?
  • 所有节点的历史记录 输出在同一操作中求和(或平均)形成一个集合。 没有办法使用它来避免在宏中使用每个单独的历史记录 输出?

谢谢任何​​导致答案。 :)

+0

看到这里的http:// stackoverflow.com/a/28374118/1004168 – agentp

+0

您的其他问题,是的,你可以删除unnescesary进口。如果您需要使用nogui从命令行运行它,请确保在删除您认为不需要的导入时以此方式进行测试。 – agentp

+0

谢谢你的答案。您发布的链接确实回答了我的主要问题。我已经从另一个来源尝试过这种方法,但我复制的代码没有工作(在“noGUI”之后缺少“=”)。 对于次要的,我想我会通过试用和错误的进口(现在我可以运行我的脚本),但你知道是否有一种方法来处理集而不是单个节点?这会减少宏的大小。 最后,如果您通过答案功能而不是评论回答,我可以将您的答案标记为最佳答案(我认为这是我唯一的帖子) –

回答

0

这里是一个脚本,基本上你想要做什么: (你看,我们只需要三个进口的)

from abaqus import * 
from abaqusConstants import * 
import visualization 
odb=session.openOdb(name='/full/path/Job-1.odb') 
session.viewports['Viewport: 1'].setValues(displayedObject=odb) 
session.xyDataListFromField(odb=odb, outputPosition=NODAL, 
      variable=(('NT11', NODAL), ), 
        nodeSets=('PART-1-1.SETNAME',)) 
keyname='From Field Data: NT11 at part instance PART-1-1' 
# run this to see what the keys look like: 
# [ o.description for o in session.xyDataObjects.values() ] 
temp=[o for o in session.xyDataObjects.values() if 
     o.description.find(keyname)==0] 
#note if you only have requested one data type you could just do: 
#temp=session.xyDataObjects.values() 
session.writeXYReport(fileName='test.rpt', xyData=temp) 
#alternate way to directly write data instead of using writexyreport: 
f=open('test.dat','w') 
for o in temp: f.write('%i %g\n'% 
    (int(o.description.split()[-1]),o.data[-1][-1])) 
f.close() 

abaqus cae -noGUI script.pyabaqus cae noGUI=script.py运行

+0

谢谢。 因此,如果我理解正确的代码,该脚本将输出(在test.rpt中)部分1-1的SETNAME集中的NT11数据(来自字段输出)。但它似乎没有对该设备的数据进行任何操作。 让我们以RFLE导出为例,因为它是最麻烦的:宏目前执行此操作:resultRFLE(t)= set on [nodal.RFLE(t)]的和。对于NT11值,它是结果NT11(t)=集合[nodal.NT11(t)]上的平均值。它看起来不像你的代码中完成这个操作。我错了吗? –

+0

对,我的文章是一个相当简陋的骨头模板。一旦你提取了数据,就可以直接在python中做任何你喜欢的操作。例如,最后一次增量的平均温度是sum(temp)[ - 1] [ - 1]/len(temp)' – agentp