У меня есть следующий фрагмент кода:
from abaqus import *
from odbAccess import *
from abaqusConstants import *
import visualization
import fileinput
import os
import shutil
import numpy as np
from odbAccess import *
def tupled_list(mylist,n):
'''group every n elements of the list into a tuple '''
return list(zip(*[iter(mylist)]*n))
# Open odb
odb_filename = 'AbaqusResults.odb'
work_directory=os.getcwd()
odb_filepath = os.path.abspath(os.path.join(os.getcwd(),'..','outputs',odb_filename))
my_odb=session.openOdb(name=odb_filepath,readOnly=FALSE)
# Automate the proces of reading the step no matter what its name is
StepNames=(my_odb.steps.keys() )
lastStep=( StepNames[-1] )
# Automation of an instance naming (in the same way)
AllInstances = (my_odb.rootAssembly.instances.keys())
MyInstance = ( AllInstances[-1] )
SubmodelInstance=my_odb.rootAssembly.instances[MyInstance]
# Get dataset containing element labels and calculated quantities in here from text file
dataset = np.loadtxt(os.path.join(os.getcwd(),'AbaqusDataInput.txt'),delimiter=',')
# List of all element labels
elLabels = dataset[0,:].astype(int).tolist()
# Count the number of integration points for a single element
gausspoints = elLabels.count(1)
# Get damage data from dataset and format into a list of tuples, tuple length depends on number of integration points for eache element
damage = tupled_list(list(dataset[1,:]),gausspoints)
damage = [list(elem) for elem in damage]
# Remove duplicates from elLabel list
elLabels = list(set(elLabels))
for i in range(len(my_odb.steps[lastStep].frames)):
new_field_damage = my_odb.steps[lastStep].frames[i].FieldOutput(name='Damage',description='Damage sustained after one repitition of the loading history', type=SCALAR)
new_field_damage.addData(position=INTEGRATION_POINT, instance=SubmodelInstance, labels=elLabels, data=damage)
my_odb.save()
my_odb.close()
но я получаю следующую ошибку:
Data at 141968 locations expected. Data at 17746 locations provided. Element data request failed. Element type is C3D20R. Data at 8 integration points per element expected
elLabels - список из 17746 предметов и
Урон - это список кортежей с 17746 предметами, но каждый предмет имеет 8 значений (по одному на каждую точку интеграции), например [(х, х, х, х, х, х, х, х, х), (х, х, х, х, х, х, х, х, х),…]
Таким образом, я предоставляю abaqus 17746 меток элементов и 17746 * 8 местоположений (всего 141968 точек данных, как было задано), поэтому я не понимаю, почему я получаю ошибку.
Я пробовал список списков вместо списка кортежей, но возникает та же ошибка. Я подозреваю, что это просто проблема использования правильных типов данных, но документация Abaqus, похоже, сильно отсутствует.
Скрипт отлично работает для файлов odb с элементами C3D8R, которые имеют 1 точку интеграции. Затем я предоставляю один и тот же список elLabels и список повреждений, но тогда у каждого кортежа есть только 1 значение (например, [(x,) (x,),…]), которое отлично работает.
Знаете ли вы, как я могу импортировать свои данные в точки интеграции элементов?