Перейти к статье

 

Измельчение сетки

В Fidesys имеются возможности конформного измельчения существующей сетки - как глобально, т.е. в пределах всей модели, так и локально - в отдельных ее областях. Измельчение выполняется путем уменьшения размеров элементов и сопровождается увеличением их числа. При локальном измельчении в сетку включаются элементы для перехода от одной плотности к другой. Ниже рассматриваются следующие способы измельчения:

Глобальное измельчение сетки

При глобальном измельчении обработке подвергается вся сетка, существующая на поверхности или в объеме:

refine surface <range>numsplit<int>

refine volume <range>numsplit<int>

Глобальное измельчение выполняется, если в команде указан геометрический объект целиком. В противном случае команда будет интерпретирована как локальное измельчение (см. ниже). Отличия могут быть значительными, поскольку алгоритм глобального измельчения разбивает каждый элемент существующей сетки на меньшее число подэлементов, чем это делается при локальном измельчении.

Параметр numsplit определяет, сколько раз производится разбиение элемента. Например, значение 1 соответствует однократному разбиению каждого треугольника и прямоугольника на четыре части, а каждого тетраэдра и гексаэдра на 8 частей (см. Рис. 1); при значении 2 разбиение является двукратным и т.д.

Исходная сетка

numsplit = 1

numsplit = 2

Исходная сетка

numsplit = 1

numsplit = 2

Исходная сетка

numsplit = 1

numsplit = 2

Исходная сетка

numsplit = 1

numsplit = 2

Рис. 1 - Примеры глобального измельчения сетки

Измельчение сетки около геометрических или сеточных особенностей

Измельчение отдельных элементов, групп элементов или других сеточных объектов, расположенных около геометрических или сеточных особенностей, возможно с помощью следующих команд:

refine {node | edge | tri | face | tet | hex} <range> [numsplit <int = 1> | size <double> [bias <double>]] [depth <int> | radius <double>] [sizing_function] [smooth]

refine {vertex | curve | surface} <range> [numsplit <int = 1> | size <double> [bias <double>]] [depth <int> | radius <double>] [sizing_function] [smooth]

Для использования этих команд сначала следует выбрать геометрические или сеточные объекты, представляющие особенность, около которой предполагается выполнить измельчение сетки. Измельчение будет распространяться на все ассоциированные или близко расположенные сеточные объекты. Если ввести ключевое слово all, то будет произведено измельчение всех элементов в модели. Другие опции (параметры команд) описываются ниже.

Параметр numsplit.

Этот параметр задает (как и ранее) число разбиений каждого элемента в области измельчения сетки. В общем случае число элементов, получаемых в результате разбиения, определяется по формуле:

NE = NI × E^numsplit,

где NI - исходное число элементов; E - число частей, на которые разбивается элемент (4 в случае 2D или 8 в случае 3D).

Элементы, расположенные в пограничной зоне между измельчаемой и неизмельчаемой областями сетки, разбиваются так, чтобы осуществить переход от одной плотности сетки к другой. При этом учитываются геометрические характеристики и окружающие элементы. Например, гексаэдр при numsplit = 1 разбивается на 27 частей (E = 27) вместо 8. Это обеспечивает большую гибкость перехода от измельчаемой области к неизменяемой части модели.

Параметры size и bias.

Эти параметры могут быть полезны, когда в определенном месте требуется наличие элементов заданного размера, или при локальном измельчении сетки вблизи вершины или кривой. Использование bias вместе с size помогает определить скорость изменения размеров элементов, чтобы удовлетворить параметрам существующей сетки. Рис. 2 иллюстрирует такую ситуацию, связанную со сгущением сетки у вершины. Вводимые значения bias больше 1,0; они представляют максимальное изменение размеров элементов от одного концентрического слоя к другому. Поскольку измельчение является дискретной операцией, вводимые значения size и bias рассматриваются как желаемые, но приближенные. Это может вызывать видимые нарушения непрерывности в размерах элементов. Эффект можно уменьшить путем сглаживания (параметр smooth). Следует отметить, что опция size исключает применение параметра numsplit. Возможно задание либо numsplit, либо size, но не одновременно.

Исходная сетка

bias = 2,0

bias = 1,5

Рис. 2 - Пример использования параметров size и bias при измельчении сетки у вершины.

Параметр depth.

С помощью этого параметра определяется, на какую глубину от рассматриваемой особенности (в виде числа слоев элементов) должно распространяться измельчение сетки. Значение по умолчанию равно 1. На Рис. 3 показан пример использования параметра depth при измельчении сетки вокруг  узла.

Исходная сетка

depth = 1

depth = 2

Рис. 3 - Пример использования параметра depth при измельчении сетки вокруг узла

Параметр radius.

Вместо определения числа слоев элементов, подвергаемых измельчению около особенности, можно ввести радиус области измельчения. Эффект будет похожим на Рис. 3, за исключением того, что измельчение затронет и элементы, центры которых попадают в указанную область.

Параметр sizing function.

Управлять измельчением сетки можно и с помощью размерной функции. Обычно размерные функции используются для регулирования локальной плотности сетки; при этом применимы различные настройки. Для использования параметра sizing function следует вначале определить размерную функцию на поверхности или в объеме, где планируется измельчение сетки. Необходимую информацию можно найти в подразделе Адаптивность сетки и функции, определяющие размер элементов.

Параметр smooth.

По умолчанию после разбиения исходной сетки на более мелкие элементы сглаживание НЕ производится. Однако, если оно необходимо для улучшения качества, параметр smooth обеспечивает такую возможность.

Управление регулярностью при измельчении треугольников

При измельчении треугольных элементов по умолчанию осуществляется попытка достичь максимального качества, используя шаблон разбиения одного элемента на четыре части (см. Рис. 1). Иногда это может приводить к сетке нерегулярного вида, в которой ребра переставлены местами. Чтобы улучшить регулярность измельчения треугольников без учета качества, можно использовать следующую команду настройки:

set triangle refine regular {on | OFF}

Измельчение гексаэдральных элементов

Для сетки из гексаэдров есть несколько вариантов измельчения; возможно использовать и ряд способов для отображения результатов:

Измельчение около геометрической особенности

Существующая сетка из гексаэдральных элементов может быть подвергнута измельчению около определенной геометрической особенности с помощью команды:

refine mesh volume <ID> feature {surface | curve | vertex | node} <ID_range> interval <integer>

Измельчение сетки производится путем добавления слоев гексаэдров. Эти слои могут обобщенно рассматриваться как плоскости для поверхностей, цилиндры для кривых и сферы для вершин. Параметр interval определяет число интервалов, отсчитываемых от особенности, после которого должен быть добавлен слой гексаэдров. По приведенной выше команде в сетку вставляется единственный новый слой.

На Рис. 4 показан пример, когда особенность, около которой должно быть выполнено измельчение сетки, представляет собой кривую, а значение параметра interval равно 2.

Рис. 4 - Пример измельчения сетки из гексаэдров около особенности в виде кривой

Измельчение по определенному пути

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

refine mesh start node <ID> direction edge <ID> end node <ID> [smooth]

На Рис. 5 представлена в качестве примера сетка, сгенерированная по схеме Протяжка. На поперечном сечении сетки (слева) показан путь измельчения, ведущий от начального узла (start node <ID>) к конечному (end node <ID>). Путь задан направляющим ребром (direction edge <ID>) и проходит вдоль других ребер. Начальный и конечный узлы должны лежать в одном и том же слое элементов. При использовании в команде параметра smooth сетка после измельчения подвергается сглаживанию.

Рис. 5 - Пример измельчения сетки из гексаэдров по определенному пути

Измельчение определенных слоев элементов

Для измельчения одного или нескольких слоев гексаэдральных элементов применима команда:

refine mesh sheet [intersect] {node <ID_1> <ID_2> | edge <ID_range>} {factor <double> | greater_than <size>} [smooth] [in volume <ID_range> [depth <num_layers]]

Параметры node и edge используются для определения слоя (или слоев), подлежащих измельчению. В случае параметра node слой определяется парой вводимых узлов (см. Рис. 6). При указании edge можно определить несколько слоев с помощью соответствующих ребер (см. Рис. 7).

Посредством параметров factor и greater_than задаются условия измельчения выбранного слоя гексаэдров. Так значение параметра factor является множителем при определении нижнего порога для ребер, подвергаемых измельчению (он равен длине наименьшего ребра, умноженной на это значение). Значение параметра greater_than задает нижний порог длины измельчаемых ребер непосредственно.

Рис. 6 - Применение команды refine mesh sheet node 796 782 greater_than 6

Рис. 7 - Применение команды refine mesh sheet edge 1584 1564 1533 1502 1471 greater_than 6

Опция intersect предусмотрена, чтобы упростить определение множества слоев гексаэдров, подлежащих измельчению. В случае его использования параметры node и edge определяют не слой элементов, а хорду (двумерный эквивалент трехмерного слоя). Все слои элементов, пересекающие поверхность, которая соответствует хорде и ассоциирована с узлами или ребрами, указанными посредством node и edge, будут измельчаться (см. Рис. 8). Узлы, вводимые посредством node, должны определять ребро на поверхности сетки.

Рис. 8 - Применение команды refine mesh sheet intersect edge 1499 greater_than 6

Параметр smooth так же представляет собой опцию. В случае его использования в команде элементы, которые были измельчены, подвергаются сглаживанию ля улучшения  качества сетки. На Рис. 9 представлено применение той же команды, что и на Рис. 8, но с добавлением опции smooth. Сглаживание может быть полезным в зависимости от конкретной ситуации.

Рис. 9 - Применение команды refine mesh sheet intersect edge 1499 greater_than 6 smooth

Измельчение в определенном направлении

Измельчение объемной сетки возможно в определенном направлении, что может оказаться при решении задач с  анизотропией. Для такого направленного измельчения служит команда:

refine volumes <ID_range> using {plane <options> | surface <ID_range> | curve <ID_range>} [depth <num_layers>] [smooth]

Посредством задания объемов определяются гексаэдры, подлежащие измельчению. Из элементов, окружающих заданные объемы, формируются слои перехода от одной плотности сетки к другой. При использовании параметра depth в измельчаемую область сетки включается соответствующее число слоев гексаэдров (<num_layers>). Если после ключевого слова using указывается параметр plane, то все ребра в объеме, которые параллельны (с некоторым допуском) выбранной плоскости, используются для определения измельчаемых слоев (выбор плоскости осуществляется согласно одной из предусмотренных опций <options>). Если после using стоит surface или curve, то используются все ребра указанных поверхностей или кривых.

На Рис. 10 показана исходная сетка из гексаэдров, которую предполагается измельчить в направлении оси X. На Рис. 11 представлен результат преобразования этой сетки с помощью команды:

refine vol 2 using plane xplane depth 1

Рис. 10 - Исходная сетка

Рис. 11 - Сетка, полученная с помощью команды refine vol 2 using plane xplane depth 1

Измельчение в определенном направлении может проводиться путем ряда итераций, чтобы уменьшить или, наоборот, создать анизотропию желаемого уровня. Пример первой итерации дан выше (см. Рис. 11). Вторая итерация осуществляется путем повторения той же команды. Однако, для улучшения качества элементов рекомендуется перед следующей итераций выполнить измельчение гексаэдров другим способом. Например, сетку, показанную на Рис. 11, можно преобразовать в сетку, представленную на Рис. 12, с помощью следующих двух команд:

refine mesh sheet edge (at 4.5 5 5 ordinal 1) factor 0

refine vol 2 using plane xplane depth 1

Рис. 12 - Вторая итерация измельчения сетки в определенном направлении

Отображение слоев гексаэдров

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

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

draw sheet {edge <ID> |node <ID_1> <ID_2>} [mesh [list]] [color <color_name>] [gradient]

Следующая команда отображает заданный гексаэдр с помощью трех граней, окрашенных в зеленый, желтый и красный цвета:

draw sheet hex <ID> [green] [yellow] [red] [mesh [list]] [gradient]

Параметр mesh, используемый в обеих командах, обеспечивает отображение слоя гексаэдров как элементов сетки. Если указывается ключевое слово list, то выводятся идентификаторы гексаэдров. Ключевое слово gradient дает изображение в градиентной заливке в соответствии с расстоянием между противоположными гранями слоя.

Локальное измельчение тетраэдров, треугольников и ребер

Локальное измельчение тетраэдров, треугольников и ребер возможно:

Локальное измельчение отдельных объектов

При измельчении треугольного элемента в его центр вставляется новый узел и в этом узле соединяются три образуемых более мелких треугольника. Исходный элемент удаляется. Соответствующая команда имеет вид:

refine local tri <tri_ID_list>

При измельчении ребер, проводимом для треугольных элементов, новый узел помещается на ребре между треугольниками и таким образом создаются 4 новых треугольника. Команда выглядит следующим образом:

refine local edge <edge_ID>

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

refine tet_edge node <node1_ID> <node2_ID>

Локальное измельчение путем создания желаемого числа тетраэдров по толщине

При таком способе измельчения пользователь задает геометрический или сеточный объект и желаемое число элементов по его толщине. Алгоритм измельчения работает, пока не будет достигнуто это число, которое интерпретируется как минимальное требуемое число ребер сетки в направлении толщины. Алгоритм запускается командой:

refine min_through_thickness <val> source {surface | node | tri | nodeset | sideset | block} <ID_range> target {surface | node | tri | nodeset | sideset | block} <ID_range> [anisotropic] [single_iteration] [dont_fill_in_gaps]

Значение некоторых опций этой команды следующее:

anisotropic - указание производить измельчение только тех ребер, которые располагаются примерно по нормали к начальному и конечному объектам; сетки на этих объектах в общем случае не изменяются; при отсутствии этой опции алгоритм измельчает элементы изотропным образом и обеспечивает хорошие переходы между измельчаемой областью и другими частями модели;

dont_fill_in_gaps - указание НЕ увеличивать области измельчения сетки (иногда их увеличение позволяет избежать появления небольших зон не измельченной сетки - неравномерностей или "пятен");

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

Параллельное измельчение

Глобальное измельчение сетки может проводиться с целью общего увеличения ее плотности посредством одной команды. Если требуется чрезвычайно большая сетка, то возможным подходом к ее построению является генерация вначале грубой сетки с относительной градацией плотности, отвечающей желаемому распределению, а затем глобальное измельчение сетки с масштабным увеличением числа элементов в пределах всей модели. В зависимости от необходимой степени измельчения возможно превышение объема доступной памяти одного процессора. Глобальное параллельное измельчение сетки позволяет выйти за пределы памяти одного процессора и выполнять обработку, учитывая только ограничения, накладываемые доступном числом процессоров. Команда параллельного измельчения имеет следующий вид:

refine parallel [fileroot <'root filename'>] [overwrite] [no_geom] [no_execute] [processors <int>] [numsplit <int>] [version <'sierra version'>]

При выполнении этой команды производится запись на диск двух файлов. Один из них - файл в формате Exodus с именем <root filename>, который содержит элементы сетки для текущей сессии Fidesys. Вторым является файл в формате OpenNURBS 3DM (см. http://www.opennurbs.org) с именем *.3dm, содержащий геометрические объекты для текущей сессии. Параметр fileroot определяет полный путь к записываемым файлам и корень для их наименования. Дополнительные блоки записываются в файл Exodus так, что они соответствуют геометрическим объектам, записанным в файл 3dm. С помощью опции overwrite указывается, должны ли перезаписываться на диск существующие файлы с одинаковыми именами.

Если сетка подвергается измельчению программой STK_Adapt, то создаваемые новые узлы проецируются на геометрические объекты, содержащиеся в файле OpenNURBS. При использовании опции no_geom записывается только файл Exodus, а вновь создаваемые узлы располагаются согласно оценкам координат, выполняемым на основе функций форм элементов.

Экспортируемые файлы Exodus и OpenNURBS предназначены для ввода в программу Sierra STK_Adapt. По умолчанию Fidesys запускает STK_Adapt в фоновом режиме после экспорта файлов. Если указана опция no_execute, то Fidesys выполняет экспорт файлов, но не запускает STK_Adapt. Пользователь может использовать эти файлы впоследствии, при запуске STK_Adapt на большой параллельной вычислительной машине.

При запуске STK_Adapt в фоновом режиме (в случае отсутствия no_execute) параметр processors определяет число доступных процессоров. Параметр numsplit задает, сколько раз должно производиться разбиение каждого элемента при измельчении. Если numsplit = 1, то каждое ребро элемента разбивается на 2 подребра. При numsplit = 2 каждое ребро разбивается на 4 подребра и т.д. С помощью параметра version указывается версия STK_Adapt, которую следует запускать. Возможные значения этого параметра: head, 4.22.0 и т.п.

Команда refine parallel создает группы для отображения связи между сеточными объектами (ребрами, треугольниками и четырехугольниками) с одной стороны и геометрическими объектами (кривыми и поверхностями) с другой. Имеются три типа групп для каждого сеточного объекта. Первая группа содержит соотношения между сеточными и геометрическими объектами "один в один". Вторая группа включает сеточные объекты, указывающие на несколько геометрических объектов. В третью группу помещаются сеточные объекты, не ассоциированные ни с одним геометрическим объектом.

После завершения измельчения по команде refine parallel сетка не изменяется, потому что результат измельчения слишком велик для сохранения на одном процессоре. Вместо этого измельченная сетка записывается на диск в виде последовательности файлов Exodus, по одному на процессор, используя значение параметра fileroot (<'root filename'>) как корень для имен файлов. Например, если в качестве значения fileroot задано ‘somemesh’, а в качестве значения processors - 8, то STK_Adapt запишет 8 файлов Exodus с именами somemesh.e.8.0, somemesh.e.8.1, ... somemesh.e.8.7. Эти файлы могут сохраняться распределенно (в целях последующего использования) или могут быть объединены командой Sierra EPU.

Масштабное увеличение числа элементов сетки

Описываемая ниже команда реализует еще один способ глобального увеличения числа элементов сетки, но он применим только для гексаэдральных элементов. Благодаря этому способу пользователь имеет больше возможностей для управления плотностью результирующей сетки. Уже рассмотренные команды глобального измельчения требовали задания параметра numsplit, согласно значению которого каждое ребро сетки разбивалось бы на 2 или 3 части. В результате такого глобального измельчения число элементов сетки возрастет в степенной зависимости с соответствующим показателем степени.

В противовес этому возможно масштабное увеличение числа элементов сетки с определенным вводимым множителем:

scale mesh {multiplier <double> [minimum <int>] | add_interval <int>}

Из-за дискретности числа элементов и его зависимости от геометрии, увеличение происходит с множителем, немного большим вводимого значения параметра multiplier. Например, в результате выполнения команд:

bri x 10

mesh vol all

создается сетка из 1000 элементов. Команда масштабного увеличения числа элементов:

scale mesh multiplier 2.5

увеличивает их количество до значения, немного большего 2500. Если же вместо масштабного увеличения использовать глобального измельчения:

refine vol all,

то результатом была бы сетка, содержащая 8000 элементов. Таким образом, при масштабном увеличении (с помощью команды scale mesh) обеспечивается существенно лучшее регулирование числа элементов.