使用python脚本查找abaqus上唯一节点的应力

时间:2019-01-24 16:12:07

标签: python python-2.7 abaqus

我解释我的问题。我绝对需要使用python脚本在我的abaqus模型上的几个唯一节点上找到压力。首先,我需要找到承受最大主应力的节点,然后还需要找到最大化某个参数的节点,该参数使用唯一节点上的应力和应变。

我首先尝试了一种在这里https://stackoverflow.com/a/43175485/10960993中看到的方法,但是在以下一行使用脚本时遇到了问题:

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.

我不知道该怎么办,我真的需要找到具有最大主应力的唯一节点的ID和坐标。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我终于找到了解决我的问题的方法,该方法可以帮助很多人(至少可以帮助我的同事)。 max9111提出的用于平均外部节点应力值的解决方案是完美且唯一的解决方案,如果您想通过Abaqus脚本了解表面应力。但是,至少应在Abaqus 6.16上对代码进行如下修改才能运行:

第一部分没有变化

Field = session.odbs['ModelName.odb'].steps['StepName'].frames[0].fieldOutputs['S']
Field = Field.getSubset(position = ELEMENT_NODAL)
Values=Field.bulkDataBlocks[0].data
NodeLabels=Field.bulkDataBlocks[0].nodeLabels

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)

由于Abaqus使用bulkDataBlocks存储数据的方式,此处的更改以创建Values变量的方式出现:

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

    max_ind=np.unravel_index(np.argmax(Values_Averaged),Values_Averaged.shape)

print("The max stress is at NodeLabel "+str(NodeLabels_unique[max_ind[0]])+ " its value is "+ str(Values_Averaged[max_ind]) +" MPa.")