最大压力节点

时间:2017-03-14 10:25:03

标签: python abaqus

我正在尝试生成脚本以在最大压力位置自动创建模型的视图。 我知道我可以读取每个节点并用python检查每个节点的压力,但由于模型的大小,这需要一段时间。由于此功能出现在CAE中,有一种简单的方法来编写脚本吗? 一旦我知道了我感兴趣的节点,我就可以利用它的位置来生成我想要的视图。

3 个答案:

答案 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不是标准列表,而是列表数组。