Skip to content
This repository has been archived by the owner on Feb 2, 2022. It is now read-only.

[mesh] snappyHexMesh

Stanislau Stasheuski edited this page Apr 13, 2020 · 9 revisions

Генерация сетки на основе существующей геометрии с помощью snappyHexMesh

Файлы, которые могут пригодиться: OpenFOAM-for-new-users/preProcessing/snappyHexMesh/

Содержание

Для решения проекта (от построения сетки до самого расчёта) в ПК OpenFOAM требуется как минимум две папки: mesh/ и case/. В данном случае присутствует и директория geometry/ .

1 Mesh generation

1.1 Подготовка геометрии

cd mesh/

В OpenFOAM (а в частности, в генераторе сетки snappyHexMesh) в допустимы форматы геометрии:

  • .stl
  • .obj

Таким образом, для генерирования сетки произвольной формы в после их построения в CAD их нужно сохранить (сконвертировать) в допустимых форматах в папку ../geometry.

1.2 Создание фоновой сетки (blockMesh)

cd system/
gedit blockMeshDict &

При генерировании сетки в утилите snappyHexMesh первоначальным этапом является создание фоновой сетки с помощью утилиты blockMesh. Фоновая сетка представляет собой параллелепипед, размеры которого должны быть больше 3D-модели геометрии (см. рисунок). Таким образом в словаре blockMeshDict в vertices()указываются координаты точек 0-7, таким образом, чтобы параллелепипед ограничивал собой расчётную геометрию. С помощью convertToMeters указывается размерность выставляемых координат по отношению к метрам.

alt_text

Порядок расположения точек в словаре blockMeshDict

В blocks ( ):

  • hex (0 1 2 3 4 5 6 7) - порядок чтения точек утилитой точек
  • (10 5 10) - количество ячеек вдоль осей координат: (x z y)
  • simpleGrading (1 1 1) - измельчение сетки вдоль осей координат (отношение вдоль их минимального размера ячейки к максимальному).

Сетка создаваемая с помощью утилиты blockMesh не является основной, а только определяющей максимальные размеры ячеек, поэтому допустимо делать её грубой.

1.2 Настройка загрузки и чтения файлов .stl

Файлы .stl сохраняем в cd ../../geometry .

Для упрощения проведения расчёта рекомендуется разбивать геометрию на несколько разных .stl файлов, в особенности, для поверхностей впуска/выпуска (напр.: inlet.stl, outlet.stl, anyGeometry.stl) - что значительно облегчает задание граничных условий.

cd ../mesh/system
gedit surfaceFeatureExtractDict &

В данном словаре определяется для каждого .stl файла какие поверхности мы хотим использовать как определяющие при удалении внешней/внутренней сетки и каким образом мы их загружаем:

  • extractionMethod - указывает как обрабатывать файл: как объемный ( extractFromFile ) или как поверхностный (extractFromSurface). Рекомендуются настройки по умолчанию.
  • includedAngle – угол между поверхностями для для последующего наложения (измельчения) на них сетки. Больше этого угла поверхности не выбираются.

Словарь сохраняет файлы в формате .eMesh в cd ../mesh/constant/triSurface/ , которые и используются для последующего наложения на них сетки.

1.3 Настройка разбиения и измельчения сетки в словаре snappyHexMeshDict

gedit snappyHexMeshDict &

1.3.1 geometry {...}

Указываются все файлы .stl , с которыми работаем в виде: anyGeometry.stl{...}, где внутри указывается вид конечных элементов, например: type triSurfaceMesh;и название файла (здесь .stl файл можно переименовать или продублировать), к которому будем обращаться в настройках словаря ниже: name anyGeometry;

Также здесь можно указывать указывать объекты для измельчения сетки (refinementRegions) - цилиндры, сферы и проч. - https://www.openfoam.com/documentation/cpp-guide/html/guide-meshing-snappyhexmesh-geometry.html

1.3.2 castellatedMeshControls{...} - настройки разбиения сетки

  • maxGlobalCells – максимальное число ячеек, при достижении которого разбиение прекращается.
  • nCellsBetweenLevels – количество буферных слоев между различными слоями улучшения сетки. nCellsBetweenLevels 1; - нормальное разбиение 2:1, большее число приводит к меньшему измельчению.
  • features(…) – измельчение сетки основанное на гранях. Прямое уточнение измельчения на грани элемента(ов). Определяет степень измельчения для каждой ячейки, пересённой поверхностями опредёнными с помощью surfaceFutureExtractDict (в частности, с помощью includedAngle ).

Так как сути это featureEdgeMesh (сетка на поверхности геометрии), читаемая из ../constant/triSurface , то внутри требуется указать название файлов .eMesh с которыми будет работать подутилита и степень измельчения сетки level:

{
    file "inlet.eMesh";
    level 0;
}

{
    file "any_geometry.eMesh";
    levels ((0.001 3) (0.005 2));
}

level <число>; - указывает степень измельчения сетки прямо на поверхности. 0 - размер ячеек по настройкам из blockMeshDict (без улучшения).

levels ( (<расстояние> <level>) ) – указывает степень измельчения сетки на расстоянии от поверхности.

refinementSurfaces {…} – измельчение сетки по опорным поверхностям.

Вызываются опорные поверхности по именам установленным в geometry {...} (см. 1.3.1), например:

any_geometry { level (0 2); }, где в level (<min> <max>) указывается минимальная и максимальная степени измельчения сетки.

refinementRegions {…} – измельчение сетки по опорным областям (если таковые есть).

Указываются параметры областей для улучшения сетки, созданных в geometry {...} и вызов их по имени определяемом там же (см. 1.3.1), например: yourRegion{...}, где внутри указывается тип разбиения сетки:mode inside; -внутри,mode distance; -на расстоянии от области.

Также должна быть указана степень измельчения (аналогично levels во features(...) ): levels ( (<расстояние> <степень>) );, где в случае измельчение сетки внутри области (mode inside;) <расстояние> игнорируется.

locationInMesh(<x> <y> <z>) – оставляет сетку внутри/вне загруженной геометрии.

Указывается точка внутри/вне геометрии, в зависимости от того в какой области должна быть сетка (внутри/вне геометрии). Не должна лежать на поверхности!

1.3.3 addLayersControls{…} - настройка измельчения сетки

relativeSizes – указывает является ли заданная толщина слоя относительной к неизмельчённой ячейке или абсолютной.

layers{...} – подсловарь содержит входы (названия) для каждого патча, на котором должны применяться слои, и количество требуемых поверхностных слоев ( nSurfaceLayers ).

Имя патча используется, потому что добавление слоев относится к существующей сетке, а не к геометрии поверхности; следовательно, применяется к патчу, а не к области поверхности.

Для определённого патча:

"inlet_.*"
{
    nSurfaceLayers 2;
}

Для всех областей:

"_.*"
{
    nSurfaceLayers 2;
}

Параметры разбиения Существует 4 параметра разбиения пространства на слои expansionRatio, firstLayerThickness, finalLayerThickness, thickness - использовать можно только одовременно два, иначе будет ошибка переопределения.

expansionRatio - коэффициент расширения слоёв (отношение размеров от слоя к слою) firstLayerThickness - толщина ближнего от стенки слоя finalLayerThicknesss - толщина дальнего от стенки слоя thickness - толщина всех слоёв (лучше указывать в совокупности с абсолютными размерами в соответсвии с данными из relativeSizes false) minThickness - минимальная общая толщина всех слоев, меньше которой поверхность не разбивается

1.4 Генерация сетки

cd ../
sh firstMesh.sh

Для генерирования сетки в папке mesh/ располагается несколько скриптов, краткое описание каждого:

firstMesh.sh - скрипт для копирования .stl файлов из ../geometry/Orig/ их масштабирования из м в мм (snappyHexMesh считает геометрию построенную (оразмеренную) на миллиметрах как метры), генерации сетки, сигнала о завершении и вызова paraView.

remesh.sh - скрипт для регенерации сетки по уже созданным файлам в constant/extendedFeatureEdgeMesh и в constant/triSurface .

hardRemesh.sh - скрипт для генерации сетки заново с копированием файлов геометрии из ../geometry/Orig/ .

toPrepareMesh.sh - скрипт, открывающий все файлы для настройки сетки.


2 Solve the case on the snappyHexMesh's mesh

Расчёт на сетке созданной snappyHexMesh (на примере решателя simpleFoam)

Все настройки решателя и граничные условия взяты по умолчанию из: OpenFOAM/tutorials/incompressible/simpleFoam/pitzDaily/

2.1 Особенности решателя simpleFoam

  • Температура
cd ../case/0
gedit transportProperties

Особенностью расчёта является задание температуры через кинематическую вязкость среды. Таким образом, например, температура equation, будет задана как кинематическая вязкость воздуха equation.

  • Давление

Так как плотность постоянна - решатель выдаёт избыточное давление относительно плотности, таким образом:equation

2.2 Решение

cd ../
sh firstRun.sh

Для запуска расчёта в папке case/ располагается несколько скриптов, краткое описание каждого:

firstRun.sh - скрипт для копирования файлов сетки из ../mesh/constant/polyMesh , запуска расчёта, сигнала о завершении и вызова paraView.

hardRerun.sh - скрипт для копирования файлов оригинальных (без каких-либо изменений) начальных условий, копирования файлов сетки заново из ../mesh/constant/polyMesh, запуска расчёта, сигнала о завершении и вызова paraView.

toPrepareCase.sh - скрипт, открывающий все файлы для настройки решателя.

Для простого перезапуска расчёта в Терминале ввести:

simpleFoam
postProcess -func "patchAverage(p,name=inlet)" -latestTime
paraview case.foam &

Таким образом были получены поля скоростей и давлений:

alt_text alt_text

Полезные ссылки

  1. Утилита snappyHexMesh 📖

<- К предыдущему разделу

Clone this wiki locally