Максимальное напряжение узла
Я пытаюсь сгенерировать сценарии для автоматического создания представлений модели в месте максимального стресса. Я знаю, что могу прочитать каждый узел и проверить нагрузку каждого с помощью Python, но это займет некоторое время из-за размера модели. Как эта функция появляется в CAE, есть ли простой способ написать это? Как только я узнаю интересующий меня узел, я могу использовать его местоположение для создания желаемых представлений.
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)
Учитывая то, что вы делаете, я думаю, что максимальное значение точки интеграции, скорее всего, то, что вы хотите. Получение среднего значения будет намного медленнее и сложнее.
Расчет уникальных узловых напряжений
Сначала вы должны подумать о том, какие значения стресса вы не хотите иметь. (макс. уникальное узловое напряжение всего тензора, Mises, MaxPrincipal,...) Если вы не хотите, например, уникальные узловые напряжения Мизеса, вы можете рассчитать напряжения Мизеса для каждого экстраполированного тензора напряжений, а затем вычислить уникальные узловые напряжения или иным образом. вокруг. Вы также найдете эту опцию в Abaqus CAE Gui.
В этом ответе я покажу, как рассчитать максимальное значение напряжения для всего уникального узлового тензора напряжения.
Сначала получите значения напряжения. Если у вас установлен Abaqus Python 6.13 или более поздней версии, используйте метод FieldBulkData для получения ваших данных. Это намного быстрее, чем метод value, показанный в ответе 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
Теперь у нас есть экстраполированные значения напряжений. Вычисление уникальных значений копируется из: среднего числа всех строк, соответствующих всем уникальным строкам
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.")
В моем ноутбуке весь процесс усреднения занимает около 9 с для 17 000 000 значений Element_Nodal.
Решение 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, который является не стандартным списком, а массивом списков.