Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diplom3.pdf
Скачиваний:
160
Добавлен:
09.02.2015
Размер:
1.48 Mб
Скачать

3.2.4 Разработка класса BlockMeshDict

blockMeshDict — словарь утилиты blockMesh, с помощью которой генерируется расчетная сетка. В нем содержатся данные о геометрии пространства, в котором ведется расчет. Пример содержимого словаря показан в листинге 3.

Листинг 3 — Пример содержимого словаря blockMeshDict

convertToMeters

0.1;

vertices

(

(0 0 0 ) (1 0 0 ) (1 1 0 ) (0 1 0 )

(0 0 0.1 ) (1 0 0.1 ) (1 1 0.1 ) (0 1 0.1 )

);

blocks ( hex (0 1 2 3 4 5 6 7 ) (50 50 1 ) simpleGrading (1 1 1 ) ); edges ( );

boundary

(

movingWall

{

type wall; faces

(

(3 7 6 2 )

);

}

fixedWalls

{

type wall; faces

(

(0 4 7 3 ) (2 6 5 1 ) (1 5 4 0 )

);

}

frontAndBack

{

type empty; faces

(

(0 3 2 1 ) (4 5 6 7 )

);

}

);

mergePatchPairs ( );

Содержимое словаря blockMeshDict всегда одинаково по структуре: сначала идет ключевое слово convertToMeters, после которого указывается масштаб.

36

Затем идет список вершин, обозначенный словом vertices, затем список блоков blocks, список дугообразных граней edges, список границ boundary и список объединяемых границ mergePatchPairs. Исходя из этой структуры была написана реализация функции-парсера CopyDict для класса BlockMeshDict. Помимо функции-парсера были определены такие классы, как Vertice, Block, ArcEdge и BoundaryBM, а также класс Face. Способ форматирования списка mergePatchPairs не указывается, и в tutorial-кейсах OpenFOAM также нет примеров его использования, из чего следует вывод, что этот список используется крайне редко. Ввиду этого для объектов этого списка не был введен отдельный класс, и его невозможно будет редактировать, используя разрабатываемое приложениеинтерфейс. Исходный код описания и реализации перечисленных классов можно посмотреть в приложении.

Список вершин в словаре blockMeshDict содержит вершины, записанные в следующем формате:

(<double>, <double>, <double>)

В круглых скобках указываются три дробных числа: первое — координата по оси X, второе — координата по Y, третье — координата по Z. Соответственно, класс Vertice будет содержать три поля (см. табл. 7).

Таблица 7 — Поля класса Vertice

Тип

Имя поля

Описание

 

 

 

double

x

координата X вершины

double

y

координата Y вершины

 

 

 

double

z

координата Z вершины

 

 

 

Для создания расчетной сетки с помощью утилиты blockMesh необходимо задать пространство в виде стыкующихся друг с другом блоков. Блоки указываются в виде списка с названием blocks. Единичный блок записывается в словаре blockMeshDict следующим образом:

37

hex (<int> <int> <int> <int> <int> <int> <int> <int>)

<имяБлока>

(<int>

<int>

<int>)

<типРасширения>

(<коэффициентыРасширения>)

Здесь hex — ключевое слово, означающее начало описания блока. За ним следуют восемь целых чисел. Каждое из этих чисел является номером вершины из списка вершин, заполненного ранее в словаре. Таким образом для блока задаются восемь его вершин. Затем следует текстовое имя блока (опционально). После этого в круглых скобках указывается три целых числа: первое — количество ячеек, на которое разбивается данный блок по оси X, второе — по Y, и третье — по Z. После этого следует тип расширения ячеек. Тип может быть simpleGrading и edgeGrading. В первом случае в круглых скобках указываются три дробных числа, означающих коэффициенты расширения ячеек по трем осям X, Y и Z, а во втором случае — двенадцать дробных чисел для задания расширения по каждому из ребер отдельно. (Для более подробного описания формата блоков blockMesh, см. [2]).

Для хранения параметров блока разработан класс Block, поля которого приведены в таблице 8.

Таблица 8 — Поля класса Block

Тип

Имя поля

Описание

 

 

 

QByteArray

name

Текстовое имя блока

 

 

 

 

 

 

 

uint[8]

vertLabels

Массив, содержащий номера вершин блока

 

 

 

 

uint[3]

cellAmount

Массив, содержащий количество ячеек для

 

 

каждой из трех координат, на которые

 

 

разбивается блок

 

 

 

 

 

 

 

 

 

 

int

typeGrading

Тип

расширения

ячеек:

1

для

 

 

simpleGrading и 2 для edgeGrading

 

 

 

 

 

 

double[12]

grading

Массив,

содержащий

коэффициенты

 

 

расширения ячеек

 

 

 

 

 

 

 

 

 

 

38

Грани блоков, на которые разбивается пространство с помощью blockMesh, могут быть не только прямыми, но и кривыми. Кривая может задаваться сплайном, но чаще всего используется дугообразная кривая (arc) с заданием единственной точки интерполяции. Формат задания дугообразной кривой в словаре blockMeshDict следующий:

arc <int> <int> <Vertice>

arc — ключевое слово, показывающее, что данное ребро — дугообразное. За ним следуют два целых числа — это номера вершин, которые соединяются дугообразным ребром. После этого задается точка интерполяции в том же формате, что и описанная выше вершина из списка vertices.

Для

хранения параметров дугообразного ребра был разработан класс

ArcEdge, поля которого приведены в таблице 9.

Таблица 9 — Поля класса ArcEdge

 

 

 

 

Тип

 

Имя поля

Описание

 

 

 

 

uint

 

v1

Номер первой вершины из списка vertices,

 

 

 

соединяемой ребром со второй

 

 

 

 

uint

 

v2

Номер второй вершины из списка vertices,

 

 

 

соединяемой ребром с первой

Vertice

 

interpVert

Точка интерполяции дуги

 

 

 

 

За списком ребер в словаре blockMeshDict следует список граничных поверхностей (патчей), который называется boundary. Формат записи отдельной граничной поверхности следующий:

<имяПатча>

{

type <тип>;

faces

(

<грань1>

<грань2>

39

<граньN>

)

}

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

Формат записи отдельной грани в словаре blockMeshDict следующий:

(<int>, <int>, <int>, <int>)

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

Для хранения параметров грани был разработан класс Face. В данном классе только одно поле типа uint[4], с названием num. В массиве num содержатся номера вершин, из которых состоит грань.

Далее, для хранения параматров границы, был разработан класс BoundaryBM. Его поля приведены в таблице 10.

Таблица 10 — Поля класса BoundaryBM

Тип

Имя поля

Описание

 

 

 

QByteArray

name

Имя патча

int

type

Тип патча

 

 

 

QByteArray

neighbourPatch

Имя соседнего патча, в случае, если тип

 

 

текущего патча cyclic

 

 

 

QList<Face>

faces

Список граней, задающих данный патч

40

После того, как были разработаны классы объектов, входящих в состав словаря blockMeshDict, был разработан класс BlockMeshDict. Его поля приведены в таблице 11.

Таблица 11 — Поля класса BlockMeshDict

Тип

Имя поля

Описание

 

 

double

convertToMeters

Значение

параметра

convertToMeters

 

 

словаря blockMeshDict (масштаб)

 

 

 

 

QList<Vertice>

vertices

Список вершин

 

 

 

 

 

QList<Block>

blocks

Список блоков

 

QList<ArcEdge>

edges

Список ребер

 

 

 

 

QList<BoundaryBM>

bnd

Список границ расчетной области

 

 

 

 

 

В классе BlockMeshDict реализованы специальные функции, которые используются функцией-парсером CopyDict. Их список приведен в таблице 12.

Таблица 12 — Функции класса BlockMeshDict

Имя функции

Описание

ParseVertice()

Сканирует одну вершину из списка

 

vertices

 

 

ParseEdge()

Сканирует одно ребро из списка edges

 

 

ParseBlock()

Сканирует один блок из списка blocks

 

 

ParseBoundary()

Сканирует один патч из списка boundary

 

 

ParseBoundaryParam(BoundaryBM &b)

Сканирует один параметр патча и

 

присваивает соответствующему параметру

 

патча b значение этого параметра

ParseFace(BoundaryBM &b)

Сканирует одну грань из списка faces,

 

добавляя ее в список граней патча b

Каждая из перечисленных в таблице 12 функций возвращает код синтаксической ошибки типа int, или 0, в случае отсутствия ошибки.

41

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]