- •РЕФЕРАТ
- •Записка к выпускной квалификационной работе изложена на 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 — Единицы измерения физических величин в OpenFOAM
Номер |
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
числа |
по |
|
|
|
|
|
|
|
порядку |
|
|
|
|
|
|
|
|
Физическая |
Масса |
Длина |
Время |
Температура |
Количество |
Электри- |
Интен- |
|
величина |
|
|
|
|
|
вещества |
ческий |
сивность |
|
|
|
|
|
|
|
ток |
света |
Единица |
|
Килограмм |
Метр |
Секунда |
Кельвин |
Килограмм/ |
Ампер |
Кандела |
измерения |
|
|
|
|
моль |
|
|
3.2.2 Разработка абстрактного базового класса Dict
Как видно из предыдущего подраздела, некоторые правила форматирования файлов кейса OpenFOAM являются общими для всех файлов. Поэтому можно определить базовый абстрактный класс, в котором будут реализованы основные методы синтаксического анализа словарей OpenFOAM, и в дальнейшем для отдельных словарей со своей особой структурой определить дочерние классы. Описание базового абстрактного класса Dict представлено в таблице 4.
Таблица 4 — Описание класса Dict
Тип |
Имя члена |
Описание |
|
|
public-поля класса |
|
|
|
Текст |
version |
Содержит поле version заголовка файла. |
|
|
|
Текст |
format |
Содержит поле format заголовка файла. |
|
|
|
Текст |
objClass |
Содержит поле class заголовка файла. |
|
|
|
QByteArray |
location |
Содержит поле location заголовка файла. |
|
|
|
QByteArray |
object |
Содержит поле object заголовка файла. |
|
|
|
QByteArray |
arr |
Содержит всю информацию из файла, из которого |
|
|
производится чтение, или информацию для записи |
|
|
в файл, если производится запись в файл. |
|
|
|
int |
ind |
Индекс сканируемого символа массива arr. |
|
|
|
int |
fileLen |
Длина файла, из которого производится чтение. |
|
|
|
|
|
public-методы класса |
|
|
|
29
Продолжение таблицы 4
Тип |
Имя члена |
|
Описание |
|
|
|
|
|
|
||
int |
CopyDict |
|
Чистая виртуальная функция-парсер словаря. В |
||
|
|
|
процессе парсинга проивзодится заполнение полей |
||
|
|
|
класса информацией из файла-словаря. В случае |
||
|
|
|
синтаксической ошибки возвращает код ошибки. |
||
|
|
|
Перед использованием данной функции массив |
||
|
|
|
arr должен быть инициализирован содержимым |
||
|
|
|
файла-словаря. |
|
|
|
|
|
|
||
void |
PrepareToSave |
|
Чистая виртуальная функция. Записывает в массив |
||
|
|
|
arr информацию, содержащуюся в полях класса, |
||
|
|
|
в виде текста в формате словаря. |
|
|
|
|
|
|
|
|
|
|
|
protected-поля класса |
|
|
QByteArray |
separators |
|
Массив символов-разделителей (пробел, символ |
||
|
|
|
табуляции, перенос строки). |
|
|
QByteArray |
specSymbols |
|
Массив символов, в который входят круглые, |
||
|
|
|
квадратные, угловые и фигурные скобки, а также |
||
|
|
|
точка с запятой. Служит для определения конца |
||
|
|
|
текущего слова функцией GetWord. |
|
|
|
|
|
|
||
int |
line |
|
Содержит номер сканируемой строки. В случае |
||
|
|
|
синтаксической |
ошибки пользователь сможет |
|
|
|
|
узнать номер строки, при сканировании которой |
||
|
|
|
возникла ошибка. |
|
|
|
|
|
|
|
|
|
|
protected-методы класса |
|
||
|
|
|
|
||
int |
ParseSenseless |
|
Функция сканирует символы массива arr начиная |
||
|
|
|
с символа по индексу ind, наличие которых не |
||
|
|
|
влияет на содержимое объекта (однострочные и |
||
|
|
|
многострочные |
комментарии, |
многократно |
|
|
|
повторяющиеся символы-разделители). В случае |
||
|
|
|
нахождения на позиции ind значащего символа, |
||
|
|
|
возвращает 0; в случае, если сканер дошел до |
||
|
|
|
конца массива ind, возвращает -1. |
|
|
|
|
|
|
|
|
30
Продолжение таблицы 4
Тип |
Имя члена |
Описание |
|
|
|
|
|
|
|
|
|
QByteArray |
GetWord |
Функция |
возвращает |
фрагмент |
текста, |
|
|
начинающийся с позиции ind массива arr, и |
|||
|
|
заканчивающийся либо символом-разделителем из |
|||
|
|
массива separators, либо специальным символом из |
|||
|
|
массива specSymbols, либо весь текст до конца |
|||
|
|
массива arr, если перечисленные символы не были |
|||
|
|
встречены. |
|
|
|
|
|
|
|||
int |
ParseHeader |
Функция сканирует заголовок файла кейса |
|||
|
|
OpenFOAM (подсловарь FoamFile), заполняя поля |
|||
|
|
version, format, location, objClass и |
|||
|
|
object. В случае синтаксической ошибки |
|||
|
|
возвращает код ошибки, иначе — ноль. |
|
||
|
|
|
|||
int |
ParseHeaderParams |
Функция сканирует один из параметров заголовка |
|||
|
|
файла (подсловаря FoamFile), присваивая |
|||
|
|
соответствующее значение одному из параметров |
|||
|
|
version, format, location, objClass или |
|||
|
|
object. В случае синтаксической ошибки |
|||
|
|
возвращает код ошибки, иначе — ноль. |
|
||
|
|
|
|||
int |
ParseSemi |
Функция сканирует символ на текущей позиции |
|||
|
|
ind и возвращает 0, если символ является точкой |
|||
|
|
с запятой, и соответствующий код ошибки, если |
|||
|
|
символ не является точкой с запятой. |
|
||
|
|
|
|
|
|
int |
ParseOpeningParen |
Функия, |
аналогичная |
ParseSemi, |
для |
|
thesis |
открывающей круглой скобки. |
|
||
|
|
|
|||
|
|
|
|
|
|
int |
ParseClosingParen |
Функия, |
аналогичная |
ParseSemi, |
для |
|
thesis |
закрывающей круглой скобки. |
|
||
|
|
|
|||
|
|
|
|
|
|
int |
ParseOpeningBrace |
Функия, |
аналогичная |
ParseSemi, |
для |
|
|
открывающей фигурной скобки. |
|
31
Продолжение таблицы 4
Тип |
Имя члена |
Описание |
|
|
|
|
|
|
|
|
|
int |
ParseClosingBrace |
Функия, |
аналогичная |
ParseSemi, |
для |
|
|
закрывающей фигурной скобки. |
|
||
|
|
|
|
|
|
int |
ParseOpeningSquar |
Функия, |
аналогичная |
ParseSemi, |
для |
|
eBrace |
открывающей квадратной скобки. |
|
||
|
|
|
|||
int |
ParseClosingSquar |
Функия, |
аналогичная |
ParseSemi, |
для |
|
eBrace |
закрывающей квадратной скобки. |
|
||
|
|
|
|||
|
|
|
|
|
|
int |
ParseOpeningBrock |
Функия, |
аналогичная |
ParseSemi, |
для |
|
et |
открывающей угловой скобки. |
|
||
|
|
|
|||
|
|
|
|
|
|
int |
ParseClosingBrock |
Функия, |
аналогичная |
ParseSemi, |
для |
|
et |
закрывающей угловой скобки. |
|
||
|
|
|
Все члены класса Dict наследуются его дочерними классами и могут быть использованы для сканирования и синтаксического анализа соответствующих файлов. У функций, реализованных в классе, нет аргументов — исходными данными для функций является массив arr, в котором записано содержимое сканируемого файла, и переменная ind — индекс текущего сканируемого символа. После определения необходимых инструментов для сканирования и синтаксического анализа файлов, можно перейти к разработке дочерних классов.
3.2.3 Разработка класса ControlDict
Для хранения данных файла controlDict необходимо разработать соответсвующий класс. Пример содержимого словаря controlDict представлен в листинге 2.
Листинг 2 — Пример содержимого словаря controlDict (без заголовка).
application |
icoFoam; |
startFrom |
startTime; |
startTime |
0; |
stopAt |
endTime; |
endTime |
0.5; |
deltaT |
0.005; |
writeInterval |
20; |
purgeWrite |
6; |
32
Файл controlDict не содержит подсловарей (кроме заголовочного FoamFile), а только набор параметров и их значений. Основные параметры и значения, которые они могут принимать, перечислены в таблице 5 [2]. Для некоторых параметров существуют значения по умолчанию (выделены жирным в таблице), и они могут не прописываться в словаре.
Таблица 5 — Основные параметры, указываемые в словаре controlDict и значения, которые они могут принимать.
Имя параметра (ключевое |
Значения |
слово) |
|
|
|
startFrom |
firstTime, startTime, latestTime |
|
|
startTime |
Указывается дробное число. Параметр |
|
используется только при значении startTime |
|
параметра startFrom |
|
|
stopAt |
endTime, writeNow, noWriteNow, |
|
nextWrite |
|
|
endTime |
Указывается дробное число. Параметр |
|
используется только при значении endTime |
|
параметра stopAt |
|
|
deltaT |
Указывается дробное число |
|
|
writeControl |
timeStep, runTime, adjustableRunTime, |
|
cpuTime, clockTime |
|
|
writeInterval |
Указывается дробное число |
|
|
purgeWrite |
Указывается целое число (по умолчанию 0) |
writeFormat |
ascii, binary |
|
|
writePrecision |
Указывается целое число (по умолчанию 6) |
|
|
writeCompression |
uncompressed, compressed |
|
|
timeFormat |
general, scientific, fixed |
|
|
timePrecision |
Указывается целое число (по умолчанию 6) |
graphFormat |
raw, gnuplot, xmgr, jplot |
|
|
runTimeModifiable |
yes, no |
|
|
application |
Указывается название программы-решателя в виде |
|
текста |
33
Как видно из таблицы 5, данные словаря controlDict могут быть нескольких типов: целые числа (например, timePrecision), дробные числа (например, startTime), перечислимый (например, startTime) и логический (например, runTimeModifiable), а также текстовый параметр application. В разработанном классе ControlDict, одноименном словарю, эти данные хранятся в полях соответствующего типа.
Помимо перечисленных в таблице 5 параметров, в словарь controlDict могут входить другие параметры, требуемые для определенных решателей. Поскольку имена и значения этих параметров заранее неизвестны, они хранятся в списке элементов класса Parameter, который имеет два текстовых поля: name — имя параметра, и val — его значение.
Основные поля разработанного класса ControlDict и их описание приведены в таблице 6.
Таблица 6 — Основные поля класса ControlDict и их описание
Тип |
Имя поля |
Описание |
|
|
|
int[7] |
enumParams |
Массив, |
содержащий |
значения |
параметров |
|
|
перечислимого типа |
|
|
|
QByteArray[1] |
stringParams |
Массив, |
содержащий |
параметры |
строкового |
|
|
типа |
|
|
|
|
|
|
|||
double[4] |
doubleParams |
Массив, содержащий параметры типа дробного |
|||
|
|
числа |
|
|
|
|
|
|
|||
uint[3] |
intParams |
Массив, содержащий параметры типа целого |
|||
|
|
числа |
|
|
|
bool[1] |
boolParams |
Массив, содержащий логические параметры |
|||
QList<QByteArr |
stringParamsList |
Список, |
содержащий |
названия |
строковых |
ay> |
|
параметров |
|
|
|
|
|
|
|
||
|
|
|
|||
QList<QByteArr |
doubleParamsList |
Список, содержащий названия параметров типа |
|||
ay> |
|
double |
|
|
|
|
|
|
|
|
|
|
|
|
|||
QList<QByteArr |
intParamsList |
Список, содержащий названия параметров типа |
|||
ay> |
|
int |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34
Продолжение таблицы 6
Тип |
Имя поля |
Описание |
|
|
|
|
|
|
|
|
|
|
|||||||
QList<QByteArr |
boolParamsList |
Список, содержащий названия параметров типа |
|||||||
ay> |
|
bool |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
QMap<int, |
enumParamVal_Str |
Массив |
из семи |
ассоциативных |
массивов, |
||||
QByteArray>[7] |
ingByNum |
позволяющий |
получить |
значение |
параметра |
||||
|
|
||||||||
|
|
перечислимого типа по номеру параметра и |
|||||||
|
|
порядковому номеру значения параметра. |
|
||||||
|
|
|
|
|
|||||
QMap<QByteArra |
enumParamName_Nu |
Ассоциативный |
массив, |
позволяющий |
|||||
y, int> |
mByString |
получить номер параметра перечислимого типа |
|||||||
|
|
||||||||
|
|
по его имени, записанному строкой. |
|
|
|||||
|
|
|
|
|
|
|
|||
QList<Paramete |
otherParams |
Список |
параметров, |
не |
указанных |
в |
|||
r> |
|
документации |
пользователя |
OpenFOAM |
и |
||||
|
|
||||||||
|
|
использующихся отдельными решателями. |
|
||||||
|
|
|
|
|
|
|
|
|
|
В конструкторе класса ControlDict инициализируется список имен параметров и ассоциативные массивы enumParamName_NumByString и enumParamVal_StringByNum. В функции CopyDict, унаследованной от базового абстрактного класса Dict, инициализируются значения параметров, для которых существуют значения по умолчанию. Так, если какой-либо параметр в считываемом словаре не указан, его значением будет значение по умолчанию.
Разработанный класс ControlDict является расширеяемым. Так, если в новых версиях OpenFOAM появятся новые параметры словаря controlDict, или возникнет необходимость добавить специальные параметры конкретного решателя, достаточно расширить один из массивов с параметрами и добавить имя параметра в список имен (или в случае, если тип добавляемого параметра — перечислимый, добавить его в ассоциативные массивы enumParamName_NumByString
и enumParamVal_StringByNum).
35