Вероятно, лучший в мире свободный мешер GMSH
в апреле обновился до третьей версии. Почти все изменения связаны с появлением во встроенном сктриптовом языке, на котором можно описывать твердотельную геометрию системы, богатых возможностей технологии CSG (конструктивной блочной геометрии) на базе ядра OpenCASCADE
:
появились команды для быстрого задания «готовых» примитивов: Sphere, Block, Torus, Cylinder, Cone, Wedge и другие;
появились полнофункциональные булевы операции над геометрическими объектами;
команды для «дополнительной обработки» типа скругления (Fillet) и т.п.;
возможность импорта геометрии и последующей работы с ней как с «родными» объектами.
В целом геометрический модуль внезапно стал очень мощным. В ряду «текстовых» CAD’ов для подготовки 3D-геометрии данный модуль GMSH
занимает теперь достойное место (до третьей версии его вообще не приходилось серьезно рассматривать). Пожалуй, он вообще не уступает теперь знаменитому OpenSCAD
, а во многом даже его превосходит, если учесть, что OpenSCAD
работает только с сетками, а тут мы имеем «полноценное» описание на основе граничных поверхностей (BREP) на технологии OpenCASCADE
.
В продолжение предыдущей заметки «Механические расчеты конструкций в свободном ПО. Часть 1» поупражняемся немного в языке GMSH
. Тот же звездчатый многогранник «Соединение пяти тетраэдров», объединенный с шаром, на языке .geo GMSH
можно построить так:
SetFactory("OpenCASCADE");
// Первый тетраэдр
Point(1) = { 1, 1, 1};
Point(2) = { 1,-1,-1};
Point(3) = {-1, 1,-1};
Point(4) = {-1,-1, 1};
Line(1) = {2,1};
Line(2) = {3,1};
Line(3) = {4,1};
Line(4) = {3,2};
Line(5) = {4,2};
Line(6) = {4,3};
Line Loop(1) = {1,5,3};
Line Loop(2) = {6,5,4};
Line Loop(3) = {2,3,6};
Line Loop(4) = {1,2,4};
Plane Surface(1) = {1};
Plane Surface(2) = {2};
Plane Surface(3) = {3};
Plane Surface(4) = {4};
Surface Loop(1) = {1,2,3,4};
Volume(1) = {1};
Dilate {{0,0,0}, 100/Sqrt(8)} {Volume{1};} // Масштабируем (длина ребра 100)
Rotate {{0,1,0}, {0,0,0}, -Atan(Sqrt(5)/2-0.5)} {Volume{1};} // Разворачиваем
// Остальные 4 тетраэдра
For i In {2:5}
Rotate {{0,0,1}, {0,0,0}, (i-1)*2*Pi/5} {Duplicata{Volume{1};}}
EndFor
// Шар
Sphere(6) = {0,0,0, 64*Sqrt(6)/4};
// Объединение всех объектов
BooleanUnion(7) = {Volume{6}; Delete;} {Volume{1:5}; Delete;};
Код получился немного громоздким в силу того, что среди «готовых» геометрических примитивов нет тетраэдра: его пришлось строить по традиционной для GMSH
идеологии «Точки -> Линии -> Замыкания линий -> Поверхности -> Замыкания поверхностей -> Тела». Если бы мы строили не тетраэдр, а, например, параллелепипед, призму или конус, все это заняло бы лишь одну строчку. Зато есть готовая команда для создания шара и булево объединение.
Язык, конечно, несколько «туповат». Лично мне больше всего не нравится именование примитивов по номерам, ну и общая бедность. С другой стороны, не надо относиться к нему как к языку программирования общего назначения. Для своих функций – описания геометрии не очень сложных объектов (а также последующей работы с ними) этот скриптовый язык вполне годный. Он на самом деле очень простой. На десятке маленьких учебных примеров изучается за пару часов.
В режиме отображения только точек и линий с их номерами получается следующая картина:
Забавно. Наш объект содержит 90 точек, 135 линий, 61 поверхность и одно тело.
После разбиения на конечные элементы второго порядка:
Здесь выполнено сечение объекта инструментом Clipping
, чтобы посмотреть на элементы внутри.
В новой версии также улучшена и ускорена оптимизация разбиения.
Собственно, об основных возможностях GMSG
, связанных с мешенгом, я планировал написать в продолжениях заметки «Механические расчеты конструкций в свободном ПО». Надеюсь, что когда-нибудь дойдут руки. Здесь попытался отметить именно нововведения в версии 3. В целом GMSH
растет. Из «просто мешера» он уверено превращается в полноценную среду для различных конечноэлементных исследований. В сочетании с решателем GetDP
из него теперь вообще можно не вылезать.