Как создать путь и извлечь из него данные с помощью python?

#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, а затем извлечь данные. Вы знаете, как это сделать таким образом? Спасибо