Загрузка STL файлов и расчет нагруженного состояния лопатки турбины¶
В этом скрипте мы покажем пример того, как в окружении Engee можно:
- загрузить трехмерную модель детали из формата STL
- визуализировать сетку этой модели
- расчитать нагруженное состояние детали при помощи команд MATLAB
Чтобы открыть CAD-файл (в STL формате), мы воспользуемся библиотекой Meshes.jl. Она позволяет работать с множеством разных CAD-форматов и расчетных сеток и может подготовить сохраненную 3D модель объекта для дальнейших манипуляций.
Для визуализации мы сперва используем стандартную библиотеку Plots, встроенную в Engee, затем – более высокоуровневую библиотеку Makie. Ее возможности вы можете оценить, посетив галерею графиков Makie.
В третьей части мы продемонстрируем, как в Engee можно выполнить пример расчета механической нагрузки, которую испытывает лопатка турбины и возуализируем графики.
Загрузка трехмерной модели¶
Сперва подключим необходимые библиотеки для этого этапа
import Pkg; Pkg.add(["Meshes", "MeshIO"], io=devnull);
using Meshes, MeshIO, FileIO, Plots
#plotly();
gr();
Укажем рабочую папку для всех будущих операций с файлами.
cd( @__DIR__ )
Теперь загрузим модель и выведем расчетную сетку на график при помощи отдельных треугольников, каждый из которых которые стилизовать по-отдельности любым образом.
obj = load( "Blade.stl" );
p = plot()
for i in obj
m = Matrix([i[1] i[2] i[3] i[1]])'
plot!( p, m[:,1], m[:,2], m[:,3], lc=:black, label=:none, lw=.1 )
end
plot!( camera=(120, 30), axis=nothing, border=:none, aspect_ratio=:equal, projection_type=:persp )
display(p)
Почему бы нам не отрисовать трехмерную анимацию вращения этой детали?
Pkg.add( "Animations", io=devnull );
using Animations
obj = load( "Blade.stl" );
@gif for az in 0:10:359
p = plot()
for i in obj
m = Matrix([i[1] i[2] i[3] i[1]])'
plot!( p, m[:,1], m[:,2], m[:,3], lc=:black, label=:none, lw=.1 )
end
plot!( camera = (az, 30), axis=nothing, border=:none, aspect_ratio=:equal )
end
Для демонстрации высокоуровневого метода работы с моделью, подключим библиотеку для визуализации Makie
, и выберем подходящий для нее инструментарией быстрой отрисовки графиков (CairoMakie
). Другой вариант, поддерживаемый браузером – пакет WGLMakie
, требует более сложных настроек. Остальные пакеты (GLMakie
и RPRMakie
) требуют создания дополнительных окон и пока не поддерживаются Engee.
import Pkg; Pkg.add(["Makie", "CairoMakie"], io=devnull);
using Makie, CairoMakie
Визуализируем модель одной строкой.
Первое выполнение этой ячейки, сразу после загрузки библиотеки Makie, может занять больше минуты.
Makie.wireframe( obj, linewidth=.2 )
Выполним вычисления при помощи ядра MATLAB¶
Для вычисления методами конечных элементов, как правило, нужно использовать хорошо зарекомендованные внешние инструменты. В этой сфере множество отличных исследовательских пакетов. Например, к пакетам для разбиения сетки на полигоны (tetgen
, gmsh
) существуют оболочки в Julia, которые можно подключить в Engee для выполнения расчетов.
Если же у вас уже есть существующий проект в MATLAB, или вы нашли демонстрационный код, который очень похож на то, что вам нужно, то Engee позволит вам запустить его и сохранить результат в облаке.
using MATLAB
Зададим расчетную задачу и загрузим трехмерную модель детали.
Первое выполнение этой ячейки, сразу после подключения библиотеки MATLAB, может занять больше минуты.
mat"cd $(@__DIR__)"
outp = mat"""
smodel = createpde('structural','static-solid');
g = importGeometry(smodel, 'Blade.stl');
figure;
p = pdegplot( smodel, 'FaceLabels', 'on', 'FaceAlpha',0.5);
axis off;
view( [133.027 16.056] );
saveas( gcf, 'Blade.png' );
""";
Выведем сохраненное изображение в окружении Engee при помощи команды load
встроенной в Engee библиотеки Images
.
using Images
img = Images.load( "Blade.png" )
В загруженном файле содержалось только описание поверхности. Теперь создадим трехмерную расчетную сетку внутри этой поверхности.
outp = mat"""
msh = generateMesh(smodel,'Hmax',0.01);
figure
p1 = pdemesh(msh, 'FaceAlpha', 1)
view([133.027 16.056])
saveas( gcf, "Blade_mesh.png" )
""";
img = Images.load( "Blade_mesh.png" )
И в-третьих, нам нужно задать параметры задачи (расчетные и физические), в частности граничные условия.
Вычислим деформацию лопатки при помощи функции solve
и выведем трехмерный график, на котором механическая деформация детали будет усилена в сотни раз, а цветовая информация будет показывать степень механического напряжения в окружности данной точки детали.
outp = mat"""
E = 227E9; % in Pa
CTE = 12.7E-6; % in 1/K
nu = 0.27;
s1 = structuralProperties(smodel,'YoungsModulus',E, ...
'PoissonsRatio',nu, ...
'CTE',CTE);
s2 = structuralBC(smodel,'Face',3,'Constraint','fixed');
p1 = 5e5; %in Pa
p2 = 4.5e5; %in Pa
s3 = structuralBoundaryLoad(smodel,'Face',11,'Pressure',p1); % Pressure side
s4 = structuralBoundaryLoad(smodel,'Face',10,'Pressure',p2); % Suction side
Rs = solve(smodel);
figure
p2 = pdeplot3D(smodel,'ColorMapData',Rs.VonMisesStress, ...
'Deformation',Rs.Displacement, ...
'DeformationScaleFactor',100);
%view([116,25]);
view( [133.027 16.056] );
saveas(gcf, "Blade_solved.png");
""";
Отобразим два графика в одинаковой проекции: на первом – распределение зон лопатки, для которых мы задавали граничные условия. На втором – деформированная модель с отмеченными областями высокой механической напряженности.
img_topo = Images.load( "Blade.png" );
img_mesh = Images.load( "Blade_mesh.png" );
img_solved = Images.load( "Blade_solved.png" );
mosaic(img_topo, img_mesh, img_solved; nrow=1)