2.1 Поток в полости с движущейся крышкой

Материал из ru.wiki.laduga.ru
Перейти к: навигация, поиск


Данный раздел руководства описывает как выполнить этапы пре-процессинга, расчет и постпроцессную обработку для тестового примера, рассматривающего изотермическое течение несжимаемой среды в двумерной квадратной области. Геометрия течения показана на Рис. 2.1, в которой все границы квадрата являются твердыми стенками. Верхняя стенка перемещается в x-направлении со скоростью 1 м/с, в то время как другие 3 неподвижны. Первоначально принято, что будет рассматриваться ламинарное течение и задача будет решаться на однородной сетке, используя решатель icoFoam для ламинарного, изотермического, несжимаемого потока. В течение курса обучающей программы, будут исследованы влияние увеличения числа узлов сетки на решение и влияние измельчения шага сетки по направлению к стенкам.

Наконец, число Рейнольдса будет увеличено, и решатель pisoFoam будет использоваться для турбулентного, изотермического, несжимаемого течения.


Fig2.1.png

Рисунок 2.1: Геометрия течения в каверне, инициированного движением верхней плиты.


Содержание

2.1.1 Пре-процессная подготовка

В составе дистрибутива OpenFOAM поставляются примеры. Для редактирования файлов примера пользователь может выбрать xeditor или любой другой текстовый редактор, например, emacs, vi, gedit, kate, nedit, и т.п. В OpenFOAM используется редактирование файлов, ввод/вывод использует формат словарей с ключевыми словами, которые представляют смысловое значение, чтобы быть понятными даже наименее опытным пользователям.

Моделируемый случай включает данные для сетки, полей, свойств, параметров контроля решения, и т.д. Как описано в разделе 4.1, в OpenFOAM эти данные хранятся в ряде файлов в пределах директории с примером, а не в единственном файле примера, как во многих других пакетах вычислительной гидродинамики (CFD). Директории примера дают соответственно описательное название, например первый случай примера для этой обучающей программы просто называют cavity (каверна). В подготовке редактирования файлов примера и выполнения первого примера cavity, пользователь должен перейти в каталог примера с помощью команды

cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavity

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

OpenFOAM всегда работает в 3 мерной декартовой системе координат и все геометрические конфигурации производятся в 3 измерениях. OpenFOAM решает примеры в 3 измерениях по умолчанию, но может быть проинструктирован решать в 2 измерениях, определяя специальное 'empty' (пустое) граничное условие на границах, нормальных к (3-ему) z измерению (для данного примера), для которого никакое решение проводить не требуется.

Область примера cavity (каверны) состоит из квадрата c длинами сторон d = 0.1 м в x-y плоскости. Первоначально будет использоваться равномерная сетка 20 x 20 ячеек. В блочной конструкции показанной на Рис. 2.2. генератор сеток, поставляемый с OpenFOAM, blockMesh, создает сетки, используя команды из описания определенного в словаре ввода, blockMeshDict расположен в каталоге constant/polyMesh для данного примера.


Fig2.2.png

Рисунок 2.2: Блочная конструкция сетки для каверны.


Чтобы перейти к blockMeshDict для этого примера возьмем следующий файл:

   1  /*--------------------------------*- C++ -*----------------------------------*\
   2  | =========                 |                                                 |
   3  | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
   4  |  \\    /   O peration     | Version:  2.3.0                                 |
   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  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
   16  
   17  convertToMeters 0.1;
   18  
   19  vertices
   20  (
   21      (0 0 0)
   22      (1 0 0)
   23      (1 1 0)
   24      (0 1 0)
   25      (0 0 0.1)
   26      (1 0 0.1)
   27      (1 1 0.1)
   28      (0 1 0.1)
   29  );
   30  
   31  blocks
   32  (
   33      hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
   34  );
   35  
   36  edges
   37  (
   38  );
   39  
   40  boundary
   41  (
   42      movingWall
   43      {
   44          type wall;
   45          faces
   46          (
   47              (3 7 6 2)
   48          );
   49      }
   50      fixedWalls
   51      {
   52          type wall;
   53          faces
   54          (
   55              (0 4 7 3)
   56              (2 6 5 1)
   57              (1 5 4 0)
   58          );
   59      }
   60      frontAndBack
   61      {
   62          type empty;
   63          faces
   64          (
   65              (0 3 2 1)
   66              (4 5 6 7)
   67          );
   68      }
   69  );
   70  
   71  mergePatchPairs
   72  (
   73  );
   74  
   75  // ************************************************************************* //

В начале файла содержится заголовок в форме рекламной полосы (баннера) (строки 1-7), затем информация в файле содержащаяся в подразделе FoamFile, заключена в фигурные скобки ({...}).

В остальной части руководства: Для сохранения места и ясности, шапка или заголовок файла , включая баннер и FoamFile под-раздел (словарь), и обрамление в скобках не будет включаться в файлы примеров (опускаются строки 1-16).

Файл в начале содержит блок вершин vertices (x,y,z координаты точек); затем в нем определяются сами блоки (blocks) (в данном примере всего 1) используя введенные выше метки или имена вершин( the vertex labels) и номера ячеек (cells) внутри них; и наконец, в файле определяются поверхности для задания граничных условий (the boundary patches). Пользователю предлагается обратиться к разделу 5.3, чтобы понять значение вводимых величин в файле blockMeshDict.

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

blockMesh

Текущее состояние выполнения blockMesh сообщается в окне терминала. Любые ошибки в исходном файле сетки blockMeshDict обрабатываются blockMesh и получающиеся сообщения об ошибках направляют пользователю номер строки в которой возникла проблема. Не должно быть никаких сообщений об ошибках на этой стадии (при запуске образцового примера).

2.1.1.2 Граничные и начальные условия

После завершения генерации сетки, пользователь может посмотреть на заданные начальные поля заданные для этого расчетного примера (случая case). Пример задает начальное время t = 0 сек, так что данные о начальных полях хранятся в каталоге (поддиректории) с цифровым именем 0 каталога примера cavity. Этот подкаталог содержит 2 файла, с именами переменных (полей) p and U, по одному для полей давления (p) и скорости (U), начальные и граничные условия которых должны быть заданы. Давайте проверим файл давления p:

   17  dimensions      [0 2 -2 0 0 0 0];
   18  
   19  internalField   uniform 0;
   20  
   21  boundaryField
   22  {
   23      movingWall
   24      {
   25          type            zeroGradient;
   26      }
   27  
   28      fixedWalls
   29      {
   30          type            zeroGradient;
   31      }
   32  
   33      frontAndBack
   34      {
   35          type            empty;
   36      }
   37  }
   38  
   39  // ************************************************************************* //

Имеется 3 главных раздела ввода данных полей исходных переменных :

dimensions (размерности)
определяют величину размерности поля, здесь м^2 с^-2 кинематическое давление, (судя по размерности это баротропия или отношение давления к плотности => (н/м2) /(кг/м3)=м2/c2 ) (Обратитесь к секции 4.2.6 за более детальной информацией);
internalField
данные поля внутри расчетной области, которое может быть задано однородным (uniform), задаваемым одной цифровой величиной; или неоднородным, когда все значения поля должны быть заданы (см. раздел 4.2.8 для более подробной информацией );
boundaryField
данные о граничных условиях которые включают граничные условия и данные для всех граничных поверхностей (boundary patches) (см раздел 4.2.8 для более подробной информации).

Для данного примера каверны (cavity), границы состоят только из стенок, разбитые на 2 группы поверхностей названных: (1) fixedWalls для неподвижных фиксированных боковых стенок и основания каверны; (2) movingWall для подвижного верха каверны. Как на стенках (walls), так и на подвижных стенках заданы граничные условия zeroGradient нулевой производной к нормали от поверхности стенки для давления p, что означает “нормальный градиент давления равен нулю”. Поверхности frontAndBack представляют переднюю и заднюю плоскости каверны для двумерного случая (2D case) и следовательно, должны быть заданы параметром empty (пустой).

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

Пользователь может аналогично проверить поле скорости в поддиректории 0 и файле 0/U. Размерность (dimensions) является именно той, которую вы ожидаете для скорости, причем внутреннее поле инициализируется как однородное нулевое (uniform zero), что в случае вектора скорости должно быть представлено тремя компонентами вектора скорости, т.е. однородными скалярными полями проекций скорости uniform (0 0 0) (см. раздел 4.2.5 для дополнительной информации).

Граничные условия для скорости (для двумерной задачи) требуют аналогичных граничных условий (empty) для передней и задней поверхностей frontAndBack. Другими поверхностями (patches) являются стенки каверны (walls): условия непроскальзывания или условия прилипания (no-slip condition) задаются на поверхностях fixedWalls, следовательно условие постоянства величины (fixedValue) с одинаковым значением uniform (0 0 0). Верхняя поверхность движется со скоростью 1 m/s в направлении оси x что тоже требует условий fixedValue, но с одинаковым ненулевым значением в направлении оси $ x $ uniform (1 0 0).

2.1.1.3 Физические свойства

Физические свойства для задачи (case) хранятся в словарях (dictionaries), к чьим именам добавляются суффиксы …Properties, расположены в дереве подкаталогов каталога Dictionaries. Для примера каверны с решателем icoFoam, единственное свойство которое следует задать это кинематическая вязкость, которая хранится в словаре transportProperties. Пользователь может проверить, что кинематическая вязкость задается правильно открыв файл словаря transportProperties чтобы просмотреть или отредактировать (view/edit) его величины. Ключевым словом для кинематической вязкости является nu, фонетическое обозначение греческой буквы $ \nu $ которой вязкость обозначена и представлена в исходной системе дифференциальных уравнений сохранения. Первоначально этот пример (case) будет запущен с числом Рейнольдса (Reynolds number) равным 10, здесь число Рейнольдса определяется как:

$ Re= \frac{d |U|}{\nu} $ (2.1)

где $ d $ и $ |U | $ являются характерным размером и модулем характерной скорости соответственно, а $ \nu $ является кинематической вязкостью. В примере $ d = 0.1 m , |U | = 1 ms^{ -1} $, так что для числа $ Re = 10, \nu = 0.01 m^2 s^{ -1} $. (обычно вязкость определяет число Рейнольдса, но в рассматриваемом примере выбиратся нефизичная вязкость, чтобы получить требуемый режим течения, определяемый заданием Re). Правильными исходными величинами для кинематической вязкости являются представленные ниже значения:

17   
18  nu              nu [ 0 2 -1 0 0 0 0 ] 0.01; 
19   
20   
21  // ************************************************************************* //

2.1.1.4 Управление (Control)

Входные данные, относящиеся к контролю времени, чтению и записи по данных решения считываются из controlDict. Пользователь должен ознакомиться с данным файлом; как и controlDict, он расположен в директории system.

Для запуска необходимо установить время начала и конца решения, а также шаг по времени. Пакет программ OpenFOAM предоставляет большую гибкость в управлении временем. Подробное описание вы найдете в разделе 4.3. В этом руководстве мы хотим начать запуск в момент времени $ t = 0 $, это значит что OpenFOAM необходимо считывать массивы данных из каталога с именем 0 ( см. раздел 4.1 для получения дополнительной информации по теме структуры файла). Поэтому мы устанавливаем для startFrom значение startTime, а затем назначаем startTime значение равное 0.

По истечении времени, мы хотим получить стационарное решение для потока, циркулирующего внутри полости каверны (cavity). В качестве рекомендации, общего правила, жидкость должна пройти через каверну 10 раз, чтобы достичь стабильного состояния в ламинарном течении. В данном случае поток не проходит через эту замкнутую область, так как здесь нет ни входа ни выхода, поэтому в качестве времени конца расчета может быть установлено время, необходимое для перемещения жидкости десять раз через каверну, т.е. 1 сек; фактически, оглядываясь назад на выполненные расчеты, обнаружим, что 0,5 сек вполне достаточно, поэтому будем использовать именно это значение. Для определения времени конца расчета, необходимо указать значение stopAt как EndTime, а затем установить значение EndTime равное 0,5. Теперь нужно установить шаг по времени, который задается ключевым словом deltaT. Для достижения временной точности и численной стабильности при запуске icoFoam, требуется число Куранта меньше чем 1. Число Куранта для одной ячейки, определяется как:

$ Co = \frac {\delta t |U|} {\delta x} $ (2.2)

где $ \delta t $ является шагом по времени, $ |U | $ представляет собой величину скорости через эту ячейку, а $ \delta x $ – это размер ячейки в направлении скорости. Скорость потока варьируется в пределах области, поэтому необходимо соблюдать условие $ Co < 1 $ во всей области. Поэтому необходимо выбирать $ \delta t $ на основе наихудшего варианта: максимальное значение $ Co $ должно соответствовать совокупному эффекту, максимальной величине отношения скорости течения к размеру ячейки. В данном случае размер ячейки устанавливается в пределах области постоянным, поэтому максимальное значение $ Co $ будет приближено к границе, где скорость близка к $ 1 m s^{-1} $.

Размер ячейки определяется по формуле:

$ \delta x = \frac {d}{n} = \frac {0.1}{20} = 0.005 m $ (2.3)

Поэтому, чтобы получить число Куранта меньше или равное 1 во всей области, шаг по времени deltaT должен быть меньше или равен:

$ \delta t = \frac {Co \delta x}{|U|} = \frac {1 \times 0.0005}{1} = 0.005 s $ (2.4)

В процессе моделирования будем записывать результаты через определенные промежутки времени, которые мы можем позднее просмотреть с помощью постпроцессора. Оператор writeControl представляет собой набор опций по настройке времени, в который записываются результаты; здесь мы выбираем вариант timeStep, который определяет, какие результаты будут записываться каждый n-ый шаг по времени, где значение n определяется в соответствии со значением writeInterval. Предположим, что нам нужно записывать результаты в 0.1, 0.2, ... , 0.5 сек. с шагом 0.005 сек. Чтобы выводить результаты на каждом 20-ом шаге, мы установили значение writeInterval равное 20.

OpenFOAM создает новую папку с именем текущего времени, например, 0.1 сек, каждый раз, когда создается набор данных, как это обсуждалось в полном объеме в разделе 4.1. В решателе icoFoam, значения U и p для каждой области записываются во временные каталоги. В описанном здесь примере, записи в controlDict приведены ниже:

17   
18  application     icoFoam; 
19   
20  startFrom       startTime; 
21   
22  startTime       0; 
23   
24  stopAt          endTime; 
25   
26  endTime         0.5; 
27   
28  deltaT          0.005; 
29   
30  writeControl    timeStep; 
31   
32  writeInterval   20; 
33   
34  purgeWrite      0; 
35   
36  writeFormat     ascii; 
37   
38  writePrecision  6; 
39   
40  writeCompression off; 
41   
42  timeFormat      general; 
43   
44  timePrecision   6; 
45   
46  runTimeModifiable true; 
47   
48   
49  // ************************************************************************* //

2.1.1.5 Дискретизация и параметры линейного решателя (linear-solver)

  Пользователь определяет выбор ограниченного объема схем дискретизации в fvSchemes в директории system. Спецификация решателей линейных уравнений (linear equation solvers) и задание точности, а также других алгоритмов контроля, выполнена аналогичным образом в fvSolution в директории system. Пользователь может просматривать эти словари, но нам не следует обсуждать их содержимое на данном этапе, за исключением pRefCell и pRefValue в PISO, который является подкаталогом словаря fvSolution. В закрытой несжимаемой системе, такой как каверна, давление относительно: это область избыточного давления которое определяется с точностью до произвольной константы и величина не является абсолютным значением (параметром состояния). В таких случаях, как этот, решатель (solver) устанавливает относительный уровень с помощью pRefValue в ячейке pRefCell. В этом примере оба значения равны 0. Изменение любого из этих значений будет изменять область абсолютного давления, но не область относительной скорости или давления.

2.1.2 Просмотр сетки

Хорошей идеей будет просмотреть сетку перед запуском, чтобы проверить ее на наличие ошибок. Сетку можно просмотреть в paraFoam, при помощи постпроцессора, который является компонентом OpenFOAM. Постпроцессор paraFoam можно запустить в терминале внутри каталога задачи

paraFoam

Команда может быть запущена и из другой директории с ключем -case, например:

paraFoam -case $FOAM RUN/tutorials/incompressible/icoFoam/cavity

Эта команда запускает окно ParaView как показано на рисунке 6.1. В Pipeline Browser, пользователь может видеть, что ParaView открыла cavity.OpenFOAM, модуль для задачи каверны. Перед нажатием на кнопку Применить (Apply), пользователю нужно задать геометрию на панели Mesh Parts. Поскольку задача-пример маленькая, проще всего выбрать все параметры. Для этого установите флажки на панели Mesh Parts', которая автоматически проверит все отдельные компоненты в рамках соответствующей группы. Затем нажмите кнопку Применить (Apply), чтобы загрузить геометрию в ParaView. Некоторые общие настройки используются по умолчанию, как описано в разделе 6.1.5.1. Обратитесь к этому разделу, чтобы узнать подробнее об этих параметрах.

Далее откройте панель Display, которая отвечает за визуализацию выбранного модуля. В панели Display выполните следующие действия, как показано на рисунке 2.3: (1) установите set Color By Solid Color;, (2) нажмите Set Ambient Color и выберите подходящий цвет, например черный (на белом фоне); (3) в панели Style выберите Wireframe в меню Representation. Цвет фона можно задать, выбрав View Settings в меню Editt на строке меню вверху.


Fig2.3.png

Рисунок 2.3: Просмотр сетки в paraFoam.


Особенно если вы впервые пользуетесь ParaView, мы рекомендуем вам работать с изображением, как описано в разделе 6.1.5. В частности, поскольку это двумерная модель, рекомендуем вам выбрать Use Parallel Projection в панели General настройки окна View Settings выбранного в меню Edit. Ориентацию осей Orientation Axes можно включить или выключить в окне Annotation, также положение переключателя можно изменять при помощи мыши.

2.1.3 Запуск приложения

Как и любые исполняемые Unix/Linux приложения, OpenFOAM можно запустить двумя способами: как основной процесс, т.е. в котором оболочка ждет завершения выполнения команды, прежде чем запустить командную строку; и как фоновый процесс, который в течение процесса выполнения позволяет вызвавшей оболочке получать дополнительные команды.

В данном случае мы будем запускать icoFoam в качестве главного процесса. Решатель icoFoam выполняется либо путем ввода в каталоге команды

icoFoam 

в командной строке, либо с помощью дополнительного ключа -case, например:

icoFoam -case $FOAM RUN/tutorials/incompressible/icoFoam/cavity

Ход решения отображается в окне терминала. Он выводит пользователю текущее время, максимальное значение числа Куранта, начальные и конечные невязки решения по всем направлениям течения.


Fig2.4.png

Figure 2.4: Отображение характеристик давления для задачи каверны.



Fig2.5.png

Figure 2.5: Распределение давлений для модели каверны.


2.1.4 Пост-обработка (Post-processing)

В то время как результаты записываются во временные каталоги, их можно просмотреть с помощью paraFoam. Вернитесь к окну paraFoam и выберите панель Properties для модуля cavity.OpenFOAM. Если нужное окно панелей в случае модуля, не отображается для любого момента времени, пожалуйста, убедитесь, что: cavity.OpenFOAM подсвечивается синим цветом, а кнопка (глаза) eye рядом с ним нажата и показывает, что графика включена;

Чтобы подготовить paraFoam для отображения данных, представляющих интерес, мы должны сначала загрузить данные в соответствующий момент времени 0,5 сек. Если процесс был запущен в то время как ParaView был открыт, выходные данные во временных директориях не будут автоматически загружаться в среду ParaView. Для загрузки данных пользователь должен выбрать Refresh Times в окне Properties, а затем нажать зеленую кнопку Apply. Временные данные будут загружены в ParaView.

2.1.4.1 Поверхности постоянных значений и профильные диаграммы (Isosurface and contour plots)

Для просмотра давления, откройте панель Display, поскольку она контролирует графическое отображение выбранного модуля. Чтобы сделать простую диаграмму давления, выполните следующие действия, подробно описанные на Рисунке 2.4: в панели Style выберите Surface в меню Representation; в панели Color, выберите Color by p и Rescale by Data Range. Теперь, чтобы просмотреть решения при $ t = 0,5 s $, можно использовать VCR Controls или Current Time Controls, чтобы изменить текущее время на 0,5. Они расположены на панели инструментов под меню в верхней части окна ParaView, как показано на рисунке 6.4. Решение поля давления имеет, как и следовало ожидать, область низкого давления в левом верхнем углу каверны и область высокого давления в правом верхнем углу, как показано на рисунке 2.5.

При выборе значка ($ \cdot p $) поле давления интерполируется через каждую ячейку, чтобы обеспечить непрерывное отображение. Вместо этого, если пользователь выбирает значок ячейки $ \Box p $ , из Color с помощью меню, тогда для каждой ячейки будет присвоено одно значение давления, поэтому каждая ячейка будет обозначена одним цветом без какой-либо градации.

Панель цвета можно включить нажатием кнопки Toggle Color Legend Visibility на панели Active Variable Controls, или выбрав Show Color Legend в меню View. Нажимая кнопку Edit Color Map или на панели Active Variable Controls или на панели Color в окне Display, пользователь может установить диапазон характеристик цветовой панели, таких как размер текста, выбор шрифта и формат нумерации для шкалы . Панель цвета можно расположить в окне изображения путем перетаскивания с помощью мыши.

Новые версии ParaView по умолчанию используют цветовую гамму синий-белый-красный, нежели обычную синий-зеленый-красный (радуга). Поэтому, если пользователь запускает ParaView в первый раз, то он, возможно захочет изменить цветовую гамму. Это можно сделать, выбрав Choose Preset в Color Scale Editor и выбрав Blue to Red Rainbow. После нажатия OK, пользователь может нажать кнопку Make Default, и ParaView всегда будет использовать эту цветовую схему по умолчанию.

Если повращать изображение, то можно увидеть, что теперь у нас есть полная цветная геометрическая поверхность по давлению. Для получения истинного контура участка пользователь должен сначала создать отсечения, или 'slice', через геометрию с помощью фильтра Slice, как описано в разделе 6.1.6.1. Отсечение должно быть сосредоточено в $ (0.05, 0.05, 0.005) $ и его нормаль необходимо установить на $ (0, 0, 1) $ (нажмите кнопку Z Normall). Сформировав отсечения, контуры можно сделать при помощи фильтра Contour, что подробно описано в разделе 6.1.6.


Fig2.6.png

Рисунок 2.6: Панель свойств фильтра Glyph.



Fig2.7.png

Рисунок 2.7: Распределение скоростей для модели каверны.


2.1.4.2 Векторные диаграммы (Vector plots)

Прежде чем начать рисовать векторы скорости потока, не помешает удалить другие модули, которые были созданы ранее, например, с помощью фильтров Slice и Contour, описанных выше. Их можно: либо полностью удалить, выделив соответствующий модуль в Pipeline Browser и нажав кнопку Delete в панели Properties; или отключить переключением кнопки глаза в соответствующем модуле в Pipeline Browser.

Теперь мы хотим создать векторные глифы для скорости в центре каждой ячейки. В первую очередь необходимо отфильтровать данные для центров ячеек, как описано в разделе 6.1.7.1. С помощью модуля cavity.OpenFOAM выделенного в Pipeline Browser, пользователь должен выбрать Cell Centers в меню Filter->Alphabetical и затем нажать кнопку Apply.

С помощью выбранных центров ячеек Centers выделенных в Pipeline Browser, выберите Glyph в меню Filter->Alphabetical. Панель окна Properties должна выглядеть, как показано на Рисунке 2.6. В появившейся панели Properties, поля скоростей U автоматически выбираются в меню векторов, поскольку оно является единственным векторным полем, которое имеется. По умолчанию Scale Mode(масштаб) для глифов будет Vector Magnitude(величиной вектора) скорости, но, поскольку мы хотим просмотреть изменение скорости вдоль области, то нужно выбрать off и Set Scale Factor равный 0,005. После нажатия кнопки Apply, глифы появятся, но, вероятно, одного цвета, например, белого. Пользователь должен задать цвет глифов в зависимости от величины скорости. Это можно сделать при помощи настройки Color by U в панели Display. Пользователь должен также выбрать Show Color Legend в Edit Color Map. Вывод показан на Рисунке 2.7, в котором заглавные шрифты Times Roman выбраны для заголовков Color Legend, а метки указаны для 2 фиксированных значимых фигур, при помощи отключения Automatic Label Format и ввода %-#6.2f в текстовом поле Label Format. Цвет фона устанавливается как белый в панели General в View Settings, как описано в разделе 6.1.5.1.

Отметим, что на левой и правой стенках, глифы показывают поток через стенки. Однако, при более подробном рассмотрении пользователь может видеть, что несмотря на то, что направление потока нормально к стенке, величина потока равна 0. Эта немного странная ситуация вызвана тем, что ParaView выбирает ориентацию глифов в направлении оси х, когда масштабирование выключено (off) и величина скорости 0.

2.1.4.3 Диаграммы линий тока( Streamline plots)

Опять же, прежде чем продолжить пост-процессорную обработку в ParaView, необходимо выключить модули такие как модуль для векторных диаграмм, описанный выше. Сейчас мы будем строить линии тока поля скорости, как описано в разделе 6.1.8.

С помощью модуля cavity.OpenFOAM выбранного в Pipeline Browser, выберите Stream Tracer в меню Filter и нажмите Apply. Окно Properties должно выглядеть, как показано на Рисунке 2.8. Точки источников Seed должны быть указаны в направлении Line Source вертикально проходящей через центр геометрии, то есть от (0.05, 0, 0.005) до (0.05, 0.1, 0.005). Для изображений мы использовали следующие настройки: point Resolution = 21; Max Propagation by Length 0.5; Initial Step Length by Cell Length 0.01; Integration Direction BOTH. Runge-Kutta 2 IntegratorType был использован с параметрами по умолчанию.

При нажатии Apply формируется индикатор (tracer). Затем, чтобы получить высококачественные изображения линий тока (streamline), пользователь должен выбрать Tube в меню Filter. Для изображений в этом примере, мы использовали: Num. sides 6; Radius 0.0003; Radius factor 10. Трyбки потоков (streamtubes) окрашены в зависимости от величины скорости. После нажатия Apply мы получим изображение как Рисунке 2.9 .


Fig2.8.png

Рисунок 2.8: Панель свойств фильтра Stream Tracer.



Fig2.9.png

Рисунок 2.9: Линии тока в кейсе cavity.


2.1.5 Увеличение разрешения сетки

Теперь увеличим в два раза разрешение сетки в каждом направлении. Результаты из грубой сетки будут перенесены на мелкую сетку в виде начальных условий задачи. Решение на тонкой сетке затем сравним с решением на грубой сетке.

2.1.5.1 Создание нового кейса на основе существующего кейса

Сейчас мы хотим создать новый кейс с названием cavityFine, который создан на основе кейса cavity. Для этого необходимо скопировать кейс cavity и отредактировать необходимые файлы. Сначала нужно создать новый каталог для нового кейса на том же уровне, что и для кейс cavity каверны:

cd $FOAM RUN/tutorials/incompressible/icoFoam
mkdir cavityFine

Скопируем основные каталоги из кейса cavity в новый кейс cavityFine, а затем перейдем в кейс cavityFine.

cp -r cavity/constant cavityFine
cp -r cavity/system cavityFine
cd cavityFine

2.1.5.2 Создание более мелкой сетки

Теперь мы хотим увеличить число ячеек сетки с помощью blockMesh. Откроем файл blockMeshDict в текстовом редакторе и изменим блок спецификации. Блоки расположены в списке в соответствии с ключевым словом blocks. Структура организации блоков подробно описана в разделе 5.3.1.3; на данном этапе достаточно знать, что следующий гексаэдр (hex) это сначала список вершин в блоке, далее список (или матрица-вектор), указывающий число ячеек в каждом направлении. Изначально список в кейсе cavity был (20 20 1). Нам необходимо изменить его на (40 40 1) и сохранить файл. Затем необходимо создать новую сетку командой blockMesh, как и раньше.

2.1.5.3 Перенос результатов с грубой сетки на мелкую сетку

Утилита mapFields переносит одно или больше полей, относящихся к данной геометрической модели на соответствующие поля для другой геометрической модели. В нашем случае будем считать поля «согласующимися», так как геометрия и типы границ, или граничных условий, для исходных и конечных полей одинаковы. Мы воспользуемся опцией –consistent при запуске mapFields в этом примере.

Данные поля, которые mapFields переносит, считываются из директории времени указанной в с помощью startFrom/startTime в controlDict в кейса-цели, т.е. того в который будут перенесены результаты. В нашем примере мы хотим перенести результаты кейса с грубой сеткой cavity в кейс с мелкой сеткой cavityFine. Таким образом, поскольку эти результаты хранятся в каталоге 0.5 для кейса cavity, необходимо в controlDict установить startTime равным 0.5 сек, а вstartFrom установить значение startTime.

Кейс готов к запуску mapFields. Запрос mapFields -help показывает, что mapFields запрашивает каталог кейса-источника в качестве аргумента. Мы используем опцию –consistent, поэтому утилита запускается из каталога cavityFine командой

mapFields ../cavity –consistent

Утилита должна запуститься с выводом на терминал, включающим

Source: ".." "cavity"
Target: "." "cavityFine"
Create databases as time
Case   : ../cavity
nProcs : 1
Source time: 0.5
Target time: 0.5
Create meshes
Source mesh size: 400 Target mesh size: 1600
Consistently creating and mapping fields for time 0.5
Creating mesh-to-mesh addressing ...
   Overlap volume: 0.0001
Creating AMI between source patch movingWall and target patch movingWall ...
   interpolating p
   interpolating U
End

2.1.5.4 Контрольная корректировка

Чтобы поддерживать число Куранта меньше 1, как описано в разделе 2.1.1.4, шаг по времени должен быть вдвое меньше, так как размер всех ячеек стал вдвое меньше. Поэтому deltaT необходимо установить равное 0.0025 сек. в словаре controlDict. Данные поля сейчас записываются через фиксированное количество шагов по времени. Сейчас мы покажем, как задать вывод данных через определенные промежутки по времени. После ключевого слова writeControl в controlDict, вместо запроса на вывод после фиксированного числа шагов по времени timeStep, поставим runTime, чтобы запись результатов проводилась через фиксированное значение времени. Теперь, если мы хотим, чтобы вывод записывался через каждые 0.1 сек. мы должны установить во writeInterval значение 0.1 и во writeControl значение runTime. Наконец, поскольку модель начинается с на основе решения, полученного на грубой сетке, нам лишь нужно запустить ее на короткое время, чтобы достичь приемлемой сходимости к стационарному состоянию. Поэтому endTime устанавливаем на 0.7 сек. Убедитесь, что параметры заданы правильно, затем сохраните файл.

2.1.5.5 Запуск расчета в фоновом режиме

Теперь попробуем запустить icoFoam в фоновом режиме, перенаправляя все выходные данные в файл log, который можно будет затем просмотреть. В каталоге cavityFine необходимо выполнить

icoFoam > log &
cat log

2.1.5.6 Диаграмма векторов для случая с измельченной сеткой

В ParaView можно одновременно открыть несколько кейсов; дело в том, что как каждый новый кейс будет просто еще одним модулем, который добавится в Pipeline Browser. Однако существует некоторое неудобство при открытии нового кейса в ParaView - есть необходимое условие, согласно которому исходные данные должны быть файлом с именем, который имеет расширение. Но в OpenFOAM каждый кейс представляет собой множестве файлов без расширений. В качестве решения был создан скрипт paraFoam, который создает фиктивный файла с расширением .OpenFOAM – поэтому модуль для кейса cavity каверны называется cavity.OpenFOAM.

Однако, если вы хотите открыть еще одну модель непосредственно в том же ParaView, то необходимо создать фиктивный файл. Например, для загрузки модели cavityFine такой файл можно создать, набрав:

cd $FOAM RUN/tutorials/incompressible/icoFoam
touch cavityFine/cavityFine.OpenFOAM

Теперь кейс cavityFine можно открыть в ParaView, выбрав команду Open из меню File, а затем выбрав cavityFine.OpenFOAM. Теперь вы можете создать диаграмму векторов на основе результатов из измельченной сетки. Диаграмму можно сравнить с кейсом cavity, включив отображение глифов (glyph) на обоих моделях одновременно.


Fig2.10.png

Рисунок 2.10: Выбор полей для построения графиков.


2.1.5.7 Построение графиков

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

foamCalc <calcType> <fieldName1 … fieldNameN>

Операция указывается в <calcType> ; на момент написания этой статьи существуют следующие операции: addSubtract; randomise; div; components; mag; magGrad; magSqr; interpolate. Пользователь может получить список вариантов <calcType> намеренно вызвав несуществующий. При сообщении об ошибке foamCalc выведет все доступные варианты, например,

 >> foamCalc xxxx 
 Selecting calcType xxxx 
     unknown calcType type xxxx, constructor not in hash table 
     Valid calcType selections are: 
  
 8 
 ( 
 randomise 
 magSqr 
 magGrad 
 addSubtract 
 div 
 mag 
 interpolate 
 components 
 )

Такие варианты calcType как components и mag предоставляют доступ к скалярным составляющим поля скорости. В случае запуска foamCalc components U , например, в кейсе cavity, считываются данные векторного поля скорости с каждой из директорий времени, затем в соответствующие директории времени записываются скалярные поля Ux, Uy, Uz содержащие x, y, z компоненты скорости. Похожим образом foamCalc mag U записывает скалярное поле magU в каждую директорию времени, представляющее величину скорости.

Пользователь может запустить foamCalc components calcType в кейсе cavity или в cavityFine. В случае кейса cavity, пользователь должен зайти в директорию cavity и выполнить команду foamCalc следующим образом:

cd $FOAM RUN/tutorials/incompressible/icoFoam/cavity
foamCalc components U

Отдельные компоненты могут быть представлены в виде графика в ParaView. Это быстро, удобно, доступны некоторые инструменты форматирования перед непосредственным выводом на печать. Тем не менее, для создания графиков для публикаций, пользователь может предпочесть сохранить необработанные данные, чтобы затем строить диаграммы и графики с помощью сторонних инструментов, таких как gnuplot или Grace/xmgr. Для этого мы рекомендуем использовать утилиту sample , описание которой находится в разделах 6.6 и 2.2.3.

До построения графиков, пользователю необходимо загрузить новые сгенерированные поля Ux, Uy и Uz в ParaView. Для этого пользователь должен нажать Refresh Times в верхней части панели Properties для кейса cavity.OpenFOAM, что приведет к загрузке новых полей в ParaView и их отображению в окне Volume Fields. Необходимо убедиться, что новые поля выбраны и изменения применены, то есть еще раз нажать Apply, если это необходимо. Также, данные могут быть неправильно интерполированы на границах, если граничные области выбраны на панели Mesh Parts. Поэтому пользователь должен отменить выбор патчей на панели Mesh Parts, т.е. movingWall, fixedWall и frontAndBack, после чего применить изменения.

Теперь для того, чтобы отобразить график в ParaView пользователь должен выбрать интересующий его модуль, т.е. cavity.OpenFOAM и применить фильтр Plot Over Line из меню Filter-> Data Analysis. После этого ниже или рядом с существующим 3D View окном откроется новое окно XY Plot. Создастся модуль PlotOverLine, в котором пользователь может указать конечные точки линия на панели Properties. В этом примере пользователь должен расположить линию по вертикали до центра домена, т.е. от (0,05, 0, 0,005) до (0,05, 0,1, 0,005), текстовые поля Point1 и Point2. Разрешение Resollution может быть установлено на 100.

При нажатии кнопки Apply, в окне Plot XY cгенерируется график. На панели Display, пользователь должен установить в Attribute Mode значение Point Data. Опция User Data Array может быть выбрано для X Axis Data, принимая параметр длины дуги arc_length, так что ось X графика представляет расстояние от основания полости.


Fig2.11.png

Рисунок 2.11: Построение графиков в paraFoam.


Пользователь может выбрать поля, которые будут отображаться на панели Line Series окна Display. В списке скалярных полей, которые будут отображаться, можно заметить, что величины и компоненты векторных полей доступны по умолчанию, например, отображаются в виде U_X, так что нет необходимости создавать Ux с помощью foamCalc. Тем не менее, пользователь должен отменить отображение всего кроме Ux (или U_х). Цветной квадрат в соседнем столбце выбранной последовательности показывает цвет линии. Самый простой способ его поменять - двойной щелчок мыши по нему.

Для форматирования графика, пользователь должен изменить параметры ниже панели Line Series, а именно цвет линии Line Color, толщину линии Line Thickness, стиль линии Line Style, стиль маркера Marker Style и оси диаграммы Chart Axes.

Кроме того, пользователь может нажать одну из кнопок, расположенных в верхнем левом углу XY Plot. Третья кнопка, например, позволяет пользователю управлять настройками отображения View Settings, где пользователь может задать заголовок и условные обозначения для каждой из осей. Кроме того, пользователь может установить шрифт, цвет и выравнивание заголовков осей, есть несколько вариантов для задания диапазона оси и меток в линейном или логарифмическом масштабах.

Рисунок 2.11 представляет собой график, сделанный в ParaView. Пользователь может создавать графики по своему усмотрению. Если интересно, график на рисунке 2.11 был с делан настройками осей: Стандартный Standard тип нотации Notation; выбрана опция Укажите диапазон выбранной оси Specify Axis Range; шрифт заголовков Sans Serif 12. График отображается в виде набора точек, а не линии, из-за активной опции Enable Line Series<tt> в окне дисплея. Примечание: если эта кнопка серая и неактивная, ее можно активировать путем выбора и отмены выбора набора переменных в панели Line Series. Если кнопка Enable Line Series выбрана, стиль линии Line Style и стиль маркера Marker Style могут быть скорректированы согласно предпочтениям пользователя.

2.1.6 Введение в градуировку сетки

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

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

Сделаем сетка 20х20 клеток с сортировкой к стенкам затем используем решение, полученное в параграфе 2.1.5.2 в качестве начального условия. Результаты, полученные на градуированной сетке сравним с результатами, полученными на предыдущих сетках. Поскольку изменения в словаре blockMeshDict довольно существенны, то кейс, используемый в этой части урока, cavityGrade, находится в $FOAM_RUN/tutorials/incompressible/icoFoam.

2.1.6.1 Создание градуированной сетки

Сетке теперь необходимо 4 блоков, так как для разных частей сетки требуется задать разную градуировку. Структура блока для сетки показана на рисунке 2.12. Пользователь может посмотреть файл blockMeshDict в каталоге constant/Polymesh в cavityGrade; основные элементы файла blockMeshDict также приводятся ниже. Каждый блок теперь имеет 10 ячеек в направлениях х и у, а соотношение между наибольшей и наименьшей ячейками 2.


Fig2.12.png

Рисунок 2.12: Блочная структура градуированной сетки для каверны (номера блоков в обведены кружками).


  convertToMeters 0.1;
  vertices
  (
      (0 0 0)
      (0.5 0 0)
      (1 0 0)
      (0 0.5 0)
      (0.5 0.5 0)
      (1 0.5 0)
      (0 1 0)
      (0.5 1 0)
      (1 1 0)
      (0 0 0.1)
      (0.5 0 0.1)
      (1 0 0.1)
      (0 0.5 0.1)
      (0.5 0.5 0.1)
      (1 0.5 0.1)
      (0 1 0.1)
      (0.5 1 0.1)
      (1 1 0.1)
  );

  blocks
  (
      hex (0 1 4 3 9 10 13 12) (10 10 1) simpleGrading (2 2 1)
      hex (1 2 5 4 10 11 14 13) (10 10 1) simpleGrading (0.5 2 1)
      hex (3 4 7 6 12 13 16 15) (10 10 1) simpleGrading (2 0.5 1)
      hex (4 5 8 7 13 14 17 16) (10 10 1) simpleGrading (0.5 0.5 1)
  );

  edges
  (
  );

  boundary
  (
      movingWall
      {
	  type wall;
	  faces
	  (
	      (6 15 16 7)
	      (7 16 17 8)
	  );
      }
      fixedWalls
      {
	  type wall;
	  faces
	  (
	      (3 12 15 6)
	      (0 9 12 3)
	      (0 1 10 9)
	      (1 2 11 10)
	      (2 5 14 11)
	      (5 8 17 14)
	  );
      }
      frontAndBack
      {
	  type empty;
	  faces
	  (
	      (0 3 4 1)
	      (1 4 5 2)
	      (3 6 7 4)
	      (4 7 8 5)
	      (9 10 13 12)
	      (10 11 14 13)
	      (12 13 16 15)
	      (13 14 17 16)
	  );
      }
  );

  mergePatchPairs
  (
  );

  // ************************************************************************* //

Ознакомившись с файлом blockMeshDict, пользователь может выполнить команду blockMesh из командной строки. Градуированную сетку можно посмотреть перед использованием с помощью paraFoam, как описано в разделе 2.1.2.

2.1.6.2 Изменение времени расчета и шага по времени

Самые высокие значения поля скорости и самые маленькие ячейки находятся рядом с крышкой, поэтому наибольшее число Куранта будет также рядом с крышкой, по причинам, указанным в разделе 2.1.1.4. Поэтому необходимо оценить размер ячеек рядом с крышкой, чтобы вычислить соответствующий шаг по времени для этого случая. Когда используется неравномерная градация сетки, blockMesh вычисляет размеры клеток с использованием геометрической прогрессии. Вдоль длины $ l $, если n ячеек необходимо создать с соотношением R между последней и первой клеткой, размер самой маленькой ячейки $ \delta x_s $, определяется по формуле:

$ \delta x_s = l \frac{r-1}{\alpha r-1} $ (2.5)

где r это соотношение между размерами текущей и следующей ячеек, которое определяется по формуле:

$ r = R^{\frac{1}{n-1}} $ (2.6)

и

$ \alpha = \begin{cases} R & \quad \text{если } R > 1,\\ 1-r^{-n}+r{-1} & \quad \text{если } R<1.\\ \end{cases} $ (2.7)

Для случая cavityGrade количество ячеек в каждом направлении в блоке равно 10, соотношение между наибольшим и наименьшим ячеек равно 2 и высота блока и ширина составляет 0.05 м. Поэтому наименьшая длина ячейки 3.45 мм. Из уравнения 2.2, шаг по времени должен быть меньше 3.45 мс, чтобы значение числа Куранта было меньше 1. Для того, чтобы гарантировать, что результаты записываются в соответствующие интервалы времени, время шага deltaT должно быть уменьшено до 2.5 мс, а writeInterval установлен в 40 так, что результаты записываются каждые 0.1 с. Эти параметры можно посмотреть в файле /cavityGrade/system/controlDict. Параметр startTime должен быть установлен исходя из условий окончания случая cavityFine, например, 0.7. Так как cavity и cavityFine сходились хорошо в течение установленного времени выполнения, мы можем установить время выполнения для случая cavityGrade 0.1 с, т.е. endTime должно быть не менее 0.8.

2.1.6.3 Интерполяция полей

Как и в разделе 2.1.5.3, используем mapFields для переноса окончательных результатов из случая cavityFine на сетку случая cavityGrade. Переходим в директорию cavityGrade и выполняем mapFields:

cd $FOAM RUN/tutorials/incompressible/icoFoam/cavityGrade
mapFields ../cavityFine -consistent


Теперь запустим icoFoam из этого каталога и просмотрим информацию о запуске. Просмотрим сошедшиеся результаты для этого случая и сравним их с другими результатами с помощью инструментов пост-обработки, описанных ранее в разделе 2.1.5.6 и разделе 2.1.5.7.

2.1.7 Увеличение числа Рейнольдса