
- •РЕФЕРАТ
- •Записка к выпускной квалификационной работе изложена на 107 стр. машинописного текста, состоит из 3 разделов и включает 24 рисунка.
- •СОДЕРЖАНИЕ
- •ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ
- •ВВЕДЕНИЕ
- •1 Анализ задачи создания пользовательского интерфейса для OpenFOAM
- •1.1 Взаимодействие пользователя с OpenFOAM в процессе моделирования задачи
- •1.1.1 Предпроцессинг
- •1.1.2 Решение задачи и пост-процессинг
- •1.2 Основные требования к пользовательскому интерфейсу OpenFOAM
- •1.3 Функционал пользовательского интерфейса OpenFOAM
- •2 Определение средств для реализации пользовательского интерфейса OpenFOAM
- •2.1 Выбор операционной системы
- •2.2 Выбор языка программирования
- •2.3 Выбор IDE
- •3 Разработка пользовательского интерфейса для OpenFOAM
- •3.1 Структура приложения-интерфейса для OpenFOAM
- •3.2 Разработка классов объектов, хранящих информацию из файлов кейса OpenFOAM
- •3.2.1 Формат файлов кейсов OpenFOAM
- •3.2.2 Разработка абстрактного базового класса Dict
- •3.2.3 Разработка класса ControlDict
- •3.2.4 Разработка класса BlockMeshDict
- •3.2.5 Разработка класса Boundary
- •3.2.6 Разработка класса Field
- •3.2.7 Разработка класса Constant
- •3.2.8 Разработка класса SetFieldsDict
- •3.3 Разработка графического пользовательского интерфейса приложения
- •3.3.1 Внешний вид приложения
- •3.3.2 Вкладка «control»
- •3.3.2 Вкладка «blockMesh»
- •3.3.3 Вкладка «boundary»
- •3.3.4 Вкладка «Поля»
- •3.3.5 Вкладка «setFields»
- •3.3.6 Вкладка «Константы»
- •3.3.7 Вкладки «fvSolution» и «fvSchemes»
- •3.3.8 Вкладка «Запуск»
- •Заключение
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРИЛОЖЕНИЕ А
- •Листинги ключевых частей программы
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