- •РЕФЕРАТ
- •Записка к выпускной квалификационной работе изложена на 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 Вкладка «Запуск»
- •Заключение
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРИЛОЖЕНИЕ А
- •Листинги ключевых частей программы
Продолжение таблицы 19
Функция |
Описание |
|
|
|
|
|
|
||
ParseBoundaryField() |
Сканирует подсловарь граничных полей |
|
||
ParseOneBoundary(Bound |
Сканирует |
отдельное граничное поле и заполняет |
его |
|
aryField &b) |
параметрами объект b |
|
|
|
|
|
|
||
|
|
|
|
|
ParseBoundaryParam(Bou |
Сканирует |
отдельный параметр |
граничного поля |
и |
ndaryField &b) |
присваивает соответствующему параметру объекта b |
|||
|
||||
|
соответствующее значение |
|
|
|
ParseBoundaryType(Boun |
Сканирует |
тип граничного поля |
и присваивает полю |
|
daryField &b) |
type объекта b соответствующее значение |
|
||
|
|
|||
|
|
|
|
|
Как и ранее, приведенные в таблице функции вызываются функциейпарсером CopyDict.
3.2.7 Разработка класса Constant
Для решения большинства задач с помощью OpenFOAM необходимо задать константы и физические свойства. Они задаются в файлах в папке constant, и имеют названия, как правило, содержащие слово «Properties» (свойства), например, transportProperties. Содержимое файлов с константами менее детерминировано, чем содержимое словаря blockMeshDict или controlDict. Каждый решатель, вопервых, нуждается в своем наборе файлов с константами, и во-вторых, содержимое того же файла transportProperties для решения задачи с помощью одного решателя может кардинально отличаться от содержимого того же файла для другого решателя. Пример содержимого файла transportProperties представлен в листинге 6.
49
Листинг 6 — пример содержимого файла transportProperties
phase1 |
|
|
|
|
|
{ |
|
|
|
|
|
transportModel |
Newtonian; |
|
|
||
nu |
|
nu [ 0 2 -1 0 0 0 0 ] 1e-06; |
|||
rho |
|
rho |
[ 1 -3 0 0 0 0 0 ] 1000; |
||
CrossPowerLawCoeffs |
|
|
|
||
{ |
nu0 |
|
nu0 [ 0 2 |
-1 0 0 0 0 ] 1e-06; |
|
|
|
||||
|
nuInf |
|
nuInf [ |
0 2 -1 0 0 0 0 ] 1e-06; |
|
|
m |
|
m [ 0 0 1 0 0 0 0 ] 1; |
||
} |
n |
|
n [ 0 0 0 0 0 0 0 ] 0; |
||
|
|
|
|
|
|
BirdCarreauCoeffs |
|
|
|
||
{ |
|
|
|
|
|
|
nu0 |
|
nu0 [ 0 2 -1 0 0 0 0 ] 0.0142515; |
||
|
nuInf |
|
nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; |
||
Листинг 6 (продолжение) |
|
|
|
||
|
k |
|
k [ 0 0 1 0 0 0 0 ] 99.6; |
||
|
n |
|
n [ 0 0 0 0 0 0 0 ] 0.1003; |
||
} |
|
|
|
|
|
} |
|
|
|
|
|
phase2 |
|
|
|
|
|
{ |
|
|
|
|
|
transportModel |
Newtonian; |
|
|
||
nu |
|
nu [ 0 2 -1 0 0 0 0 ] 1.48e-05; |
|||
rho |
|
rho |
[ 1 -3 0 0 0 0 0 ] 1; |
||
CrossPowerLawCoeffs |
|
|
|
||
{ |
nu0 |
|
nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; |
||
|
|
||||
|
nuInf |
|
nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; |
||
|
m |
|
m [ 0 0 1 0 0 0 0 ] 1; |
||
} |
n |
|
n [ 0 0 0 0 0 0 0 ] 0; |
||
|
|
|
|
|
|
BirdCarreauCoeffs |
|
|
|
||
{ |
|
|
|
|
|
|
nu0 |
|
nu0 [ 0 2 -1 0 0 0 0 ] 0.0142515; |
||
|
nuInf |
|
nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; |
||
|
k |
|
k [ 0 0 1 0 0 0 0 ] 99.6; |
||
|
n |
|
n [ 0 0 0 0 0 0 0 ] 0.1003; |
||
} |
|
|
|
|
|
} |
|
|
|
|
|
sigma |
sigma [ |
1 0 -2 0 0 0 0 ] 0.07; |
В приведенном листинге можно увидеть древовидную структуру параметров: некоторые параметры могут содержать вложенные параметры, заключенные в фигурные скобки. Поэтому для хранения содержимого файлов физических свойств и констант был разработан класс ConstantParameter. Его поля представлены в таблице 20.
50
Таблица 20 —Поля класса ConstantParameter
Тип |
Имя поля |
Описание |
|
|
|
QByteArray |
name |
Имя параметра |
|
|
|
bool |
isMulti |
Признак того, что параметр является подсловарем, |
|
|
в который могут включаться другие параметры. В |
|
|
случае, если данное поле принимает значение |
|
|
true, используется поле children, иначе — |
|
|
параметр не является вложенным, и его значение |
|
|
хранится в поле val |
|
|
|
QByteArray |
val |
Значение параметра в случае, если флаг isMulti |
|
|
не установлен; иначе поле не используется |
|
|
|
QList<constantPar |
children |
Список указателей на вложенные параметры в |
ameter*> |
|
случае, если флаг isMulti установлен, иначе поле |
|
|
|
|
|
не используется |
Класс Constant включает в себя только одно поле типа
QList<ConstantParameter> под названием cParams, которое является
списком объектов описанного выше класса ConstantParameter. Таким образом в приложении хранится древовидная структура параметров, заданных в любом из файлов констант и физических свойств.
Разработанный класс Constant можно использовать также для представления содержимого файлов fvSolution и fvSchemes. Их содержимое также сильно зависит от используемого решателя и представляет собой набор параметров, некоторые из которых могут быть вложенными, поэтому класс ConstantParameter хорошо подойдет для хранения параметров этих файлов.
3.2.8 Разработка класса SetFieldsDict
Задания неоднородных внутренних полей, как правило, не производится путем ручного ввода значения каждой ячейки, как того требует OpenFOAM. Для этого существуют специальные утилиты. Простейшим инструментом для задания неоднородных полей является утилита setFields. Она позволяет одновременно задать определенное значение физической величины для всех ячеек, ограниченных
51
определенной геометрической фигурой (например, сферой или параллелепипедом). Для использования setFields необходимо отредактировать ее словарь setFieldsDict. Пример содержимого этого словаря представлен в листинге 7.
Листинг 7 — Пример содержимого словаря setFieldsDict
defaultFieldValues
(
volScalarFieldValue alpha1 1 volScalarFieldValue p_rgh 1e5
);
regions
(
sphereToCell
{
centre (0.5 0.5 0);
Листинг 7 (продолжение)
radius 0.1; fieldValues
(
volScalarFieldValue alpha1 0 volScalarFieldValue p_rgh 1e6
);
}
boxToCell
{
box (-10 1 -1) (10 10 1); fieldValues
(
volScalarFieldValue alpha1 0
);
}
);
Структура словаря setFieldsDict такова: сначала задается список defaultFieldValues значений полей по умолчанию, затем список регионов regions, в котором задаются подсловари геометрических фигур, ячейкам внутри которых необходимо присвоить определенное значение. Полный список фигур, используемых в setFieldsDict, можно посмотреть здесь [9].
Значение поля в setFieldsDict форматируется следующим образом:
<типПоля> <физическаяВеличина> <одноЗначение>
типПоля определяет, является ли физическаяВеличина скалярной, векторной или тензорной, и принимать значения volScalarFieldValue, volVectorFieldValue, volTensorFieldValue. После типа задается
название физической величины. При этом в начальной временной должен 52
существовать файл, содержащий информацию о данном поле. После названия задается одно значение физической величины так же, как в пункте 3.2.6.
Для хранения значения поля из словаря setFieldsDict был разработан класс SetFieldsValue. Его поля приведены в таблице 21.
Таблица 21 — Поля класса SetFieldsValue
Тип |
Имя поля |
Описание |
|
|
|
int |
valSize |
Содержит количество компонент значения физической |
|
|
величины (для скалярной — 1, для векторной — 3, для |
|
|
тензорной - 9) |
|
|
|
QByteArray |
name |
Название физической величины. Должно совпадать с |
|
|
именем одного из файлов в начальной временной папке |
SingleField |
value |
Значение физической величины |
Value |
|
|
|
|
|
Для представления элементов списка regions был разработан класс Region. Его поля представлены в таблице 22.
Таблица 22 — Поля класса Region
Тип |
Имя поля |
Описание |
|
|
|
QByteArray |
name |
Имя региона — подсловаря. От него зависит, |
|
|
какие параметры подребуются setFields для |
|
|
правильной работы |
|
|
|
QList<Parameter> |
geometryParams |
Список параметров (текстовые имя параметра |
|
|
и значение), характерных для данного региона |
|
|
|
QList<SingleField |
FieldValues |
Список значений полей в данном регионе |
Value> |
|
|
|
|
|
Для представления всего словаря setFieldsDict в приложении был разработан класс SetFieldsDict. Его поля представлены в таблице 23.
53
Таблица 23 — Поля класса SetFieldsDict
Тип |
Имя поля |
|
Описание |
|
|
|
|
||
|
|
|
|
|
|
|
|||
QList<SetFieldsValue> |
defaultFieldValues |
Список |
значений |
полей |
по |
||||
|
|
|
|
умолчанию, вне регионов |
|
||||
|
|
|
|
|
|
|
|||
QList<Region> |
regions |
|
Список регионов |
|
|
||||
Реализованные в классе SetFieldsDict функции для сканирования |
|||||||||
словаря setFieldsDict представлены в таблице 24. |
|
|
|
|
|
||||
Таблица 24 — Функции класса SetFieldsDict |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
Функция |
|
Описание |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
ParseDefaultFieldValues() |
Сканирует |
|
список |
defaultFieldValues, |
|||||
|
|
заполняя элементами одноименное поле-список |
|||||||
|
|
defaultFieldValues |
|
|
|
|
|||
|
|
|
|
|
|
||||
ParseOneFieldValue(SetFiel |
Сканирует |
одно |
значение |
поля и |
присваивает |
||||
dsValue &v) |
|
соответствующее значение объекту v |
|
|
|||||
|
|
|
|
||||||
|
|
|
|||||||
ParseRegions() |
|
Сканирует список regions, заполняя элементами |
|||||||
|
|
одноименное поле-список |
regions |
|
|
||||
|
|
|
|
|
|
|
|||
ParseOneRegion(Region |
|
Сканирует |
один |
подсловарь-регион |
из |
списка |
|||
®) |
|
regions, присваивая соответствующее значение |
|||||||
|
|
||||||||
|
|
объекту reg |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
ParseRegionParam(Parameter |
Сканирует |
один |
параметр |
подсловаря-региона, |
|||||
&p) |
|
присваивая соответствующее значение объекту p |
|||||||
|
|
||||||||
|
|
|
|
|
|
||||
ParseRegionFieldValues(Reg |
Сканирует |
|
список |
fieldValues |
внутри |
||||
ion ®) |
|
подсловаря-региона, добавляя соответствующий |
|||||||
|
|
||||||||
|
|
элемент в поле-список fieldValues объекта reg |
|||||||
|
|
|
|
|
|
|
|
|
|
Как и прежде, функции для сканирования словаря setFieldsDict запускаются функцией-парсером CopyDict.
54