манипулирование тензорными данными в Abaqus ODB - PullRequest
0 голосов
/ 17 ноября 2018

Я хочу суммировать все значения плотности энергии деформации (ELSE) каждого режима (кадры из модального анализа) моего odb и сохранить его в новом кадре.

Мой код отлично работает со смещением 'U' и типом = VECTOR Но когда я изменяю его на «ELSE» и набираю = TENSOR_3D_FULL, я получаю следующую ошибку:

Traceback (most recent call last):    File "..\Python\modaldata.py", line 62, in <module> 
    newField.addData(field=strechtMode1)  OdbError: Fields are not compatible. They are either associated with different structural models or have incompatible attributes.

Нужно ли использовать другой метод для манипулирования тензорными данными? Я нашел что-то с позицией = ELEMENT_NODAL, но с совершенно разным подходом, получив определенные скалярные значения напряжений определенных наборов узлов. Мне нужен целый ELSE Tensor для каждой точки интеграции каждого элемента в виде нового фрейма.

Вот мой код:

#-ODB OEFFNEN------------------------------------------------------------------------#    
odb = openOdb(odbName) 
#-DIE MODEN EINZELN ABSPEICHERN UM SIE VERRECHNEN ZU KOENNEN-------------------------#
nmoden=len(odb.steps['Modalanalyse'].frames)

#------------------------------------------------------------------------------------#
#-FIELD VARIABLE ZIEHEN UND VERRECHNEN-----------------------------------------------#
#------------------------------------------------------------------------------------#

field='U' # ''ELSE' # U oder E oder ELSE oder whatever...
type=VECTOR #TENSOR_3D_FULL  # muss an das field angepasst werden. 

Modes_field=[]
for i in range(nmoden):
    Modes_field.insert(i,odb.steps['Modalanalyse'].frames[i].fieldOutputs[field])  
#-FIELD VARIABLE ALLER MODEN UEBERLAGERN---------------------------------------------#
sumAllModes_field = Modes_field[0]
for i in range(nmoden):
    sumAllModes_field = sumAllModes_field + Modes_field[i] 
#-NEUE FIELD VARIABLE MODE ABSPEICHERN-----------------------------------------------#
newFrame = odb.steps['Modalanalyse'].Frame(incrementNumber=0, frameValue=0.0)
newField = newFrame.FieldOutput(name=field, description='sum of ELSE of all modes', type=type)
newField.addData(field=sumAllModes_field)
#-ODB ABSPEICHERN--------------------------------------------------------------------#
odb.save()

1 Ответ

0 голосов
/ 22 ноября 2018

ELSE - полная энергия.
Таким образом, тип выходного поля - SCALAR.И именно поэтому вы получаете свою ошибку, вы пытаетесь заполнить поле TENSOR_3D_FULL значениями поля SCALAR.

Я настоятельно рекомендую использовать prettyPrint из библиотеки textRepr, чтобы получить доступ к полю и лучше понять его свойства.

from textRepr import prettyPrint as pp  

pp(odb.steps['Modalanalyse'].frames[-1].fieldOutputs['ELSE'])
pp(sumAllModes_field)
pp(newField)
...