Продолжаю тему популярного открытого сеточного генератора. Теперь рассматривается структурированная 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;