Максимальное напряжение от ODB

#python #arrays #abaqus #odb

Вопрос:

Я новичок в программировании, и мне нужно написать код, который создаст odb, визуализирующий максимальное значение вывода шести полей за один шаг. Для каждого отдельного узла я хотел бы представить максимальное значение каждого выходного поля. Теперь я создал код, который приводит к этой ошибке:

 myFieldOutput.addData(position=INTEGRATION_POINT, instance=instance1, data=maxStress)
 

omu_PrimArray из последовательности неудачных измерений.

Это и есть код:

 from abaqus import *
from abaqusConstants import *
import visualization
myViewport = session.Viewport(name='Max_Stess',
origin=(10, 10), width=150, height=100)
# Open the tutorial output database.
myOdb = visualization.openOdb(path='PROVA_04_10.odb', readOnly=False)
# Associate the output database with the viewport.
myViewport.setValues(displayedObject=myOdb)
instance1 = myOdb.rootAssembly.instances['MODIFICA_FUNZIONANTE']
# Create variables that refer to the first steps.
firstStep = myOdb.steps['sigma_equivalenti']

frame = firstStep.frames[-1]
#creo nuovo step

# lettura degli stress dallo step sigma

sigma_eq_1 = frame.fieldOutputs['sigma_eq_1']
sigma_eq_2 = frame.fieldOutputs['sigma_eq_2']
sigma_eq_3 = frame.fieldOutputs['sigma_eq_3']
sigma_eq_4 = frame.fieldOutputs['sigma_eq_4']
sigma_eq_5 = frame.fieldOutputs['sigma_eq_5']
sigma_eq_6 = frame.fieldOutputs['sigma_eq_6']

#calcolo del vettore degli sforzi massimi

maxStress=[]
for i in range(len(sigma_eq_1.values)):
   v1=sigma_eq_1.values[i]
   v2=sigma_eq_2.values[i]
   v3=sigma_eq_3.values[i]
   v4=sigma_eq_4.values[i]
   v5=sigma_eq_5.values[i]
   v6=sigma_eq_6.values[i]
   maxStress.append((max(v1,v2,v3,v4,v5,v6),)) #max(valori)


myFieldOutput = frame.FieldOutput(name='tensioni_max',description='calcolo delle tensioni massime', type=SCALAR)
myFieldOutput.addData(position=INTEGRATION_POINT, instance=instance1, data=maxStress)

#visualizzazione della variabile delle sigma massima sul programma
myViewport.odbDisplay.setPrimaryVariable(field=myFieldOutput,outputPosition=INTEGRATION_POINT)
myViewport.odbDisplay.display.setValues(plotState=(CONTOURS_ON_DEF,))
 

Ответ №1:

Вы можете использовать field аргумент для добавления выходных данных поля как FieldOutput object . Однако вам следует создать данные полей из уже существующих выходных данных полей.
В вашем случае вы могли бы сделать следующее:

  1. Получите доступ к выходным данным поля (а НЕ к выходным данным поля), как вы правильно сделали.
 sigma_eq_1 = frame.fieldOutputs['sigma_eq_1']
sigma_eq_2 = frame.fieldOutputs['sigma_eq_2']
sigma_eq_3 = frame.fieldOutputs['sigma_eq_3']
sigma_eq_4 = frame.fieldOutputs['sigma_eq_4']
sigma_eq_5 = frame.fieldOutputs['sigma_eq_5']
sigma_eq_6 = frame.fieldOutputs['sigma_eq_6']
 
  1. Затем обработайте эти выходные данные поля. Вы можете выполнить любую возможную математическую операцию над этими данными, например, сложить,вычесть и т.д. В этом случае, чтобы найти максимальное значение, мы вызываем специальную команду maxEnvelope .
 maxS = maxEnvelope([sigma_eq_1, sigma_eq_2, sigma_eq_3, sigma_eq_4, sigma_eq_5, sigma_eq_6])
 

Пожалуйста, обратите внимание, что эта команда принимает список в качестве аргумента. И эта команда вычисляет новые данные поля в той же позиции, где доступны исходные данные. В этом случае он доступен в Точке интеграции, следовательно, он будет записан в точке интеграции.
3. Теперь вы можете использовать field arugment для добавления выходных данных поля.

 myFieldOutput = frame.FieldOutput(name='tensioni_max',description='calcolo delle tensioni massime', type=SCALAR)
myFieldOutput.addData(field=maxS[0])
 

PS: Поскольку вы импортировали модуль визуализации как import visualization , вы должны использовать maxEnvelope метод как visualization.maxEnvelope(...)