加速Abaquspython代码中从.odb fi中提取应变数据的慢循环

2024-10-03 13:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.odb文件,名为plate2.odb,我想从中提取应变数据。为此,我构建了下面的简单代码,该代码遍历每个元素的字段输出E(应变),并将其保存到一个列表中。在

from odbAccess import openOdb
import pickle as pickle

# import database
odbname = 'plate2'
path = './'
myodbpath = path + odbname + '.odb'
odb = openOdb(myodbpath)

# load the strain values into a list
E = []
for i in range(1000):
    E.append(odb.steps['Step-1'].frames[0].fieldOutputs['E'].values[i].data)   

# save the data
with open("mises.pickle", "wb") as input_file:
    pickle.dump(E, input_file)

odb.close()

问题是将应变值加载到列表中的for循环需要很长时间(1000个元素需要35秒)。按照这个速度(0.035个查询/秒),我需要2个小时来提取包含200000个元素的模型的数据。为什么要花这么长时间?我怎样才能加速呢?在

如果我在任何Python语言之外执行一个应变查询,则需要0.04秒,因此我知道这不是Python循环的问题。在


Tags: the数据path代码import元素列表as
3条回答

派对有点晚,但我发现在本例中使用^{}for循环或列表理解要快得多

所以不是“奥斯丁诺尼”

E = []
EE = odb.steps['Step-1'].frames[0].fieldOutputs['E']
for i in range(1000):
    E.append(EE.values[i].data) 

这样做:

^{pr2}$

这与列表理解的速度差不多,但是如果您有多个属性需要一次提取(比如coordinates或{}),则效果更好

我会在这里使用bulkDataBlocks。这比使用值方法快得多。同样使用腌菜通常是缓慢的,而且没有必要。查看FieldBulkDATA对象的C++手册http://abaqus.software.polimi.it/v6.14/books/ker/default.htm。Python方法是相同的,但至少在abaqus6.14中,它没有在Python脚本参考(它从6.13开始就可用)中记录。在

例如:

from odbAccess import openOdb
import numpy as np

# import database
odbname = 'plate2'
path = './'
myodbpath = path + odbname + '.odb'
odb = openOdb(myodbpath)

# load the strain values into a numpy array
EE = odb.steps['Step-1'].frames[0].fieldOutputs['E']

# get a numpy array with your data 
# Not using np.copy here may work also, but sometimes I encountered some weird bugs
Strains=np.copy(EE.bulkDataBlocks[0].data)

# save the data
np.save('OutputPath',Strains)

odb.close()

请记住,如果您有多个元素类型,可能会有多个bulkDataBlock。在

我发现每当我想要一个版本时,我都不得不重新打开odb字典中的子目录。因此,为了解决这个问题,我将odb对象保存为一个较小的对象。下面是我更新的代码,它只需几秒钟就可以解决。在

from odbAccess import openOdb
import pickle as pickle

# import database
odbname = 'plate2'
path = './'
myodbpath = path + odbname + '.odb'
odb = openOdb(myodbpath)

# load the strain values into a list
E = []
EE = odb.steps['Step-1'].frames[0].fieldOutputs['E']
for i in range(1000):
    E.append(EE.values[i].data)  

# save the data
with open("mises.pickle", "wb") as input_file:
    pickle.dump(E, input_file)

odb.close()

相关问题 更多 >