среда, 26 апреля 2017 г.

GMSH 3.0

Вероятно, лучший в мире свободный мешер 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 из него теперь вообще можно не вылезать.