Сетевое издание
Международный студенческий научный вестник
ISSN 2409-529X

SOLUTION OF THE NAVIER STOKES COMPLETE SYSTEM OF EQUATIONS WITH PARALLELIZATION OF THE COMPUTATION PROCESS

Markin E.E. 1 Skachkov P.P. 1
1 Ural state University of railway engineering
The aim of the work is the development of a multithread program for the complete Navier Stokes equations system, the solutions of which describe the flow of a compressible viscous heat-conducting ideal gas at constant values of the viscosity and thermal conductivity coefficients. The method of computation is in the construction of solutions using an explicit difference scheme. When solving the presented problem, the software package was used - DevC ++ 5.11 and the multi-media cross-platform library SFML. In the paper for differential equations, in the one-dimensional case, equations in finite differences are described. It is told about the idea of parallelizing the process. Methods for the organization of flows and their interactions are being studied. The efficiency of using a multithreaded program is calculated. The result of the work is a software product written in the C ++ programming language that calculates the values of pressure, flow velocity and specific volume. Examples of the graphs of the studied quantities are given as a result of calculation of the constructed program including the calculated Fourier spectra of the coefficients. In the work animation of the process proceeding in the system is carried out and a video of the wave phenomena is obtained.
gas dynamics equations
difference methods
parallel computing.

Рассматривается полная система уравнений Навье Стокса, решения которой описывают течения сжимаемого вязкого теплопроводного идеального газа. В системе выполнен переход от переменной плотности и температуры к удельному объему и давлению. Это позволяет решать систему уравнений с частными производными в нормальной форме относительно производных по времени.

В одномерном случае в безразмерных переменных эта система выглядит так [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).

  1. скачиваем 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

  1. Распаковываем оба архива в отдельные папки на жестком диске (лучше, чтобы путь не содержал кириллических символов). Например , 32-х разрядную версию распакуем в папку С:\Dev-Cpp\SFML-2.2-32, а 64-х разрядную - в папку С:\Dev-Cpp\SFML-2.2-64.
  2. Переходим к настройке среды разработки DEV C++. Открываем «Сервис» -> «Параметры компилятора» -> вкладка «Компилятор»;
  3. Для каждого набора настроек компилятора добавляем новые параметры в поле «Добавить эти команды к командной строке компоновщика».

Код

-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

Видео ролик волнового процесса можно посмотреть, обратившись к облачному файлу по второй ссылке.

https://cloud.mail.ru/public/NEip/J4DFydQgy

https://cloud.mail.ru/public/EUu8/hD9B372Eo