#python #abaqus
#python #abaqus
Вопрос:
Я выполняю симуляцию в Abaqus, которая состоит из столкновения двух пластин. Представьте, что симуляция имеет 100 кадров, я хочу извлечь данные по пути для определенного кадра. Я написал этот скрипт на Python для извлечения данных velocity и mises из всех узлов для всех фреймов (текстовый файл гигантский), но я хочу сделать это только для набора в данном фрейме. Кто-нибудь знает, как создать набор узлов или путь, а затем извлечь данные по этому набору или пути для определенного фрейма?
Скрипт для экспорта данных из abaqus:
import time
import numpy as np
from numpy import savetxt
import math
from odbAccess import *
from textRepr import *
import os, sys
#import matplotlib.pyplot
start_time = time.time()
path = (os.getcwd())
odbName = '%s/Job-1.odb'%path
odb = openOdb(odbName, readOnly=True)
myAssembly = odb.rootAssembly.instances['FIXED-1']
newpath = 'results'
if not os.path.exists(newpath):
os.makedirs(newpath)
steps1 = odb.steps['Step-1'].frames
currentframe1 = []
for c_elem in range(len(steps1)):
currentframe1 = steps1[c_elem]
mises = []
velocity = []
strain = []
displacement = []
fieldvalues_mises = currentframe1.fieldOutputs['S']
fieldvalues_velocity = currentframe1.fieldOutputs['V']
fieldvalues_displacement = currentframe1.fieldOutputs['U']
fieldvalues_strain = currentframe1.fieldOutputs['LE']
vel_set = fieldvalues_velocity.values
disp_set = fieldvalues_displacement.values
mises_set = fieldvalues_mises.values
strain_set = fieldvalues_strain.values
for v in vel_set:
velocity.append(v.data)
for s in strain_set:
strain.append(s.data)
for m in mises_set:
mises.append(m.data)
for d in disp_set:
displacement.append(d.data)
# Vector of frames
vector_frame = c_elem*[1]
with open('velocityFile.txt', 'w') as f:
for i in range(1,len(vector_frame) 1):
f.write('nn')
for j in velocity:
f.write(str(j) 3*' ')
with open('misesFile.txt', 'w') as f:
for i in range(1,len(vector_frame) 1):
f.write('nn')
for j in mises:
f.write(str(j) 3*' ')
Ответ №1:
Вы открыли odb как редактируемый? Значение по умолчанию доступно только для чтения, и вы НЕ МОЖЕТЕ что-то в нем сохранить, поэтому вашей строки там не будет. Вот почему abaqus всегда сообщит вам, что локальные выходные данные хранятся только в текущем сеансе.
Кроме того, используя ваш фрагмент кода, вы не можете просто использовать имя, но должны создать set в odb, например
odb.rootAssembly.nodeSets['LINE_1']
и используйте этот набор в region.
Набор должен присутствовать в сборке.
Комментарии:
1. Технически это отвечает на вопрос.
Ответ №2:
Да! Откройте odb
раздел «Как редактируемый», создайте интересующий путь и сохраните его в odb. Используйте скрипт для чтения интересующих переменных по созданному пути. Посмотрите Viewing results along a path
в документации для создания пути и получения результатов xy.
Комментарии:
1. Я понимаю, что вы имеете в виду, но я не знаю, как это сделать. При выполнении моделирования (перед последующей обработкой) я создаю набор узлов с именем LINE_1. Но затем, когда я хотел получить координаты этого набора для данного фрейма, я использовал форму: resultCoord = steps1[6].fieldOutputs[«COORD»].getSubset(region=LINE_1).values . И он выдал мне сообщение об ошибке, в котором говорилось, что LINE_1 не существует. Поэтому я думаю, что лучший способ — создать набор узлов или путь в скрипте python, а затем извлечь данные. Вы знаете, как это сделать таким образом? Спасибо