Первая страница
В данной статье описывается расчет течения в каверне. Описание данного расчета приводится в главе 2 руководства пользователя OpenFOAM 1.7.1. В каждой статье будет описываться задача: физическая постановка задачи, геометрия расчетной области, начальные и граничные условия, описание решаемых уравнений.
Все примеры находятся в обучающей директории OpenFOAM, которую можно создать на основе инсталляции программы следующими командами:
mkdir –p $FOAM_RUN
где $FOAM_RUN – наименование папки, где будут храниться обучающие программы. Например, это может быть папка LinuxOpenFOAM-1.7.1 в директории OpenFOAM-1.7.1
Обучающие программы можно затем скопировать в эту папку с помощью команды:
cp –r $FOAM_TUTORIALS/* $FOAM_RUN
Течение несжимаемой жидкости в каверне.
Геометрия расчетной области показана на рис.2.1

Рисунок 2.1: Геометрия расчетной области задачи
Область состоит из квадрата со стороной 0.1 м, 3 границы которого неподвижны, верхняя граница движется со скоростью Ux=1 м/с. Изучим возможные физические и расчетные случаи решения данной задачи.
Пользователь должен перейти в каталог cavity, командой:
cd $FOAM _RUN/tutorials/incompressible/icoFoam/cavity
Исходные данные для каждой задачи в OpenFOAM хранятся в различных файлах. Для редактирования этих файлов можно использовать любой текстовый редактор, например Emacs, VI, Gedit, Кейт, Nedit и т.д..
В OpenFOAM используется 3мерная декартова система координат. Чтобы решать задачу в 2х измерениях необходимо задать «пустые» граничные условия в направлении z. Будем решать задачу в дверной постановке. Область делится равномерной сеткой размерности 20х20 Структура разбиения показана на рисунке 2.2:

Рисунок 2.2: Структура сетки.
Файл содержащий узлы сетки генерируется командой blockMesh. Входные параметры для команды находятся в папке Polymesh в файле blockMeshDict. Которые состоит из следующих разделов:
Заголовок файла:
1 /*--------------------------------*- C++ -*----------------------------------*\
2 | ========= | |
3 | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
4 | \\ / O peration | Version: 1.7.1 |
5 | \\ / A nd | Web: www.OpenFOAM.org |
6 | \\/ M anipulation | |
7 \*---------------------------------------------------------------------------*/
8 FoamFile
9 {
10 version 2.0;
11 format ascii;
12 class dictionary;
13 object blockMeshDict;
14 }
15 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Коэффициент масштабирования
17 convertToMeters 0.1;
Список координат вершин исследуемой области. На рис.2.2. они обозначены числами 0-7.
19 vertices
20 (
21 (0 0 0) // Вершина с номером 0
22 (1 0 0) // Вершина с номером 1
23 (1 1 0) // Вершина с номером 2
24 (0 1 0) // Вершина с номером 3
25 (0 0 0.1) // Вершина с номером 4
26 (1 0 0.1) // Вершина с номером 5
27 (1 1 0.1) // Вершина с номером 6
28 (0 1 0.1) // Вершина с номером 7
29 );
Список блоков, из которых состоит расчетная область. В данной задаче рассматриваем только один блок. Запись состоит из 3 частей. Первая часть состоит из номеров вершин данного блока. Эта часть всегда является шестигранником. Порядок этих номеров показан на рис. 2.2. Вторая запись показывает сколько точек разбиения задается в каждом направлении (направления x, y и z). В частности данная запись задает размерность задачи. Для более точного решения данной задачи можно заменить эту запись на следующую: (40 40 1). При этом шаг по времени должен быть уменьшен в 2 раза (см.ниже). Третья запись задает коэффициент расширения ячейки для каждого направления в блоке. Есть два вида расширения: упрощенный simpleGrading с 3мя параметрами (1, 2, 3), и сложный edgeGrading с параметрами расширения для каждого ребра блока. Значение определяет отношение между начальной и конечной ячейкой на грани. То есть отношение первого интервал к последнему будет равно значению описанному в simpleGrading или edgeGrading. Например, записи simpleGrading (1 2 3) и edgeGrading (1 1 1 1 2 2 2 2 3 3 3 3) будут равнозначными.
31 blocks
32 (
33 hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
34 );
Края блоков. По умолчанию каждый край считается прямым. Поэтому в данном случае эта область пустая.
36 edges
37 (
38 );
В секции patches приведены участки сетки на которых задаются особые условия (граничные, начальные и тд.). В названии используется зарезервированное слово (patch, symmetryPlane, empty, wedge, cyclic, wall, processor) название участка сетки (патча) и его координаты. Описание зарезервированных слов будет приведено позже. Слово wall используется для описания стены. В данном случае movingWall содержит координаты движущейся стенки, fixedWalls координаты 3х неподвижных стенок. Координаты должны быть записаны в таком порядке, чтобы при направлении взгляда изнутри блока порядок вершин должен быть записан по часовой стрелке. Первая координата – любая.
40 patches
41 (
42 wall movingWall
43 (
44 (3 7 6 2)
45 )
46 wall fixedWalls
47 (
48 (0 4 7 3)
49 (2 6 5 1)
50 (1 5 4 0)
51 )
Здесь задаем пустые блоки. Слово empty означает, что на таком блоке не должно быть никаких условий. В данном случае – это передняя и задняя стенки. Порядок записи вершин такой же как и в предыдущем случае.
52 empty frontAndBack
53 (
54 (0 3 2 1)
55 (4 5 6 7)
56 )
57 );
Сетка может состоять из более чем одного блока. В таком случае можно описать связь между этими двумя блоками в разделе mergePatchPairs. Подробнее данный раздел будет описан позже.
59 mergePatchPairs
60 (
61 );
62
63 // ************************************************************************* //
Граничные и начальные условия
По умолчанию программой OpenFOAM считается, что начальные условия начинаются с времени t=0. Поэтому файлы с начальными условиями хранятся в папке «0». Для нашей задачи папка 0 содержит два файла: давление «p» и скорость «U». Рассмотрим файл «p»:
Определяет размерность переменной. Размерность давления - м2/с2. Полное описание данного пункта будет приведено ниже.
17 dimensions [0 2 -2 0 0 0 0];
Задание поля давления. uniform - поле давления однородно и равно 0 (в данном случае). В данном случае рассматривается изменение давления. nonuniform – значения задаются в каждой точке. Полное описание данного пункта будет приведено ниже.
19 internalField uniform 0;
Здесь описываются все граничные условия для переменных приведённых в файле blockMeshDict. Данный раздел также имеет сложный характер и будет описан ниже. Для рассматриваемой задачи граничные условия описываем равенством нулю градиента давления – zeroGradient.
21 boundaryField
22 {
23 movingWall
24 {
25 type zeroGradient;
26 }
27
28 fixedWalls
29 {
30 type zeroGradient;
31 }
Поскольку передняя и задняя стенки не участвуют в расчете их оставляем пустыми.
33 frontAndBack
34 {
35 type empty;
36 }
37 }
Аналогично описываются значения для скорости в файле «U»:
17 dimensions [0 1 -1 0 0 0 0];
Поскольку скорость зависит от трех переменных, задание поля скорости имеет такой вид:
19 internalField uniform (0 0 0);
Задание граничных условий отличается тем, что мы задаем значение равное 1 м/с по переменной х. Правильное описание приведено в секции movingWall. На всех остальных стенках начальная скорость равна 0.
21 boundaryField
22 {
23 movingWall
24 {
25 type fixedValue;
26 value uniform (1 0 0);
27 }
28
29 fixedWalls
30 {
31 type fixedValue;
32 value uniform (0 0 0);
33 }
34
35 frontAndBack
36 {
37 type empty;
38 }
39 }
Физические свойства.
Все физические свойства переменных приведены в начале файлов. В файле transportProperties для рассматриваемой задачи приведено значение для кинематической вязкости и её размерность:
18 nu nu [ 0 2 -1 0 0 0 0 ] 0.01;
Кинематическая вязкость записывается фонетическим звучанием греческой буквы «nu». Для течения несжимаемой жидкости в каверне используется следующая формула:

где d и U характерная длина стенки каверны и скорость. В данном случае d=0,1 м, |U|=1 м/с.
Данные, связанные с контролем шага по пространству и времени считываются из файла controlDict. Он находится в папке system. В примере используется начальное время равное 0, значит начальные данные OpenFOAM будет считывать из папки под наименованием 0. Начальное время устанавливается в секции startTime. Для окончания счета необходимо в секции stopAt записать слово endTime. В данной задаче endTime равно 0,5. Теперь необходимо установить шаг по времени deltaT. Для устойчивого счета необходимо выполнение следующего условия:

где dt - шаг по времени, dx - размер ячейки. Выбираем dt из условия, что максимум Co соответствует максимальной скорости и минимальной ячейке. Из этих условий следует, что dt =0,005 с. Стоит заметить, что в данной задаче выбор промежутка времени определяется пользователем. Для записи поля скоростей и давления в определенные промежутки времени в секцию writeControl записываем слово timeStep, которое означает, что запись будет происходить через равное число итераций, описанное в секции writeInterval.
Дискретизация и настройка решения
Пользователь указывает выбор схемы дискретизации в файле fvSchemes в папке system.
Подробнее данный раздел будет описан позже.
Просмотр сетки
В некоторых случаях стоит перед расчетом просмотреть исследуемую область. Разработчики OpenFOAM рекомендуют для этих целей использовать свободное программное обеспечение ParaView. Данная программа запускается из директории cavity (для текущей задачи) командой ParaFoam. Работа с paraView будет описана позже.
Запуск расчета
Как любое UNIX приложение OpenFOAM может быть запущено двумя способами. Либо в каталоге cavity командой:
icoFoam
либо в командной строке с использованием аргумента -case:
icoFoam -case $FOAM_RUN/tutorials/incompressible/icoFoam/cavity
Параметры расчета высвечиваются в окне терминала. Чтобы записать процесс расчета необходимо выполнить расчет при помощи следующей команды (из директории cavity)
icoFoam > log &
cat log
Обработка полученного решения
Расчетная задача в ПС OpenFOAM представляется как упорядоченный набор файлов и каталогов, размещенных в директории файловой системы под некоторым именем. Корневая структура расчетной задачи (относительно каталога задачи) имеет вид, показанный на рис. 2.3..

Рисунок 2.3.Структура расчетных файлов OpenFOAM
После расчета результаты можно просмотреть командой paraFoam в окне программы paraView.
Создание сложной сетки
Если в некоторой области значения скорости или давления сильно отличаются в ближайших точках то необходимо использовать более сложные виды расчетных сеток. В нашем случае в верхних крайних точках и в области около них значения давления жидкости гораздо больше чем в центре каверны. Зачастую возникают такие задачи, где в некоторых областях достаточно знать лишь очень грубое приближение. Например, задача о распространении трещины гидроразрыва. В окрестности вершины трещины необходимо знать очень точные значения напряжений, на расстояниях много больше диаметра трещины можно использовать более грубую сетку.
Исследуем задачу течения жидкости в каверне для сложной сетки. Поскольку изменения в исходных файлах довольно существенны, пример решения такой задачи находится в папке CavityGrade в стандарной поставке OpenFOAM.
Создадим сетку как показано на рис. 2.4:

Рисунок.2.4. Структура сетки для задачи течения несжимаемой жидкости в каверне.
Файл blockMeshDict будет иметь следующий вид:
17 convertToMeters 0.1;
18
19 vertices
20 (
21 (0 0 0)
22 (0.5 0 0)
23 (1 0 0)
24 (0 0.5 0)
25 (0.5 0.5 0)
26 (1 0.5 0)
27 (0 1 0)
28 (0.5 1 0)
29 (1 1 0)
30 (0 0 0.1)
31 (0.5 0 0.1)
32 (1 0 0.1)
33 (0 0.5 0.1)
34 (0.5 0.5 0.1)
35 (1 0.5 0.1)
36 (0 1 0.1)
37 (0.5 1 0.1)
38 (1 1 0.1)
39 );
Здесь уже 4 блока. Ребро каждого разбивается на 10 отрезков длины которых меняются с коэффициентами, описанными командой simpleGrading.
41 blocks
42 (
43 hex (0 1 4 3 9 10 13 12) (10 10 1) simpleGrading (2 2 1)
44 hex (1 2 5 4 10 11 14 13) (10 10 1) simpleGrading (0.5 2 1)
45 hex (3 4 7 6 12 13 16 15) (10 10 1) simpleGrading (2 0.5 1)
46 hex (4 5 8 7 13 14 17 16) (10 10 1) simpleGrading (0.5 0.5 1)
47 );
48
49 edges
50 (
51 );
52
53 patches
54 (
Поскольку верхняя стенка теперь состоит из 2 блоков, то секция movingWall будет состоять из 2х записей,
55 wall movingWall
56 (
57 (6 15 16 7)
58 (7 16 17 8)
59 )
то же относится и к секции fixedWalls.
60 wall fixedWalls
61 (
62 (3 12 15 6)
63 (0 9 12 3)
64 (0 1 10 9)
65 (1 2 11 10)
66 (2 5 14 11)
67 (5 8 17 14)
68 )
В 4 раза увеличивается количество пустых граничных условий.
69 empty frontAndBack
70 (
71 (0 3 4 1)
72 (1 4 5 2)
73 (3 6 7 4)
74 (4 7 8 5)
75 (9 10 13 12)
76 (10 11 14 13)
77 (12 13 16 15)
78 (13 14 17 16)
79 )
80 );
81
82 mergePatchPairs
83 (
84 );
Вычисление шага по времени
Максимальная скорость движения жидкости и минимальные ячейки находятся около верхней грани каверны. Использование команды simpleGrading позволяет задавать ячейки с использованием геометрической прогрессии. Если длина ребра блока равна l, а число точек на ребре n, с отношением между первым отрезком и последним R, то размер самой меленькой ячейки определяется по следующей формуле:

где
отношение размеров двух соседних ячеек и

В рассматриваемом случае dxs=0,00345 м. Следовательно, временной интервал равен dt=0,0025 с. Поэтому значение writeInterval (файл controlDict в папке cavityGrade/system/) устанавливаем равным 40, чтобы расчетные значения записывались через каждые 0,1 с. Теперь необходимо установить начальное и конечное время работы программы и произвести расчет командами:
blockMesh
icoFoam
после расчета можно просмотреть результат командой:
paraFoam
Стоит заметить, что в OpenFOAM совпадение узлов расчетной сетки на границах блоков полностью определяется пользователем. Если узлы не будут совпадать, то расчет будет неверным.
Увеличение числа Рейнольса.
При увеличении числа Рейнольдса до 100, схождение к стационарному решению будет происходить гораздо медленнее. Для решения данной задачи необходимо создать папку cavityHighRe. В стандартной поставке OpenFOAM в папке icoFoam находится исполнимый файл Allrun. После работы этого файла в папке появляются все директории описанные в данном руководстве. Папка cavityHighRe создается при помощи следующих команд:
cd $FOAM_RUN/tutorials/incompressible/icoFoam
cp -r cavity cavityHighRe
Войдите в файл transportProperties в папке constant. Поскольку мы увеличиваем число Рейнольдса в 10 раз, то необходимо уменьшить вязкость в 10 раз. Так как стационарных режим возникает позже, то необходимо расчетное время увеличить в 2 раза (в файле cavityHighRe/system/controlDict в секции endTime необходимо поставить число 2).
Теперь запустите расчет командой icoFoam. При выполнении работы в фоновом режиме, могут быть полезны следующие команды UNIX:
nohup – программа остается в работе, даже если пользователь закрыл терминал.
nice - изменяет приоритет процесса. -20 – наивысший приоритет, 19 – низший.
Это полезно, например, если пользователь хочет провести расчет на удаленной машине и установить ему низкий приоритет. Пример выполнения команд:
cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavityHighRe
nohup nice -n 19 icoFoam > log &
cat log
Часто время установления стационарного режима гораздо меньше чем заданное пользователем. Для того чтобы программа не работала впустую в файле fvSolutions можно задать разницу между ближайшими итерациями скорости U. Обычно это значение равно 10-6. Как только разница стала меньше чем заданное число расчет останавливается.
Разумеется бесконечно увеличивать число Рейнольса нельзя. Поскольку возникают турбулентные режимы, которые описываются другими законами. Исследование турбулентности и более сложные режимы течения можно рассчитать перейдя в папку pisoFoam.
Сложные режимы течения
Перейдите в папку $FOAM_RUN/tutorials/incompressible/pisoFoam/ras. Сгенерируйте сетку командой blockMesh. Начиная с версии 1.6. в OpenFOAM применяются специальные модели, позволяющие задать разные граничные условия на различных стенках. Некоторые из них приведены при выборе турбулентной вязкости в файле 0/nut:
18 dimensions [0 2 -1 0 0 0 0];
19
20 internalField uniform 0;
21
22 boundaryField
23 {
24 movingWall
25 {
26 type nutWallFunction;
27 value uniform 0;
28 }
29 fixedWalls
30 {
31 type nutWallFunction;
32 value uniform 0;
33 }
34 frontAndBack
35 {
36 type empty;
37 }
38 }
Здесь используется граничное условие nutWallFunction. В файлах 0/k и 0/epsilon используются граничные условия epsilonWallFunction и kqRwallFunction. Начальные значения для k и ε выбираются на основе следующих формул:


где
- константа равная 0,09 для k-ε модели. В декартовых координатах k определяется по формуле скалярного произведения:

где
- координаты скорости. Предположим что начальная турбулентность изотропна, т. е.
и равна 5% от скорости верхней грани каверны. Тогда получаем:



До версии 1.6 для каждого крупного вихря создавался свой решатель, это приводило к дублированию кода. Теперь метод моделирования выбирается пользователем при помощи ключевого слова simulationType в файле turbulenceProperties. В папке можно открыть этот файл:
18 simulationType RASModel;
Можно использовать команды laminar, RASModel и LESModel. В данном случае выбирается модель RAS определенная в файле RASProperties в папке constant. Виды RAS моделей будут описаны позднее. Здесь kEpsilon – это стандартная k-ε модель турбулентности. В данном случае пользователь должен установить флаг on для расчета турбулентности:
turbulence on;
Число Рейнольдса определяется по формуле, приведенной выше. После установки начального и конечного времени, а также временного промежутка необходимо произвести расчет командой pisoFoam.
Упражнение
1. Установите входные параметры таким образом, чтобы расчет происходил быстрее, при этом не теряя точности.
Изменение геометрии расчетной области
Создадим папку cavityClipped в директории icoFoam. Для примера удалим квадрат со стороной 0,04 м из расчетной области (внизу справа). Файл BlockMeshDict будет выглядеть следующим образом:
17 convertToMeters 0.1;
18
19 vertices
20 (
21 (0 0 0)
22 (0.6 0 0)
23 (0 0.4 0)
24 (0.6 0.4 0)
25 (1 0.4 0)
26 (0 1 0)
27 (0.6 1 0)
28 (1 1 0)
29
30 (0 0 0.1)
31 (0.6 0 0.1)
32 (0 0.4 0.1)
33 (0.6 0.4 0.1)
34 (1 0.4 0.1)
35 (0 1 0.1)
36 (0.6 1 0.1)
37 (1 1 0.1)
38
39 );
40
Расчетная область состоит из 3 блоков.
41 blocks
42 (
43 hex (0 1 3 2 8 9 11 10) (12 8 1) simpleGrading (1 1 1)
44 hex (2 3 6 5 10 11 14 13) (12 12 1) simpleGrading (1 1 1)
45 hex (3 4 7 6 11 12 15 14) (8 12 1) simpleGrading (1 1 1)
46 );
47
48 edges
49 (
50 );
51
52 patches
53 (
54 wall lid
55 (
56 (5 13 14 6)
57 (6 14 15 7)
58 )
59 wall fixedWalls
60 (
61 (0 8 10 2)
62 (2 10 13 5)
63 (7 15 12 4)
64 (4 12 11 3)
65 (3 11 9 1)
66 (1 9 8 0)
67 )
68 empty frontAndBack
69 (
70 (0 2 3 1)
71 (2 5 6 3)
72 (3 6 7 4)
73 (8 9 11 10)
74 (10 11 14 13)
75 (11 12 15 14)
76 )
77 );
78
79 mergePatchPairs
80 (
81 );
Поскольку в поставке OpenFOAM учебные файлы в данном случае проводят расчет со времени 0,5 c. То пользователю необходимо записать начальные данные в папку 0,5 предварительно создав её. Сделать это можно следующими командами:
cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavityClipped
cp -r 0 0.5
После всех изменений можно провести расчет командой icoFoam.
Упражнение
1. Проделайте то же самое, только удалите квадрат сверху слева.
2. Проведите расчет для более сложной области, в виде квадрата удалённого в середине расчетной области.
3. Проведите расчет для полостей в виде прямоугольников со сторонами 0,04 и 0,08 м удаленными слева и справа внизу расчетной области.
Решения упражнений в виде исполнимых файлов и описание их будут с течением времени приведены в моем блоге.
По всем вопросам обращаться на e-mail: serg@imech.anrb.ru