вторник, 20 декабря 2011 г.

Gmsh. Новые команды

Пусть название поста вас не смущает - сегодня я хотел написать об интересных командах, которые я открыл для себя недавно. То есть речь пойдет о новых для меня командах, а не о том, что разработчики Gmsh'а предложили что-то свеженькое. Поэтому, вполне возможно, вы с такими командами уже сталкивались, а значит, они для вас совсем не новые. Чтобы не заставлять вас зазря читать весь пост целиком, приведу список этих команд прямо сейчас:

Point In Surface;
Line In Surface;

Ну а теперь, пожалуй, начнем.
Начнем с того, где эти команды полезно использовать. Поэтому сразу обратимся к примеру.
Пусть необходимо построить сетку в области, представляющей собой шар, вписанный в куб. Мы уже работали с похожей моделью ранее. Однако тогда диаметр шара не совпадал со стороной куба. Теперь совпадает, и это, на первый взгляд, незначительное обстоятельство, приведет нас либо к большим фантазиям с геометрией, либо к использованию новых команд. Наша новая модель в проекции выглядит так (код соответствующего .geo файла можно скачать отсюда):
Попробовав построить тетраэдральную сетку, вы получите следующее
Как вы видите, тетраэдральная сетка построилась только в шаре. Все, что "отсеклось" шаром от куба, имеет только поверхностную сетку. Кстати, Gmsh версии 4.2.4 просто промолчит об этом, в то время, как Gmsh 2.5.0 выдаст кучу ошибок о пересекающихся элементах (тем не менее, результат они выдают одинаковый). Наличие ошибок очевидно, ведь мы пересекаем поверхности шара и куба в 6-ти точках, но ничего не говорим об этом Gmsh'у. То, что эти 6 точек принадлежат поверхности шара, мы явно указываем в .geo файле. Поэтому внутри шара Gmsh спокойно строит тетраэдральную сетку. Чтобы сетка появилась и в остальной области, необходимо эти 6 точек привязать к соответствующим граням куба. И здесь, как я уже говорил, как минимум, 2 варианта: первый - создать дополнительные линии, проходящие через эти точки (например, диагонали каждой грани), или применить еще какие-нибудь уловки с геометрией; второй - команда Point In Surface. Конечно же мы пойдем по второму пути. Интерфейс этой команды такой:

Point{номера точек} In Surface{номер поверхности};

Добавив несколько строк в .geo файл (который вы можете скачать здесь), получим ожидаемый результат

Ну и чтобы два раза не вставать, потрогаем схожую команду Line In Surface. Я думаю, когда вы столкнетесь с подходящей задачей, вы обязательно вспомните об этой команде, поэтому сейчас мы ее рассмотрим на очень простом нежизненном примере. Хотя, кто знает, может над решением именно этой проблемы вы сейчас и бьетесь.
Пусть имеется область
полученная с помощью следующего скрипта:

cl = 0.2;
cl2 = 0.1;
Point(1) = { 0, 0, 0, cl };
Point(2) = { 1, 0, 0, cl };
Point(3) = { 1, 1, 0, cl };
Point(4) = { 0, 1, 0, cl };
Point(5) = { 0.3, 0.5, 0, cl2 };
Point(6) = { 0.7, 0.5, 0, cl2 };
Line(1) = { 1, 2 };
Line(2) = { 2, 3 };
Line(3) = { 3, 4 };
Line(4) = { 4, 1 };
Line(5) = { 5, 6 };
Line Loop(11) = { 1, 2, 3, 4 };
Plane Surface(1) = { 11 };

Построенная в результате работы Gmsh'а сетка не будет согласована с линией:
Добавим в конец скрипта строку

Line{5} In Surface{1};

и теперь у нас все замечательно:

Примечание! В мануале Gmsh'а говорится, что "встраиваемые" линии работают только для алгоритма MeshAdapt 2D. Тем не менее, эксперименты показали, что для приведенной выше модели, все три алгоритма (MeshAdapt, Delaunay, Frontal) работают правильно (проверялось в Gmsh 2.4.2 и 2.5.0).

2 комментария: