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

Таблица 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

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