2016-09-23 26 views
1

私はAbaqus(6.13)を使ってFEM熱シミュレーションを実行しています。私は、そのモデルに適用された全外部熱流束を取得する必要があります。私の検索によると、それを得る唯一の方法はRFLEの履歴出力をモデル全体で合計することであり、うまくいきます。問題は、〜300000要素のモデルがあり、Report/XYウィンドウの簡単な開きに数時間かかります。AbaqusマクロをPythonスクリプトに変換する

輸出を簡略化するために、Abaqusのマクロマネージャーを使用してエクスポートマクロを作成しました。記録はabaqusでodbをインポートする前に開始され、X/Yデータを含むレポートをエクスポートした後に終了します。 このマクロは(〜900 000行)大きいので、私はここでのトリミングされたバージョンあなたを与える生成:

# -*- 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"を追加しようとしましたが、同じエラーが発生します。私は冒頭にいくつかのコードを追加するべきだと思うが、私はそれを回避することはできない。私たちを手伝ってくれますか?ところで

は、それは二次的なものですが、私は機能簡素化することができような気がします。私は削除する場合があり、すべてが必要とされ を確認していない関数の先頭でインポートの束の中に

  • を一部?
  • の出力が同じ操作で合計(または平均)されたすべてのノードが1組を形成します。 マクロ内の個々の履歴 の出力を避けるために、その方法を使用する方法はありませんか?

回答ありがとうございます。ここ

+0

と参照://他の質問にstackoverflow.com/a/28374118/1004168 – agentp

+0

、はいあなたはunnescesaryのインポートを削除できます。 noguiでコマンドラインから実行する必要がある場合は、必要と思わないインポートを削除するように、その方法でテストしてください。 – agentp

+0

両方のあなたの回答のためにagentpに感謝します。本当に投稿したリンクが私の主な質問に答えました。私はすでに別のソースからそのメソッドを試していましたが、コピーしたコードは機能しませんでした(「noGUI」の後ろに「=」がありません)。 二次的なものについては、インポートについて試行錯誤しています(私はスクリプトを実行できるようになりました)。しかし、単一のノードの代わりにセットを扱う方法があるかどうか知っていますか?それはマクロのサイズを大きく減らすでしょう。 最後に、コメントではなく回答機能を使用して回答した場合、回答を最良の回答としてマークすることができます(私の考える唯一の投稿だと思う) –

答えて

0

はあなたが望むものを基本的に実行するスクリプトされ:):ここでは、HTTPを (そしてあなたは私たちが3人のしか輸入者を必要とする参照)

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.pyまたはabaqus cae noGUI=script.py

+0

ありがとう。 コードを正しく理解すると、このスクリプトはpart-1-1のSETNAMEセットにあるNT11データ(フィールド出力から)を(test.rptで)エクスポートします。しかし、それはセットのデータに対して何の操作もしていないようです。 RFLEエクスポートを例に挙げてみましょう。これは最も面倒です。マクロは現在、これを行います:resultRFLE(t)= sum on set [nodal.RFLE(t)]。 NT11値の場合、結果NT11(t)=集合[nodal.NT11(t)]の平均です。この操作はコード内で行われるようには見えません。私が間違っている? –

+0

右、私のポストはかなり素朴な骨のテンプレートです。データを抽出したら、Pythonで好きな操作を行うことは簡単です。例えば、最後の増分での平均温度は 'sum(temp)[ - 1] [ - 1]/len(temp)'です。 – agentp

関連する問題