最大应力节点

Max stress node

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

FWIW 这是我所知道的最好的方法..:[=​​12=]

 field=frame.fieldOutputs['S'].getScalarField(componentLabel='S11')
 maxp = max([ (g.data,g.elementLabel,g.integrationPoint) for g in field.values ])

( 242.4324 , 10333 , 1 )

考虑到你在做什么,我认为最大积分点值可能是你想要的。获取节点平均值会慢很多,也比较复杂。

独特节点应力的计算

首先你要考虑你不想拥有什么样的压力值。 (整个张量的最大唯一节点应力,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 秒。

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 存储数据的方式,它不是标准列表而是列表数组。