М.В. Крапошин (НИЦ Курчатовский Институт) О.И. Самоваров

Download Report

Transcript М.В. Крапошин (НИЦ Курчатовский Институт) О.И. Самоваров

# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
Школа-семинар
∂ρ
«Расширенные
возможности
+ ∇⋅ρU = 0
pV = ν R T
∂t
пакета
OpenFOAM»
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
T
+СТРУКТУРНЫЕ
∇⋅( ρU U ) − ∇⋅ μ ( ∇ UЕДИНИЦЫ
+ ( ∇ U ) ) = −∇ p
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) m9hIU3EkhMLl
OPENFOAM
fvm::laplacian(mu,U)
=
-fvc::grad(p)
М.В. Крапошин (НИЦ Курчатовский Институт)
О.И. Самоваров (Институт Системного Программирования РАН)
С.В. Стрижак (ГОУ ВПО МГТУ им. Баумана)
Институт системного программирования РАН
№1
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
СОДЕРЖАНИЕ
●
●
●
C++ в OPENFOAM
pVАБСТРАКЦИИ
= ν RT
УРОВНИ
∂ρ
+ ∇⋅ρU = 0
∂t
ОСНОВНЫЕfvm::ddt(rho)
КЛАССЫ И ИХ
НАЗНАЧЕНИЕ
+ fvc::div(phi)=0
∂ ρU
1
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№2
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ИСПОЛЬЗОВАНИЕ ТЕХНОЛОГИИ C++ В OpenFOAM
∂ρ
+ ∇⋅ρU = 0
∂t
Инкапсуляция — разработаны классы тензоров 0-го, 1-го и 2-го
порядков в 3-х мерном пространстве, определены понятия сетки
(пространства), времени, полей величин, схем дискретизации и
решения систем линейных алгебраических уравнений. Работа с
ними осуществляется
как с отдельными
объектами («чёрными
fvm::ddt(rho)
+ fvc::div(phi)=0
ящиками»).
pV = ν R T
∂ ρU
1 эволюционногоTподхода
Наследование
— за счет гибкого,
(
)
+
∇⋅
(
ρU
U
)
−
∇⋅
μ
∇
U
+
∇
U
=
−∇
наследования
исключено дублирование
кода, построена
∂t
2
естественная
иерархия объектов
(пример: модель
fvm::ddt(rho,
U) + fvm::div(phi,U)
турбулентности → RAS модель → k-ε модель).
(
(
)
)
p
fvm::laplacian(mu,U)
Полиморфизм — одни и те же методы используются для
= тензоров, векторов и
математических операций с полями
скаляров, матриц и массивов.
-fvc::grad(p)
Институт системного программирования РАН
№3
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
УРОВНИ АБСТРАКЦИИ OpenFOAM
Платформа OpenFOAM включает в себя следующие
уровни (могут находиться в различных
библиотеках):
∂ρ
+ ∇⋅ρU
=
0
pV =1)νСистемный:
R T файлы, потоки, системные
команды,
∂
t
динамические библиотеки
2) Примитивы программирования:
массивы, списки,
fvm::ddt(rho)
+
fvc::div(phi)=0
программные указатели, хэш-списки, контейнеры
3) Математические примитивы: тензоры, вектора,
∂ ρU
1
T
скаляры, поля тензоров,
размерности физических
+ ∇⋅( ρUвеличин
U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂t
2
II. Библиотека,
Уровень
разработчика
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
4) Физическое время
5) Пространство (сетка)
6) Средства дискретизации уравнений, матрица СЛАУ
7) Методы решения систем линейных алгебраических
уравнений
III. Приложения,
8) Алгоритмы интегрирования ДУ в ЧП
Уровень пользователя 9) Решатели и утилиты (приложения)
Сложность
I. Библиотека,
системный уровень
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№4
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
УРОВНИ OPENFOAM СОГЛАСНО HRVOJE JASAK
∂ρ
+ ∇⋅ρU = 0
∂t
I. Пространство и время: polyMesh, fvMesh, Time
II. Алгебраические преобразования над полями: Field,
DimensionedField, GeometricField
III. Граничныеfvm::ddt(rho)
условия: fvPatchField
и наследуемые
+ fvc::div(phi)=0
классы
IV.
Разреженные матрицы: lduMatrix,
fvMatrix
и
∂ ρU
1
T
+ ∇⋅( ρU
U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
линейные
решатели
∂t
2
V. Конечно-Объёмная
дискретизация:
пространства
fvm::ddt(rho, U)
+ fvm::div(phi,U)
имён fvc:: и fvm::
pV = ν R T
(
)
fvm::laplacian(mu,U)
= 2-ому уровню абстракции.
Все эти классы соответствует
Часть из них являются
общими, часть предназначена
-fvc::grad(p)
только для МКО
Институт системного программирования РАН
№5
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРИМИТИВЫ СИСТЕМНОГО УРОВНЯ (POSIX)
●
●
●
regExp — работа со строками, поиск выражений
∂ρ
fileStat — статус файла (чтение и запись)
+ ∇⋅ρU = 0
pV
=
ν
R
T
sigFpe — обработка ошибки при вычислениях
сtплавающей точкой
∂
(SIGFPE)
fvm::ddt(rho) + fvc::div(phi)=0
●
sigInt — обработка ошибки при прерывании с клавиатуры (SIGINT)
●
sigQuit
∂ ρU — обработка при выходе с 1клавиатуры (SIGQUIT)
T
●
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
(
)
+
∇⋅
(
ρU
U
)
−
∇⋅
μ
(
∇
U
+
∇
U
)
=
−∇
p
sigSegv
к запретной области
∂ t — обработка ошибки при обращении
2
памяти (SIGSEGV)
●
●
●
●
fvm::laplacian(mu,U)
clockTime — счет общего времени,
= затрачиваемого на выполнение
Mutex — определение одноместного
семафора
-fvc::grad(p)
cpuTime — счет времени, затрачиваемого ЦП (CPU)
И другие классы
Институт системного программирования РАН
№6
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРИМИТИВЫ СИСТЕМНОГО УРОВНЯ, ПАМЯТЬ
∂ρ
pV<class
= T>ν Xfer<T>
R T - простейший класс+для∇⋅ρU
➢ template
хранения = 0
∂ t быть реализованы
объекта, у инкапсулируемого объекта должны
Хранение объектов в памяти
методы transfer() и copy()
➢
fvm::ddt(rho)
+
fvc::div(phi)=0
template <class T> autoPtr<T> - программный указатель,
объект при вызове метода clear(), обнуляет хранящийся
∂ уничтожает
ρU
1
T
адрес+при
вызове
метода
ptr()
∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
t
2
➢ ∂
template
<class T> tmp<T> - программный
указатель с учетом
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
числа ссылок (инкапсулированный объект должен содержать
методы count(), okToDelete(), resetRefCount() и операторы ++(),
и --()
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№7
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРИМИТИВЫ СИСТЕМНОГО УРОВНЯ, МАССИВЫ
∂ρ
+ ∇⋅ρU
=0
pV<class
= T>ν UList<T>
R T - одномерный массив
➢ template
данных с
∂t
известным размером, использованием конструктора
по умолчанию
Хранение объектов в памяти
для вновь создаваемых элементов, итераторами, проверкой границ
и вводом/выводом
fvm::ddt(rho) + fvc::div(phi)=0
➢ template <class T> List<T> - подкласс UList<T>, с известным
∂ размером
ρU
1
T
и
возможностью
сохранения
данных
при
+ ∇⋅( ρU U ) − ∇⋅ μ ∇ U + ( ∇ U ) изменении
= −∇
операциями копирования
∂размера,
t
2 и удаления
(
))
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
p
➢ template <class T> DynamicList<T> - подкласс List<T> с
поддержкой переменного размера
➢
➢
fvm::laplacian(mu,U)
template <class T, Key, class =
Hash> HashTable <T, Key, Hash> хэш-таблица, построенная в соответствии со стандартами STL
-fvc::grad(p)
Другие классы
Институт системного программирования РАН
№8
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ТЕНЗОРНЫЕ ПРИМИТИВЫ
●
●
Скаляр: scalar — действительное
∂ρ число с
∇⋅ρU
плавающей
pV =точкой
ν R T(одинарной или+двойной
∂t
точности
fvm::ddt(rho)
fvc::div(phi)=0
Вектор: template
<class C>+ Vector<C>
- вектор
размерности
N чисел с плавающей
точкой
и
∂ ρU
1
T
+ ∇⋅( ρU Uсоответствующих
) − ∇⋅ μ ( ∇ U + ( ∇
U ) ) = −∇ p
определением
операций
∂t
2
fvm::ddt(rho,
U)
+
fvm::div(phi,U)
Тензор: template <class C> Tensor<C>- тензор 3D
fvm::laplacian(mu,U)
пространства
для чисел с плавающей точкой и
= скалярного, тензорного и
определением операций
-fvc::grad(p)
прочих типов
(
●
=0
)
Институт системного программирования РАН
№9
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ОПЕРАЦИИ С ТЕНЗОРНЫМИ ПРИМИТИВАМИ
∂ρ
+ ∇⋅ρU = 0
∂t
Для выполнения алгебраических преобразований над тензорами в
OpenFOAM переопределены основные операторы:
pV = ν R T
№№
Оператор Описание
№№
Оператор Описание
1
=
11
T.T()
Покомпонетное
присваивание значения
одного тензора другому.
Ранг тензоров должен
совпадать
Операция транспонирования тензора
fvm::ddt(rho) + fvc::div(phi)=0
2 ρU +, -, *,/
12 1 tr(T)
∂
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂t
2
3
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) *
Произведение векторов
или тензоров
4
&
Скалярное произведение
5
&&
Двойное скалярное
произведение
Нормал (модуль) тензора
6
^
Векторное произведение
двух векторов
Возведение тензора в степень
Покомпонетные операции
сложения, вычитания и
умножения и деления на
скаляр
След тензора
13
symm(T)
Симметричная составляющая тензора
fvm::laplacian(mu,U)
15
mag(T)
=
16
pow(T,n)
-fvc::grad(p)
14
dev(T)
Антисимметричная составляющая
тензора
Институт системного программирования РАН
№10
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
РАЗМЕРНОСТЬ ФИЗИЧЕСКИХ ВЕЛИЧИН В OPENFOAM
dimensionSet:
pV = ν R T
●
Масса, кг
●
Длина, м
●
Время, с
●
Температура, К
∂ρ
+
∇⋅ρU
=0
Масса,
кг
∂t
fvm::ddt(rho)Время,
+ fvc::div(phi)=0
с
Температура, К
●
●
●
●
Количество вещества (моли), моль
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
dimensioned<T>:
●
●
●
●
Длина, м
∂ ρU
1
T
Сила
тока,
А
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂ tИнтенсивность освещения, Кд 2
●
fvm::laplacian(mu,U)
Имя string name_
=
Размерность dimensionSet dimensions_
-fvc::grad(p)
Значение T value_
dimensionedScalar, dimensionedVector, dimensionedTensor...
Институт системного программирования РАН
№11
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ВРЕМЯ в OpenFOAM
∂ρ
+ ∇⋅ρU = 0
∂t
●
Управление временем модели (моделируемого процесса) — класс Time
●
Наследует от:
pV = ν R T
●
clock — счетчик системного времени
●
cpuTime — счетчик процессорного времени
fvm::ddt(rho) + fvc::div(phi)=0
TimePaths — пути расположения основных файлов и каталогов случая
(задачи OpenFOAM)
∂ ρU
1
T
●
+ ∇⋅ ρU
U − объектов
∇⋅ μ случая
∇ UOpenFOAM
+ ∇ U = −∇ p
objectRegistry
— регистр
●
(
) ))
(
(
∂t
2
fvm::ddt(rho, U) + fvm::div(phi,U) -
(
●
●
●
●
)
TimeState — состояние времени (шаг-приращение по времени), номер шага
по времени, определение момента времени для записи данных на диск
fvm::laplacian(mu,U)
= и критерии окончания цикла
Операции перехода к новому шагу
-fvc::grad(p)
Поиск зарегистрированных
объектов случая OpenFOAM
Операции ввода/вывода в определенные моменты времени
Институт системного программирования РАН
№12
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
РЕЕСТР ОБЪЕКТОВ objectRegistry
●
●
∂ρ
+ ∇⋅ρU = 0
pV = ν R T
t
Физическое время является корневым∂регистром.
Каждый
Разветвленное хранилище ссылок на все
зарегистрированные объекты и физическое время Time
регистр может содержать под-регистры.
fvm::ddt(rho) + fvc::div(phi)=0
●
●
●
Наследует от regIOobject, HashTable<regIOobject*>
∂ ρU
1
T
Операции
работы
с
деревом:
parent(),
subRegistry(),
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇names()
p
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
Операции поиска объектов:
fvm::laplacian(mu,U)
template<class T> bool foundObject (const word& name);
=
template<class T> const T& lookupObject (const word& name);
-fvc::grad(p)
Добавление/удаление
объектов checkIn(), checkOut()
●
template<class T> HashTable<T*> lookupClass();
●
●
●
Институт системного программирования РАН
№13
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ДИСКРЕТИЗАЦИЯ ПРОСТРАНСТВА в OpenFOAM
●
●
В терминах OpenFOAM пространство — это сетка
(внутренняя — internal и пограничная — boundary)
∂ρ
+ ∇⋅ρU = 0
pV = ν R T
fvMesh (наследует polyMesh, lduMesh,
∂ tsurfaceInterpolation)
— конечно-объёмная сетка, содержит все необходимые
fvm::ddt(rho)
+ fvc::div(phi)=0
методы и данные
для к.о. дискретизации
●
●
polyMesh
(наследует primitiveMesh,
objectRegistry)
—
∂ ρU
1
T
+ ∇⋅( ρU U ) −сетка
∇⋅ μс поддержкой
( ∇ U + ( ∇контрольных
U ) ) = −∇ p
неструктурированная
∂
t
2
объёмов
произвольнойU)
формы,
содержит топологию
fvm::ddt(rho,
+ fvm::div(phi,U)
- сетки и
методы работы с топологией
(
)
fvm::laplacian(mu,U)
primitiveMesh — класс для установления связей между
=
ячейками, гранями, рёбрами и точками
-fvc::grad(p)
Институт системного программирования РАН
№14
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
КЛАССИФИКАЦИЯ СЕТОК ПО ТИПУ РАСЧЕТНЫХ УЗЛОВ
●
●
●
●
∂ρ
+ ∇⋅ρU = 0
pV = ν R T
∂ tдля всех типов сеток
template <class M> GeoMesh<M> — базовый класс
Дискретизация возможна в следующих типах расчетных узлов: а) центрах
контрольных объёмов; б) центрах граней, ограничивающих к.о.; в) вершинах
контрольных объёмов
fvm::ddt(rho) + fvc::div(phi)=0
volMesh — наследует от GeoMesh<fvMesh> и содержит данные для
выполнения конечно-объёмной дискретизации с расчетными точками в центрах
ячеек (контрольных объёмов).
∂ ρU
1
T
+ ∇⋅
ρU U −
∇⋅ μ ∇ U +и содержит
∇ U данные
= −∇
surfaceMesh
— наследует
от GeoMesh<fvMesh>
дляp
∂t
2
выполнения
конечно-объёмной дискретизации
с расчетными точками в центрах
граней контрольных объёмов.
(
) ))
(
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
(
)
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№15
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ДИСКРЕТИЗАЦИЯ ФИЗИЧЕСКИХ ГРАНИЦ В OpenFOAM
●
●
●
●
Доступ к границам: const fvBoundaryMesh& fvMesh::boundary() const
pV = ν R T
∂ρ
+ ∇⋅ρU = 0
∂t
fvBoundaryMesh наследует от fvPatchList (List<fvPatch>) - список внешних границ
(патчей) расчетной области, на которых задаются граничные условия для каждого из
полей задачи
fvPatch содержит информацию о геометрии границы — центры граней Cf() и
прилегающих к ним ячеек Cn(), их площади magSf(), Sf() и нормали nf(), вектора
расстояний delta() от центров граней до центров прилегающих ячеек, ссылку на объект с
топологией границы patch()
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
T
polyPatch+
— ∇⋅
наследует
содержит
себе
топологию
( ρU отUpatchIdentifier,
) − ∇⋅ μ primitivePatch,
(
∇ U + (∇
U ) ) в=
−∇
p
границы
∂ t и методы для работы с ней (центры2 граней, связи между гранями, связи между
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
гранями и прилегающими ячейками, адресацию между номерами граней на данной
внешней границе (локальными номерами) и глобальными (во всей расчетной области)
●
●
fvm::laplacian(mu,U)
=
primitivePatch — устанавливает адресацию между узлами и натянутыми на них гранями
-fvc::grad(p)
данной внешней границы
patchIdentifier — идентификатор внешней границы (её номер в общем списке, имя и тип
в виде строковой константы)
Институт системного программирования РАН
№16
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ТИПЫ ФИЗИЧЕСКИХ ГРАНИЦ OpenFOAM
fvPatch
∂ρ
+ ∇⋅ρU = 0
∂t
wedgeFvPatch
pV = ν R T
genericFvPatch
symmetryFvPatch
coupledFvPatch
emptyFvPatch
fvm::ddt(rho) + fvc::div(phi)=0
wallFvPatch
cyclicFvPatch
cyclicPolyPatch
∂directMappedFvPatch
ρU
1
T
processorFvPatch
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇
U ) ) = −∇ p
directMappedWallFvPatch
processorPolyPatch
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
fvPatch содержит
ссылку на соотв. polyPatch,
например - cyclicFvPatch
coupledPolyPatch
fvm::laplacian(mu,U)
genericPolyPatch
=
emptyPolyPatch
wallPolyPatch
polyPatch
-fvc::grad(p)
symmetryPolyPatch
wedgePolyPatch
Институт системного программирования РАН
№17
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ПРЕДСТАВЛЕНИЕ ПОЛЕЙ В OpenFOAM
●
●
●
●
●
∂ρ
+ ∇⋅ρU = 0
pV =
ν Rопределенной
T
Поле физической
величины
размерности DimensionedField
t
<class T, class GeoMesh> наследует от Field<T>∂
и regIOobject
Поле как список значений в расчетных точках (например, центрах к.о.) Field<T>
наследует от refCount и List<T>
fvm::ddt(rho) + fvc::div(phi)=0
Геометрическое поле GeometricField<class T, template<class> PatchField,
class GeoMesh> наследует от DimensionedField<T, GeoMesh> определено на
всей расчетной области и вычисляется в определенных точках (к.о., гранях,
∂ ρU
1
узлах)
T
( ∇ U + ( ∇ U ) ))= −∇ p
(
∂t
2
fvm::ddt(rho, U) + fvm::div(phi,U) + ∇⋅( ρU U ) − ∇⋅ μ
Поле, определенное в центрах ячеек (volFields.H, volFieldsFwd.H):
typedef GeometricField<scalar, fvPatchField,volMesh> volScalarField;
typedef GeometricField<vector, fvPatchField,volMesh> volVectorField;
typedef GeometricField<tensor, fvPatchField,volMesh> volTensorField;
fvm::laplacian(mu,U)
Поле, определенное в центрах граней
(surfaceFields.H, surfaceFieldsFwd.H):
=
typedef GeometricField<scalar, fvPatchField,surfaceMesh> surfaceScalarField;
typedef GeometricField<vector,
fvPatchField,surfaceMesh> surfaceVectorField
-fvc::grad(p)
Институт системного программирования РАН
№18
# #
#ДИСКРЕТИЗАЦИЯ
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ПОЛЕЙ НА ВНЕШНЕЙ ГРАНИЦЕ
РАСЧЕТНОЙ ОБЛАСТИ
●
pV = ν R T
●
Поле, определенное на некоторой границе (fvPatch) определяется либо в
шаблоне fvPatchField<T> (при дискретизации в центрах к.о., соответствует
vol***Field) либо fvsPatchField<T> (при дискретизации в центрах граней,
соответствует
surface***Field). Параметр
шаблона T - это тип
∂
ρU
1
T поля (вектор,
скаляр, тензор
прочее).
шаблона,
+ ∇⋅и ρU
U Три
− звездочки
∇⋅ μ соответствуют
∇ U + ∇ параметру
U = −∇
p а:
Scalar,
∂ t Vector, Tensor и т.д.
2
fvm::ddt(rho) + fvc::div(phi)=0
(
) ))
(
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
(
●
∂ρ
+ ∇⋅ρU = 0
∂t
Также, как и расчетная область (сетка), поля физических величин представлены
значениями внутри расчетной области и значениями на границе. Последние
группируются по именованному множеству граней и выступают как численная
реализация граничного условия определенного типа.
)
Класс fv(s)PatchField обязательно содержит: а) ссылку на сетку данной границы
patch(), б) регистр объектов данного уровня db(), в) внутренее поле
internalField(), г) производную по нормали snGrad(), д) диагональные
коэффициенты матрицы valueInternalCoeffs() и gradientInternalCoeffs(), е)
коэффициенты правой части уравнений valueBoundaryCoeffs() и
gradientBoundaryCoeffs(), ж) операторы присваивания и простейшие
арифметические операторы, з) маркер, определяющий является ли это ГУ 1-го
рода — fixesValue().
№19
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ИЕРАРХИЯ КЛАССОВ ГРАНИЧНЫХ УСЛОВИЙ
empty
mixed
pV = fixedGradient
ν RT
fvPatchField
fixedValue
zeroGradient
∂ρjumpCyclic
+cyclic
∇⋅ρU = 0
∂t
processor
fvm::ddt(rho)
+ fvc::div(phi)=0
coupled
calculated
transform
wedge
∂ ρU
1
symmetry
T
+ ∇⋅
( ρU U ) − ∇⋅
μ ( ∇ U + ( ∇ U ) )Специальные
= −∇ pтипы
basicSymmetry
Базовые классы
(basic)
∂t
2
(constraint)
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
mixed
fixedGradient
buoyantPressure
fvm::laplacian(mu,U)
outletInlet
fixedValue
=
timeVaryingUniformFixedValue
-fvc::grad(p) ::updateCoeffs()
inletOutlet
advective
waveTransmissive
Имя исходника: <имя_ГУ>FvPatchField.H
Пример:
fixedValue — fixedValueFvPatchField.H
Производные типы
(derived)
Институт системного программирования РАН
№20
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРЕДСТАВЛЕНИЕ РАЗРЕЖЕННЫХ МАТРИЦ. ИСХОДНАЯ МАТРИЦА
∂ρ
+
∇⋅ρU
=
0
pV =AiiνψR
T
+
A
ψ
=
S
∑ ij j ∂ ti
i
j
Ax=b
Aii
Или, разворачивая запись, получаем
Диагональные
элементы
матрицы A
fvm::ddt(rho)
+ fvc::div(phi)=0
Искомое поле, определенное
в расчетных
точках
∂ψρU
j
1
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂t
2
∑
(
)
U) + fvm::div(phi,U) Afvm::ddt(rho,
ψ
ij
j
Сумма недиагональных элементов в строке i
fvm::laplacian(mu,U)
Правая часть уравнения
(источник)
=
Si
Имеем матрицу NxN,-fvc::grad(p)
где N — число расчетных точек (
j
контрольных объёмов)
Институт системного программирования РАН
№21
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРЕДСТАВЛЕНИЕ РАЗРЕЖЕННЫХ МАТРИЦ В ПАМЯТИ
— матрица по сути описывает соединение контрольных
1 2 3 L-D-U
объёмов с её соседями. L — соседи ∂ρ
с номером меньшим номера к.о.,
—=
диагональный
(данный к.о.) и+
U —∇⋅ρU
верхний треугольник,
=
0
νс большим
R T элемент
6 5 4pVDэлементы
номером
∂
t
7 8 9 i 1 2 3 4 5 6 7 8 9 Aii ψi + ∑ Aij ψ j = S i
fvm::ddt(rho)
+
fvc::div(phi)=0
D U
U
j
lduMatrix
∂ ρU
+
∂t
1
2 L D U
∇⋅3( ρU UL ) −
D
4
L
5
L
6 L
7
8
9
Отдельно хранятся
диагональные элементы,
верхний и нижний
T
треугольники
(хранятся
только не нулевые
значения). Получаем, что
при Si = 0, сумма
недиагональных по
строке должна иметь
знак, обратный к
диагональному.
1
∇⋅
U μ (∇ U + (∇ U )
2
U
))= −∇ p
(
fvm::ddt(rho, U) + fvm::div(phi,U) D
L
U
D
L
U
U
D
L
U
fvm::laplacian(mu,U)
U
=
D U
-fvc::grad(p)
L
L D U
L
L
Должно выполняться
условие диагонального
преобладания
D
Институт системного программирования РАН
№22
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРЕДСТАВЛЕНИЕ РАЗРЕЖЕННЫХ МАТРИЦ В ПАМЯТИ. АДРЕСАЦИЯ
∂ρ
+ ∇⋅ρU = 0
∂t
COO (Coordinate storage) — все непустые значения хранятся в одном массиве
(values). Помимо него используются ещё два вектора — номера непустых
колонок (cols) и номера непустых рядов (rows)
pV = ν R T
OpenFOAM COO — отдельно хранятся диагональные элементы (D), верхние (U)
— номера ячеек с индексом U > D, и нижние (L) с индексом L < D
i
1
2
1
D
U
3
4
5
fvm::ddt(rho)
+
fvc::div(phi)=0
D
=
1,
2, 3, 4, 5, 6, 7, 8, 9
6 7 8 9
∂ ρU
1 L = 2, 3, 3, 2, 4, 1, 5, 6,T 5, 7, 4, 8
2 L D +U ∇⋅(UρU U ) − ∇⋅ μ
( ∇ U + ( ∇ U ) ) = −∇ p
2 R = 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8
3 ∂t L D U
4
6
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) L
5
L
D
U
L
D
L
L
7
8
9
U = 2, 6, 3, 5, 4, 5, 9, 6, 8, 7, 8, 9
U
L
L
U
С = 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8
U
U
fvm::laplacian(mu,U)
В представлении матрицы OpenFOAM каждой
D U
ячейке соответствуют: а) диагональный
= б) список элементов верхнего
элемент,
L D U
треугольника (по строкам), в) список
L D-fvc::grad(p)
U
элементов нижнего треугольника (по рядам)
L
D
Институт системного программирования РАН
№23
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
СВЯЗЬ АДРЕСАЦИИ МАТРИЦЫ С РАСЧЕТНОЙ СЕТКОЙ
1 2 3
6 5 4pV
7 8 9
i
1
2
1
D
O
3
4
Структура представления расчетной сетки OpenFOAM
соответствует представлению данных матрицы. Расчетная сетка
представляет собой:
1) Список координат вершин, образующих контрольные объёмы
2) Список граней, образующих контрольные объёмы, каждый
элемент такого списка содержит массив номеров
узлов из списка вершин пункта 1, сортированный
5 6 7 8 9 таким образом, что нормаль грани «смотрит»
во-вне контрольного объёма
O
3) Список граней, принадлежащих
контрольным
T
O
объёмам (соединяющим один объём с другим,
чей номер выше данного); нормаль такой грани
O
O направлена наружу упомянутого объёма
(Neighbours), Число элементов — кол-во
D O
O
внутренних.
N D O
4) Список граней, принадлежащих соседним
контрольным объёмам (с номером, меньшим чем
N D O
данный) — Owners. Число элементов N
N D O общее количество внутренних граней
N D (внутренние + внешние)
= ν RT
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
N D O
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U )
3
N D O
∂t
2
2
4
N
5
6
))= −∇ p
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
N
D
N
N
7
8
9
N
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Owners — верхний треугольник, Neighbours - нижний
Институт системного программирования РАН
№24
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРЕДСТАВЛЕНИЕ РАЗРЕЖЕННЫХ МАТРИЦ В ПАМЯТИ
●
Матрица содержится в классе ∂ρ
lduMatrix:
●
●
pV = ν R T
+ ∇⋅ρU = 0
Коэффициенты матрицы lowerPtr_, diagPtr_, upperPtr_
∂t
Адресация осуществляется через объект типа
fvm::ddt(rho)
lduAddressing
- ::lduAddr() + fvc::div(phi)=0
Доступ к матрице — lower(),
∂ ρU
1 diag(), upper()
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
к операторам H() 2и A() A P ψP + H P = S P
∂Доступ
t
●
●
●
●
●
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
Операторы сложения и вычитания -=, +=
fvm::laplacian(mu,U)
Ссылку на расчетную область mesh()
=
Подклассы: а) solver; б) solverPerfomance; в) smoother;
-fvc::grad(p)
г) preconditioner
Институт системного программирования РАН
№25
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ
Класс lduMatrix::solver:
pV = ν R T
●
Имя искомой величины
●
Ссылка на параметры поиска
●
Критерий выхода из итераций
●
●
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho) + fvc::div(phi)=0
∂Процедура
ρU
1
T PbiCG
решения
—
BICCG,
ICCG,
PCG,
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂ t решения используется2 процедура Matrix::solve()
Для
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№26
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
СТАТИСТИКА СОЛВЕРА
∂ρ
+ ∇⋅ρU = 0
∂t
lduMatrix::solverPerfomance — информация о процессе
решения системы линейных алгебраических уравнений
(private):
pV = ν R T
●
Имя решателя
solverName_
fvm::ddt(rho)
●
Имя поля fieldName_
●
●
●
●
●
+ fvc::div(phi)=0
∂ ρU
1
T
+ ∇⋅( ρU
U ) −initialResidual_
∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
Начальная
невязка
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
Конечная невязка finalResidual_
fvm::laplacian(mu,U)
Число итераций noIterations_
=
Сходимость решения converged_
-fvc::grad(p)
Сингулярность решения singular_
Институт системного программирования РАН
№27
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
СГЛАЖИВАНИЕ РЕШЕНИЯ
Сглаживание — процедура подавления высокочастотных
составляющих решения (релаксация) при использовании
многосеточных методов. Целью сглаживателя (smoother) ставится
сглаживание решения для улучшения приближения на грубой сетке
∂ρ
+ ∇⋅ρU = 0
∂t
pV = ν R T
fvm::ddt(rho)
+ fvc::div(phi)=0
Базовый абстрактный
класс сглаживателя
определен в классе
lduMatrix::smoother, его реализации в классах:
ρU
1
T разложения
➢∂DICSmoother
— сглаживание методом
неполного
+ ∇⋅( ρU U ) − ∇⋅ μ ∇ U + ( ∇ U ) = −∇ p
Холецкого
∂
t
2
➢ DICGaussSeidelSmoother
методом неполного
fvm::ddt(rho, U)—+сглаживание
fvm::div(phi,U)
разложения Холецкого и Гаусса-Зейделя
➢ DILUSmoother fvm::laplacian(mu,U)
— сглаживание методом LU-разложения
➢ DILUGaussSeidelSmoother —=сглаживание методом LUразложения и Гаусса-Зейделя
➢ GaussSeidelSmoother-fvc::grad(p)
— сглаживание методов Гаусса-Зейделя
(
(
)
)
Институт системного программирования РАН
№28
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ПРЕДОБУСЛАВЛИВАТЕЛИ
∂ρ
+ ∇⋅ρU = 0
pV = ν R T
noPreconditioner — без предобуславливания
∂t
Базовый класс для всех предобуславливателей —
lduMatrix::preconditioner, их реализации содержатся в классах:
●
●
diagonalPreconditioner
— диагональный
предобуславливатель
fvm::ddt(rho)
+ fvc::div(phi)=0
●
GAMGPreconditioner — многосеточный предобуславливатель
●
●
●
∂ ρU
1
T
+ ∇⋅( ρU U —
) −предобусловливание
∇⋅ μ ( ∇ U + ( ∇ методом
U ) ) = −∇
DILUPreconditioner
LU- p
∂t
2
разложения
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
DICPreconditioner
— предобусловливание методом неполного
fvm::laplacian(mu,U)
разложения Холецкого
=
FDICPreconditioner — предобусловливание методом быстрого
-fvc::grad(p)
неполного разложения
Холецкого
Институт системного программирования РАН
№29
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
РЕШЕНИЕ СЛАУ, ПОЛУЧЕННЫХ ПОСЛЕ ДИСКРЕТИЗАЦИИ УРАВНЕНИЙ
МЕТОДОМ КОНЕЧНЫХ ОБЪЁМОВ
∂ρ
+ ∇⋅ρU = 0
∂t
fvMatrix — реализация lduMatrix, предназначенная для решения
СЛАУ, полученных МКО, наследует от refCount и lduMatrix,
осуществляет выбор решателя (fvMatrix::fvSolver). Уравнения могут
решаться только для одной переменной (скаляр), решение уравнений
для тензоров и векторов производится последовательно:
✗ solve() - решение системы СЛАУ, полученных после дискретизации
уравнений на сетке
∂ ρU- искомое поле (скаляр)
1
T
✗ psi()
(
)
+
∇⋅
(
ρU
U
)
−
∇⋅
μ
∇
U
+
∇
U
=
−∇
p
✗ source()
∂ t - источник
2
✗ другие функции связанные lduMatrix
pV = ν R T
fvm::ddt(rho) + fvc::div(phi)=0
(
))
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
fvm::laplacian(mu,U)
=
LA = L1 A+ L 2 A-fvc::grad(p)
= L 2 A+ L 1 A = ( L1 + L 2 ) A
Класс fvMatrix обладает свойствами самотождественности,
аддитивности и коммутативности через переопределенные операторы:
Институт системного программирования РАН
№30
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
MULES
Для решения конвективных задач можно воспользоваться
методом MULES — Multidimensional Universal Limiter with
Explicit Solution — Многомерный Ограниченный Явный Метод
Решения. Метод реализован в виде набора функций
пространства имен MULES:
∂ρ
+ ∇⋅ρU = 0
∂t
pV = ν R T
fvm::ddt(rho) + fvc::div(phi)=0
MULES::explicitSolve(rho, psi, …) - явное решение с учетом
∂ ρU
1
T
плотности
+ ∇⋅( ρU U ) − ∇⋅ μ ∇ U + ( ∇ U ) = −∇ p
● MULES::explicitSolve(psi, ...) - явное решение без учета
∂t
2
плотности
fvm::ddt(rho,
U)
+
fvm::div(phi,U)
● MULES::implicitSolve(rho, gamma, ...) - неявное решение с
fvm::laplacian(mu,U)
учетом плотности
● MULES::implcitSolve(gamma, …) - неявное решение без учета
=
плотности
-fvc::grad(p)
● MULES::limiter(...) - ограничение
переменной
●
(
(
)
)
Институт системного программирования РАН
№31
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ОБЩИЙ ПОРЯДОК ИНТЕГРИРОВАНИЯ УРАВНЕНИЙ
Решение задачи проводится на три этапа. Результат выполнения
каждого из трех — fvMatrix. В случае неявной дискретизации (fvm::) матрица коэффициентов в левой части, в случае явной (fvc::) — вектор
правой части (поле, определенное в расчетных точках)
1) Неявная дискретизация слагаемых уравнений (fvm::)
2) Явная дискретизация слагаемых уравнений (fvc::)
3) Дискретизация по времени (fvm::ddt,fvm::d2dt2 и fvc::dtdt,
fvc::d2tdt2)
∂ ρU
1
T
4) Обновление
шагах
2) −∇ p
+ ∇⋅граничных
( ρU U ) −условий
∇⋅ μ(возможно
∇ U +на( ∇
U ) 1 и=
∂t
2
5) Решение
системы уравнений
pV = ν R T
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho) + fvc::div(phi)=0
(
))
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
fvm::operator(...)
Сетка (fvMesh)
fvc::operator(...)
fvm::laplacian(mu,U)
=
Aψ= b
-fvc::grad(p)
solve( A ψ = b )
ψ
Институт системного программирования РАН
№32
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ПРОСТРАНСТВА ИМЕН FVC и FVM
●
fvc:: — Finite Volume Calculus
∂ρ
pVFinite
= Volume
ν R T Method - + ∇⋅ρU = 0
fvm:: —
∂t
Общая схема вызовов:
Реализация конкретного численного
оператора дифференцирования
определенного класса (градиент,
дивергенция, диффузия,
производная по времени)
●
fvm::ddt(rho) + fvc::div(phi)=0
Шаблоны функций операторов
∂ ρU
1
численного дифференцирования
+ ∇⋅
( ρU- fvm::div(...),
U ) − ∇⋅ μfvc::ddt(...)
∇U+
(fvm::
и fvc::)
( ∇ U ) ) )= −∇ p
(
(
∂t
2
fvm::ddt(rho, U) + fvm::div(phi,U) -
Статическая функция создания
конкретной реализации численного
оператора определенного класса
fvc::, fvm:: operatorScheme::New(...)
(divScheme::New(...), ddtScheme::New(...))
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Линия с кружочком означает вызов, а не наследование!!!
T
Институт системного программирования РАН
№33
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
СХЕМА ВЫЗОВОВ (ОТ ОПЕРАТОРА ДО РЕАЛИЗАЦИИ)
Оператор fv::operator(psi)
pV = ν R T
Селектор класса оператора
(fv::convectionScheme, fv::ddtScheme,
fv::gradScheme, fv::laplacianScheme,
fv::ddtScheme)
∂ρ fvm::div(phi,U)
+ ∇⋅ρU = 0
∂t
fv::convectionScheme
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
T
+ ∇⋅
( ρU U ) −оператора
∇⋅ μ ( ∇ U + ( ∇
U ) ) = −∇ p
fv::convectionScheme
Селектор
реализации
∂
t
2
::New(....) - static
operatorScheme::New
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
fvm::laplacian(mu,U)
fv::convectionScheme
=
::fvmDiv(phi,U)
-fvc::grad(p)
Селектор явного/неявного
дифференцирования
(operatorScheme.fvcOperator(...),
operatorScheme.fvmOperator(...))
Институт системного программирования РАН
№34
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ДИСКРЕТИЗАЦИЯ ДИВЕРГЕНЦИИ
) = ∑ S f⋅(ρU ) f ψ f
∫V ∇⋅(ρU ψ)dV = ∫S d S⋅(ρU ψ∂ρ
+f ∇⋅ρU = 0
pV = ν R T
∂
t
∇⋅ψdV
=
d
S⋅
(
ψ
)
=
∫V
∫S
∑ S f⋅(ψ) f
f
fvm::ddt(rho) + fvc::div(phi)=0
Дискретизация конвективного слагаемого осуществляется с помощью группы функций
div(...) пространства имён fvc:: и fvm::, файлы fvmDiv.H, fvcDiv.H T
∂ ρU
1
(
)
+
∇⋅
(
ρU
U
)
−
∇⋅
μ
(
∇
U
+
∇
U
)
=
−∇
p
template<class
Type> tmp<fvMatrix<Type> >2
∂
t
fvm::div (const surfaceScalarField& flux, GeometricField<Type, fvPatchField, volMesh>&
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
vf, const word& name);
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Классы-реализации операторов:
template<class Type> tmp <GeometricField<
typename innerProduct<vector, Type>::type, fvPatchField, volMesh> >
div (const GeometricField<Type, fvPatchField, volMesh>& vf, const word& name)
fv::convectionScheme (fvm::, fvc::), fv::divScheme (fvc)
Институт системного программирования РАН
№35
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ДИСКРЕТИЗАЦИЯ ГРАДИЕНТА
∂ρ
∇
(ψ)dV
=
(d
S
)
ψ
=
S
ψ
∫pV
∫
∑
+
∇⋅ρU
=0
f
f
=
ν
R
T
V
S
∂t f
fvm::ddt(rho) + fvc::div(phi)=0
Дискретизация градиента (метод наименьших квадратов, теорема Гаусса и т. д.)
осуществляется с помощью группы функций grad(...) пространства имён fvc::, для
дискретизации градиента определенным методом используются fvc::gGrad(...),
fvc::lsGrad(...) и т. д. Файл fvcGrad.H
T
∂ ρU
1
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U )
template<class
Type> tmp <GeometricField< 2
∂t
))= −∇ p
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
typename outerProduct<vector,Type>::type, fvPatchField, volMesh> >
fvc::grad (
const GeometricField<Type, fvPatchField, volMesh>& vf,
const word& name)
fvm::laplacian(mu,U)
=
Операторы реализуются в классе gradScheme
-fvc::grad(p)
Институт системного программирования РАН
№36
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ДИСКРЕТИЗАЦИЯ ДИФФУЗИОННОГО СЛАГАЕМОГО
∫V
∂ρ
∇⋅(Γ ψ ∇ ψ) dV = ∫S d S⋅( Γ ψ ∇ ψ
)=∑ S f⋅(Γ ψ ∇ ψ) f
pV = ν R T
∂t
+f ∇⋅ρU = 0
fvm::ddt(rho) + fvc::div(phi)=0
Дискретизация диффузионного слагаемого (лапласиан в OpenFOAM) осуществляется с
помощью группы функций laplacian(...) пространства имён fvc:: и fvm::, файлы
fvmLaplacian.H и fvcLaplacian.H
∂ ρU
1
T
+ Type,
∇⋅( ρU
U ) − tmp<fvMatrix<Type>
∇⋅ μ ( ∇ U +> ( ∇ U ) ) = −∇ p
template<class
class GType>
fvm::laplacian
∂ t (const GeometricField<GType, 2fvsPatchField, surfaceMesh>& gamma,
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
GeometricField<Type, fvPatchField, volMesh>& vf, const word& name)
fvm::laplacian(mu,U)
=
Операторы реализуются в классе
laplacianScheme
-fvc::grad(p)
template<class Type, class Gtype> tmp<GeometricField<Type, fvPatchField, volMesh> >
fvc::laplacian ( const GeometricField<GType, fvsPatchField, surfaceMesh>& gamma,
const GeometricField<Type, fvPatchField, volMesh>& vf, const word& name);
Институт системного программирования РАН
№37
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПЕРВАЯ ПРОИЗВОДНАЯ ПО ВРЕМЕНИ
pV =
∂ρ
∂
ν R∂Tt ∫V ρ ψdV +
∂t
∇⋅ρU = 0
fvm::ddt(rho) + fvc::div(phi)=0
Дискретизация первой производной осуществляется с помощью группы функций ddt(...)
пространства имён fvc:: и fvm::, используются схемы первого порядка (Эйлера) и
второго порядка (обратного дифференцирования), файлы fvmDdt.H, fvcDdt.H
∂ ρU
1
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
template<class Type> tmp<fvMatrix<Type> >
∂ t ( GeometricField<Type, fvPatchField,
2 volMesh>& vf)
fvm::ddt
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
fvm::laplacian(mu,U)
=
Операторы реализуются в классе ddtScheme
-fvc::grad(p)
template<class Type> tmp<GeometricField<Type, fvPatchField, volMesh> >
fvc::ddt (const dimensioned<Type> dt, const fvMesh& mesh)
Институт системного программирования РАН
№38
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ВТОРАЯ ПРОИЗВОДНАЯ ПО ВРЕМЕНИ
∂ρ
∂
ψ
∂
+
∇⋅ρU
ρ
dV
pV = ν R
T
∫
∂t V ∂t
∂t
fvm::ddt(rho)
+ fvc::div(phi)=0
Дискретизация первой производной
осуществляется
с помощью группы функций
=0
d2dt2(...) пространства имён fvc:: и fvm::, используются схема первого порядка
(Эйлера), файлы fvmD2dt2.H, fvcD2dt2.H
∂ ρU
1
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
template<class Type> tmp<fvMatrix<Type> > fvm::d2dt2 (GeometricField<Type,
∂ t volMesh>& vf)
2
fvPatchField,
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
fvm::laplacian(mu,U)
=
Операторы реализуются в классе d2dt2Scheme
-fvc::grad(p)
template<class Type> tmp<GeometricField<Type, fvPatchField, volMesh> >
fvc::d2dt2 (const GeometricField<Type, fvPatchField, volMesh>& vf)
Институт системного программирования РАН
№39
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ПРОИЗВОДНАЯ ПО НОРМАЛИ
∂ρ
∂ψ
+ ∇⋅ρU = 0
pV = ν R T
∂n
∂t
fvm::ddt(rho)
+ fvc::div(phi)=0
Дискретизация производной
по нормали осуществляется
с помощью группы функций
snGrad(...) пространства имён fvc::, множество расчетных значений определено на
поверхности (на гранях расчетной сетки), файлы fvcSnGrad.H
∂ ρU
1
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
template<class Type> tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
∂ t (const GeometricField<Type, fvPatchField,
2
fvc::snGrad
volMesh>& vf, const word&
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
name)
{
return fv::snGradScheme<Type>::New
(vf.mesh(), vf.mesh().snGradScheme(name))().snGrad(vf);
}
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Операторы реализуются в классе
snGradScheme
Институт системного программирования РАН
№40
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ИНТЕРПОЛЯЦИЯ
pV = ν R T
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho)
+
fvc::div(phi)=0
ψP
ψf
∂ ρU
1
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U )
∂t
2
))= −∇ p
(
fvm::ddt(rho, U) + fvm::div(phi,U) -
T (веса обратно
● Интерполяция с узлов ячеек на центры ячеек: pointVolInterpolation
пропорциональны расстоянию)
● Интерполяция с центров ячеек на узлы ячеек volPointInterpolation (веса обратно
пропорциональны расстоянию)
● Интерполяция поля (объёмного или поверхностного) в произвольной точке
пространства, классы interpolationCell, interpolationCellPoint,
interpolationCellPointFace
● Интерполяция с объёмного поля на поверхностное поле — surfaceInterpolationScheme.
Ограниченные схемы интерполяции — папка limitedSchemes, неограниченные —
schemes, многомерные схемы интерполяции — папка multivariateSchemes
fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№41
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПАРАЛЛЕЛЬНОЕ ВЫПОЛНЕНИЕ: УПРАВЛЕНИЕ ПОТОКАМИ
●
●
●
●
●
●
●
Класс Pstream (почти все члены
∂ρстатические)
pV = ν R T
bool parRun()
nProcs()
∂t
+ ∇⋅ρU = 0
fvm::ddt(rho) + fvc::div(phi)=0
master()
∂ ρU
1
T
(
)
+
∇⋅
(
ρU
U
)
−
∇⋅
μ
(
∇
U
+
∇
U
)
=
−∇
p
masterNo()
∂t
2
fvm::ddt(rho, U) + fvm::div(phi,U) myProcNo()
(
)
fvm::laplacian(mu,U)
Классы IPstream (ввод=данных, оператор >>),
OPstream (вывод-fvc::grad(p)
данных, оператор <<)
Институт системного программирования РАН
№42
# #
#
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
ПОДДЕРЖКА ДВИЖУЩИХСЯ СЕТОК
●
●
●
●
dynamicFvMesh наследует от fvMesh
∂ρ
+
∇⋅ρU
=
0
pV
=
ν
R
T
fvMotionSolver — движение сетки
(наследует
от
∂
t
motionSolver) без изменения топологии
fvm::ddt(rho) + fvc::div(phi)=0
motionSmoother — контроль за качеством сетки
∂ ρUеё деформации
1
T
при
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂
t
2
topoChangerFvMesh — движение сетки с
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
изменениемfvm::laplacian(mu,U)
топологии (остальные классы
наследуют от этого, например mixerFvMesh)
=
-fvc::grad(p)
Институт системного программирования РАН
№43
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ: МОДЕЛИ ТУРБУЛЕНТНОСТИ
R
Eff
(∇ U )
= (μ+ μ ) [ ∇ U +∂ρ
pV = ν R T
t
(mu + mut) * (fvc::grad(U) + fvc::grad(U).T())
∂t
T
]
+ ∇⋅ρU = 0
1) Все RAS-модели опираются на одно и тоже предположение Буссинеска
2) Расчет эффективного тензора Рейнольдса зависит только от параметров конкретной
модели
3) Эти особенности выносятся в отдельную библиотеку, например,
libincompressibleRASModels
T
4) Множественность вариантов одной и той же функции осуществляется за счет
полиморфизма — механизма виртуальных функций
4) Для включения в динамическую библиотеку информации о возможных вариантах
виртуальной функции используются макросы:
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U )
∂t
2
))= −∇ p
(
fvm::ddt(rho, U) + fvm::div(phi,U) fvm::laplacian(mu,U)
=
-fvc::grad(p)
● defineTypeNameAndDebug(kEpsilon,0)
addToRunTimeSelectionTable(RASModel,kEpsilon,dictionary)
●
● defineTemplateTypeNameAndDebugWithName(<name>, <debug level>)
<debug level> - уровень отладки. 0 — без отладки, 1 — минимальный вывод
2 — вывод всех сообщений
Институт системного программирования РАН
№44
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ОБЗОР БИБЛИОТЕК (ПОДПАПКИ src), 1
●
ODE — методы интегрирования обыкновенных дифференциальных уравнений
●
OSspecific — системные вызовы и функции
●
OpenFOAM — ядро программы, её основные классы
●
Pstream — работа с потоками исполнения
●
autoMesh — алгоритмы автоматического создания сеток
●
conversion — алгоритмы конвертации форматов сеток
●
decompositionMethods — методы декомпозиции задачи по пространству
T
●
pV = ν R T
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
( ∇ U ) ) =по−∇
+ ∇⋅( ρU
U ) − ∇⋅
μ (∇
U + декомпозиции
p
dummyThirdParty
—
интерфейсы
к
сторонним
методам
пространству
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) -
●
dynamicFvMesh — конечно-объёмная сетка с поддержкой её деформации
●
dynamicMesh — методы деформации и изменения сетки
●
●
●
●
fvm::laplacian(mu,U)
edgeMesh — сетка, состоящая из отрезков (рёбер)
=
engine — библиотека для решения задач, связанных с горением в двигателе
-fvc::grad(p)
errorEstimation — оценка погрешностей,
ошибок аппроксимации, невязок
finiteVolume — реализация метода конечных объёмов в OpenFOAM
Институт системного программирования РАН
№45
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ОБЗОР БИБЛИОТЕК (ПОДПАПКИ src), 2
●
●
●
●
●
●
●
●
●
●
●
●
●
●
fvAgglomerationMethods — методы укрупнения сеток при использовании многосеточных
алгоритмов решения систем линейных алгебраических уравнений
fvMotionSolver — методы деформации сетки без изменения топологии по заданным
перемещениям внешних границ расчетной области
genericPatchFields — описание нетипизированного (абстрактного) граничного условия
lagrangian — решение задач в переменных Лагранжа
meshTools — утилиты для работы с сеткой
postProcessing — анализ расчетных результатов
T
randomProcesses — анализ случайных процессов (например, БПФ)
sampling — анализ выборки из общих расчетных данных (полей)
surfMesh — поверхностная сетка
thermophysicalModels — термодинамические и теплофизические модели
topoChangerFvMesh — изменение топологии конечно-объёмной сетки
transportModels — модели транспорта (Ньютоновская и не-Ньютоновские)
triSurface — триангулированная поверхность
turbulenceModels — сжимаемые и несжимаемые RAS, LES и DES модели
турбулентности
pV = ν R T
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U )
∂t
2
))= −∇ p
(
fvm::ddt(rho, U) + fvm::div(phi,U) fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№46
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
ПРИЛОЖЕНИЕ OpenFOAM. ОСНОВНЫЕ ЭТАПЫ
1)Инициализация структуры каталогов
∂ρ рабочей
+ ∇⋅ρU =
задачиpV = ν R T
∂
t
2)Инициализация потоков выполнения (MPI)
0
fvm::ddt(rho) + fvc::div(phi)=0
3)Инициализация физического времени
∂ ρU
1
T
+ ∇⋅( ρU U ) расчетной
− ∇⋅ μ ( ∇сетки
U + ( ∇ U ) ) = −∇ p
4)Инициализация
∂t
2
fvm::ddt(rho,
U) + fvm::div(phi,U)
5)Инициализация
искомых
полей
(
)
fvm::laplacian(mu,U)
6)Инициализация цикла интегрирования (время)
=
7)Интегрирование-fvc::grad(p)
уравнений и запись результатов
8)Завершение работы
Институт системного программирования РАН
№47
# #
СТРУКТУРНЫЕ ЕДИНИЦЫ OPENFOAM
#
СПАСИБО ЗА ВНИМАНИЕ!
pV = ν R T
∂ρ
+ ∇⋅ρU = 0
∂t
fvm::ddt(rho) + fvc::div(phi)=0
∂ ρU
1
T
+ ∇⋅( ρU U ) − ∇⋅ μ ( ∇ U + ( ∇ U ) ) = −∇ p
∂t
2
(
)
fvm::ddt(rho, U) + fvm::div(phi,U) fvm::laplacian(mu,U)
=
-fvc::grad(p)
Институт системного программирования РАН
№48