Решение полной системы уравнений Навье Стокса с распараллеливанием процесса вычислений
Разработка многопоточной программы для полной системы уравнений Навье Стокса, эффективность ее использования. Использование пакета программ – DevC++ 5.11 и мультимедийной кроссплатформенной библиотеки SFML. Способы организации потоков и их взаимодействий.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | статья |
Язык | русский |
Дата добавления | 11.03.2018 |
Размер файла | 270,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Уральский государственный университет путей сообщения
Решение полной системы уравнений навье стокса с распараллеливанием процесса вычислений
АВТОРЫ
Маркин Е.Е. Скачков П.П.
Резюме
многопоточный программа мультимедийный стокс
Целью работы являетя разработка многопоточной программы, для полной системы уравнений Навье Стокса, решения которой описывают течения сжимаемого вязкого теплопроводного идеального газа при постоянных значениях коэффициентов вязкости и теплопроводности. Способ вычислений состоит в построении решений с помощью явной разностной схемы. При решении представленной задачи был использован пакет программ - DevC++ 5.11 и мультимедийная кроссплатформенная библиотека SFML. В работе для дифференциальных уравнений, в одномерном случае, описываются уравнения в конечных разностях. Рассказывается об идеи распараллеливания процесса. Изучаются способы организации потоков и их взаимодействий. Рассчитывается эффективность использования многопоточной программы. Итогом работы является программный продукт, написанный на языке программирования C++ реализующий расчет величин давления, скорости течения и удельного объема. Приводятся примеры графиков изучаемых величин как результат расчета по построенной программе включая вычисленные спектры Фурье коэффициентов. В работе проведена анимация процесса протекающего в системе и получен видео ролик волновых явлений.
Рассматривается полная система уравнений Навье Стокса, решения которой описывают течения сжимаемого вязкого теплопроводного идеального газа. В системе выполнен переход от переменной плотности и температуры к удельному объему и давлению. Это позволяет решать систему уравнений с частными производными в нормальной форме относительно производных по времени.
В одномерном случае в безразмерных переменных эта система выглядит так [1,3]:
(1)
где время, x ? пространственная переменная, u ? скорость течения газа - удельный объем и р - давление. Кроме того коэффициенты вязкости теплопроводности и показатель политропы соответственно.
Для системы (1) рассматривается начально-краевая задача. Именно, на отрезке [0,p] заданы начальные и краевые условия вида (2)
Приближенные решения в одномерном случае находятся построением численных решений с помощью явной разностной схемы.
При построении решений с помощью разностных схем по пространственной переменной вводится равномерная сетка . Для дискретизации производных выбираются следующие стандартные выражения:
Разностные уравнения для системы (1) в этом случае имеют вид:
(3)
с начальными (4) и граничными (5) условиями:
(4)
(5)
Равенство нулю производной температуры на концах отрезка аппроксимируется уравнениями:
(6)
Из системы (7) и граничных условий (9,10) получается разностная схема для определения значений неизвестных на следующем шаге по времени [2].
Построение программы и распараллеливание процесса вычислений
Алгоритм решения сеточных уравнений показан на рисунке 1.
Имеется первый слой - начальные условия. И затем на основании его вычисляем следующий слой. При этом используется явная схема пересчета, так как разностные уравнения нелинейные и неявную схему реализовать не имеет смысла из-за необходимости в обратном ходе решать нелинейную систему (метод прогонки невозможен). Задача будет решенной, если значения искомых переменных определены на всех «временных слоях».
Идея распараллеливания показана на рисунке 2. Как видно из условий задачи, распараллелить процесс мы можем только на участке нахождения элементов слоя. При этом потоки должны быть согласованны, то есть потоки должны приступать к решению следующего слоя одновременно. Первый поток также является главным, он решает, в зависимости от состояния всех остальных потоков переходить ли на следующий слой, и производит проверку нужно ли записывать слой в файл.
Рис. 2. Алгоритм нахождение элементов слоя двумя потоками.
Количество потоков, задействованных для решения задачи, должен определить сам пользователь, потоки создаются динамически.
Для решения задачи использовалась среда программирования Dev-C++.
Программа состоит из пяти подпрограмм.
void init(); - для задания начальных условий.
void kpud(byte ntt); - подпрограмма, находящая значения всех функций во всех узлах сетки.
void ThreadProc1(); - функция первого, главного потока.
void ThreadProc(byte A); - функция второго и последующего потока.
int main(); - главная подпрограмма реализующая запуск потоков и вывод информации в консоль.
Функции kpud(byte ntt); и ThreadProc(byte A); требуют аргумент - номер потока.
Создание потоков
Существует два способа создания потоков, с помощью кроссплатформенной мультимедийной библиотекой SFML и стандартным набором классов для работы с потоками доступными начиная с версии C++2011.
Параллельно запустить функцию позволяет библиотека SFML (англ. Simple and Fast Multimedia Library -- простая и быстрая мультимедийная библиотека) - Свободная кроссплатформенная мультимедийная библиотека. Написана на C++, но доступна также для C, D, Java, Python, Ruby, OCaml, .Net и Go. Представляет собой объектно-ориентированный аналог SDL
Подключаем библиотеку SFML следующим образом.
1. Определяем версию установленного компилятора C++. Это важно, так как разные версии компиляторов GCC не совместимы между собой:
В нашем случае была доступна версия на 1 апреля 2017 года DEV-C++ версии 4.8.1 TDM (SJLJ).
2. скачиваем 32-х разрядную и 64-разрядную версии библиотеки SFML GCC 4.8.1 TDM (SJLJ). (Ссылки на библиотеки доступны в конце статьи).
SFML-2.2-windows-gcc-4.8.1-tdm-32-bit.zip
SFML-2.2-windows-gcc-4.8.1-tdm-64-bit.zip
3. Распаковываем оба архива в отдельные папки на жестком диске (лучше, чтобы путь не содержал кириллических символов). Например , 32-х разрядную версию распакуем в папку С:\Dev-Cpp\SFML-2.2-32, а 64-х разрядную - в папку С:\Dev-Cpp\SFML-2.2-64.
4. Переходим к настройке среды разработки DEV C++. Открываем «Сервис» -> «Параметры компилятора» -> вкладка «Компилятор»;
5. Для каждого набора настроек компилятора добавляем новые параметры в поле «Добавить эти команды к командной строке компоновщика».
Код
-lsfml-graphics -lsfml-window -lsfml-audio -lsfml-system
6) Переходим к вкладке «Каталоги» (рисунок 4) и так же, для каждого набора настроек компилятора прописываем пути для:
«Библиотек»:
для 32-х разрядной версии - D:\Soft\Dev-Cpp\SFML-2.2-32\lib
для 64-х разрядной версии - D:\Soft\Dev-Cpp\SFML-2.2-64\lib
«Включаемых файлов C»:
для 32-х разрядной версии - D:\Soft\Dev-Cpp\SFML-2.2-32\include
для 64-х разрядной версии - D:\Soft\Dev-Cpp\SFML-2.2-64\include
«Включаемых файлов C++»:
для 32-х разрядной версии - D:\Soft\Dev-Cpp\SFML-2.2-32\include
для 64-х разрядной версии - D:\Soft\Dev-Cpp\SFML-2.2-64\include
На этом настройка IDE DEV C++ закончена.
После проведенных действий, подключаем библиотеку, прописывая в начале кода программы.
#include <SFML/System.hpp>
В функции main() инициализируем объект потока, и запускаем его.
sf::Thread* thread = new sf::Thread(&ThreadProc1);
thread->launch();
Далее в цикле запускаем функцию ThreadProc(byte A); и сообщаем ей номер потока.
for (byte i=2;i<=THR;i++)
{ thread = new sf::Thread(&ThreadProc,i);
thread->launch(); }
Таким образом, мы можем динамически создавать потоки, указывая константе THR количество задействованных потоков.
Так как требуется синхронизация потоков, то в главной функции пишем цикл ожидания завершения работы остальных потоков. Если хоть один поток еще не рассчитал слой, то переменная типа bool станет true и цикл будет повторен.
do
{ next=false;
for (thh=2;thh<=THR;thh++)
{ if (n_t[thh]!=n_t[1]) next = true; }}
while(next);
Если все потоки завершены, осуществляется переход на новый слой.
Функция второго и последующего потока.
В данной функции описан цикл проверки слоя, на котором находится первый поток, если первый поток переходит на следующий слой, то текущий поток вызывает функцию обработки своего участка слоя.
void ThreadProc(byte A)
{
do
{
if (n_t[A]!=n_t[1]){//обрабатываем новую строку
kpud(A);//Если строка новая то вызываем функцию
n_t[A]=n_t[1];
}
}
while(!thr_stop);
}
Ссылка на полный исходный код программы доступен в конце статьи.
Подсчет эффективности работы программы
Для подсчета времени работы программы воспользуемся процессорным временем. Процессорное время увеличивается, когда процесс работает и потребляет циклы CPU. Во время операций ввода-вывода, блокировок потоков и других операций, которые приостанавливают работу процессора, процессорное время не увеличивается, пока процесс снова не начнет использовать CPU.
Для такого расчета служит функция getCPUTime();
Вызываем getCPUTime( ) до и после запуска алгоритма, и получаем разницу в секундах.
Рис. 3. Подсчет эффективности работы программы
Время одного полного цикла первого потока рассчитывается по первой формуле (7)
Время полного цикла второго и последующего потока рассчитывается по второй формуле (7)
(7)
Если учесть что t_алг очень большое, а t_ком очень маленькое (элементарные команды: сложение, сравнение…), то можно предположить что первый поток фактически работает всегда. А у второго время простоя очень незначительно. Это также видно из конечного результата (Рисунок 5), время сократилось на 43,63%. Если учесть, что первый поток активен всегда, то расчеты показывают, что второй загружен на 87,27 %.
Результаты численных расчетов решения начально-краевой задачи
При значениях вязкости и малых значениях h и (h » 0.001, » 0.0001) на достаточно больших промежутках времени
(t » 1/µ0 ) графики давления при начальных условиях
,
то характерный вид графика давления имеет вид
Рис. 4. График давления, вычисленные разностным методом, при t = 12
Литература
1. Титов С.С. Пространственно-периодические решения полной системы Навье Стокса. // Доклады РАН. ? 1999. ? Т. 365, №6. ? С. 761?763.
2. Замыслов В.Е., Скачков П.П. Сравнение двух приближенных методов решения одной начально-краевой задачи газовой динамики с учетом вязкости и теплопроводности // Вестник УрГУПС.- 2012.- № 4(16).-С.29-38.
3. Баутин С.П., Замыслов В.Е. Представление приближенных решений полной системы уравнений Навье-Стокса в одномерном случае. // Вычислительные технологии. М.: ? 2012. ? Т. 17, №3. ? С. 3?12. ISSN 1560-7534.
4. Mathcad 14 для студентов, инженеров и конструкторов.: БХВ-Петербург, 2007-368 c.
5. Романов Е.Л. - Практикум по программированию на C++ - 2004. ВУЗ: СумГУ.
Размещено на Allbest.ru
...Подобные документы
Решение дифференциальных уравнений с использованием классических алгоритмов численных методов Эйлера и Рунге-Кутта 4-го порядка. Команды, используемые при решении обыкновенных дифференциальных уравнений в системе вычислений. Результат работы программы.
курсовая работа [226,6 K], добавлен 05.04.2013Проектирование приложения, позволяющего находить решение системы алгебраических линейных уравнений матричным методом. Выбор количества уравнений, заполнение значений коэффициентов системы уравнений и свободных членов, алгоритм решения линейных уравнений.
курсовая работа [939,4 K], добавлен 16.01.2014Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Сферы использования компьютеров, сущность и языки программирования. Применение модифицированного метода Гаусса и расширенной матрицы для решения системы линейных алгебраических уравнений (СЛАУ). Разработка программы, системные требования для ее работы.
курсовая работа [657,1 K], добавлен 09.01.2014Особенность разработки алгоритмов для базы данных "Поэты". Анализ реализации анимации с помощью многофункциональной кроссплатформенной библиотеки SFML. Характеристика схемы алгоритма работы меню. Осуществление запуска программы через VisualStudio.
курсовая работа [4,4 M], добавлен 10.05.2019Системы линейных алгебраических уравнений. Решение систем уравнений графическим способом. Разработка программного кода модуля, реализующего приближенное решение систем линейных уравнений графическим способом. Отладка программного модуля "Метод Гаусса".
курсовая работа [858,5 K], добавлен 01.12.2013Точность вычислений, классификация погрешностей. Оценка апостериорной погрешности, численное дифференцирование. Численное решение систем линейных уравнений. Аппроксимация функций методом наименьших квадратов. Решение нелинейных уравнений с неизвестным.
методичка [611,8 K], добавлен 10.10.2010Сущность матричного метода. Разработка программы решения системы уравнений линейных алгебраических уравнений методом решения через обратную матрицу на языке программирования Delphi. Представление блок-схемы и графического интерфейса программного продукта.
курсовая работа [1,0 M], добавлен 27.09.2014Использование метода Зейделя для нахождения корней системы линейных алгебраических уравнений. Суть метода простых итераций. Оценка погрешности нормальной системы. Составление алгоритма, блок-схемы и кода программы. Тестовый пример и проверка в MathCad.
лабораторная работа [174,8 K], добавлен 02.10.2013Возможности математического пакета MathCad в среде Windows 98 для использования матричной алгебры и решения системы линейных алгебраических уравнений. Методы решения систем линейных алгебраических уравнений. Сравнение метода Гаусса с методом MathCad.
практическая работа [62,6 K], добавлен 05.12.2009Решение системы дифференциальных уравнений, заданной в нормальной форме Коши. Определение аналитических зависимостей изменения переменных состояния системы с использованием преобразования Лапласа. Численный метод решения системы c помощью Mathcad.
практическая работа [657,1 K], добавлен 05.12.2009Создание программ в Borland C++ Builder 6.0. Разработка программы для построения графика временной функции, работающей, как в машинном, так и в реальном времени. Использование алгоритма Горнера для вычисления корня квадратного и нелинейного уравнений.
контрольная работа [925,2 K], добавлен 05.01.2016Решение систем алгебраических линейных уравнений методом Крамера. Сущность метода прогонки. Программная реализация метода: блок-схема алгоритма, листинг программы. Проверка применимости данного способа решения для конкретной системы линейных уравнений.
курсовая работа [581,0 K], добавлен 15.06.2013Использование программной системы Mathcad для выполнения, документирования и использования вычислений и инженерных расчетов. Вычисление пределов, суммы ряда. Работа с матрицами, построение трехмерного графика. Решение систем нелинейных уравнений.
отчет по практике [1,5 M], добавлен 11.09.2014Разработка программы для решения системы линейных уравнений методом Крамера и с помощью расширенной матрицы на языке С++. Описание метода Крамера. Структура программы: заголовочные файлы, типы данных, переменные, идентификаторы, операторы, массивы.
курсовая работа [32,3 K], добавлен 19.01.2009Обзор существующих методов по решению нелинейных уравнений. Решение нелинейных уравнений комбинированным методом и методом хорд на конкретных примерах. Разработка программы для решения нелинейных уравнений, блок-схемы алгоритма и листинг программы.
курсовая работа [435,8 K], добавлен 15.06.2013Решение нелинейных уравнений методом простых итераций и аналитическим, простым и модифицированным методом Ньютона. Программы на языке программирования Паскаль и С для вычислений по вариантам в порядке указанных методов. Изменение параметров задачи.
лабораторная работа [191,0 K], добавлен 24.06.2008Использование MS Excel для математических расчетов. Описание численных методов решения системы линейных алгебраических уравнений. Решение систем линейных алгебраических уравнений с методами Крамера и Зейделя и с помощью табличного процессора MS Excel.
курсовая работа [1,6 M], добавлен 14.02.2021Решение систем линейных алгебраических уравнений по методу Гаусса. Разработка прикладной программы формирования видеотеки с использованием технологии разработки программ "сверху-вниз". Алгоритм добавления, удаления и корректировки элемента видеотеки.
курсовая работа [305,0 K], добавлен 18.06.2012Традиционные языки высокоуровневого программирования. Обзор методов интегрирования. Оценка апостериорной погрешности. Численное решение систем линейных уравнений. Аппроксимация функций методом наименьших квадратов. Решение дифференциальных уравнений.
методичка [6,4 M], добавлен 23.09.2010