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

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

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