28
ЛЕКЦИЯ 16 УРОВНИ АБСТРАКЦИИ И ОСНОВНЫЕ КЛАССЫ В OpenFOAM Авторы: Аветисян А.И., Крапошин М.В., Самоваров О.И., Стрижак С.В.

УРОВНИ АБСТРАКЦИИ И ОСНОВНЫЕ КЛАССЫ Вhpc-education.ru/files/lectures/2011/avetisyan/... · ЛЕКЦИЯ 16 УРОВНИ АБСТРАКЦИИ И ОСНОВНЫЕ

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

ЛЕКЦИЯ 16

УРОВНИ АБСТРАКЦИИ И ОСНОВНЫЕ КЛАССЫ В

OpenFOAM

Авторы:

Аветисян А.И., Крапошин М.В., Самоваров О.И., Стрижак С.В.

ТЕРМИНОЛОГИЯ

Патч (patch), внешняя граница

Расчетная область, пространство, расчетная сетка

Внутренняя (объёмная) расчетная область

Практически во всех случаях имя класса соответствует имени заголовочного файла. Если имя класса className, то его объявление содержится в файле className.H. Иначе, даются .H файлы с объявлением

СОДЕРЖАНИЕ ЛЕКЦИИ

1.ВВЕДЕНИЕ 2.ИСПОЛЬЗОВАНИЕ C++ ДЛЯ РЕШЕНИЯ ЗАДАЧ МСС В OPENFOAM 3.СТРУКТУРА OPENFOAM 4.ОСНОВНЫЕ СТРУКТУРНЫЕ ЕДИНИЦЫ ИСХОДНОГО КОДА OPENFOAM 5.ОБЗОР ИСХОДНОГО КОДА НЕКОТОРЫХ ОСНОВНЫХ РЕШАТЕЛЕЙ 6.РАЗРАБОТКА ПРИЛОЖЕНИЙ НА ЯЗЫКЕ C++ В СРЕДЕ UNIHUB 7.ЛАБОРАТОРНЫЕ РАБОТЫ: РЕШЕНИЕ ПРОСТЕЙШИХ ЗАДАЧ МСС СРЕДСТВАМИ OPENFOAM

ОТЛИЧИЕ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ОТ ПРОЦЕДУРНОГО СТИЛЯ ПРОГРАММИРОВАНИЯ

Процедурное Программирование. Базовые единицы — переменная и функция. Стратегия программы определяется до написания исходного в виде блок-схем или псевдокода. Пример: Fortran, C, Pascal subroutine sum (a,b,c)

real*4 a, b, c

c = a + b

end subroutine

Объектно-ориентированное программирование. Базовая единица — класс, содержащий в себе и данные (атрибуты) класса и методы class A{

float val;

const A& sum(const A& a, const A& b){

val = a.val + b.val;

return *this;

}

};

ТРИ КИТА ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

Инкапсуляция (сокрытие данных)

Наследование (сохранение базовых принципов)

Полиморфизм (плюрализм методов решения)

? X Y

S = π R2= π

D2

4=1

4πl2≈ n×a

R a

ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ

ПРОЦЕДУРНОЕ — предполагает понимание как всей задачи в целом, так и каждой её части

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ — намечаются цели, которые далее можно решать некоторым (абстрактным) способом. Стратегия отделена от тактики

Шаг 1. Базовые типы переменных, присваивание, ветвление, циклы 1) Переменные всегда объявляются явно. Поддерживаются следующие базовые типы: short, int, long, float, double, char, bool, void 2) Присваивание, присваивание с инкрементом и декрементом: =, +=, -=, *=, /=, ++, - - 3) Ветвление: конструкции if-else if, switch

4) Циклы: while, for

ОСНОВЫ C++ (1)

double a=0.0,b; int l=1,k; bool c; const float pi=3.14;

s=0; s=s+1; s+=1; s++; a=b=s++; a=b=++s; a+=b;

if (a>=0 && a<=1)

{ // если а в диапазоне[0,1]

}

else if (a<0){} //если a < 0

else{} //все остальные случаи

switch (j)

{

case 0: {break;}// если j = 0

case 1: {break;}// если j = 1

default: {break;}// другие случаи

}

while (i < 10)

{i++;}

do

{j++;} while (j<10);

for (int j=0; j<10; j++)

{

cout << j << endl;

}

while(1){}

for(;;){}

ОСНОВЫ C++ (2) Шаг 2. Специальные типы переменных. Указатели, массивы , ссылки, функции

1) Указатель * — переменная, хранящая адрес некоторой области памяти заданной длины, которая определяется типом указателя либо вручную (при типе указателя void или в случае массива). К указателям применимы операции =, +, -, ++, - -, +=, -= и прочие

2) Массив [] — статический эквивалент указателя — хранит указатель на первый элемент и длину массива (число элементов)

3) Ссылка & - символическая ссылка на переменную, с которой можно работать как с самой переменной. Безопасный аналог указателя.

4) Функция () - поименованный поток инструкций, в который передаются данные и из которого возвращаются данные.

double a=0.0; double *pa = &a; *pa+=10;

double a[2]; a[0] = 1.0; *(a+1) = a[0]*2.0;

double a=0.0; double &la = a; la+=10;

double power (double& val, int f){

double v = 1.0;

for (int i=0; i<f; i++)

v*=val;

val = v; return v;}

ОСНОВЫ C++ (3)

Шаг 3. Класс — новый тип данных, содержащий в себе как данные, так и методы их обработки

Ключевые составляющие: член, метод, область видимости (private, protected, public), конструктор, деструктор, оператор, виртуальные методы и друзья, статические единицы

class Shape{

private:

int id_;

protected:

double surface_;

double center_;

public:

Shape();

Shape(const Shape&);

~Shape();

virtual double surface();

virtual double center();

virtual const Shape& operator = (const Shape& s);

static double Pi();

friend double anyFunc();

};

ОСНОВЫ C++ (4) Шаг 4. Область видимости — время жизни объекта, пространства имен, доступ к членам и методам класса В зависимости от целей локализации данных могут быть следующие способы классификации области видимости: По времени жизни По пространству имен По уровню доступа к структурным единицам класса: private — доступ только из методов данного класса, либо класса, либо наследующего со спецификатором private protected — доступ из методов данного класса и всех наследующих public — доступ из тела программы и любых методов класса friend — позволяет получить доступ к private и protected без наследования

int a, b;

{

int c, d; {int e,f;} for (int j=0; j<10; j++) {}

}

namespace ns1{

class A{};

}

ОСНОВЫ C++ (5)

Шаг 5. Шаблоны — обобщение классов на препроцессорном уровне (до трансляции в машинный код) Шаблоны используются при обобщении операций с различными типами данных, в которых класс объекта может варьироваться на стадии написания программы

template <class T> class vector

{

private:

T * data_;

int size_;

public:

vector (int size);

const T& operator [] (int idx);

T& operator (int idx);

const vector<T>& operator = (const vector<T>& v);

}

ОСНОВЫ C++ (6)

Шаг 5. Преобразование типов Язык C++ обладает средствами контроля типа переменной: const_cast<T> (…) - отказ от константности объекта static_cast<T> (…) - Преобразует выражение к указанному типу, без каких-либо проверок во время выполнения программы dynamic_cast<T> (…) - Преобразует выражение (ссылку на объект класса или указатель) к указанному типу, с проверкой во время выполнения программы, является ли выражение ссылкой или указателем на объект класса, эквивалентного или производного от того, что указан reinterpret_cast<T> (…) - Позволяет преобразовать выражение, являющееся указателем любого типа, к указанному типу

ОСНОВЫ C++ (7)

Шаг 6. Язык препроцессора #include #define #ifdef #warning #error

ПРОЦЕСС КОМПИЛЯЦИИ И СБОРКИ ПРОГРАММЫ

Препроцессор gcc

Транслятор gcc

Сборщик gcc

$ gcc main.cpp

Make, cmake, autoconf, wmake

Исходные файлы в OpenFOAM имеют расширение .H или .С

СТРУКТУРА КАТАЛОГОВ ИСХОДНОГО КОДА OPENFOAM

applications — исходный код приложений OpenFOAM

solvers — решатели OpenFOAM

utilities — утилиты для пре- и постпроцессинга

src — исходный код библиотек OpenFOAM

OSspecific — взаимодействие с системой (файлы, потоки выполнения, системное время и пр.)

OpenFOAM — базовая библиотека (примитивы величин (скаляр, вектор, тензор и др.), матрицы, поля, работа с памятью, размерность величин, база данных объектов и т. д.)

Pstream — работа с параллельными процессами (MPI)

finiteVolume — метод конечного объёма (дискретизация полей методом К.О., конечно-объёмная сетка и матрица, поверхностная сетка, объемные и поверхностные поля)

ИСПОЛЬЗОВАНИЕ ТЕХНОЛОГИИ C++ В OpenFOAM

Инкапсуляция — разработаны классы тензоров 0-го, 1-го и 2-го порядков в 3-х мерном пространстве, определены понятия сетки (пространства), времени, полей величин, схем дискретизации и решения систем линейных алгебраических уравнений. Работа с ними осуществляется как с отдельными объектами («чёрными ящиками»).

Наследование — за счет гибкого, эволюционного подхода наследования исключено дублирование кода, построена естественная иерархия объектов (пример: модель турбулентности → RAS модель → k-ε модель).

Полиморфизм — одни и те же методы используются для математических операций с полями тензоров, векторов и скаляров, матриц и массивов.

УРОВНИ АБСТРАКЦИИ OpenFOAM

Платформа OpenFOAM включает в себя следующие уровни (могут находиться в различных библиотеках):

1) Системный: файлы, потоки, системные команды, динамические библиотеки

2) Примитивы программирования: массивы, списки, программные указатели, хэш-списки, контейнеры

3) Математические примитивы: тензоры, вектора, скаляры, поля тензоров, размерности физических величин

4) Физическое время

5) Пространство (сетка)

6) Средства дискретизации уравнений, матрица СЛАУ

7) Методы решения систем линейных алгебраических уравнений

8) Алгоритмы интегрирования ДУ в ЧП

9) Решатели и утилиты (приложения)

III. Приложения, Уровень пользователя

I. Библиотека, системный уровень

II. Библиотека, Уровень разработчика

Сл

ож

но

сть

УРОВНИ OPENFOAM СОГЛАСНО OpenFOAM-ext

I. Пространство и время: polyMesh, fvMesh, Time II. Алгебраические преобразования над полями: Field,

DimensionedField, GeometricField III. Граничные условия: fvPatchField и наследуемые

классы IV. Разреженные матрицы: lduMatrix, fvMatrix и

линейные решатели V. Конечно-Объёмная дискретизация: пространства

имён fvc:: и fvm::

Все эти классы соответствует 2-ому уровню абстракции. Часть из них являются общими, часть предназначена только для МКО

ПРИМИТИВЫ СИСТЕМНОГО УРОВНЯ (POSIX)

regExp — работа со строками, поиск выражений

fileStat — статус файла (чтение и запись)

sigFpe — обработка ошибки при вычислениях с плавающей точкой (SIGFPE)

sigInt — обработка ошибки при прерывании с клавиатуры (SIGINT)

sigQuit — обработка при выходе с клавиатуры (SIGQUIT)

sigSegv — обработка ошибки при обращении к запретной области памяти (SIGSEGV)

cpuTime — счет времени, затрачиваемого ЦП (CPU)

clockTime — счет общего времени, затрачиваемого на выполнение

Mutex — определение одноместного семафора

И другие классы

ПРИМИТИВЫ СИСТЕМНОГО УРОВНЯ, ПАМЯТЬ

Хранение объектов в памяти

template <class T> Xfer<T> - простейший класс для хранения объекта, у инкапсулируемого объекта должны быть реализованы методы transfer() и copy()

template <class T> autoPtr<T> - программный указатель, уничтожает объект при вызове метода clear(), обнуляет хранящийся адрес при вызове метода ptr()

template <class T> tmp<T> - программный указатель с учетом числа ссылок (инкапсулированный объект должен содержать методы count(), okToDelete(), resetRefCount() и операторы ++(), и --()

ПРИМИТИВЫ СИСТЕМНОГО УРОВНЯ, МАССИВЫ

Хранение объектов в памяти

template <class T> UList<T> - одномерный массив данных с известным размером, использованием конструктора по умолчанию для вновь создаваемых элементов, итераторами, проверкой границ и вводом/выводом

template <class T> List<T> - подкласс UList<T>, с известным размером и возможностью сохранения данных при изменении размера, операциями копирования и удаления

template <class T> DynamicList<T> - подкласс List<T> с поддержкой переменного размера

template <class T, Key, class Hash> HashTable <T, Key, Hash> - хэш-таблица, построенная в соответствии со стандартами STL

Другие классы

ТЕНЗОРНЫЕ ПРИМИТИВЫ

Скаляр: scalar — действительное число с плавающей точкой (одинарной или двойной точности

Вектор: template <class C> Vector<C> - вектор размерности N чисел с плавающей точкой и определением соответствующих операций

Тензор: template <class C> Tensor<C>- тензор 3D пространства для чисел с плавающей точкой и определением операций скалярного, тензорного и прочих типов

ОПЕРАЦИИ С ТЕНЗОРНЫМИ ПРИМИТИВАМИ

• Для выполнения алгебраических преобразований над тензорами в OpenFOAM переопределены основные операторы:

№№ Оператор Описание №№ Оператор Описание

1 = Покомпонетное присваивание значения одного тензора другому. Ранг тензоров должен совпадать

11 T.T() Операция транспонирования тензора

2 +, -, *,/ Покомпонетные операции сложения, вычитания и умножения и деления на скаляр

12 tr(T) След тензора

3 * Произведение векторов или тензоров

13 symm(T) Симметричная составляющая тензора

4 & Скалярное произведение 14 dev(T) Антисимметричная составляющая тензора

5 && Двойное скалярное произведение

15 mag(T) Нормал (модуль) тензора

6 ^ Векторное произведение двух векторов

16 pow(T,n) Возведение тензора в степень

РАЗМЕРНОСТЬ ФИЗИЧЕСКИХ ВЕЛИЧИН В OPENFOAM

dimensionSet:

Масса, кг

Длина, м

Время, с

Температура, К

Количество вещества (моли), моль

Сила тока, А

Интенсивность освещения, Кд

dimensioned<T>:

Имя string name_

Размерность dimensionSet dimensions_

Значение T value_

dimensionedScalar, dimensionedVector, dimensionedTensor...

Масса, кг

Дл

ина

, м

Время, с

Тем

пер

атура

, К

ВРЕМЯ В OpenFOAM

Управление временем модели (моделируемого процесса) — класс Time

Наследует от:

clock — счетчик системного времени

cpuTime — счетчик процессорного времени

TimePaths — пути расположения основных файлов и каталогов случая (задачи OpenFOAM)

objectRegistry — регистр объектов случая OpenFOAM

TimeState — состояние времени (шаг-приращение по времени), номер шага по времени, определение момента времени для записи данных на диск

Операции ввода/вывода в определенные моменты времени

Операции перехода к новому шагу и критерии окончания цикла

Поиск зарегистрированных объектов случая OpenFOAM

РЕГИСТР ОБЪЕКТОВ objectRegistry

Разветвленное хранилище ссылок на все зарегистрированные объекты и физическое время Time

Физическое время является корневым регистром. Каждый регистр может содержать под-регистры.

Наследует от regIOobject, HashTable<regIOobject*>

Операции работы с деревом: parent(), subRegistry(), names()

Операции поиска объектов: template<class T> HashTable<T*> lookupClass();

template<class T> bool foundObject (const word& name);

template<class T> const T& lookupObject (const word& name);

Добавление/удаление объектов checkIn(), checkOut()

ДИСКРЕТИЗАЦИЯ ПРОСТРАНСТВА в OpenFOAM

В терминах OpenFOAM пространство — это сетка (внутренняя — internal и пограничная — boundary)

fvMesh (наследует polyMesh, lduMesh, surfaceInterpolation) — конечно-объёмная сетка, содержит все необходимые методы и данные для к.о. дискретизации

polyMesh (наследует primitiveMesh, objectRegistry) — неструктурированная сетка с поддержкой контрольных объёмов произвольной формы, содержит топологию сетки и методы работы с топологией

primitiveMesh — класс для установления связей между ячейками, гранями, рёбрами и точками

КЛАССИФИКАЦИЯ СЕТОК ПО ТИПУ РАСЧЕТНЫХ УЗЛОВ

Дискретизация возможна в следующих типах расчетных узлов: а) центрах контрольных объёмов; б) центрах граней, ограничивающих к.о.; в) вершинах контрольных объёмов

template <class M> GeoMesh<M> — базовый класс для всех типов сеток

volMesh — наследует от GeoMesh<fvMesh> и содержит данные для выполнения конечно-объёмной дискретизации с расчетными точками в центрах ячеек (контрольных объёмов).

surfaceMesh — наследует от GeoMesh<fvMesh> и содержит данные для выполнения конечно-объёмной дискретизации с расчетными точками в центрах граней контрольных объёмов.