Как создать контурную диаграмму жесткости (узловая сила / смещение), используя скрипт Python в Abaqus? - PullRequest
0 голосов
/ 18 февраля 2020

Я хотел бы создать контурную диаграмму жесткости из результатов полевых работ. Для этого мне нужно разделить NFORC2 (Y-компонент вектора узловой силы) на U2 (смещение в направлении Y).

Я пытался использовать Create Field Output -> From Fields, где мы можем определить наши собственные выходные переменные. Скаляры могут быть извлечены из векторов с помощью getScalarField (), но Abaqus выдает ошибку, потому что NFOR C - это целая переменная элемента, а U - узловая переменная.

Таким образом, кажется, что единственный способ - написать скрипт, который будет конвертировать NFOR C. Я нашел код, который может сохранить переменную как элемент узловой. Он был разработан для напряжения, которое рассчитывается в точках интеграции, поэтому я не уверен, что он будет правильно преобразовывать NFOR C, но это единственный вариант, который у меня есть. Это сохраняет некоторые результаты, поэтому я предполагаю, что это правильно.

Однако Abaqus все еще не позволяет мне разделить эту новую переменную на U2. Кажется, я должен сначала преобразовать его в уникальный узел. Для этого я нашел другой скрипт Python и добавил его в первый. Видимо, я сделал что-то не так, потому что появляется ошибка.

Вот два сценария, объединенные в один:

from abaqusConstants import *
from odbAccess import *
import numpy as np

# ***********************************************
odbPath="path_to_odb_file"
stepName="Step-1"
frameNumber=-1 #last frame in the stepName
sourceOutputFieldName='NFORC2' #element forces field
newOutputFieldName='NFORC2_at_NODES_UNIQUE'
# ************************************************
odb=session.openOdb(name=odbPath,readOnly=FALSE)
step=odb.steps[stepName]
frame=step.frames[frameNumber]
sourceField=frame.fieldOutputs[sourceOutputFieldName]
subField=sourceField.getSubset(position=ELEMENT_NODAL)
Values=subField.bulkDataBlocks[0].data
NodeLabels=subField.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]):
    ValuesTemp = [item[i] for item in Values]
    unq_sum = np.bincount(unq_idx, weights=ValuesTemp)
    Values_Averaged[:,i] = unq_sum / unq_counts
newField=frame.FieldOutput(name=newOutputFieldName, field=Values_Averaged)
odb.save()
odb.close()

Ошибка, которую я получаю, указывает на следующую строку кода:

newField=frame.FieldOutput(name=newOutputFieldName, field=Values_Averaged) 

Сообщение об ошибке: Ошибка типа: ошибка ключевого слова в поле

Знаете ли вы, что может быть причиной ошибки и как должен выглядеть скрипт?

...