среда, 10 августа 2011 г.

Триангуляция сложных моделей

Хорошие генераторы сеток, такие как Gmsh и Netgen, не являются хорошими CAD (computer-aided design) системами. Я думаю, это очевидно. Тем более, что они и не стремятся, т.к. предназначены совсем для других вещей. Тем не менее, и Gmsh, и Netgen обладают некоторыми способностями по созданию более-менее сложных моделей. Gmsh имеет встроенный язык, довольно богатый и позволяющий задать геометрию с самого нижнего уровня (с точек), однако лишенный такого важного качества, как, например, булевы операции над фигурами. Netgen не имеет встроенного языка как такового, однако имеет собственный формат входного файла, в котором можно задать геометрию. Этот формат называется CSG (constructive solid geometry). Он позволяет задавать геометрию несложных моделей, за счет определения примитивов и некоторых булевых операций над ними. Как вы понимаете, и Gmsh, и Netgen имеют некоторые преимущества друг перед другом в части задания геометрии. Но что делать, если нужно сгенерировать сетку в области, сложнее, чем шар или куб?
В этом случае на помощь придет библиотека OpenCASCADE (OCC или OCCT - OpenCASCADE Technology). И Gmsh, и Netgen поддерживают OCC модели. А на основе OpenCASCADE построено множество современных CAD систем. Таким образом, построение сетки в сложной области сводится к использованию стороннего пакета для определения геометрии и экспорту этой модели в формате .BRep (родной формат OpenCASCADE) или .STEP в одну из названных программ-триангуляторов.
Естественно, мы будем рассматривать только бесплатные CAD программы. Я очень надеюсь, что список таких программ будет увеличиваться моими (и вашими!) усилиями.

OpenCASCADE Это сама библиотека. На сайте можно скачать исходники с документацией. Там же есть действующий форум, т.е. на нем реально получить быстрый, хороший ответ. На сайте также можно найти подробный пример по заданию довольно сложной геометрии, которую точно не осилят ни Gmsh, ни Netgen. Родной формат, в котором импортируются модели - это BRep (boundary represantation).
Salome Организация, разрабатывающая библиотеку OpenCASCADE, выпускает также и CAE продукт. Это, конечно, огромная программа, предназначенная не только для задания геометрии, но и для много другого. В ней, кстати, есть и встроенный генератор сетки.
FreeCAD Отличная CAD программа, основанная на OCCT, с превосходной документацией и форумом. Очень понравилось с ней работать. А особенно решать возникающие вопросы на форуме. Как будто общаешься с разработчиком, который сидит в соседней комнате.

Честно говоря, на этом мой практический опыт использования CAD систем для переноса сложных моделей в Gmsh и Netgen заканчивается. Однако, чтобы обзор хотя бы изначально получился мало-мальски приличным, добавлю программы, найденные здесь:

BRL-CAD
PythonCAD
BlenderCAD
Archimedes
OpenSCAD

Возможно, не все представленные в этом списке программы основаны на OpenCASCADE и не выдают модели в формате .BRep или .STEP. В этом случае полезно посмотреть программу CAD Exchanger, которая преобразует многие форматы в те, которые прочитает потом Gmsh или Netgen.
Для загрузки модели в формате .BRep/.STEP в Gmsh никаких телодвижений совершать не нужно. Просто:

gmsh model.brep

Хотя может случиться, что вы свою модель не увидите. Так бывает, если Gmsh определит ребра и грани вашей модели слишком мелкими для отображения. Чтобы этого избежать, отключите опции Remove small edges from OpenCascade models и Remove small faces from OpenCascade models в меню Options -> Geometry -> General (см. рисунок), а затем загрузите свою модель заново. Чтобы при загрузке новой модели вам не потребовалось заново отключать эти опции, сохраните настройки для локального компьютера, на котором вы работаете. Напомню, что сделать это можно в меню File -> Save Default Options.
Однако если вы хотите что-либо изменить - например, добавить объем или измельчить сетку, необходимо присоединить модель с помощью команды Merge в .geo файле:

Merge "model.brep";
Geometry.OCCFixSmallEdges=0; // аналог опции Remove small edges из GUI
Geometry.OCCFixSmallFaces=0; // аналог опции Remove small faces из GUI
Mesh.CharacteristicLengthFactor = 0.5;

Комментариев нет:

Отправить комментарий