我正在尝试生成脚本以在最大压力位置自动创建模型的视图。 我知道我可以读取每个节点并用python检查每个节点的压力,但由于模型的大小,这需要一段时间。由于此功能出现在CAE中,有一种简单的方法来编写脚本吗? 一旦我知道了我感兴趣的节点,我就可以利用它的位置来生成我想要的视图。
答案 0 :(得分:2)
FWIW这是我所知道的最佳方法..:
field=frame.fieldOutputs['S'].getScalarField(componentLabel='S11')
maxp = max([ (g.data,g.elementLabel,g.integrationPoint) for g in field.values ])
(242.4324,10333,1)
考虑到你在做什么,我认为最大积分点值很可能是你想要的。获得节点平均值会慢很多,也会更复杂。
答案 1 :(得分:2)
计算独特的节点应力
首先,你必须考虑一下你没有的压力值。 (整个张量的最大唯一节点应力,Mises,MaxPrincipal,......) 如果你不是例如独特的节点Mises应力,你可以计算每个外推应力张量的Mises应力,而不是计算独特的节点应力或反之。您还可以在Abaqus CAE Gui中找到该选项。
在这个答案中,我将展示如何计算整个唯一节点应力张量的最大应力值。
首先得到压力值。 如果安装了Abaqus Python 6.13或更高版本,请使用FieldBulkData方法获取数据。它比agentp的答案中显示的值方法快得多。例如:
Field=odb.steps[Steps[0]].frames[1].fieldOutputs['S']
Field = Field.getSubset(position = ELEMENT_NODAL)
Values=Field.bulkDataBlocks[0].data
NodeLabels=Field.bulkDataBlocks[0].nodeLabels
现在我们有了外推的压力值。唯一值的计算从以下位置复制: average of all rows corresponing to all unique rows
NodeLabels_unique, unq_idx = np.unique(NodeLabels, return_inverse=True)
Values_Averaged=np.zeros((NodeLabels_unique.size,Values.shape[1]))
unq_counts = np.bincount(unq_idx)
for i in xrange(0,Values.shape[1]):
unq_sum = np.bincount(unq_idx, weights=Values[:,i])
Values_Averaged[:,i] = unq_sum / unq_counts
#Index of max stress value
max_ind=np.unravel_index(np.argmax(Values_Averaged),Values_Averaged.shape)
#Print the results
print("The max stress is at NodeLabel "+str(NodeLabels_unique[max_ind[0]])+ " its value is "+ str(Values_Averaged[max_ind]) +" MPa.")
在我的笔记本上,17,000,000个Element_Nodal值的整个平均过程大约需要9秒。
答案 2 :(得分:0)
max9111的解决方案是一种非常好的方法,但是在运行时,至少在Abaqus 6.16上运行时,它在以下一行中存在问题:
for i in xrange(0,Values.shape[1]):
unq_sum = np.bincount(unq_idx, weights=Values[:,i])
...
出现以下错误消息:
ValueError: The weights and list don't have the same length.
我花费了大量时间来修复它。可行的解决方案如下,
for i in xrange(0,Values.shape[1]):
ValuesTemp = [item[i] for item in Values]
unq_sum = np.bincount(unq_idx, weights=ValuesTemp)
Values_Averaged[:,i] = unq_sum / unq_counts
问题出在Abaqus使用bulkDataBlocks存储数据的方式上,bulkDataBlocks不是标准列表,而是列表数组。