<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jhuighuy</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jhuighuy"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Jhuighuy"/>
	<updated>2026-10-23T14:23:10Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24485</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24485"/>
		<updated>2017-11-29T16:06:52Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — количество вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходные данные — трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием накладных расходов на обмен данными между процессами (то есть все данные, необходимые для соответствующего вычисления, локальны относительно процесса) при вычислении коэффициентов приближенного решения и значений функции, а также лишь двумя обменами данными между этапами вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использованием CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24484</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24484"/>
		<updated>2017-11-29T15:38:33Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — количество вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходные данные — трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием накладных расходов на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использованием CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24482</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24482"/>
		<updated>2017-11-29T15:36:50Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — количество вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходные данные — трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием накладных расходов на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24481</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24481"/>
		<updated>2017-11-29T15:35:17Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — количество вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходные данные — трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24480</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24480"/>
		<updated>2017-11-29T15:33:16Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — количество вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24479</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24479"/>
		<updated>2017-11-29T15:32:13Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24478</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24478"/>
		<updated>2017-11-29T15:31:13Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этий значение вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24477</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24477"/>
		<updated>2017-11-29T15:28:20Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Информационного граф показывает, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24476</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24476"/>
		<updated>2017-11-29T15:26:56Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24475</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24475"/>
		<updated>2017-11-29T15:26:48Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
С сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24474</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24474"/>
		<updated>2017-11-29T15:25:39Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24473</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24473"/>
		<updated>2017-11-29T15:25:15Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24472</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24472"/>
		<updated>2017-11-29T15:23:53Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из подсчета интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24471</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24471"/>
		<updated>2017-11-29T15:21:54Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24470</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24470"/>
		<updated>2017-11-29T15:18:32Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24469</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24469"/>
		<updated>2017-11-29T15:17:13Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24468</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24468"/>
		<updated>2017-11-29T15:16:01Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24467</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24467"/>
		<updated>2017-11-29T15:14:15Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24466</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24466"/>
		<updated>2017-11-29T15:10:59Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24465</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24465"/>
		<updated>2017-11-29T15:10:17Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24464</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24464"/>
		<updated>2017-11-29T15:09:58Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) предполагает решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24463</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24463"/>
		<updated>2017-11-29T15:09:35Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) -- метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24462</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24462"/>
		<updated>2017-11-29T15:07:00Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.&lt;br /&gt;
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использование CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24461</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24461"/>
		<updated>2017-11-29T15:02:57Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием расходом на обмен данными между процессами при вычислении коэффициентов приближенного решения и значений функции.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24460</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24460"/>
		<updated>2017-11-29T14:57:36Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для оценки масштабируемости были выбраны значения &amp;lt;math&amp;gt;N_x=N_y=N_z=M_x=M_y=M_z=64&amp;lt;/math&amp;gt;. Все тесты проводились на суперкомпьютере Ломоносов-1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 &amp;lt;br/&amp;gt;&lt;br /&gt;
Самарский А. А. Введение в численные методы, 1982.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy&amp;diff=24444</id>
		<title>Участник:Jhuighuy</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy&amp;diff=24444"/>
		<updated>2017-11-29T10:48:36Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: Новая страница: «Бутаков Олег Борисович, 404 гр. 2017-2018»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Бутаков Олег Борисович, 404 гр. 2017-2018&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24442</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24442"/>
		<updated>2017-11-29T10:41:01Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 0 0 0, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 2. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z}{Q}+\frac{M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24441</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24441"/>
		<updated>2017-11-29T10:40:33Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=0..M_x, j=0..M_y, k=0..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 1 1 1, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 2. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z}{Q}+\frac{M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24439</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24439"/>
		<updated>2017-11-29T10:39:01Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности вложенные конструкции упрощены):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 1 1 1, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 2. Информационный граф метода Галеркина.]]&lt;br /&gt;
&lt;br /&gt;
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.&lt;br /&gt;
* На первом ярусе вычисляются коэффициенты.&lt;br /&gt;
* На втором ярусе происходит объединение их в общий массив.&lt;br /&gt;
* На третьем ярусе вычисляется сеточная функция.&lt;br /&gt;
* На четвертом ярусе происходит вывод. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что можно коэффициенты &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt; можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вычислительных узлов, при &amp;lt;math&amp;gt;P \le min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt; можно достичь производительности в &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z M_x M_y M_z}{P})&amp;lt;/math&amp;gt; операций. &amp;lt;br/&amp;gt;&lt;br /&gt;
При &amp;lt;math&amp;gt;P \gt min(N_x N_y N_z, M_x M_y M_z)&amp;lt;/math&amp;gt;, положив &amp;lt;math&amp;gt;Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))&amp;lt;/math&amp;gt;, за счет параллельного суммирования, эта величина равна &amp;lt;math&amp;gt;O(\frac{N_x N_y N_z}{Q}+\frac{M_x M_y M_z}{Q})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24438</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24438"/>
		<updated>2017-11-29T09:47:59Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. В другом варианте сначала вычислим часть коэффициентов, частичные суммы базисных функций на подсчитанных коэффициентах, а затем итоговую функцию.&lt;br /&gt;
&lt;br /&gt;
Первый вариант:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй вариант:&lt;br /&gt;
# Определим разбиение, например, &amp;lt;math&amp;gt;N_z&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; не пересекающихся подмножеств &amp;lt;math&amp;gt;[k_{0,s}, k_{1,s}]: \sqcup_{s=1}^{S}[k_{0,s}, k_{1,s}]=[1,N_z]&amp;lt;/math&amp;gt;. Для всех &amp;lt;math&amp;gt;s=1..S:&amp;lt;/math&amp;gt;&lt;br /&gt;
## Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=k_{0,s}..k_{1,s}&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}^{s} = &lt;br /&gt;
    \Sigma_{m,n=1,l=k_{0,s}}^{N_x,N_y,k_{1,s}} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z})&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k} = \Sigma_{s=1}^{S}\hat{u}_{h,i,j,k}^{s} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Опишем лишь первый вариант макроструктуры, так как второй имеет смысл рассматривать лишь в случае последовательной реализации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности упростим вложенные конструкции):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 1 1 1, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В качестве входных данных выступает трехмерный массив &amp;lt;math&amp;gt;M_x \times M_y \times M_z&amp;lt;/math&amp;gt; правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24437</id>
		<title>Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9F%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D0%B0%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=24437"/>
		<updated>2017-11-29T09:45:18Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: Новая страница: «Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.  == Свойства и струк…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
    \begin{cases}&lt;br /&gt;
        \laplace u = -f, u = \phi(x,y,z), (x,y,z) \in G, G = (0,L_x)\times(0,L_y)\times(0,L_z),&lt;br /&gt;
        \\&lt;br /&gt;
        u(x,y,z) = 0, (x,y,z) \in \partial G.&lt;br /&gt;
    \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Выберем тригонометрическую систему базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \phi_{m,n,l} = sin(\frac{\pi m x}{L_x})sin(\frac{\pi n y}{L_y})sin(\frac{\pi l z}{L_z}), m=1..N_x, n=1..N_y, l=1..N_z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение &amp;lt;math&amp;gt;(u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   (\phi_{m,n,l} \phi_{i,j,k}) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} \phi_{m,n,l} \phi_{i,j,k} dx dy dz&lt;br /&gt;
   = \int_{0}^{L_x} sin(\frac{\pi m x}{L_x}) sin(\frac{\pi i x}{L_x}) dx \int_{0}^{L_y} sin(\frac{\pi n x}{L_y}) sin(\frac{\pi j x}{L_y}) dy \int_{0}^{L_z} sin(\frac{\pi l x}{L_z}) sin(\frac{\pi k x}{L_z}) dz&lt;br /&gt;
   = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. &amp;lt;br/&amp;gt;&lt;br /&gt;
Представим приближенное решение в виде комбинации базисных функций:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    R(x,y,z) = \laplace\hat{u} + f = -\Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \phi_{m,n,l} + f&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \begin{split}&lt;br /&gt;
        &amp;amp;R_{i,j,k} = (R, \phi_{i,j,k}) = -C_{i,j,k} \pi^2(\frac{m^2}{L_x^2}+\frac{n^2}{L_y^2}+\frac{l^2}{L_z^2}) \frac{L_x}{2}\frac{L_y}{2}\frac{L_z}{2} + (f, \phi_{i,j,k}) = 0&lt;br /&gt;
         \Rightarrow&lt;br /&gt;
        \\&lt;br /&gt;
        &amp;amp;C_{i,j,k} = \frac{8 L_x L_y L_z (f, \phi_{i,j,k})}{\pi^2 ((i L_y L_z)^2 + (j L_x L_z)^2 + (k L_x L_y)^2)}, i=1..N_x, j=1..N_y. k=1..N_z.&lt;br /&gt;
    \end{split}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \omega_h = [(x_i,y_j,z_k); x_i=i\Delta x, y_j=i\Delta y, z_k=k\Delta k; L_x=M_x\Delta x, L_y=M_y\Delta y, L_z=M_z\Delta z].&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда трехмерный интеграл будет приближенно описываться выражением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} f dx dy dz \approx \Sigma_{m,n,l=1}^{M_x,M_y,M_z} f(x_i,y_j,z_k)\Delta x\Delta y\Delta z.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление функции на сетке тривиально:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \hat{u}_{h,i,j,k} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z}).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. В другом варианте сначала вычислим часть коэффициентов, частичные суммы базисных функций на подсчитанных коэффициентах, а затем итоговую функцию.&lt;br /&gt;
&lt;br /&gt;
Первый вариант:&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=1..N_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй вариант:&lt;br /&gt;
# Определим разбиение, например, &amp;lt;math&amp;gt;N_z&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; не пересекающихся подмножеств &amp;lt;math&amp;gt;[k_{0,s}, k_{1,s}]: \sqcup_{s=1}^{S}[k_{0,s}, k_{1,s}]=[1,N_z]&amp;lt;/math&amp;gt;. Для всех &amp;lt;math&amp;gt;s=1..S:&amp;lt;/math&amp;gt;&lt;br /&gt;
## Для всех &amp;lt;math&amp;gt;i=1..N_x, j=1..N_y, k=k_{0,s}..k_{1,s}&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;C_{m,n,l}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k}^{s} = &lt;br /&gt;
    \Sigma_{m,n=1,l=k_{0,s}}^{N_x,N_y,k_{1,s}} C_{m,n,l} sin(\frac{\pi m x_i}{L_x})sin(\frac{\pi n y_j}{L_y})sin(\frac{\pi l z_k}{L_z})&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для всех &amp;lt;math&amp;gt;i=1..M_x, j=1..M_y, k=1..M_z&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;\hat{u}_{h,i,j,k} = \Sigma_{s=1}^{S}\hat{u}_{h,i,j,k}^{s} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Опишем лишь первый вариант макроструктуры, так как второй имеет смысл рассматривать лишь в случае последовательной реализации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039; на языке Fortran (для наглядности упростим вложенные конструкции):&lt;br /&gt;
    Do i j k = 1 1 1, Nx Ny Nz&lt;br /&gt;
        r = 0.0D0&lt;br /&gt;
        Do i0 j0 k0 = 1 1 1, Mx My Mz&lt;br /&gt;
            x = i0*dx&lt;br /&gt;
            y = j0*dy&lt;br /&gt;
            z = k0*dz&lt;br /&gt;
            r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;:&lt;br /&gt;
    Do i0 j0 k0 = 1 1 1, M_x M_y M_z&lt;br /&gt;
        x = i0*dx&lt;br /&gt;
        y = j0*dy&lt;br /&gt;
        z = k0*dz&lt;br /&gt;
        s = 0.0D0&lt;br /&gt;
        Do i j k = 1 1 1, N_x N_y N_z&lt;br /&gt;
            s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)&lt;br /&gt;
        End Do&lt;br /&gt;
        u(i0, j0, k0) = s&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительную сложность первого варианта алгоритма можно оценить как &amp;lt;math&amp;gt;O(N_x N_y N_z M_x M_y M_z)&amp;lt;/math&amp;gt; операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=24392</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=24392"/>
		<updated>2017-11-28T14:27:17Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: Полностью удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=24391</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=24391"/>
		<updated>2017-11-28T14:26:16Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Явная техника расщепления операторов для системы уравнений Навье-Стокса, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N_x}, &lt;br /&gt;
			j \in \overline{0,N_y} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем. Кратко опишем итерационный процесс:&lt;br /&gt;
;Подготовка перед итерационным процессом&lt;br /&gt;
# Выберем начальное приближение &amp;lt;math&amp;gt; x^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^0  = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \tilde{r} = r^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \rho^0 = \alpha^0 = \omega^0 = 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^0 = p^0 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-я итерация метода:&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho^k = (\tilde{r}, r^{k-1})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \beta^k = \frac{\rho^{k}}{\rho^{k-1}} \frac{\alpha^{k-1}}{\omega^{k-1}} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; p^k = r^{k-1} + \beta^k ( p^{k-1} - \omega^{k-1} v^{k-1} ) &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^k = A p ^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \alpha^k = \frac{\rho^k}{(\tilde{r}, v^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; s^k = r^{k-1} - \alpha v^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; t^k = A s^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \omega^k = \frac{(t^k, s^k)} {(t^k, t^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; x^k = x^{k-1} + \omega^k s^k + \alpha^k p^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^k = s^k - \omega^k t^k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Опишем макроструктуру в виде обновления полей скорости и давления на новом шаге по времени:&lt;br /&gt;
&lt;br /&gt;
# Вычисление поля предсказанных скоростей (здесь и далее дифференциальные операторы аппроксимированы формулами конечных разностей) &amp;lt;math&amp;gt; \nsVelocityA &amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части для дискретного уравнения Пуассона: &amp;lt;math&amp;gt; \theta = \frac{\rho}{\tau}(\nabla, \nsVelocityA) &amp;lt;/math&amp;gt;.&lt;br /&gt;
# Решение дискретной задачи Пуассона &amp;lt;math&amp;gt;Au = f, A \approx \laplace, u \approx \phi, f \approx \theta&amp;lt;/math&amp;gt; методом BiCGStab.&lt;br /&gt;
# Вычисление поля скоростей на новом шаге по времени.&lt;br /&gt;
# Вычисление поля давления на новом шаге по времени.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Вычисление поля предсказанных скоростей (здесь и далее дифференциальные операторы аппроксимированы формулами конечных разностей) &amp;lt;math&amp;gt; \nsVelocityA &amp;lt;/math&amp;gt;:&lt;br /&gt;
    Do j=1, n_y-1&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            v_ast(i, j, :) = v_l(i, j, :) - Tau*dv_dv(i, j, v_l, v_l) &amp;amp;&lt;br /&gt;
                - Tau*Beta*grad_p(i, j, p_l)  + Tau/Re*lap_v(i, j, v_l)&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
2. Вычисление правой части для дискретного уравнения Пуассона:&lt;br /&gt;
    Do j=1, n_y-1&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            Theta(i, j) = 1.0D0/Tau*div_v(i, j, v_ast, v_flags)&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
3. Решение дискретной задачи Пуассона &amp;lt;math&amp;gt;Au = f, A \approx \laplace, u \approx \phi, f \approx \theta&amp;lt;/math&amp;gt; методом BiCGStab: &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.1. Конвертирование поля &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; в вектор &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; с учетом граничных условий, где переменная indices отображает двумерную индексацию в одномерную, введена для удобства в случае не прямоугольной области:&lt;br /&gt;
    Do j=0, n_y&lt;br /&gt;
        f(indices(1, j)) = Theta(1, j)*d_y**2 + (Beta-1.0)*b*p_0&lt;br /&gt;
        Do i=2, n_x-2&lt;br /&gt;
            f(indices(i, j)) = Theta(i, j)*d_y**2&lt;br /&gt;
        End Do&lt;br /&gt;
        f(indices(n_x-1, j)) = Theta(n_x-1, j)*d_y**2 + (Beta-1.0)*b*p_1&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
3.2. Решение дискретного уравнения Пуассона:&lt;br /&gt;
    Call solve_bicgstab(A, u, f)&lt;br /&gt;
&lt;br /&gt;
3.3. Конвертирование вектора &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; в скалярное поле &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
    Do j=0, n_y&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            Phi(i, j) = u(indices(i, j))&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
4. Вычисление поля скоростей на новом шаге по времени:&lt;br /&gt;
    Do j=1, n_y-1&lt;br /&gt;
        Do i=1, n_x&lt;br /&gt;
            v_l(i, j, :) = v_ast(i, j, :) - Tau*grad_phi(i, j, Phi) &lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
5. Вычисление поля давления на новом шаге по времени:&lt;br /&gt;
    Do j=0, n_y&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            p_l(i, j) = Phi(i, j) + Beta*p_l(i, j)&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый, второй, четвертый и пятый этапы занимают &amp;lt;math&amp;gt;O(N_x N_y)&amp;lt;/math&amp;gt; операций умножения и деления.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Кек&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кек&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кек&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Кек&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Кек&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кек&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=24242</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=24242"/>
		<updated>2017-11-26T13:08:38Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Явная техника расщепления операторов для системы уравнений Навье-Стокса, Бутаков О.Б. 404 группа.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N_x}, &lt;br /&gt;
			j \in \overline{0,N_y} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем. Кратко опишем итерационный процесс:&lt;br /&gt;
;Подготовка перед итерационным процессом&lt;br /&gt;
# Выберем начальное приближение &amp;lt;math&amp;gt; x^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^0  = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \tilde{r} = r^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \rho^0 = \alpha^0 = \omega^0 = 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^0 = p^0 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-я итерация метода:&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho^k = (\tilde{r}, r^{k-1})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \beta^k = \frac{\rho^{k}}{\rho^{k-1}} \frac{\alpha^{k-1}}{\omega^{k-1}} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; p^k = r^{k-1} + \beta^k ( p^{k-1} - \omega^{k-1} v^{k-1} ) &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^k = A p ^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \alpha^k = \frac{\rho^k}{(\tilde{r}, v^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; s^k = r^{k-1} - \alpha v^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; t^k = A s^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \omega^k = \frac{(t^k, s^k)} {(t^k, t^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; x^k = x^{k-1} + \omega^k s^k + \alpha^k p^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^k = s^k - \omega^k t^k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Опишем макроструктуру в виде обновления полей скорости и давления на новом шаге по времени:&lt;br /&gt;
&lt;br /&gt;
# Вычисление поля предсказанных скоростей (здесь и далее дифференциальные операторы аппроксимированы формулами конечных разностей) &amp;lt;math&amp;gt; \nsVelocityA &amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части для дискретного уравнения Пуассона: &amp;lt;math&amp;gt; \theta = \frac{\rho}{\tau}(\nabla, \nsVelocityA) &amp;lt;/math&amp;gt;.&lt;br /&gt;
# Решение дискретной задачи Пуассона &amp;lt;math&amp;gt;Au = f, A \approx \laplace, u \approx \phi, f \approx \theta&amp;lt;/math&amp;gt; методом BiCGStab.&lt;br /&gt;
# Вычисление поля скоростей на новом шаге по времени.&lt;br /&gt;
# Вычисление поля давления на новом шаге по времени.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Вычисление поля предсказанных скоростей (здесь и далее дифференциальные операторы аппроксимированы формулами конечных разностей) &amp;lt;math&amp;gt; \nsVelocityA &amp;lt;/math&amp;gt;:&lt;br /&gt;
    Do j=1, n_y-1&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            v_ast(i, j, :) = v_l(i, j, :) - Tau*dv_dv(i, j, v_l, v_l) &amp;amp;&lt;br /&gt;
                - Tau*Beta*grad_p(i, j, p_l)  + Tau/Re*lap_v(i, j, v_l)&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
2. Вычисление правой части для дискретного уравнения Пуассона:&lt;br /&gt;
    Do j=1, n_y-1&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            Theta(i, j) = 1.0D0/Tau*div_v(i, j, v_ast, v_flags)&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
3. Решение дискретной задачи Пуассона &amp;lt;math&amp;gt;Au = f, A \approx \laplace, u \approx \phi, f \approx \theta&amp;lt;/math&amp;gt; методом BiCGStab: &amp;lt;br/&amp;gt;&lt;br /&gt;
3.1. Конвертирование поля &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; в вектор &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; с учетом граничных условий, где переменная indices отображает двумерную индексацию в одномерную, введена для удобства в случае не прямоугольной области:&lt;br /&gt;
    Do j=0, n_y&lt;br /&gt;
        f(indices(1, j)) = Theta(1, j)*d_y**2 + (Beta-1.0)*b*p_0&lt;br /&gt;
        Do i=2, n_x-2&lt;br /&gt;
            f(indices(i, j)) = Theta(i, j)*d_y**2&lt;br /&gt;
        End Do&lt;br /&gt;
        f(indices(n_x-1, j)) = Theta(n_x-1, j)*d_y**2 + (Beta-1.0)*b*p_1&lt;br /&gt;
    End Do&lt;br /&gt;
3.2. Решение дискретного уравнения Пуассона:&lt;br /&gt;
    Call solve_bicgstab(A, u, f)&lt;br /&gt;
3.3. Конвертирование вектора &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; в скалярное поле &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
    Do j=0, n_y&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            Phi(i, j) = u(indices(i, j))&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
4. Вычисление поля скоростей на новом шаге по времени:&lt;br /&gt;
    Do j=1, n_y-1&lt;br /&gt;
        Do i=1, n_x&lt;br /&gt;
            v_l(i, j, :) = v_ast(i, j, :) - Tau*grad_phi(i, j, Phi) &lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
5. Вычисление поля давления на новом шаге по времени:&lt;br /&gt;
    Do j=0, n_y&lt;br /&gt;
        Do i=1, n_x-1&lt;br /&gt;
            p_l(i, j) = Phi(i, j) + Beta*p_l(i, j)&lt;br /&gt;
        End Do&lt;br /&gt;
    End Do&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый, второй, четвертый и пятый этапы занимают &amp;lt;math&amp;gt;O(N_x N_y)&amp;lt;/math&amp;gt; операций умножения и деления.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23468</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23468"/>
		<updated>2017-10-24T05:24:14Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N}, &lt;br /&gt;
			j \in \overline{0,M} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем. Кратко опишем итерационный процесс:&lt;br /&gt;
;Подготовка перед итерационным процессом&lt;br /&gt;
# Выберем начальное приближение &amp;lt;math&amp;gt; x^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^0  = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \tilde{r} = r^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \rho^0 = \alpha^0 = \omega^0 = 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^0 = p^0 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-я итерация метода:&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho^k = (\tilde{r}, r^{k-1})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \beta^k = \frac{\rho^{k}}{\rho^{k-1}} \frac{\alpha^{k-1}}{\omega^{k-1}} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; p^k = r^{k-1} + \beta^k ( p^{k-1} - \omega^{k-1} v^{k-1} ) &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^k = A p ^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \alpha^k = \frac{\rho^k}{(\tilde{r}, v^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; s^k = r^{k-1} - \alpha v^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; t^k = A s^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \omega^k = \frac{(t^k, s^k)} {(t^k, t^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; x^k = x^{k-1} + \omega^k s^k + \alpha^k p^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^k = s^k - \omega^k t^k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление промежуточных полей по формулам конечных разностей.&lt;br /&gt;
* Решение дискретной задачи Пуассона.&lt;br /&gt;
* Вычисление искомых параметров задачи на новом временном слое по формулам конечных разностей.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23203</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23203"/>
		<updated>2017-10-21T21:38:59Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N}, &lt;br /&gt;
			j \in \overline{0,M} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем. Кратко опишем итерационный процесс:&lt;br /&gt;
;Подготовка перед итерационным процессом&lt;br /&gt;
# Выберем начальное приближение &amp;lt;math&amp;gt; x^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^0  = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \tilde{r} = r^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \rho^0 = \alpha^0 = \omega^0 = 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^0 = p^0 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-я итерация метода:&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho^k = (\tilde{r}, r^{k-1})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \beta^k = \frac{\rho^{k}}{\rho^{k-1}} \frac{\alpha^{k-1}}{\omega^{k-1}} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; p^k = r^{k-1} + \beta^k ( p^{k-1} - \omega^{k-1} v^{k-1} ) &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^k = A p ^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \alpha^k = \frac{\rho^k}{(\tilde{r}, v^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; s^k = r^{k-1} - \alpha v^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; t^k = A s^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \omega^k = \frac{(t^k, s^k)} {(t^k, t^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; x^k = x^{k-1} + \omega^k s^k + \alpha^k p^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^k = s^k - \omega^k t^k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление промежуточных полей по формулам конечных разностей.&lt;br /&gt;
* Решение дискретной задачи Пуассона.&lt;br /&gt;
* Вычисление искомых параметров задачи на новом временном слое по формулам конечных разностей.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23202</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23202"/>
		<updated>2017-10-21T21:38:49Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Кек&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N}, &lt;br /&gt;
			j \in \overline{0,M} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем. Кратко опишем итерационный процесс:&lt;br /&gt;
;Подготовка перед итерационным процессом&lt;br /&gt;
# Выберем начальное приближение &amp;lt;math&amp;gt; x^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^0  = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \tilde{r} = r^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \rho^0 = \alpha^0 = \omega^0 = 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^0 = p^0 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-я итерация метода:&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho^k = (\tilde{r}, r^{k-1})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \beta^k = \frac{\rho^{k}}{\rho^{k-1}} \frac{\alpha^{k-1}}{\omega^{k-1}} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; p^k = r^{k-1} + \beta^k ( p^{k-1} - \omega^{k-1} v^{k-1} ) &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^k = A p ^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \alpha^k = \frac{\rho^k}{(\tilde{r}, v^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; s^k = r^{k-1} - \alpha v^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; t^k = A s^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \omega^k = \frac{(t^k, s^k)} {(t^k, t^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; x^k = x^{k-1} + \omega^k s^k + \alpha^k p^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^k = s^k - \omega^k t^k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление промежуточных полей по формулам конечных разностей.&lt;br /&gt;
* Решение дискретной задачи Пуассона.&lt;br /&gt;
* Вычисление искомых параметров задачи на новом временном слое по формулам конечных разностей.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23201</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23201"/>
		<updated>2017-10-21T21:37:03Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Кек&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N}, &lt;br /&gt;
			j \in \overline{0,M} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем. Кратко опишем итерационный процесс:&lt;br /&gt;
;Подготовка перед итерационным процессом&lt;br /&gt;
# Выберем начальное приближение &amp;lt;math&amp;gt; x^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^0  = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \tilde{r} = r^0 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \rho^0 = \alpha^0 = \omega^0 = 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^0 = p^0 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-я итерация метода:&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho^k = (\tilde{r}, r^{k-1})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \beta^k = \frac{\rho^{k}}{\rho^{k-1}} \frac{\alpha^{k-1}}{\omega^{k-1}} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; p^k = r^{k-1} + \beta^k ( p^{k-1} - \omega^{k-1} v^{k-1} ) &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; v^k = A p ^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \alpha^k = \frac{\rho^k}{(\tilde{r}, v^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; s^k = r^{k-1} - \alpha v^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; t^k = A s^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; \omega^k = \frac{(t^k, s^k)} {(t^k, t^k)} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; x^k = x^{k-1} + \omega^k s^k + \alpha^k p^k &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; r^k = s^k - \omega^k t^k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление промежуточных полей по формулам конечных разностей.&lt;br /&gt;
* Решение дискретной задачи Пуассона.&lt;br /&gt;
* Вычисление искомых параметров задачи на новом временном слое по формулам конечных разностей.&lt;br /&gt;
&lt;br /&gt;
Заметим, что единственной нетривиальной операцией является итерационный процесс решения СЛАУ.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23200</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23200"/>
		<updated>2017-10-21T21:27:56Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Кек&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Применим метод конечных разностей для решение системы уравнений Навье-Стокса в двухмерной прямоугольной области на равномерной сетке с начальными и краевыми данными течения Пуазёйля. Введем равномерную сетку &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; с шагами &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\omega = \bigl[ (x_i, y_j), &lt;br /&gt;
			i \in \overline{0,N}, &lt;br /&gt;
			j \in \overline{0,M} \bigl],&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;f_{i,j} = f(i\Delta x, j\Delta y).&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычислений по формулам конечных разностей для первых и вторых производных, а также скалярных произведений, возникающих при произведении матрицы на вектор, осуществляющегося в рамках итерационного метода для решения линейной системы уравнений дискретной задачи Пуассона. Выпишем, например, формулы для вторых частных производных скорости:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityQ}{\vec{v}^{?}}&lt;br /&gt;
		&lt;br /&gt;
	\newcommand{\nsVelocityQDx}{\frac{\partial\nsVelocityQ}{\partial x}}&lt;br /&gt;
	\newcommand{\nsVelocityQDy}{\frac{\partial\nsVelocityQ}{\partial y}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocityQDxDx}{\frac{\partial^2 \nsVelocityQ}{\partial x^2}}&lt;br /&gt;
	\newcommand{\nsVelocityQDyDy}{\frac{\partial^2 \nsVelocityQ}{\partial y^2}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureLDx}{\frac{\partial\nsPressureL}{\partial x}}&lt;br /&gt;
	\newcommand{\nsPressureLDy}{\frac{\partial\nsPressureL}{\partial y}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		\nsVelocityQDyDy \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i,j+1} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i,j-1}}{\Delta y^2},&lt;br /&gt;
			i \in \overline{0,N}, j \in \overline{1,M-1}.	&lt;br /&gt;
		\\&lt;br /&gt;
		\nsVelocityQDxDx \bigl|_{i,j}&lt;br /&gt;
			\approx \frac{\nsVelocityQ_{i+1,j} &lt;br /&gt;
				- 2\nsVelocityQ_{i,j}  &lt;br /&gt;
				+ \nsVelocityQ_{i-1,j}}{\Delta x^2},&lt;br /&gt;
			i \in \overline{1,N-1}, j \in \overline{1,M-1}.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качественно итерационного метода выберем Стабилизированный Метод Бисопряженных Градиентов (BiCGStab). Данный метод выбран лишь потому, что матрица для дискретной задачи Пуассона не является симметрической. Для реализации этого метода требуется лишь операция умножения матрицы на вектор и скалярное произведение. Генерацию матрицы для задачи Пуассона добавлять в ядро не будем.&lt;br /&gt;
&lt;br /&gt;
* Вычисление промежуточных полей по формулам конечных разностей.&lt;br /&gt;
* Решение дискретной задачи Пуассона.&lt;br /&gt;
* Вычисление искомых параметров задачи на новом временном слое по формулам конечных разностей.&lt;br /&gt;
&lt;br /&gt;
Заметим, что единственной нетривиальной операцией является итерационный процесс решения СЛАУ.&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23135</id>
		<title>Участник:Jhuighuy/Явная техника расщепления операторов для системы уравнений Навье-Стокса</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Jhuighuy/%D0%AF%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%80%D0%B0%D1%81%D1%89%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%9D%D0%B0%D0%B2%D1%8C%D0%B5-%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0&amp;diff=23135"/>
		<updated>2017-10-21T17:03:02Z</updated>

		<summary type="html">&lt;p&gt;Jhuighuy: Новая страница: «Кек  == Свойства и структура алгоритма ==  === Общее описание алгоритма ===  Данный алгоритм я…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Кек&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является одним из численных методов решения системы уравнений Навье-Стокса:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\renewcommand{\vec}[1]{\mathbf{#1}}&lt;br /&gt;
	\newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsVelocity}{\vec{v}}&lt;br /&gt;
	\newcommand{\nsPressure}{p}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForces}{\vec{g}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsEquationMotion}{&lt;br /&gt;
		\frac{\partial \nsVelocity}{\partial t} + (\nsVelocity, \nabla)\nsVelocity&lt;br /&gt;
			= -\frac{1}{\rho}\nabla\nsPressure + \nu\laplace\nsVelocity + \vec{g}&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsEquationContinuity}{&lt;br /&gt;
		(\nabla, \nsVelocity) = 0&lt;br /&gt;
	}&lt;br /&gt;
	\newcommand{\nsSystem}{&lt;br /&gt;
		\begin{cases}&lt;br /&gt;
			\nsEquationMotion,&lt;br /&gt;
			\\&lt;br /&gt;
			\nsEquationContinuity.&lt;br /&gt;
		\end{cases}&lt;br /&gt;
	}&lt;br /&gt;
	\nsSystem&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На сегодняшний день одной из самых популярных стратегий численного решения системы уравнений Навье-Стокса является техника расщепления операторов. Концепция этих техник заключается в том, что исходная нелинейная система разбивается на несколько более простых уравнений, например, Пуассона, Бюргерса и несколько явных или неявных выражений для вычисления величин на новом временном слое. Сначала, отбросив уравнение неразрывности, вычисляется промежуточное &#039;&#039;предсказанное&#039;&#039; поле скоростей, а потом оно проецируется на соленоидальное поле.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Разложим производную по времени с первым порядком точности в момент &amp;lt;math&amp;gt;t = \tau l&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\newcommand{\nsVelocityL}{\nsVelocity^l}&lt;br /&gt;
	\newcommand{\nsVelocityA}{\vec{v}^*}&lt;br /&gt;
	\newcommand{\nsVelocityC}{\vec{v}^c}&lt;br /&gt;
	\newcommand{\nsVelocityLp}{\nsVelocity^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPressureL}{\nsPressure^l}&lt;br /&gt;
	\newcommand{\nsPressureLp}{\nsPressure^{l+1}}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsForcesL}{\nsForces^l}&lt;br /&gt;
	&lt;br /&gt;
	\newcommand{\nsPhiDy}{\frac{\partial\phi}{\partial y}}&lt;br /&gt;
	\newcommand{\nsPhiDn}{\frac{\partial\phi}{\partial n}}&lt;br /&gt;
&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\frac{\nsVelocityLp - \nsVelocityL}{\tau}&lt;br /&gt;
			+ (\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			+ \frac{1}{\rho}\nabla\nsPressureL&lt;br /&gt;
			= \nu\laplace\nsVelocityL&lt;br /&gt;
			+ \nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако невозможно утверждать, что вычисленная скорость на новом временном слое на самом деле есть искомая величина, в силу того, что уравнение неразрывности не было учтено. Помимо того, отсутствует выражение для вычисления давления на следующем шаге по времени.&lt;br /&gt;
Поэтому будем считать, что вычисляемая по этой формуле величина является некоторой промежуточной &#039;&#039;предсказанной&#039;&#039; скоростью &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt;. Также добавим параметр &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; при градиенте давления для большей гибкости:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разложим поле скоростей &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt; на два (промежуточное поле &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; и поле поправок &amp;lt;math&amp;gt;\nsVelocityC&amp;lt;/math&amp;gt;) с таким условием, чтобы выполнялось уравнение неразрывности:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA + \nsVelocityC&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;(\nabla, \nsVelocityLp) = 0.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорость на новом временном слое выразим через исходное уравнение движения аналогично полю промежуточных скоростей, однако входящий в выражение член с градиентом давления будем вычислять неявным образом:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{1}{\rho}\nabla\nsPressureLp&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, вычитая &amp;lt;math&amp;gt;\nsVelocityA&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;, получим выражение для поля поправок:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityC&lt;br /&gt;
			= \nsVelocityLp - \nsVelocityA&lt;br /&gt;
			= -\frac{\tau}{\rho}\nabla(\nsPressureLp - \beta\nsPressureL).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда, положив поле &amp;lt;math&amp;gt;\phi = \nsPressureLp - \beta\nsPressureL&amp;lt;/math&amp;gt;, перейдем к новому выражению для скорости на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityLp&lt;br /&gt;
			= \nsVelocityA&lt;br /&gt;
			- \frac{\tau}{\rho}\nabla\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо потребовать выполнения уравнения неразрывности для &amp;lt;math&amp;gt;\nsVelocityLp&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		0&lt;br /&gt;
			= (\nabla, \nsVelocityLp)&lt;br /&gt;
			= (\nabla, \nsVelocityA - \frac{\tau}{\rho}\nabla\phi)&lt;br /&gt;
			= (\nabla, \nsVelocityA) - \frac{\tau}{\rho}\laplace\phi.&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Тем самым приходим к уравнению Пуассона относительно &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA).&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Решив уравнение Пуассона, можем найти явные формулы для вычисления давления и скорости на следующем временном слое:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подводя итоги, выпишем алгоритм для простейшей явной техники расщепления операторов:&lt;br /&gt;
* Вычисляем промежуточное поле скоростей:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
		\nsVelocityA&lt;br /&gt;
			= \nsVelocityL&lt;br /&gt;
			- \tau(\nsVelocityL, \nabla)\nsVelocityL&lt;br /&gt;
			- \tau\frac{\beta}{\rho}\nabla\nsPressureL&lt;br /&gt;
			+ \tau\nu\laplace\nsVelocityL&lt;br /&gt;
			+ \tau\nsForcesL;&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Решаем уравнение Пуассона:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{cases}&lt;br /&gt;
		\laplace\phi = \frac{\rho}{\tau}(\nabla, \nsVelocityA),&lt;br /&gt;
		\\&lt;br /&gt;
		\nsPhiDn\bigl|_{\partial\Omega} = 0;&lt;br /&gt;
	\end{cases}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
* Находим значения скорости и давления на следующем шаге по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
	\begin{equation*}&lt;br /&gt;
	\begin{split}&lt;br /&gt;
		&amp;amp;\nsVelocityLp = \nsVelocityA - \frac{\tau}{\rho}\nabla\phi,&lt;br /&gt;
		\\&lt;br /&gt;
		&amp;amp;\nsPressureLp = \phi + \beta\nsPressureL.&lt;br /&gt;
	\end{split}&lt;br /&gt;
	\end{equation*}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jhuighuy</name></author>
	</entry>
</feed>