簡體   English   中英

內存不足python Abaqus

[英]Running out of memory python Abaqus

我已經在python中編寫了一個腳本來對Abaqus中的一組文件進行后處理。 該腳本按順序打開abaqus輸出數據庫文件,讀取多個節點的結果,將這些結果寫入.txt文件中,然后關閉odb(輸出數據庫。開始時該過程非常迅速。在多次打開和關閉之后文件(例如50次)后,過程變得更加緩慢,最后(可能由於缺少命令),程序(Abaqus)崩潰了。

我添加了gc.collect命令,並以某種方式提供了幫助,但問題仍然存在。

我還注意到,盡管寫入的文件位於另一張光盤(D)中,但在光盤C:的過程中空間仍被占用。 重新啟動計算機后,該空間已可用。

有誰知道它為什么會發生,我該如何解決? 我的意思是我該如何避免內存變滿和過程變慢。 這是我的腳本:

from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
import gc
executeOnCaeStartup()
session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
referenceRepresentation=ON)
nodes = [1001,1201,1401,1601,1801,2001,2201,2401,2601,2801,3001]
a = ["5"]
Kx = ["0001", "001","1"]
dth = ["0", "05" , "1" ,"5", "10"]
dw = ["0","1","5" ,"10" ,"40"]
fmt = "WD_dw{w}_dth{y}_Kx{z}_a{x}"
k = 0
j = 0
for x in a:
    j = j + 1
    print 'j =',j
    f = open("WD_sin_results_{j}.txt".format(j=j), 'w')
    for z in Kx:
        for y in dth:
            for w in dw:
                f.write("\n" + fmt.format(w=w, z=z, y=y, x=x)+ "\n")
                lista = []
                listb = []
                listc = []
                xy1 = []
                k = k + 1
                print 'k =',k
                o1 = session.openOdb(name='E:\Abaqus\WD_sin_p1_c{k}.odb'.format(k=k))
                session.viewports['Viewport: 1'].setValues(displayedObject=o1)
                leaf = dgo.LeafFromOdbElementMaterials(elementMaterials=('SOIL', ))
                session.viewports['Viewport: 1'].odbDisplay.displayGroup.replace(leaf=leaf)
                odbName=session.viewports[session.currentViewportName].odbDisplay.name
                session.odbData[odbName].setValues(activeFrames=(('Step-1', ('0:-1', )), ))
                odb = session.odbs['E:\Abaqus\WD_sin_p1_c{k}.odb'.format(k=k)]
                for i in nodes:
                    print 'i =',i
                    session.xyDataListFromField(odb=odb, outputPosition=NODAL, variable=(('CPRESS', ELEMENT_NODAL), ), nodeLabels=(('PART-1-1', ('%i'%(i), )), ))
                    xy1 = []
                    xy1 = session.xyDataObjects['CPRESS (Not averaged) PI: PART-1-1 N: %i'%(i)]
                    xy1.setValues(
                    sourceDescription='CPRESS (Not averaged) PI: PART-1-1 N: %i'%(i))
                    xy2 = xy1[530]
                    xy3 = xy2[1]
                    print 'xy3:', xy3
                    if xy3 < 0:                  
                        lista = currentMin(truncate(xyData=xy1, startX=5, endX=6))
                        lista.setValues(
                        sourceDescription='currentMin ( truncate ( xyData="CPRESS (Not averaged) PI: PART-1-1 N: {i}" ,startX=5, endX=6  ) )'.format(i=i))
                    else:
                        lista = currentMax(truncate(xyData=xy1, startX=5, endX=6))
                        lista.setValues(
                        sourceDescription='currentMax ( truncate ( xyData="CPRESS (Not averaged) PI: PART-1-1 N: {i}" ,startX=5, endX=6  ) )'.format(i=i))
                    listb = lista[100]
                    print "listb:", lista[100]
                    listc = listb[1]
                    print "listc:", listb[1]
                    f.write('%s'%listc+ "\n")
                    del session.xyDataObjects['CPRESS (Not averaged) PI: PART-1-1 N: %i'%(i)]
                    del session.xyDataObjects['CPRESS (Not averaged) PI: PART-1-1 N: %i'%(i)]
                    del session.xyDataObjects['_temp_1']
                    del session.xyDataObjects['_temp_2']
                    del session.xyDataObjects['_temp_3']
                    del session.xyDataObjects['_temp_4']
                    del session.xyDataObjects['_temp_5']
                    del session.xyDataObjects['_temp_6']
                    del session.xyDataObjects['_temp_7']
                    del session.xyDataObjects['_temp_8']
                    del session.xyDataObjects['_temp_9']
                    del session.xyDataObjects['_temp_10']
                    del session.xyDataObjects['_temp_11']
                    del session.xyDataObjects['_temp_12']
                    del session.xyDataObjects['_temp_13']
                    del session.xyDataObjects['_temp_14']
                    del session.xyDataObjects['_temp_15']
                    del session.xyDataObjects['_temp_16']
                    del session.xyDataObjects['_temp_17']
                    del session.xyDataObjects['_temp_18']
                    del session.xyDataObjects['_temp_19']
                    del session.xyDataObjects['_temp_20']
                    del session.xyDataObjects['_temp_21']
                    del session.xyDataObjects['_temp_22']
                session.odbs['E:\Abaqus\WD_sin_p1_c{k}.odb'.format(k=k)].close()
    gc.collect()
    f.close()

這里有一些建議:

1-使用odbAccess在abaqus python命令提示符下打開odbs。 不使用Abaqus Viewer可能會節省一些內存

2-直接從odb中的幀中提取數據。 不要使用XY數據列表操作。

以下代碼未經測試,但可能會給您一些想法。 如果要使用它,則很可能必須對其進行調試。 我不知道您要從odb提取什么數據,但我做出了一個猜測。

from abaqus import *
from abaqusConstants import *
from odbAccess import *
import odbAccess
from caeModules import *
from driverUtils import executeOnCaeStartup
import numpy as np

nodeLabels = [1001,1201,1401,1601,1801,2001,2201,2401,2601,2801,3001]
instanceName='PART-1-1'
a = ["5"]
Kx = ["0001", "001","1"]
dth = ["0", "05" , "1" ,"5", "10"]
dw = ["0","1","5" ,"10" ,"40"]
fmt = "WD_dw{w}_dth{y}_Kx{z}_a{x}"
k = 0
j = 0
for x in a:
    j += 1
    print 'j =',j
    with open("WD_sin_results_{j}.txt".format(j=j), 'w') as f:
        for z in Kx:
            for y in dth:
                for w in dw:
                    f.write("\n" + fmt.format(w=w, z=z, y=y, x=x)+ "\n")
                    k += 1
                    print 'k =',k
                    odb = odbAccess.openOdb(name='E:\Abaqus\WD_sin_p1_c{k}.odb'.format(k=k))
                    step=odb.steps.values()[0]  # evaluate 1st step in odb
                    frames=step.frames # evaluate all frames in step
                    inst=odb.rootAssembly.instances[instanceName]

                    matrix=np.zeros((len(nodeLabels),len(frames)))  #initialse NumPy array, array = node x frame
                    for frameNum,frame in enumerate(frames): 
                        CPRESSframe=frame.fieldOutputs['CPRESS']  
                        for nodeNum,nodeLabel in enumerate(nodeLabels):
                            node=inst.getNodeFromLabel(nodeLabel)
                            matrix[nodeNum,frameNum]=CPRESSframe.getSubset(region=node).values[0].data

                    # Write out the largest absolute cpress over all the frames for each node
                    for nodeNum,nodeLabel in enumerate(nodeLabels):
                        idx=np.argmax(abs(matrix[nodeNum,:])) # find the frame with the largest absolute cpress for this node

                        f.write('%s'%matrix[nodeNum,idx]+ "\n")      

                    odb.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM