Продолжаю тему популярного открытого сеточного генератора. Теперь рассматривается структурированная 2D сетка в Gmsh. Вот такая:

Структурированная 2D сетка в Gmsh: О скрипте
Когда Вы работаете в Gmsh, команды графического интерфейса, относящиеся к созданию геометрии, записываются в скрипт в виде вызовов функций. Это текстовый файл. Он имеет расширение «geo». Имя файла скрипта указывается в заголовке окна.

Поскольку графический интерфейс программы Gmsh оставляет желать лучшего, для создания сетки иногда проще работать со скриптом. Разумеется, можно работать в GUI и смотреть на то, какой получается скрипт и как-то его модифицировать при необходимости. В следующем параграфе, при разборе скрипта я пишу и вызов функции и соответствующую команду в GUI.
Есть три важные команды по управлению скриптом:

- Reload script — стереть всю геометрию и прочитать снова файл скрипта.
- Remove last script command — отмена (удаление) последней добавленной в скрипт строчки.
- Edit script — открыть скрипт в блокноте.
Текст скрипта
Point(1) = {0, 0, 0, 1.0};
Point(2) = {0, 0.5, 0, 1.0};
Point(3) = {1, 0.5, 0, 1.0};
Point(4) = {1, -0, 0, 1.0};
Point(5) = {0.5, 0.25, 0, 1.0};
Point(6) = {0.4, 0.3, 0, 1.0};
Point(7) = {0.6, 0.3, 0, 1.0};
Point(8) = {0.6, 0.2, 0, 1.0};
Point(9) = {0.4, 0.2, 0, 1.0};
//+
Circle(1) = {9, 5, 6};
Circle(2) = {6, 5, 7};
Circle(3) = {7, 5, 8};
Circle(4) = {8, 5, 9};
//+
Line(5) = {1, 2};
Line(6) = {2, 3};
Line(7) = {3, 4};
Line(8) = {4, 1};
Line(9) = {6, 2};
Line(10) = {7, 3};
Line(11) = {8, 4};
Line(12) = {1, 9};
//+
Transfinite Line {2} = 10 Using Progression 1;
Transfinite Line {4} = 10 Using Progression 1;
Transfinite Line {8} = 10 Using Progression 1;
Transfinite Line {6} = 10 Using Progression 1;
Transfinite Line {10} = 10 Using Progression 1;
Transfinite Line {11} = 10 Using Progression 1;
Transfinite Line {12} = 10 Using Progression 1;
Transfinite Line {9} = 10 Using Progression 1;
Transfinite Line {1} = 5 Using Progression 1;
Transfinite Line {3} = 5 Using Progression 1;
Transfinite Line {7} = 5 Using Progression 1;
Transfinite Line {5} = 5 Using Progression 1;
//+
Line Loop(1) = {9, -5, 12, 1};
Plane Surface(1) = {1};
Line Loop(2) = {2, 10, -6, -9};
Plane Surface(2) = {2};
Line Loop(3) = {10, 7, -11, -3};
Plane Surface(3) = {3};
Line Loop(4) = {11, 8, 12, -4};
Plane Surface(4) = {4};
//+
Transfinite Surface {1};
Transfinite Surface {2};
Transfinite Surface {3};
Transfinite Surface {4};
//+
Physical Line("left") = {5};
Physical Line("right") = {7};
Physical Line("top") = {6};
Physical Line("bottom") = {8};
Physical Surface("internal") = {2, 3, 4, 1};
Посмотрев на скрипт, важно заметить следующее. При создании геометрии, сначала создаются точки с помощью функции Point(). Одноименный пункт есть в дереве модуля Geometry. Далее, по точкам создаются дуги окружности при помощи функции Circle(). Этому вызову соответствует пункт Circle arc в дереве модуля Geometry. Потом создаются линии Line() соответствует Straight line в GUI.
С функцией Transfinite() интереснее. Она находится в модуле Mesh -> Define -> Transfinite. В частности, Transfinite Line() задает разбиение на линиях. О трансфинитной интерполяции см. книгу А.М. Молчанов, М.А. Щербаков, Д.С. Янышев, М.Ю. Куприков, Л.В. Быков — «Построение сеток в задачах авиационной и космической техники» 2013 г., стр 41. Есть тут.
Далее следуют пары вызовов Line loop() и Plane surface(). Это создаются поверхности для построения двумерной сетки. В GUI каждой паре соответствует вызов одной команды Plane surface из модуля Geometry.
Transfinite surface устанавливает поверхность для трансфинитного построения сетки.
В заключение при помощи функций Physical Line() создаются регионы для обозначения внутренних элементов и задания граничных условий. В графическом интерфейсе это модуль Geometry: Physical groups -> Add
Два слеша — комментарий.
Скачать
Если открываете скрипт (geo) в Gmsh, то сетка не появится. Появится только геометрия. Сетку надо строить вызовом узла «2D» в модуле Mesh, также следует вызвать «Recombine 2D», чтобы сетка стала не только структурированной, но ещё и состоящей из четырехугольников.



Thanks for the post!
Do you know if it possible to use Recombine 2D in the script text, to automatic mesh and recombine a mesh file?
For the script given here you can try adding this after the last line:
Recombine Surface {1, 2, 3, 4};
Mesh 2;