Skip to main content
 首页 » 编程设计

python之加速 Abaqus-python 代码中的慢循环,用于从 .odb 文件中提取应变数据

2025年05月04日28birdshome

我有一个名为 plate2.odb 的 .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 个小时才能为我的包含 200,000 个元素的模型提取数据。为什么要花这么长时间?我怎样才能加速这个?

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

请您参考如下方法:

我发现每次我想要一个菌株时都必须重新打开 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()