- •РЕФЕРАТ
- •Записка к выпускной квалификационной работе изложена на 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.5 Разработка класса Boundary
Расчетная сетка в большинстве задач, решаемых OpenFOAM, генерируется с помощью утилиты blockMesh. Словарь blockMeshDict является своеобразным интерфейсом пользователя для создания расчетной сетки. Данные о самой сетке, используемые OpenFOAM, хранятся в файлах points, cells, faces и boundary, которые генерируются в результате запуска blockMesh. Все эти файлы, как правило, не редактируются пользователем, так как они содержат большие объемы данных, с которыми человеку трудно работать. Исключением является файл boundary. Пример его содержимого представлен в листинге 4.
Листинг 4 — Пример содержимого файла boundary
3
(
movingWall |
|
{ |
|
type |
wall; |
nFaces |
50; |
startFace |
4900; |
} |
|
fixedWalls |
|
{ |
|
type |
wall; |
nFaces |
150; |
startFace |
4950; |
} |
|
frontAndBack |
|
{ |
|
type |
empty; |
nFaces |
5000; |
startFace |
5100; |
} |
|
)
В файле boundary содержится информация о границах расчетной области: количество различных границы, их название и тип, а также другие параметры, которые для пользователя, как правило, не имеют значения. Однако редактирование файла boundary полезно в том случае, если расчетная сетка уже сегенерирована, но необходимо поменять тип одной из границ, или ее название. К примеру, blockMesh допускает задания в своем словаре не всех границ, полностью покрывая область расчета, а только некоторых. Для остальных утилита blockMesh сама определяет название defaultPatches и тип empty. В случае, если пользователь хочет, чтобы сгенерированные утилитой blockMesh границы имели
42
другой тип или другое название, он может отредактировать файл boundary. Поэтому возникает задача написания класса Boundary, с помощью которого можно будет распарсить одноименный файл и предоставить пользователю возможность редактировать его с помощью элементов графического интерфейса.
Параметрами патча в файле boundary, помимо type, nFaces и startFace, которые можно увидеть в листинге 4, являются neighbourPatch и matchTolerance, которые указываются только тогда, когда указан тип патча cyclic. Исходя из этого был разработан класс Patch, поля которого представлены в таблице 13.
Таблица 13 — поля класса Patch
Тип |
Имя поля |
Описание |
|
|
|
|
|
|
|
QByteArray |
name |
Имя патча |
|
|
|
|
|
|
|
int |
type |
Тип патча |
|
|
uint |
nFaces |
Параметр nFaces (количество граней патча) |
||
|
|
|
||
uint |
startFace |
Параметр startFace (начальная грань патча) |
||
|
|
|
|
|
double |
matchTolerance |
Параметр |
matchTolerance |
(точность |
|
|
совпадения вершин граней соседних патчей — |
||
|
|
только для патча типа cyclic) |
|
|
|
|
|
||
QByteArray |
neighbourPatch |
Имя соседнего патча (только для патча типа |
||
|
|
cyclic) |
|
|
|
|
|
|
|
Подчеркну, что поля nFaces и startFace не должны редактироваться пользователем. Они включены в класс для полноты, и будут отображаться в приложении, но не будут доступны для изменения.
Полями разработанного класса Boundary являются поле nPatches типа int и patchesList типа QList<Patch>. Второе является списком объектов типа Patch, а первое — количество элементов в данном списке.
Функции, реализованные в классе Boundary, представлены в таблице 14.
43
Таблица 14 — Функции класса Boundary
Функция |
Описание |
|
|
|
|
|
|
|
|
|
|
ParsePatches(Patch &p) |
Сканирует |
отдельный |
патч |
и |
присваивает |
|
соответствующие значения полям патча p |
|
|||
|
|
|
|
|
|
ParsePatchParams(Patch |
Сканирует |
отдельный параметр |
патча и |
присваивает |
|
&p) |
соответствующее значение |
соответствующему полю |
|||
|
|||||
|
патча p |
|
|
|
|
|
|
|
|
|
|
Функции, приведенные в таблице 14, как и в описанных в предыдущих разделах классах, унаследованных от Dict, вызываются функцией-парсером CopyDict. Исходный код реализации класса Boundary приведен в приложении.
3.2.6 Разработка класса Field
Значения физических величин хранятся в файлах полей OpenFOAM, которые находятся во временных директориях. Имя временной директории соответствует моменту времени, в который физические величины имеют определенные значения (например, «0»), а имя файла поля соответствует названию физической величины (например, «p» для давления или «U» для скорости). Для задания исходных данных задачи пользователю необходимо задать значение поля в начальный момент времени. Пример содержимого файла поля давления приведен в листинге 5.
Листинг 5 — Пример содержимого файла поля давления
dimensions |
[0 2 -2 0 0 0 0]; |
internalField |
uniform 0; |
boundaryField |
|
{ |
|
movingWall |
|
{ |
|
type |
zeroGradient; |
} |
|
fixedWalls |
|
{ |
|
type |
zeroGradient; |
}
frontAndBack
{
type empty;
}
}
44
Как видно из листинга 5, структура файла поля физической величины такова: вначале указывается ее размерность (ключевое слово dimensions), затем указывается значение внутреннего поля для ячеек расчетной сетки (ключевое слово internalField), после чего следует подсловарь boundaryField, содержащий информацию о поле на границах расчетной сетки. Рассмотрим формат файла поля более детально.
Формат задания размерности физической величины имеет следующий вид: dimensions [<int> <int> <int> <int> <int> <int> <int>]
Каждое из целых чисел внутри круглых скобок задает степень одной из единиц измерения (см. таблицу 3.2.1.2).
Формат задания значения внутреннего поля имеет следующий вид: internalField <Значение>
При этом <Значение> может быть однородным (uniform) и неоднородным (nonuniform). В случае однородного поля значение задается так:
uniform <одноЗначение>
При этом значение <одноЗначение> для скалярных физических величин состоит из одного дробного числа, для векторных — из трех чисел, заключенных в круглые скобки и разделенных пробелами, для тензорных — из девяти чисел в круглых скобках, разделенных пробелами. В случае неоднородного поля формат имеет вид: nonuniform List< <тип> >
(
<одноЗначение1>
<одноЗначение2>
…
<одноЗначениеN>
)
Здесь <тип> указывает тип физической величины. Для скалярных величин он принимает значение scalar, для векторных — vector, для тензорных — tensor. Для задания неоднородного внутреннего поля необходимо ввести список элементов в количестве, равном количеству ячеек, на которое разбито пространство расчетной сеткой.
45
Для представления значения поля в приложении были разработаны классы
SingleFieldValue и FieldValue.
В классе SingleFieldValue лишь одно поле val типа double[9]. В данном массиве содержатся значения компонент вектора и тензора, если поле — векторное или тензорное; в случае скалярного поля, начение скалярной величины содержится в нулевом элементе массива.
Поля класса FieldValue приведены в таблице 15.
Таблица 15 — Поля класса FieldValue
Тип |
Имя поля |
Описание |
|
|
|
bool |
isUniform |
Флаг, указывающий, |
какое |
значение |
|
|
|
содержится в данном объекте: при false |
|||
|
|
— значение неоднородное, при true — |
|||
|
|
однородное. |
В |
первом |
случае |
|
|
используется поле uniformVal, во |
|||
|
|
втором — nonUniformVal |
|
||
|
|
|
|||
SingleFieldValue |
uniformVal |
Значение поля в однородном случае |
|||
QList<SingleFieldValue> |
nonUniformVal |
Список значений поля в неоднородном |
|||
|
|
случае |
|
|
|
|
|
|
|
|
|
Подсловарь boundaryField содержит множество подсловарей, одноименных граничным поверхностям, содержащимся в файле boundary. Каждый из этих подсловарей имеет набор некоторых параметров. Обязательным является параметр type, значение которого определяет те параметры, которые должны быть указаны после него. Основные типы граничных полей и параметры, которые необходимо указать для граничного поля данного типы, приведены в таблице 16.
46
Таблица 16 — Основные типы граничных полей и необходимые для них параметры
Тип |
Необходимые параметры |
fixedValue |
value |
|
|
fixedGradient |
gradient |
|
|
zeroGradient |
Нет |
|
|
calculated |
Нет |
mixed |
refValue, refGradient, valueFraction |
|
|
directionMixed |
refValue, refGradient, valueFraction |
|
|
Кроме перечисленных в таблице 16 типов граничных полей существует огромное множество других типов, для изучения которых руководство пользователя [2] OpenFOAM предлагает изучить исходный код пакета. В разработанном классе BoundaryField для хранения необходимых параметров типов, перечисленных в таблице, отведены специальные поля, одноименные параметрам. В случае, если тип граничного поля не является одним из предусмотренных типов, его параметры сохраняются в поле-списке otherParams класса BoundaryField. Список полей данного класса приведен в таблице 17.
Таблица 17 — Поля класса BoundaryField
Тип |
Имя поля |
Описание |
|
|
|
QByteArray |
name |
Имя граничной поверхности (патча) |
QByteArray |
type |
Тип поля граничной поверхности |
|
|
|
FieldValue |
value |
Параметр value поля патча (только при типе |
|
|
fixedValue) |
|
|
|
FieldValue |
gradient |
Параметр gradient поля патча (только при |
|
|
типе fixedGradient) |
|
|
|
FieldValue |
refValue |
Параметр refValue поля патча (при типах |
|
|
mixed и directionMixed) |
|
|
|
FieldValue |
refGradient |
Параметр refGradient поля патча (при типах |
|
|
mixed и directionMixed) |
|
|
|
FieldValue |
valueFraction |
Параметр valueFraction поля патча (при |
|
|
типах mixed и directionMixed) |
|
|
|
QList<Parameter> |
otherParams |
Список параметров для типов граничных полей, |
|
|
не предусмотренных в приложении |
47
После описания вспомогательных классов SingleFieldValue, FieldValue и BoundaryField можно привести описание класса Field. Основные поля этого класса приведены в таблице 18.
Таблица 18 — Поля класса Field
Тип |
Имя поля |
|
|
Описание |
|
|
|
|
|
|
int[7] |
dimensions |
|
|
Массив, содержащий показатели степеней при |
||||||
|
|
|
|
соответствующих |
единицах |
измерения |
||||
|
|
|
|
(приведены в таблице XXX) |
|
|
|
|||
FieldValue |
internalFieldValue |
|
Значение внутреннего поля расчетной области |
|||||||
|
|
|
|
|
|
|||||
QList<Bounda |
boundaryFields |
|
Список полей граничных поверхностей |
|
||||||
ryField> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
valSize |
|
|
|
Количество компонент в одном значении |
||||||
|
|
|
|
физической |
величины |
(для |
скалярной |
|||
|
|
|
|
величины — 1, для векторной — 3, для |
||||||
|
|
|
|
тензорной — 9). Тип величины указывается в |
||||||
|
|
|
|
заголовочном подсловаре |
|
|
|
|||
|
|
|
|
|||||||
Основные функции класса Field, применяемые для парсинга файла поля, |
||||||||||
приведены в таблице 19. |
|
|
|
|
|
|
|
|
|
|
Таблица 19 — Функции класса Field |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
Функция |
|
Описание |
|
|
|
|
|
|
|
|
|
|
|||||||||
ParseDimensions() |
Сканирует данные о размерности физической величины |
|||||||||
ParseInternalField() |
Сканирует значение внутреннего поля расчетной |
|||||||||
|
|
области |
|
|
|
|
|
|
|
|
ParseValue(FieldValue |
Сканирует |
значение |
величины, |
однородное |
или |
|||||
&v) |
|
неоднородное, и заполняет этим значением объект |
v |
|||||||
|
|
|||||||||
|
|
|
|
|
|
|||||
ParseSingleValue(Singl |
Сканирует |
отдельное |
значение |
физической |
величины |
|||||
eFieldValue &v) |
(однородное, или входящее в состав неоднородного |
|||||||||
|
|
|||||||||
|
|
значения) и заполняет этим значением объект |
v |
|
||||||
|
|
|
|
|
|
|
|
|
|
|
48
