Академический Документы
Профессиональный Документы
Культура Документы
Панкратов
МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ
РЕАЛЬНЫХ ПРОЦЕССОВ В ПАКЕТЕ
OPENFOAM
Учебное пособие
для студентов и магистрантов
направлений «Прикладная математика и информатика»,
«Механика и математическое моделирование»
и других естественно-научных специальностей
Саратов 2019
УДК [533.6:004.94](075.8)
ББК 22.253я73
П 16
Рецензенты:
Доктор физико-математических наук, доцент, заведующий кафедрой
прикладной информатики и информационных технологий в управлении
Поволжского института управления имени П.А. Столыпина – филиала
РАНХиГС Кондратов Д.В.
Рекомендовано к публикации
Ученым советом механико-математического факультета Саратовского
национального исследовательского государственного университета имени
Н.Г. Чернышевского
Автор:
Панкратов Илья Алексеевич, к.т.н., доцент кафедры математического и
компьютерного моделирования механико-математического факультета
Саратовского национального исследовательского государственного
университета имени Н.Г. Чернышевского
Панкратов И.А.
П 16 Математическое моделирование реальных процессов в пакете
OpenFOAM: Учебное пособие / И.А. Панкратов. – Саратов: Издательство
«Саратовский источник», 2019. – 61 с.
ISBN 978-5-91879-994-9
3
Введение
OpenFOAM – это открытая интегрируемая платформа для
численного моделирования процессов механики сплошных сред от гидро-
и аэродинамики, включая учет процессов горения, протекания химических
реакций, турбулентности и тепломассообмена, до механики
деформируемого твердого тела и электромагнетизма. Данная программа
распространяется под лицензией GPL 3 (General Public License)
разработанной организацией Free Software Foundation и работает под
операционной системой Linux.
OpenFOAM представляет собой набор модулей для моделирования
задач из различных научных областей, позволяющих решать следующие
задачи [1]:
1. Гидродинамика ньютоновских и неньютоновских вязких жидкостей
(как несжимаемых, так и сжимаемых) с учётом конвективного
теплообмена и действием сил гравитации. Для моделирования
турбулентных течений возможно использование RANS-моделей,
LES и DNS методов. Возможно решение дозвуковых, околозвуковых
и сверхзвуковых задач.
2. Прочностные расчеты.
3. Задачи теплопроводности в твёрдом теле.
4. Многофазные задачи, в том числе с описанием химических реакций
компонент потока.
5. Задачи, связанные с деформацией расчётной сетки.
6. Сопряжённые задачи.
7. Распараллеливание расчёта, как в кластерных, так и
многопроцессорных системах.
8. Некоторые другие задачи, при математической постановке которых
требуется решение дифференциальных уравнений в частных
производных в условиях сложной геометрии среды.
Приложения можно разделить на программы-решатели,
разработанные для решения конкретных задач сплошной среды и утилиты,
разработанные для манипулирования данными, например, для конвертации
расчетной сетки из одного формата в другой.
Преимуществом OpenFOAM является то, что приложения могут
создаваться самим пользователем при знании основных принципов
строения приложений OpenFOAM.
Рабочим языком OpenFOAM является язык C++. Данный язык
выбран для удобства представления математических операторов и
выражения в удобной форме до компиляции в исполняемый файл.
Условно код OpenFOAM можно разделить на следующие части (как
и любую другую сложную программу):
1. Ядро (core) – набор файлов, определяющих основные
функциональные возможности кода;
2. Библиотеки (solvers) – содержат множество моделей механики
сплошных сред;
4
3. Исполняемые файлы (utilities) – утилиты для решения задач
механики сплошных сред, подготовки и обработки данных.
Общая схема решения состоит из подготовки исходных данных с
помощью препроцессора, процесса решения, а также обработки и
визуализации результатов вычислений с помощью постпроцессора.
Решение любой задачи в данном прикладном программном пакете
начинается с описания геометрии расчетной области, построения сетки в
ней и задания граничных условий, что является основными задачами
препроцессора. Препроцессорами являются приложения blockMesh и
snappyHexMesh, которые входят в состав OpenFOAM.
Утилита blockMesh [2] наиболее подходит в случае областей
простейшей формы. Она позволяет строить структурированные сетки,
состоящие из гексаэдров. Принцип работы blockMesh заключается в
делении всей расчетной области на трехмерные гексаэдральные блоки.
Ребрами этих блоков могут быть отрезки прямых или дуг. Сетка
получается вследствие разбиения каждого блока на определенное число
ячеек в каждом направлении. Вся необходимая информация о построении
сетки указывается в текстовом файле blockMeshDict.
Утилита snappyHexMesh [3] является более мощным
препроцессором. В отличие от blockMesh, snappyHexMesh позволяет
строить сетки достаточно высокого качества в случае более сложной
геометрии расчетной области. Процесс построения сетки в snappyHexMesh
начинается с разбиения ячеек, пересекающих границы тел, находящихся в
вычислительной области. Масштаб получаемой сетки определяется
уровнем ее измельчения. SnappyHexMesh может выполняться в
параллельном режиме, допуская построение сеток, состоящих из
миллионов ячеек, при наличии достаточного числа вычислительных ядер и
объема оперативной памяти. Рассмотрение принципов работы
snappyHexMesh выходит за рамки настоящего пособия.
Задачей решателя является подготовка системы линейных
алгебраических уравнений, аппроксимирующих исходную
математическую модель, и нахождение ее решения. OpenFOAM содержит
большое количество решателей, которые разделены на группы,
соответствующие группам решаемых задач. Известно, что при численном
решении задач математической физики часто применяется метод конечных
разностей [4]. При этом значения искомых параметров находятся лишь
в конечном наборе точек, принадлежащих расчётной области. Также
применяются различные методы взвешенных невязок [5, 6]. В этом случае
искомые величины представляются в виде линейной комбинации базисных
функций. В OpenFOAM все задачи решаются с помощью метода конечных
объёмов (см., например, пособие [7]). Этот метод основан на
аппроксимации законов сохранения в интегральной форме. Внутри каждой
группы решатели учитывают особенности конкретных математических
моделей, а также выбор метода решения: различных алгоритмов решения
либо поиск нестационарного или стационарного решения. Результатом
5
работы решателя является набор файлов, в которых содержатся данные о
поле исследуемой величины в конкретный момент времени.
Пользователь может влиять на способ решения задачи. Он имеет
возможность редактирования исходного кода, т.к. исходный код всех
решателей открыт, может создать новый решатель либо настроить
параметры решателя, т.е. задать различные схемы аппроксимации
операторов дифференциальной задачи (оператора градиента, дивергенции,
оператора Лапласа, первых и вторых производных по времени) и схем
интерполяции. Также пользователь может выбрать метод решения системы
линейных алгебраических уравнений.
Задача постпроцессора состоит в обработке, анализе и визуализации
данных о поле исследуемой величины в конкретный момент времени.
Постпроцессором является программа ParaView версии 5.4.0. Эта
программа является основным средством визуализации результатов в
пакете OpenFOAM. Она разработана американской компанией Kitware inc.
ParaView обладает большими возможностями для визуализации, т.е.
позволяет визуализировать скалярные и векторные поля, линии тока,
изоповерхности, получать информацию о нужном поле в точке или вдоль
некоторой линии. Важной особенностью ParaView является поддержка
параллельной обработки данных на высокопроизводительных
вычислительных системах с общей или распределенной памятью.
Настоящее пособие состоит из трёх разделов. В первом из них
приведён обзор существующих средств виртуализации и даны
рекомендации по установке операционной системы (ОС) Ubuntu на
компьютер пользователя. Здесь же рассмотрены вопросы, непосредственно
касающиеся установки пакета OpenFOAM. Во втором разделе показаны
основные этапы выполнения математического моделирования физических
процессов с помощью OpenFOAM на примере нестационарного уравнения
теплопроводности. Приведены многочисленные примеры численного
решения задачи для различных вариантов задания граничных условий.
Последний раздел содержит описание работы с модулем ParaView,
инструментом для постобработки, поставляемым вместе с пакетом
OpenFOAM.
6
1 Установка программного обеспечения
1.1 Средства виртуализации
OpenFOAM работает под операционной системой (ОС) Linux.
Вообще говоря, установка OpenFOAM (например, из исходных кодов)
возможна в различных дистрибутивах ОС Linux. Автор настоящего
пособия настоятельно рекомендует использовать Ubuntu [8]. В Ubuntu есть
встроенный пакет для установки OpenFOAM. Рассмотрим, какие шаги
нужно предпринять для установки OpenFOAM.
Если Вы хотите работать под ОС Windows и не желаете
устанавливать Ubuntu второй системой, то начните с установки
программного продукта для виртуализации. Если у Вас уже установлена
Ubuntu, то Вы можете пропустить этот шаг и перейти к разделу 1.3. Далее
рассмотрено такое средство виртуализации, как VirtualBox [9].
VirtualBox является кросс-платформенным приложением
виртуализации. VirtualBox работает на компьютерах с процессорами Intel
или AMD под управлением операционных систем Windows, Mac, Linux
или Solaris. VirtualBox расширяет возможности вашего компьютера тем,
что позволяет работать множеству операционных систем одновременно
(внутри виртуальных машин). Например, Вы можете запустить Windows и
Linux на вашем Mac, запустить Windows Server 2008 на вашем Linux
сервере, запустить Linux на вашем ПК с Windows и т.д., и все они
одновременно будут работать с вашими программами. Вы можете
установить и запустить виртуальных машин столько, сколько вам нужно –
Ваша фантазия ограничивается только размером свободного дискового
пространства и памяти.
VirtualBox является мощным инструментом. Он может применяться
везде: от небольших встроенных систем и персональных компьютеров до
центров обработки данных и даже в «облачных» средах.
Для понимания технологии виртуализации, Вам необходимо
ознакомиться с небольшим количеством важных терминов.
Операционная система хоста (ОС хоста, host OS) – это операционная
система физического компьютера, в которой установлен VirtualBox.
Существуют версии VirtualBox для Windows, Mac OS X, Linux и Solaris
хостов.
Гостевая операционная система (Гостевая ОС, guest OS) – это
операционная система, работающая внутри виртуальной машины.
Теоретически, в VirtualBox могут работать любые операционные системы
x86 (DOS, Windows, OS/2, FreeBSD, OpenBSD), но для достижения
высокой производительности гостевых систем применяется оптимизация
некоторых операционных систем. Поддерживается и оптимизируется
работа для небольшого количества ОС (но это небольшое количество,
однако, включает в себя наиболее распространенные системы).
Виртуальная машина (ВМ, VM) – специальная среда, которую
VirtualBox создает для работы гостевой операционной системы. Другими
словами, Вы запускаете гостевую операционную систему «в» ВМ. Обычно,
7
ВМ существует в виде окна на рабочем столе вашего компьютера, но, в
зависимости от используемого интерфейса VirtualBox, она может занимать
весь Ваш экран (in full-screen mode) или отображаться на экране другого
компьютера.
На другом, более абстрактном уровне, VirtualBox воспринимает ВМ
как множество параметров, которые определяют ее поведение. Эти
параметры включают: аппаратные настройки (размер памяти выделенной
для ВМ, типы жёстких дисков, подключенные CD и т.д.) и текущее
состояние (ВМ работает, сохранена и т.п.). Эти настройки представлены в
окне менеджера VirtualBox, а также могут управляться через программу
командной строки VBoxManage. Другими словами, ВМ – это также то, что
Вы можете видеть в диалогах настроек.
Гостевые дополнения (Guest Additions) – это пакет программных
продуктов поставляемых с VirtualBox, но разработанных для установки
внутри ВМ, способствующих улучшению производительности гостевой
ОС и предоставления дополнительной функциональности.
На данный момент VirtualBox включает в себя следующие
возможности: нативная x86-виртуализация, не требующая наличия
поддержки аппаратных техник Intel VT или AMD-V (которая, однако,
может быть включена в настройках); дружественный пользовательский
интерфейс, в том числе и на русском языке (построенный с помощью Qt);
поддержка Windows, Linux и Mac OS хостовых систем; наличие Guest VM
Additions для упрощения взаимодействия с хостовыми ОС; поддержка
многопроцессорных и многоядерных систем; поддержка виртуализации
аудиоустройств; высокая производительность; поддержка различных
видов сетевого взаимодействия (NAT, Host Networking via Bridged,
Internal); поддержка дерева сохраненных состояний виртуальной машины
(snapshots), к которым может быть произведен откат из любого состояния
гостевой системы; описание настроек виртуальной машины в XML-
формате; поддержка общих папок для простого обмена файлами между
хостовой и гостевой системами.
Для того чтобы скачать VirtualBox, пройдите по ссылке
https://www.virtualbox.org/wiki/Downloads и выберите свою операционную
систему из представленных в списке. Рядом с каждым названием стоит
ссылка на скачивание Virtualbox. После сохранения файла с VirtualBox на
компьютер, запустите его. В установке платформы нет никаких
особенностей: она проста и проходит быстро. Вам нужно лишь выбрать
директорию установки, нажав на кнопку «Browse» либо оставить всё как
есть. Согласитесь с установкой всего программного обеспечения от Oracle,
так как оно нужно для корректной работы виртуальной машины. Такие
окна будут появляться несколько раз.
После первого запуска VirtualBox Вам будет доступна одна
единственная кнопка на панели инструментов слева – «Создать». Нажмите
её, и на экране появится уведомление о том, что Вы приступили к
созданию виртуальной машины.
8
Рис. 1.1 Новая виртуальная машина
Для начала, введите имя своей ОС. Это может быть любое слово,
которое поможет вам запомнить цель создания системы. Также выберите
саму систему, которая будет установлена в виртуальной машине (ОС
Ubuntu (64 bit)), как показано на рис. 1.2.
9
Рис. 1.3 Оперативная память
Следующий этап посвящен жёсткому диску, он будет виртуальным.
Выберите пункт «Создать новый виртуальный жёсткий диск», как
показано на рис. 1.4.
10
Рис. 1.5 Тип жёсткого диска
Затем укажите формат хранения виртуального жёсткого диска, как
показано на рис. 1.6.
12
Рис. 1.8 Выбор образа Ubuntu
Также убедитесь в том, что в пункте «Система» порядок загрузки
таков, что оптический диск идёт перед жёстким диском (см. рис. 1.9).
13
Рис. 1.10 Язык установки Ubuntu
В открывшемся меню Вам необходимо выбрать пункт «Запустить
Ubuntu». Если система слишком долго загружается, то выключите
виртуальную машину и увеличьте количество оперативной памяти,
выделенной для виртуальной машины.
Дождитесь окончания загрузки. Когда система загрузится,
выполните двойной клик левой кнопкой мыши по значку «Установить
Ubuntu». Затем выберите язык для будущей системы. Далее выберите
раскладку клавиатуры по умолчанию. Вы можете спокойно выбирать
русскую, так как если во время установки вам понадобиться сменить
раскладку, то Вы сможете это очень просто сделать с помощью сочетания
клавиш Alt+Shift или Win+Пробел. Отметьте также галочки напротив
пунктов «Загрузить обновления во время установки Ubuntu» и
«Установить дополнительное программное обеспечение» как показано на
рис. 1.11.
15
Рис. 1.14 Новая таблица разделов
Заметим, что все изменения касаются лишь того места на Вашем
жёстком диске, которое выделено для виртуальной машины.
Нам необходимо создать два раздела: / – для самой операционной
системы и /home – для файлов пользователя.
Для создания раздела выберите пункт «Свободное пространство» и
нажмите кнопку со знаком «плюс». В открывшемся окне Вам будет
необходимо выбрать размер раздела. Размер раздела, как следует из
системных требований, должен быть не менее 10 Гбайт, но желательно
сделать больше – 20-30 Гбайт, чтобы Вам было его достаточно для
установки программ.
Здесь будет располагаться операционная система. Если Вы не
создадите раздел /home, то его файлы тоже будут находиться на этом
разделе.
Файловая система может быть zfs, btrfs, ext4 или reiserfs. Но лучше
выбирайте проверенную ext4. Точка монтирования – /.
17
допущена ли ошибка при наборе команды. Заметим, что параметром
команды «wget» является латинская буква «O», а не цифра ноль.
Это нужно сделать только один раз для данной системы.
Очевидно, что Вы должны включить доступ в Сеть для Вашей
виртуальной машины, чтобы иметь возможность установить программные
пакеты в Ubuntu. Сбой установки из-за проблем с сетью обычно приводит
к сообщению об ошибке, в котором говорится о сбоях в получении
архивов, заканчивается оно следующей строкой:
E: Unable to fetch some archives...
Обновите список пакетов apt с учетом нового репозитория, дав
команду
sudo apt update
Установите OpenFOAM (6 в названии пакета относится к версии 6),
который также устанавливает средство для постпроцессинга
paraviewopenfoam54.
sudo apt -y install openfoam6
Пакет OpenFOAM периодически обновляется. Для того чтобы
обновить OpenFOAM вместе с остальными пакетами Ubuntu, дайте
команды
sudo apt update
sudo apt upgrade
Также Вы можете обновить только OpenFOAM 6 с помощью
следующих команд
sudo apt update
sudo apt install --only-upgrade openfoam6
Чтобы использовать установленный пакет OpenFOAM, выполните
следующие действия. Откройте файл .bashrc в домашнем каталоге
пользователя в любом редакторе, например, введя в окне терминала
(обратите внимание на точку)
gedit ~/.bashrc
В конце файла добавьте следующую строку и сохраните файл.
source /opt/openfoam6/etc/bashrc
Если подобная строка уже существует, например, для предыдущей
версии OpenFOAM, то строка должна быть удалена или, в качестве
альтернативы, закомментирована с помощью # в начале строки. При
первой установке OpenFOAM такой строки в файле .bashrc естественно
нет.
Зарегистрируйте изменение файла .bashrc, набрав в командной
строке терминала (обратите внимание на точку) следующее:
18
source ~/.bashrc
Откройте новое окно терминала и проверьте работу решателя
simpleFoam из пакета OpenFOAM, введя в консоли команду
simpleFoam --help
Если всё сделано верно, то должно появиться сообщение,
содержащее некоторую справочную информацию. Установка и настройка
OpenFOAM завершены. В случае, если Вы столкнулись с некоторыми
затруднениями, то обратитесь к документации пакета OpenFOAM,
размещённой на официальном сайте проекта.
Для дальнейшей работы Вам также понадобится текстовый редактор
kate. Установите его, дав команду
sudo apt install kate konsole
Здесь konsole – это встроенный в редактор терминал. В текстовом
редакторе kate Вы будете редактировать конфигурационные файлы
OpenFOAM. При этом удобно выполнять команды OpenFOAM не в
отдельном окне терминала, а в том, которое находится рядом с
редактируемым текстом.
Запустите установленный текстовый редактор. Для этого найдите его
в меню приложений или дайте в консоли команду kate. Затем зайдите в
меню «Настройка -> Настроить Kate -> Модули» и поставьте галочку
напротив пункта «Встроенный терминал», как показано на рис. 1.17. После
этого подтвердите внесение изменений.
19
После этого нажмите кнопку «Терминал» в нижней части окна kate.
Вы должны увидеть чёрное окно терминала снизу от окна с текстовым
файлом, как показано на рис. 1.18.
20
2.2 Построение сетки с помощью blockMesh
Для того чтобы провести расчёт в пакете с открытым исходным
кодом OpenFOAM, создадим в домашней папке каталог Teplo, в котором
будут храниться файлы нашей задачи. Для этого дайте команды в консоли
cd ~
При этом Вы перейдёте в домашнюю папку.
mkdir Teplo
Команда mkdir создаёт каталог с тем именем, которое было передано
ей в качестве параметра.
Название этого каталога, вообще говоря, может быть любым. Оно
лишь отражает специфику решаемой задачи (не используйте пробелы и
кириллицу). Внутри этого каталога нужно создать каталоги с именами
constant и system (это зарезервированные слова OpenFOAM). Для этого
дайте команды
cd ~\Teplo
mkdir constant
mkdir system
или воспользуйтесь некоторым файловым менеджером (например,
Dolphin).
Вместо тильды Вы можете указать полный путь к Вашей домашней
папке. Например переход в папку Teplo можно совершить так
cd \home\user\Teplo
Затем в любом текстовом редакторе (например kate) нужно создать
текстовый файл под названием blockMeshDict (без расширения!) и
сохранить его в каталоге system.
Занесём в файл blockMeshDict следующую информацию
/*------------------------------------*- C++ -*------------------------------------*\
=======
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 6
\\/ M anipulation |
\*-------------------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
21
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
convertToMeters 1.0;
vertices
(
(0 0 0) //0
(1 0 0) //1
(1 1 0) //2
(0 1 0) //3
(0 0 0.1) //4
(1 0 0.1) //5
(1 1 0.1) //6
(0 1 0.1) //7
);
Удобно установить подсветку в стиле C++, выбрав пункт меню
«Сервис -> Подсветка -> Исходный код -> С++».
Строки между
/*------------------------------------*- C++ -*------------------------------------*\
и
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
это «шапка» файла, в которой указаны версия OpenFOAM и тип
редактируемого файла. В дальнейшем для краткости изложения «шапка»
часто будет опускаться.
В строке
convertToMeters 1.0;
приведён масштабный коэффициент для перевода координат вершин
нашей расчётной области в метры. Если координаты вершин и так даны в
метрах, то строку с множителем 1.0 можно пропустить. Дециметрам
соответствует коэффициент 0.1, а сантиметрам и миллиметрам – 0.01 и
0.001 соответственно. Заметим, что все координаты должны быть взяты в
одних и тех же единицах измерения.
Список координат вершин расчётной области задаётся в блоке
vertices. В каждой строке в круглых скобках приводятся трёхмерные
декартовы координаты одной из точек (абсцисса, ордината и аппликата
соответственно). Порядок следования вершин здесь не важен. Символом //
22
обозначены однострочные комментарии. Легко видеть, что
закомментированы номера вершин (они пригодятся в дальнейшем).
OpenFOAM нумерует все вершины, начиная с нуля.
Для того чтобы разбить нашу вычислительную область на ячейки,
вершины нужно объединить в блоки. Самым простым блоком является
параллелепипед, состоящий из восьми вершин. Добавим в конец файла
blockMeshDict следующие строки
blocks
(
hex (0 1 2 3 4 5 6 7) (4 2 1) simpleGrading (1 1 1)
);
Разберём их. Ключевое слово blocks указывает на то, что далее в
фигурных скобках будут перечислены один или несколько блоков (в
простейшем случае это параллелепипеды). hex – зарезервированное слово
(hexahedron – англ. шестигранник). Затем в круглых скобках перечислены
вершины шестигранника. Удобно вначале задать, например, нижнюю
грань, а затем верхнюю. Заметим, что ребра граней не должны
пересекаться. Далее в круглых скобках через пробел приведены три числа
– количество ячеек, на которые мы хотим разбить вычислительную
область в направлении каждой из осей координат. Например, в нашем
случае в направлении оси Ox будет 4 ячейки (со сторонами по 1 / 4 0.25
м), в направлении оси Oy будет 2 ячейки (со сторонами по 1 / 2 0.5 м) и в
направлении оси Oz только одна ячейка со стороной 0.1 / 1 0.1 м. В
простейшем случае все ячейки должны быть одинаковыми
параллелепипедами. Для этого после ключевого слова simpleGrading
указаны три единицы в круглых скобках. Это означает, что в направлении
каждой из осей координат отношение длины стороны последней ячейки к
длине стороны первой ячейке равно единице, т.е. длины сторон этих ячеек
совпадают.
По умолчанию все грани блоков объединены в группу defaultFaces.
В дальнейшем нам понадобится задавать те или иные граничные условия.
Для этого нужно обозначить каждую из граней. Добавим в конец файла
blockMeshDict следующие строки
boundary
(
fixedWalls
{
type wall;
faces
(
23
(3 7 6 2) // top
(1 5 4 0) // bottom
(0 4 7 3) // left
(2 6 5 1) // right
(0 3 2 1) // back
(4 5 6 7) // front
);
}
);
Разберём их. После ключевого слова boundary в фигурных скобках
перечислены все грани нашего параллелепипеда. fixedWalls – это название
группы граней, оно может быть произвольным. Удобно давать группе
осмысленное имя. В нашем случае грани блока не движутся, они
фиксированы на месте. Это и отражено в названии группы. После названия
группы в фигурных скобках указан тип группы – wall (стена). Другие типы
групп будут разобраны далее. После ключевого слова faces в фигурных
скобках приведены все восемь граней нашего параллелепипеда. Каждая
грань задается простым перечислением номеров её вершин в круглых
скобках через пробел. Это как раз те номера, которые были ранее
закомментированы в блоке vertices. Заметим, что номера вершин идут не в
произвольном порядке. Порядок вершин таков, что если смотреть на грань
из центра блока, то вершины будут перечислены против часовой стрелки.
Какая именно вершина грани будет первой в списке – не важно. После
каждой грани закомментировано её название: top – верхняя грань
параллелепипеда, bottom – нижняя, left – левая, right – правая, back –
задняя и front – передняя. Это удобно, т.к. в случае ошибки будет легче
сориентироваться, какую грань рассматривал разработчик.
Для того чтобы задать такие параметры расчёта, как начальное и
конечное время, шаг по времени и т.д. в папке system нужно создать файл
controlDict. Занесём в него следующую информацию
/*------------------------------------*- C++ -*------------------------------------*\
=======
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 6
\\/ M anipulation |
\*-------------------------------------------------------------------------------------*/
FoamFile
24
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application laplacianFoam;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 3;
deltaT 0.005;
writeControl runTime;
writeInterval 0.1;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Разберём некоторые строки этого файла. application – наименование
стандартного «решателя» OpenFOAM для уравнения теплопроводности.
startFrom – момент времени, с которого нужно начинать расчёт, latestTime
означает, что будет взят последний из моментов времени, до которого
досчитали в предыдущий раз. Если нужно каждый раз начинать расчёт
сначала, то latestTime следует заменить на startTime. startTime – момент
времени, в который начинается самый первый расчёт (в папке с таким
именем должен находиться файл с начальными и граничными условиями).
stopAt – время остановки расчёта. deltaT – шаг по времени (в некоторых
задачах его нужно выбирать так, чтобы число Куранта было меньше
единицы). Блок
25
writeControl runTime;
writeInterval 0.1;
говорит нам о том, что запись результатов расчёта в файл будет
происходить через каждую 0.1 секунду. Если мы хотим записывать в файл
результаты расчётов например для каждого двадцатого шага по времени,
то этот блок в файле controlDict следует заменить на
writeControl timeStep;
writeInterval 20;
writePrecision – количество значащих цифр при записи в файл результатов
расчёта.
Помимо всего прочего в папке system нужно создать файл
fvSchemes, в котором описаны схемы дискретизации для производных,
входящих в рассматриваемое уравнение. Этот файл имеет вид
/*------------------------------------*- C++ -*------------------------------------*\
=======
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 6
\\/ M anipulation |
\*-------------------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
26
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
grad(T) Gauss linear;
}
divSchemes
{
default none;
}
laplacianSchemes
{
default none;
laplacian(DT,T) Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Также в эту папку необходимо поместить файл fvSolution, в котором
описаны применяемые методы решения систем линейных алгебраических
уравнений. Этот файл имеет вид
27
/*------------------------------------*- C++ -*------------------------------------*\
=======
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 6
\\/ M anipulation |
\*-------------------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
T
{
solver PCG;
preconditioner DIC;
tolerance 1e-06;
relTol 0;
}
}
SIMPLE
{
nNonOrthogonalCorrectors 2;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
В блоке «T» указано, что система линейных алгебраических
уравнений относительно искомых значений температуры в центрах ячеек
28
будет решаться методом PCG (устойчивый метод сопряжённых градиентов
с предобуславливателем). При этом предобуславливатель DIC
соответствует неполному разложению Холецкого. Здесь же приведена
точность решения системы, при достижении которой итерационный
процесс завершится.
Для того чтобы построить сетку, откроем встроенный терминал и
перейдём в каталог Teplo, дав команду
cd ~\Teplo
или
cd ..
или
cd /home/user/Teplo
Вторая команда соответствует переходу на один уровень выше в
дереве папок (по умолчанию при открытии терминала мы находимся в
домашнем каталоге).
Затем дадим команду blockMesh как показано на рис. 2.1.
31
Закроем окно ParaView и перейдём к формированию начальных и
граничных условий.
Задание:
Пусть abcdef – последние шесть цифр номера Вашей зачётной
книжки. Постройте параллелепипед с ребрами ab, cd и ef соответственно.
Единицы измерения определите так: вычислите x = f mod 4 (остаток от
деления последней цифры номера Вашей зачётной книжки на четыре)
Если x = 0, то ребра Вашего параллелепипеда заданы в метрах; х = 1 – в
дециметрах; х = 2 – в сантиметрах; х = 3 – в миллиметрах. Количество
ячеек выберите так, чтобы каждая ячейка была кубом с ребром 1.
Например, если номер зачетной книжки заканчивается на 123456, то
размеры параллелепипеда 12 см * 34 см * 56 см.
34
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
DT DT [0 2 -1 0 0 0 0] 4e-04;
Заметим, что синтаксис файлов OpenFOAM требует того, чтобы
название коэффициента (параметра) повторялось дважды. Затем в
квадратных скобках идёт размерность этого коэффициента (легко
проверить, что в нашем случае это м2/сек). В конце строки указана
величина коэффициента теплопроводности (экспоненциальную форму
записи использовать необязательно, но удобно). Название коэффициента
фиксировано.
35
Итак, находясь в папке Teplo, запустите Midnight Commander, дав
команду
mc
во встроенном терминале. Вы увидите структуру дерева папок,
показанную на рис. 2.8.
Для возврата в терминал нажмите комбинацию клавиш Ctrl-O. Затем
дайте команду blockMesh. Вы должны, как и ранее увидеть сообщение
«End». Это означает, что новая сетка построена. Если это не так, то
вернитесь к редактированию файла blockMeshDict для исправления
ошибок. Заметим, что теперь наша сетка состоит, как и требуется, из 500
ячеек ( 500 10 10 5 ). В этом можно убедиться, изучив раздел «Mesh
Information» в логе команды blockMesh (nCells: 500).
В отличие от раздела 2.2 у нас уже заданы начальные и граничные
условия задачи, а также её параметры. Запустите процесс решения
нестационарного уравнения теплопроводности. Для этого, не покидая
папку Teplo, дайте команду laplacianFoam.
36
Задание:
Нагрейте таким же образом параллелепипед с ребрами ab, cd и ef
соответственно, построенный Вами в предыдущем задании.
38
присутствовать интересующее нас поле T. Нажмите кнопку «Apply».
Теперь вместо vtkBlockColors выберите в выпадающем списке поле T, как
показано на рис. 2.12.
40
Заметим, что ParaView интерполирует значения температуры в
соседних ячейках.
Кликните мышью на строке Slice1. Убедитесь, что в сечении будет
отображаться температура T, а тип отображения – Surface (см. рис. 2.15).
41
Рис. 2.17 Распределение температуры в сечении при t 3 сек (условия
Дирихле
Нажмите кнопку Play. Вы увидите, как начнет меняться
распределение температуры в сечении пластины с течением времени. На
рис. 2.17 показано распределение температуры при t 3 сек .
Задания:
1. Очевидно, что при данных граничных условиях вся пластина
должна прогреться до 373 К. Проверьте это. Увеличьте время окончания
процесса в файле controlDict и запустите расчёт заново. Не забудьте перед
этим удалить каталоги 0.1, 0.2 и т.д. с результатами предыдущего расчёта.
Также можно увеличить коэффициент теплопроводности в файле
transportProperties, чтобы пластина быстрее нагрелась.
2. Установите, как нужно изменить параметры задачи, чтобы
полностью прогрелся построенный Вами параллелепипед с ребрами ab, cd
и ef соответственно.
42
boundary
(
fixedWalls
{
type wall;
faces
(
(3 7 6 2) // top
(1 5 4 0) // bottom
(0 4 7 3) // left
(0 3 2 1) // back
(4 5 6 7) // front
);
};
rightWall
{
type wall;
faces
{
(2 6 5 1) // right
}
}
}
Разберём его. Появилась группа граней rightWall, включающая в
себя только одну, правую грань пластины. Остальные грани по-прежнему
входят в группу fixedWalls.
Затем изменим файл T. Блок boundaryField примет вид
boundaryField
(
fixedWalls
{
type fixedValue;
value uniform 373;
};
43
Рис. 2.18 Распределение температуры в сечении при t 3 сек (условие
Неймана)
rightWall
{
type zeroGradient;
}
}
На границе под названием fixedWalls по-прежнему задано
фиксированное значение температуры (373 К). На правой же стороне
пластины задан нулевой градиент температуры (условие Неймана).
Удалим папки с результатами предыдущих вычислений и запустим
расчёт поля температуры так, как было описано выше в разделе 2.5.1.
На рис. 2.18 показано распределение температуры при t 3 сек.
Задание:
Нагрейте таким же образом построенный Вами параллелепипед с
ребрами ab, cd и ef соответственно.
45
Разберём его. Появилась группа граней frontAndBackWall,
включающая в себя переднюю и заднюю грани параллелепипеда. Тип
empty – это специальный тип грани для случая, когда на ней не заданы
граничные условия. Остальные грани входят в группу fixedWalls.
Затем изменим файл T. Блок boundaryField примет вид
boundaryField
(
fixedWalls
{
type fixedValue;
value uniform 373;
};
frontAndBackWall
{
type empty;
}
}
На границе под названием fixedWalls по-прежнему задано
фиксированное значение температуры (373 К). На передней и задней
гранях граничные условия не заданы. Теперь задача стала двумерной,
искомое поле температуры зависит только от абсциссы и ординаты точек
пластины.
Удалите папки с результатами предыдущих вычислений и запустите
расчёт поля температуры так, как было описано выше в разделе 2.5.1.
Проверьте, как меняется поле температуры. Теперь необязательно
рассекать пластину плоскостью, перпендикулярной оси Oz.
Задание:
Нагрейте таким же образом построенный Вами параллелепипед с
ребрами ab, cd и ef соответственно.
47
Панель Properties – здесь показаны время, отображаемые регионы
вычислительной области и физические поля; здесь же находится панель
отображения, которая управляет визуальным представлением
рассматриваемой области (палитры цветов и т.д.). Заметим, что окно
Properties содержит панель Selection, в которой указаны параметры сетки и
физических полей.
Элементы управления показаны на рис. 3.2. Пользователь может
выбрать сетку и поля, которые загружаются в ParaView для всех моментов
времени.
48
Как и в случае любой операции в paraFoam, пользователь должен
нажать кнопку применить после внесения изменений. Кнопка Apply
выделена зеленым цветом, чтобы предупредить пользователя, о том, что
изменения были сделаны, но не приняты. Такой метод работы имеет то
преимущество, что позволяет пользователю сделать ряд действий, прежде
чем принять их. Это особенно полезно в случаях, когда обработку данных
лучше свести к минимуму.
Если новые данные записываются во время выполнения ParaView,
пользователь должен загрузить дополнительные каталоги времени, нажав
кнопку Refresh Times.
Окно Properties содержит панель Display, показанную на рис. 3.3.
Здесь находятся параметры визуализации данных.
50
Также в меню Help пользователю дается краткое описание функции
любой кнопки.
Заметим, что для того чтобы сохранить скриншот, показывающий
картину распределения того или иного параметра в некоторый момент
времени, необязательно пользоваться клавишей Print Screen. Самый
простой способ вывода изображения в файл из ParaView – выбрать пункт
Save Screenshot в меню File. При этом появляется окно, в котором
пользователь может выбрать разрешение для сохранения изображения.
Существует кнопка, которая при нажатии сохраняет соотношение сторон
рисунка, поэтому, если пользователь изменяет разрешение в одном
направлении, разрешение автоматически настраивается в другом
направлении. После выбора количества точек на дюйм, изображение
можно сохранить. Для достижения высокого качества вывода,
пользователь может попробовать установить разрешение в 1000 пикселей
или более в направлении оси абсцисс, так чтобы изображение оставалось
чётким при масштабировании.
Для того чтобы создать анимационный ролик, пользователь должен
сначала выбрать пункт Save Animation из меню File. При этом появится
диалоговое окно, в котором пользователь может указать ряд параметров,
включая разрешение изображения. Пользователь должен указать
требуемое разрешение. Другим примечательным параметром является
количество кадров на каждый шаг по времени (Frame Rate). По умолчанию
одному шагу по времени соответствует один кадр. Но можно увеличить
это число, чтобы искусственно ввести больше кадров в анимацию. Этот
метод может быть особенно полезен для создания более медленной
анимации, поскольку некоторые видеопроигрыватели имеют
ограниченный контроль над скоростью воспроизведения, особенно при
использовании формата mpeg.
Задания:
1. Сохраните скриншоты, показывающие распределение
температуры при нагреве построенного Вами параллелепипеда в
различные моменты времени. Рассмотрите сечения, перпендикулярные
каждой из координатных осей.
2. Создайте анимационные ролики, показывающие, как происходит
нагрев параллелепипеда в каждом из трёх сечений.
Задание:
Сохраните скриншоты, показывающие изолинии температуры в трёх
сечениях построенного Вами параллелепипеда в различные моменты
времени. Также сохраните видео-файлы, демонстрирующие, как меняются
изолинии с течением времени.
52
Рис. 3.7 Изолинии температуры в сечении при t 3 сек
53
«Время: %0.2f» (кавычки печатать не нужно) и нажмите Apply. Надпись
изменится, у числа останется только два знака после запятой (см. рис. 3.8).
Для того чтобы поменять положение надписи на экране,
воспользуйтесь блоком Text Position, показанным на рис. 3.9.
54
Рис. 3.11 Диапазон изменения параметра
55
Выделите синим цветом строку Slice1 и выберите пункт меню Filters
-> Common -> Calculator (также можно воспользоваться алфавитным
списком всех фильтров). В Pipeline Browser появится новый объект под
названием Calculator1. Его свойства показаны на рис. 3.12.
Задания:
1. Вернитесь к задаче о нагреве Вашего параллелепипеда. Поместите
в произвольное место экрана метку со временем. Увеличьте в надписи
количество знаков после запятой до трёх. Как нужно изменить параметры
задачи, чтобы при проведении математического моделирования менялась
последняя цифра в надписи?
2. Установите, как меняется с течением времени натуральный
логарифм температуры при нагреве Вашего параллелепипеда.
56
Рис. 3.14 Квадрат температуры в сечении при t 3 сек
57
Установите белую линию параллельно оси абсцисс, нажав кнопку
X Axis, и затем нажмите кнопку Apply. Появится окно LineChartView1
содержащее график. После этого выберите в выпадающем списке
X_Array_Name (блок X Axis Parameters) пункт Points_X. Так Вы поменяете
подписи к оси абсцисс на абсциссы точек, через которые проходит Ваша
линия. Убедитесь также, что в разделе Series Parameters выбрано поле
температуры T.
После этого можно поменять названия осей, например левой и
нижней (Left Axis Title и Bottom Axis Title соответственно) и подписать
график (поле Chart Title).
Запустите визуализацию процесса, нажав кнопку Play. В окне
LineChartView1 появится график изменения температуры вдоль нужной
Вам линии. На рис. 3.16 показан закон изменения температуры вдоль оси
абсцисс при t 3 сек.
58
Таким образом, ParaView – это мощное средство, позволяющее
визуализировать и обрабатывать экспериментальные данные. Более
подробные сведения о нём можно почерпнуть на официальном сайте
проекта или в руководстве пользователя [12].
Задания:
1. Постройте графики изменения температуры пластины вдоль осей
ординат и аппликат соответственно.
2. Установите, как меняется с течением времени температура вдоль
каждой из осей при нагреве Вашего параллелепипеда.
3. Выберите произвольную линию, не параллельную координатной
оси. Установите, как меняется с течением времени температура вдоль этой
линии при нагреве Вашего параллелепипеда.
59
Литература
1. Официальный сайт OpenFOAM. – URL: https://openfoam.org/ (дата
обращения 14.01.2019).
2. Документация blockMesh. – URL: http://openfoamwiki.net/
index.php/blockMesh (дата обращения 15.01.2019).
3. Документация SnappyHexMesh. – URL: http://openfoamwiki.net/
index.php/blockMeshSnappyHexMesh (дата обращения 15.01.2019).
4. Самарский А.А. Введение в теорию разностных схем. – М.: Наука,
1971. – 552 с.
5. Зенкевич О., Морган К. Конечные элементы и аппроксимация. –
М.: Мир, 1986. – 318 с.
6. Коннор Дж., Бреббиа К. Метод конечных элементов в механике
жидкости. – Л.: Судостроение, 1979. – 264 с.
7. Ковеня В.М., Чирков Д.В. Методы конечных разностей и
конечных объёмов для решения задач математической физики. –
Новосибирск: Новосибирский государственный университет, 2013. – 87 с.
8. Официальный сайт Ubuntu. – URL: https://www.ubuntu.com/ (дата
обращения 10.02.2019).
9. Официальный сайт VirtualBox. – URL: https://www.virtualbox
.org (дата обращения 11.02.2019).
10. Официальный сайт ParaView. – URL: https://www.paraview.org/
(дата обращения 20.08.2019).
11. Тихонов А.Н., Самарский А.А. Уравнения математической
физики. – М.: Наука, 2004. – 798 с.
12. ParaView Guide. – URL: https://gitlab.kitware.com/paraview/
paraview-guide-ce (дата обращения 20.08.2019).
60
Учебное издание
Панкратов И.А.
МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ
РЕАЛЬНЫХ ПРОЦЕССОВ В ПАКЕТЕ OPENFOAM
Учебное пособие
61