Python-скрипт Abaqus, как «addData» для элементов с несколькими точками интеграции (например, C3D20R) - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть следующий фрагмент кода:

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,),…]), которое отлично работает.

Знаете ли вы, как я могу импортировать свои данные в точки интеграции элементов?

...