Загрузка STL файлов и расчет нагруженного состояния лопатки турбины

В этом скрипте мы покажем пример того, как в окружении Engee можно:

  1. загрузить трехмерную модель детали из формата STL

  2. визуализировать сетку этой модели

  3. расчитать нагруженное состояние детали при помощи команд 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)

interactive-scripts/images/math_and_optimization_turbine_blade_mesh_cfd/deb5d671ad480fb527e772f8351ab56950c67a4b

Почему бы нам не отрисовать трехмерную анимацию вращения этой детали?

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
[ Info: Saved animation to /user/start/examples/math_and_optimization/turbine_blade/tmp.gif
tmp

Для демонстрации высокоуровневого метода работы с моделью, подключим библиотеку для визуализации Makie, и выберем подходящий для нее инструментарией быстрой отрисовки графиков (CairoMakie). Другой вариант, поддерживаемый браузером – пакет WGLMakie, требует более сложных настроек. Остальные пакеты (GLMakie и RPRMakie) требуют создания дополнительных окон и пока не поддерживаются Engee.

import Pkg; Pkg.add(["Makie", "CairoMakie"], io=devnull);
using Makie, CairoMakie
WARNING: using Makie.plot in module Main conflicts with an existing identifier.
WARNING: using Makie.plot! in module Main conflicts with an existing identifier.

Визуализируем модель одной строкой.

Первое выполнение этой ячейки, сразу после загрузки библиотеки Makie, может занять больше минуты.

Makie.wireframe( obj, linewidth=.2 )

interactive-scripts/images/math_and_optimization_turbine_blade_mesh_cfd/9fd566263ee52ce9a3c5b377e2f004a02fd52dc1

Выполним вычисления при помощи ядра 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' );
""";
>> >> >> >> >> >> >> >> [Warning: MATLAB has disabled some advanced graphics rendering features by
switching to software OpenGL. For more information, click <a
href="matlab:opengl('problems')">here</a>.]
Fontconfig warning: "/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf", line 6: unknown element "reset-dirs"
Fontconfig warning: "/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf", line 6: unknown element "reset-dirs"

Выведем сохраненное изображение в окружении Engee при помощи команды load встроенной в Engee библиотеки Images.

using Images
img = Images.load( "Blade.png" )

interactive-scripts/images/math_and_optimization_turbine_blade_mesh_cfd/4f6655e548353273980f19447690bbafebd96b2d

В загруженном файле содержалось только описание поверхности. Теперь создадим трехмерную расчетную сетку внутри этой поверхности.

outp = mat"""
msh = generateMesh(smodel,'Hmax',0.01);

figure
p1 = pdemesh(msh, 'FaceAlpha', 1)
view([133.027 16.056])

saveas( gcf, "Blade_mesh.png" )
""";
>> >> >> >> >> >> [Warning: Cannot set Renderer to OpenGL on this figure.]
[> In pdeplot3D (line 276)
In pdemesh (line 129)]

p1 =

  Patch with properties:

    FaceColor: [0 1 1]
    FaceAlpha: 1
    EdgeColor: [0 0 0]
    LineStyle: '-'
        Faces: [5488x3 double]
     Vertices: [2744x3 double]

  Use GET to show all properties
img = Images.load( "Blade_mesh.png" )

interactive-scripts/images/math_and_optimization_turbine_blade_mesh_cfd/a4cc89a564c4781534a5a45be5b47b85b15e877c

И в-третьих, нам нужно задать параметры задачи (расчетные и физические), в частности граничные условия.

Вычислим деформацию лопатки при помощи функции 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)

interactive-scripts/images/math_and_optimization_turbine_blade_mesh_cfd/c1e476c1960444090fd862662e5f4c401ee4d72a

Загрузить пример в Engee

Чтобы скачать пример себе в файловый браузер, скопируйте и выполните следующие команды. Пример появится по адресу start/examples в соответствующей папке.

# Проверка наличия директории для примера
if isdir("/user/start/examples/math_and_optimization/turbine-blade")
	rm("/user/start/examples/math_and_optimization/turbine-blade"; force = true, recursive = true)
end

# Копирование примера на диск Engee
run(`git clone https://git.engee.com/learn-engee/examples/math_and_optimization/turbine-blade.git /user/start/examples/math_and_optimization/turbine-blade`)