Вычисление спектра реакции перемещения и дальнейшее его использование в задачах

Данный пример демонстрирует возможность вычисления спектра ответа и дальнейшее его применение в расчетах, зная при этом только временную нагрузку. Задача прогоняется в цикле питона, где для каждой итерации учитываются характеристики пружины и ее граничные условия. На каждой итерации получается отклик пружины на периодическую нагрузку, откуда вытаскиваются максимальные значения.

Итоговые значения записываются в виде "частот - максимальное пермещение" в формате csv. Полученный csv-файл учитывается в спектральном анализе как нагрузка.

Получение csv-файла

Для корректной работы python-файла, сначало нужно установить библиотеку meshio: pip install meshio.

Создать новый файл python. Для этого запустите среду разработки IDLE из меню «Пуск» или папки, где установлен Python. Выберите File - New File.

Cкопируйте в открывшееся пустое окно следующий скрипт:

import sys  # системная библиотека
import os # системная библиотека
import math # библиотека для работы с числами
import meshio # библиотека работы с выходными данными расчетов
import csv # библиотека для работы с csv файлами

fidesys_path = r'C:\Program Files\Fidesys\CAE-Fidesys-6.0'  # директория, где установлен фидесис
base_dir = os.path.dirname(os.path.abspath(__file__))  # директория скрипта питона
prep_paths = [os.path.join(fidesys_path, 'preprocessor', 'bin'),
                     os.path.join(fidesys_path, 'preprocessor', 'bin', 'plugins'),
                     os.path.join(fidesys_path, 'preprocessor', 'bin', 'acis', 'code', 'bin'),
                     os.path.join(fidesys_path, 'preprocessor', 'structure')] # Директории, где препроцессор
calc_path = os.path.join(fidesys_path,'bin', 'FidesysCalc.exe') # Директория, где решатель
for path in prep_paths:
    os.environ['PATH'] += os.pathsep + path # Добавление пути к препроцессору в PATH
    os.add_dll_directory(path)
    sys.path.append(path) # Добавление пути к препроцессору в PATH

# Импорт библиотеки Фидесис.
try: 
    import cubit
    import fidesys
except ModuleNotFoundError: 
    print("В скрипте указан следующий путь к Фидесис: ", fidesys_path)
    print("Укажите в скрипте путь к вашей версии Фидесис. Вероятно ваша версия отличается от указанной или установлена в другую директорию.")
    sys.exit(1)

m = 1 # масса
omegaArray =  [i for i in range(1,31)] #  массив собственных частот
dampingRatio = 0.02 # модальный коэффициент демфирования
data = [['f','dx']] # массив для записи данных в csv
    
cubit.init([""]) # инициализация функций препроцессора
fc = fidesys.FidesysComponent() # cоздание обязательного компонента Фидесис fc 
fc.init_application(prep_paths[0]) # инициализация
fc.start_up_no_args() # запуск обязательного компонента Фидесис fc
# Запуск цикла по массиву частот. 
for element in omegaArray:
    dispArray = [] # массив перемещений 
    stiffness = round(m*((2*math.pi*element)**2),3) # коэффициент жесткости на каждой итерации
    dampingCoeff = 2*dampingRatio*m*math.sqrt(element/m) # коэффициент вязкости  на каждой итерации
    fidesys.cmd('reset')
    fidesys.cmd('create curve location 0 0 0 location 0  1e-03 0')
    fidesys.cmd('curve all interval 1')
    fidesys.cmd('curve all scheme equal')
    fidesys.cmd('curve all interval 1')
    fidesys.cmd('curve all scheme equal')
    fidesys.cmd('mesh curve all')
    fidesys.cmd('create material 1 from \'Углеродистая сталь\'')
    fidesys.cmd('set duplicate block elements off')
    fidesys.cmd('block 1 add curve 1 ')
    fidesys.cmd('set duplicate block elements off')
    fidesys.cmd('create spring properties 1')
    fidesys.cmd('modify spring properties 1 type \'linear_spring\'')
    fidesys.cmd(f'modify spring properties 1 stiffness {stiffness}')
    fidesys.cmd(f'modify spring properties 1 spring_constant_damping {dampingCoeff}')
    fidesys.cmd('modify spring properties 1 spring_linear_damping 0')
    fidesys.cmd('modify spring properties 1 spring_mass 0')
    fidesys.cmd('block 1 element spring')
    fidesys.cmd('block 1 spring properties 1')
    fidesys.cmd('set duplicate block elements off')
    fidesys.cmd('block 2 add vertex 2 ')
    fidesys.cmd('create lumpmass properties 1')
    fidesys.cmd('modify lumpmass properties 1 mass 1')
    fidesys.cmd('block 2 cs 1 element lumpmass')
    fidesys.cmd('block 2 lumpmass properties 1')
    fidesys.cmd('create displacement  on vertex 1  dof all fix 0 ')
    fidesys.cmd('create displacement  on vertex 2  dof 1 dof 3 dof 4 dof 5 dof 6 fix 0 ')
    fidesys.cmd("create formula 1 '40 * cos(t) * cos(112.406 * t)'")
    fidesys.cmd('create gravity global')
    fidesys.cmd('modify gravity 1 dof 2 formula 1')
    fidesys.cmd('analysis type dynamic dim3 preload off')
    fidesys.cmd('dynamic method mode_superposition scheme implicit steps 25 newmark_gamma 0.005 maxtime 0.224  mod_count 1')
    fidesys.cmd(f"calculation start path '{base_dir}/{element}_freq.pvd'")
    # Расчет закончен в пределах итерации. Переходим к формированию данных для записи.
    solutionPath = f'{base_dir}/{element}_freq' # директория, где находятся результаты
    solutionFiles = os.listdir(path = solutionPath) # массив файлов результатов 
    vtuFiles = list(filter(lambda el:el.split('.')[1] == 'vtu', solutionFiles)) # массив с vtu файлами
    # Цикл по vtu файлам. Из первого файла массива вытаскиваем собственную частоту, из остальных - результаты пермещений для каждого временного шага.
    for vtuFile in vtuFiles:       
        mesh = meshio.read(f'{solutionPath}/{vtuFile}')  # чтение vtu файла
        if vtuFiles.index(vtuFile) == 0:
              freq = mesh.field_data['Eigen Values'][0]  # получение собственной частоты                                               
        else:
             disp = abs(mesh.point_data['Displacement'][2][1]) # получения модуля перемещения 
             dispArray.append(disp) # добавление в массив dispArray  disp на каждой итерации по vtu файлам
    #  Цикл по vtu файлам закончен.        
    recordValues = [freq,max(dispArray)] # формирование массива частота - максимальное значение перемещения    
    data.append(recordValues) # добавление  в data полученные значения recordValues 
# Цикл по элементам массива частот закончен.    
fc.delete_application() # очистка памяти фидесиса
# Запись csv файла.
os.chdir(base_dir) # замена текущего каталога на base_dir (фидесис в процессе работы мог поменять рабочий каталог)
file = open('dispSpectr.csv','w+',newline = '') # открытие файла csv для записи
writer = csv.writer(file) # создание объекта писателя
writer.writerows(data) # запись массива data
file.close() # закрытие файла csv
print("Запись файла csv прошла успешно!")

Запустите на расчет. Выберите Run - Run Module.

После того как расчет прошел вы увидите:

В папке с файлом скрипта будут лежать файлы с результатами. Нужно открыть и проверить значения в файле с названием dispSpectr:

Далее необходимо подготовить модель для расчета. Откройте Fidesys и импортируйте модель скачать файл. Для этого на панели инструментов нажмите на значок Импорт, выберете нужную модель. Нажмите Готово.

Построение сетки

Для построения тетраэдральной сетки задайте в настройках сетки тип элемента по умолчанию, для этого на верхней панели выберите Инструменты - Настройки. Далее в настройках найти раздел "Настройки сетки" и выбрать тип элемента - тетраэдр, после чего нажать "Сохранить".

Постройте тетраэдральную сетку. На панели команд выберите Режим - Сетка, Объект - Объемная, Действие - Интервалы. Из выплывающего списка выберите Автоматический размер. Задайте необходимые параметры. Нажмите Задать размер, Построить сетку.

Задание материала и свойств блока

Создайте материал. На панели команд выберите Режим - Материал, Объект - Управление материалами. В открывшемся виджете Управление материалами в средней колонке укажите имя материала. В колонке свойств откройте список Упругость и перетащите Материал Гука в колонку Свойства материала, затем в левой колонке перейдите в раздел и перетащите Общие → Плотность. Задайте необходимые значения. Нажмите Применить

Создайте блок. На панели команд выберите Режим - Блоки, Объект - Блок, Действие - Добавить сущность в блок. Задайте необходимые параметры. Нажмите Применить.

Задайте свойства блоку. На панели команд выберите Режим - Блоки, Объект - Блок, Действие - Свойства/параметры блока. Задайте необходимые параметры. Нажмите Применить.

Задание граничных условий

Закрепите модель в перемещениях. На панели команд выберите Режим - Граничные условия, Объект - Перемещения, Действие - Создать. Задайте необходимые параметры. Нажмите Применить.

Запуск расчета

Для запуска на расчет в CAE Fidesys выберите на панели команд Режим - Настройки расчета, Объект - Спектральный, Спектральный - Общие. Задайте требуемые параметры и нажмите Применить, Начать расчет.

Анализ результатов

Откройте файл с результатами. Это можно сделать тремя способами:

  • Нажмите Ctrl+E;

  • В главном меню выберите Расчёт - Результаты. Нажмите Открыть последний результат;

  • На панели команд выберите Результаты (Режим - Результаты, Результаты - Открыть Результаты).

Появится окно Fidesys Viewer, в котором вы сможете ознакомиться с результатами расчёта.

Выберите фильтр Фильтр - Алфавитный указатель - Линейно-Спектральный анализ. На странице свойств укажите необходимые параметры, далее укажите путь до файла с данными спектра отклика, которые был посчитан выше с помощью python-файла. Нажмите Применить.

Выведите результаты перемещения и напряжения, полученные методом "Корень квадратный из суммы квадратов". Из первого выпадающего списка выберите Перемещения_ККСК, из второго – Сумма.

Затем выберите Перемещения_ККСК, из второго – Сумма.

Использование консольного интерфейса

Построение геометрии, генерацию сетки, задание граничных условий и материалов можно выполнить с использованием консольного интерфейса. Ниже приведён код программы, позволяющий выполнить шаги описанного выше руководства, необходимо только самостоятельно указать полный путь и название сохраняемого файла.

reset
import step "C:/models/tank_step.stp" heal
set default element tri
volume all size auto factor 4
mesh volume all
create material 1
modify material 1 name 'stal'
modify material 1 set property 'MODULUS' value 2e+11
modify material 1 set property 'POISSON' value 0.3
modify material 1 set property 'DENSITY' value 7800
set duplicate block elements off
block 1 add volume 1 
block 1 material 1 cs 1 element solid order 1
create displacement  on surface 10 16 18 20 12 14  dof all fix 0 
analysis type spectrum dim3 preload off
spectrum type linear
eigenvalue find 6 smallest