我是编程新手,我需要编写一段代码来创建一个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,))
您可以使用
field
参数将字段输出数据添加为 FieldOutput object
。但是,您应该从现有的现场输出创建现场数据。 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']
maxEnvelope
的特定命令。maxS = maxEnvelope([sigma_eq_1, sigma_eq_2, sigma_eq_3, sigma_eq_4, sigma_eq_5, sigma_eq_6])
请注意,该命令将 list 作为参数。此命令在原始数据可用的相同位置计算新的字段数据。在这种情况下,它在集成点可用,因此它将在集成点写入。
3. 现在,您可以使用
field
参数添加字段输出数据。
myFieldOutput = frame.FieldOutput(name='tensioni_max',description='calcolo delle tensioni massime', type=SCALAR)
myFieldOutput.addData(field=maxS[0])
P.S.:由于您已将可视化模块导入为
import visualization
,因此您应该使用maxEnvelope
方法作为visualization.maxEnvelope(...)
数据值必须是根据 Abaqus 脚本参考指南指定指定位置、实例和标签的数据值的浮点序列序列。 (请参阅 Odb 命令/FieldOutput 对象/addData(...) 方法)。
当分配给 addData 方法中的数据参数时,通过列表理解提供元组中的封装元素数据,例如 (myElementData,)。查看我导入 json 数据进行可视化的函数:
def fatigue_visualize(odb_file=r'filePath',damage_results_file=r'r'filePath'):
import datetime
def dictionaryLoad(json_file):
import json
with open(json_file,'r') as fileObj:
dictData=json.load(fileObj)
return dictData
# session.Viewport(name='Fatigue Damages')
odb = session.openOdb(odb_file, readOnly=False)
damageDict=dictionaryLoad(damage_results_file)
json_instances = damageDict.keys()
fieldOutputs=damageDict[str(json_instances[0])].keys()
damageStep = odb.Step(name='Fatigue Spectrum Damage '+str(datetime.datetime.now())[:-7], description='', domain=TIME, timePeriod=1.0)
t1 = damageStep.Frame(frameId=0, frameValue=1.0, description='Increment 1: Step Time = 1.000')
for fieldOutputName in fieldOutputs:
damageField = t1.FieldOutput(name=str(fieldOutputName), description='Fatigue Spectrum Damages', type=SCALAR, componentLabels=('Fatigue Spectrum Damage',))
for instanceName in json_instances:
elementLabels=[int(elem) for elem in damageDict[instanceName][fieldOutputName].keys()]
damages=[(float(damageDict[instanceName][fieldOutputName][str(key)]),) for key in elementLabels]
damageField.addData(position=CENTROID, instance=odb.rootAssembly.instances[str(instanceName)], labels=elementLabels, data=damages)
odb.save() ; odb.close() ; odb = session.openOdb(odb_file, readOnly=True)