GMSH 3D поверхностная сетка

Я безуспешно пытался создать сетку 3D SURFACE с помощью GMSH (v.3.0.6).

Проблема, с которой я столкнулся, заключается в том, что после создания поверхности и генерации сетки, когда я читаю файл .MSH, я получаю странную нумерацию узлов, то есть не все векторы нормалей ориентированы наружу, а некоторые указывают внутрь. Я пытался создать куб и сферу, но всегда сталкивался с одной и той же проблемой.

Ниже представлен файл .GEO, который я создал с помощью графического интерфейса пользователя GMSH для куба.

    // Gmsh project created on Fri Apr 20 17:08:44 2018
//+
Point(1) = {1, 0, 0, 1.0};
//+
Point(2) = {1, 1, 0, 1.0};
//+
Point(3) = {0, 1, 0, 1.0};
//+
Point(4) = {0, 0, 1, 1.0};
//+
Point(5) = {1, 0, 1, 1.0};
//+
Point(6) = {1, 1, 1, 1.0};
//+
Point(7) = {0, 1, 1, 1.0};
//+
Point(8) = {0, 0, 0, 1.0};
//+
Line(1) = {7, 6};
//+
Line(2) = {6, 5};
//+
Line(3) = {5, 1};
//+
Line(4) = {1, 8};
//+
Line(5) = {8, 3};
//+
Line(6) = {3, 7};
//+
Line(7) = {7, 4};
//+
Line(8) = {4, 8};
//+
Line(9) = {4, 5};
//+
Line(10) = {2, 1};
//+
Line(11) = {2, 6};
//+
Line(12) = {2, 3};
//+
Line Loop(1) = {6, 1, -11, 12};
//+
Plane Surface(1) = {1};
//+
Line Loop(2) = {11, 2, 3, -10};
//+
Plane Surface(2) = {2};
//+
Line Loop(3) = {2, -9, -7, 1};
//+
Plane Surface(3) = {3};
//+
Line Loop(4) = {6, 7, 8, 5};
//+
Plane Surface(4) = {4};
//+
Line Loop(5) = {8, -4, -3, -9};
//+
Plane Surface(5) = {5};
//+
Line Loop(6) = {10, 4, 5, -12};
//+
Plane Surface(6) = {6};
//+
Physical Surface(1) = {4, 3, 2, 6};
//+
Physical Surface(2) = {1};
//+
Physical Surface(3) = {5};
//+
Surface Loop(1) = {6, 2, 1, 4, 3, 5};
//+
Volume(1) = {1};

Поскольку я также определяю объем, все нормальные векторы должны указывать ВНЕ. Есть идеи, как я могу это исправить (или так, как мне нужно)?

Всем заранее спасибо,


person Gabs    schedule 16.05.2018    source источник


Ответы (1)


Порядок строк в Line Loop влияет на то, какой нормаль будет использоваться в Surface, созданном из этого Line Loop. Вы либо должны быть последовательны в порядке строк во ВСЕХ своих Line Loops, либо можете поменять порядок для тех, которые вызывают проблемы.

Чтобы нормали указывали наружу, для этого конкретного примера вы можете просто изменить две линии:

Plane Surface(3) = {-3};
Plane Surface(4) = {-4};

Это говорит GMSH инвертировать порядок строк в Line Loop, получая, таким образом, противоположную нормальную.

Для справки, вот общий скорректированный скрипт GMSH, который генерирует сетку с правильными нормалями:

Point(1) = {1, 0, 0, 1.0};
Point(2) = {1, 1, 0, 1.0};
Point(3) = {0, 1, 0, 1.0};
Point(4) = {0, 0, 1, 1.0};
Point(5) = {1, 0, 1, 1.0};
Point(6) = {1, 1, 1, 1.0};
Point(7) = {0, 1, 1, 1.0};
Point(8) = {0, 0, 0, 1.0};
Line(1) = {7, 6};
Line(2) = {6, 5};
Line(3) = {5, 1};
Line(4) = {1, 8};
Line(5) = {8, 3};
Line(6) = {3, 7};
Line(7) = {7, 4};
Line(8) = {4, 8};
Line(9) = {4, 5};
Line(10) = {2, 1};
Line(11) = {2, 6};
Line(12) = {2, 3};
Line Loop(1) = {6, 1, -11, 12};
Plane Surface(1) = {1};
Line Loop(2) = {11, 2, 3, -10};
Plane Surface(2) = {2};
Line Loop(3) = {2, -9, -7, 1};
Plane Surface(3) = {-3};
Line Loop(4) = {6, 7, 8, 5};
Plane Surface(4) = {-4};
Line Loop(5) = {8, -4, -3, -9};
Plane Surface(5) = {5};
Line Loop(6) = {10, 4, 5, -12};
Plane Surface(6) = {6};
Physical Surface(1) = {4, 3, 2, 6};
Physical Surface(2) = {1};
Physical Surface(3) = {5};
Surface Loop(1) = {6, 2, 1, 4, 3, 5};
Volume(1) = {1};
person Anton Menshov    schedule 17.05.2018
comment
@ Гэбс, что ты имеешь в виду? Этого не может быть. Вы изменили свои исходные строки на те, которые имеют знаки минус, сохранив все остальное без изменений? - person Anton Menshov; 18.05.2018
comment
Да, я сделал. Gmsh создает сетку только с четырех сторон куба. - person Gabs; 18.05.2018
comment
@Gabs Я не понимаю, как это могло происходить. Я добавил общий код к своему ответу - ваш с двумя фиксированными знаками - и удалил ненужные строки комментариев. - person Anton Menshov; 18.05.2018
comment
В порядке! Теперь все заработало! Спасибо! Но как я могу установить его автоматически? Я имею в виду, я должен убедиться, что все векторы нормали направлены наружу (и, таким образом, определяют объем). - person Gabs; 18.05.2018
comment
@Gabs вы не можете. Вы должны выбрать / перечислить строки в том же порядке против часовой стрелки, но это очень сложно сделать. Таким образом, вы обычно проверяете сетку на наличие нормалей и исправляете их после. - person Anton Menshov; 18.05.2018