Участник:Jhuighuy/Уравнение Пуассона, решение методом Галеркина: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
 
(не показано 25 промежуточных версий этого же участника)
Строка 1: Строка 1:
Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б. 404 группа.
+
Уравнение Пуассона, решение методом Галеркина, [[Участник:Jhuighuy|Бутаков О.Б]].
  
 
== Свойства и структура алгоритмов ==
 
== Свойства и структура алгоритмов ==
Строка 5: Строка 5:
 
=== Общее описание алгоритма ===
 
=== Общее описание алгоритма ===
  
Метод Галеркина (Галеркина-Бубнова) метод решения краевых задач для дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:
+
Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:
 
:<math>
 
:<math>
 
     \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}
 
     \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup}
Строка 15: Строка 15:
 
</math>
 
</math>
  
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты находятся исходя из ортогональности невязки базисной фукнции.
+
Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.
  
 
=== Математическое описание алгоритма ===
 
=== Математическое описание алгоритма ===
Строка 31: Строка 31:
 
</math>
 
</math>
  
Выражение выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы, которое потребуется в дальнейшем. <br/>
+
Выражение, представленное выше, с учетом известной ортогональности тригонометрического ряда, дает выражение для нормы базисной функции, которое потребуется в дальнейшем. <br/>
 
Представим приближенное решение в виде комбинации базисных функций:
 
Представим приближенное решение в виде комбинации базисных функций:
 
:<math>
 
:<math>
     \hat{u} = \Sigma_{m,n,l=1}^{L_x,L_y,L_z} C_{m,n,l} \phi_{m,n,l}
+
     \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l}
 
</math>.
 
</math>.
  
Подставим выражение для приближенного решения в уравнение, получим выражение для невязки:
+
Подставив в уравнение выражение для приближенного решения, получим формулу невязки:
 
:<math>
 
:<math>
 
     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
 
     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
 
</math>.
 
</math>.
  
Разложив выражение для невязки, потребуем ортогональность невязки базисным функциям:
+
Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:
 
:<math>
 
:<math>
 
     \begin{split}
 
     \begin{split}
Строка 54: Строка 54:
 
=== Вычислительное ядро алгоритма ===
 
=== Вычислительное ядро алгоритма ===
  
Вычислительное ядро алгоритма состоит из вычисления интегралов для нахождения коэффициентов приближенного решения, а также нахождение приближенного решения на сетке. Опишем сетку:
+
Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:
 
:<math>
 
:<math>
 
     \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].
 
     \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].
Строка 71: Строка 71:
 
=== Макроструктура алгоритма ===
 
=== Макроструктура алгоритма ===
  
Рассмотрим две возможные структуры алгоритма, в одной сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:
+
Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:
 
# Для всех <math>i=1..N_x, j=1..N_y, k=1..N_z</math> вычислить <math>C_{m,n,l}</math>.
 
# Для всех <math>i=1..N_x, j=1..N_y, k=1..N_z</math> вычислить <math>C_{m,n,l}</math>.
 
# Для всех <math>i=0..M_x, j=0..M_y, k=0..M_z</math> вычислить <math>\hat{u}_{h,i,j,k}</math>.
 
# Для всех <math>i=0..M_x, j=0..M_y, k=0..M_z</math> вычислить <math>\hat{u}_{h,i,j,k}</math>.
Строка 90: Строка 90:
  
 
'''Второй этап''':
 
'''Второй этап''':
     Do i0 j0 k0 = 1 1 1, M_x M_y M_z
+
     Do i0 j0 k0 = 0 0 0, M_x M_y M_z
 
         x = i0*dx
 
         x = i0*dx
 
         y = j0*dy
 
         y = j0*dy
Строка 107: Строка 107:
 
=== Информационный граф ===
 
=== Информационный граф ===
  
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 2. Информационный граф метода Галеркина.]]
+
[[Файл:GalerkinInfGraph.png|thumb|center|300px|Рисунок 1. Информационный граф метода Галеркина.]]
  
 
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.
 
* На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.
Строка 117: Строка 117:
 
=== Ресурс параллелизма алгоритма ===
 
=== Ресурс параллелизма алгоритма ===
  
Из информационного графа видно, что можно коэффициенты <math>C_{m,n,l}</math> и <math>\hat{u}_{h,i,j,k}</math> можно вычислять параллельно. Так как каждое из этих значение вычисляется в виде сумм, дополнительный параллелизм можно достичь за счет параллельного суммирования. Таким образом, при количестве <math>P</math> вычислительных узлов, при <math>P \le min(N_x N_y N_z, M_x M_y M_z)</math> можно достичь производительности в <math>O(\frac{N_x N_y N_z M_x M_y M_z}{P})</math> операций. <br/>
+
Информационный граф показывает, что коэффициенты <math>C_{m,n,l}</math> и <math>\hat{u}_{h,i,j,k}</math> можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если <math>P</math> — количество вычислительных узлов, при <math>P \le min(N_x N_y N_z, M_x M_y M_z)</math>, можно достичь производительности в <math>O(\frac{N_x N_y N_z M_x M_y M_z}{P})</math> операций. <br/>
При <math>P \gt min(N_x N_y N_z, M_x M_y M_z)</math>, положив <math>Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))</math>, за счет параллельного суммирования, эта величина равна <math>O(\frac{N_x N_y N_z}{Q}+\frac{M_x M_y M_z}{Q})</math>.
+
При <math>P \gt min(N_x N_y N_z, M_x M_y M_z)</math>, положив <math>Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))</math>, за счет параллельного суммирования, эта величина равна <math>O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})</math>.
  
 
=== Входные и выходные данные алгоритма ===
 
=== Входные и выходные данные алгоритма ===
  
В качестве входных данных выступает трехмерный массив <math>M_x \times M_y \times M_z</math> правой части уравнения. Выходной массив - трехмерный массив решения той же размерности.
+
В качестве входных данных выступает трехмерный массив <math>M_x \times M_y \times M_z</math> правой части уравнения. Выходные данные — трехмерный массив решения той же размерности.
  
 
=== Свойства алгоритма ===
 
=== Свойства алгоритма ===
Строка 135: Строка 135:
  
 
=== Масштабируемость алгоритма и его реализации ===
 
=== Масштабируемость алгоритма и его реализации ===
 +
 +
Для оценки масштабируемости были выбраны значения <math>N_x=N_y=N_z=M_x=M_y=M_z=64</math>. Все тесты проводились на суперкомпьютере Ломоносов-1.
 +
 +
[[Файл:GalerkinMPI_Perf.png|thumb|center|500px|Рисунок 2. Оценка сильной масштабируемости метода Галеркина.]]
 +
 +
Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием накладных расходов на обмен данными между процессами (то есть все данные, необходимые для соответствующего вычисления, локальны относительно процесса) при вычислении коэффициентов приближенного решения и значений функции, а также лишь двумя обменами данными между этапами вычислений.
  
 
=== Динамические характеристики и эффективность реализации алгоритма ===
 
=== Динамические характеристики и эффективность реализации алгоритма ===
Строка 141: Строка 147:
  
 
=== Существующие реализации алгоритма ===
 
=== Существующие реализации алгоритма ===
 +
 +
* [https://github.com/asaks/Galerkin-Method-Integral-Equation-MPI] Реализация метода Галеркина для интегрального уравнения с использованием MPI.
 +
* [https://github.com/chanchikwan/sg2] Реализация метода Галеркина для задач CFD с использованием CUDA.
  
 
== Литература ==
 
== Литература ==
 +
 +
Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013 <br/>
 +
Самарский А. А. Введение в численные методы, 1982.

Текущая версия на 19:06, 29 ноября 2017

Уравнение Пуассона, решение методом Галеркина, Бутаков О.Б.

1 Свойства и структура алгоритмов

1.1 Общее описание алгоритма

Метод Галеркина (Галеркина-Бубнова) используется для решения краевых задач дифференциальных уравнений. В данной статье рассмотрим алгоритм метода Галеркина для решения уравнения Пуассона с краевыми условиями первого рода:

[math] \newcommand{\laplace}{\mathop{}\!\mathbin\bigtriangleup} \begin{cases} \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), \\ u(x,y,z) = 0, (x,y,z) \in \partial G. \end{cases} [/math]

Алгоритм предполагает выбор полного набора базисных функций, удовлетворяющих краевым условиям. Решение строится в виде линейной комбинации базисных функций, коэффициенты определяются условием ортогональности невязки базисной функции.

1.2 Математическое описание алгоритма

Выберем тригонометрическую систему базисных функций:

[math] \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. [/math]

Очевидно, эта система удовлетворяет краевым условиям. Проверим ортогональность функций, введя скалярное произведение [math](u,v) = \int_{0}^{L_x}\int_{0}^{L_y}\int_{0}^{L_z} u v dx dy dz[/math]:

[math] (\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 = \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 = \delta_{m,i}\frac{L_x}{2} \delta_{n,j}\frac{L_y}{2} \delta_{l,k}\frac{L_z}{2}. [/math]

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

[math] \hat{u} = \Sigma_{m,n,l=1}^{N_x,N_y,N_z} C_{m,n,l} \phi_{m,n,l} [/math].

Подставив в уравнение выражение для приближенного решения, получим формулу невязки:

[math] 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 [/math].

Разложив выражение для невязки по базисным функции, потребуем ортогональность невязки базисным функциям:

[math] \begin{split} &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 \Rightarrow \\ &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. \end{split} [/math].

1.3 Вычислительное ядро алгоритма

Вычислительное ядро алгоритма состоит из подсчета интегралов для поиска коэффициентов приближенного решения, а также для нахождения приближенного решения на сетке. Опишем сетку:

[math] \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]. [/math]

Тогда трехмерный интеграл будет приближенно описываться выражением:

[math] \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. [/math]

Вычисление функции на сетке тривиально:

[math] \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}). [/math]

1.4 Макроструктура алгоритма

Сначала вычислим все коэффициенты, а потом восстановим функцию. Алгоритм:

  1. Для всех [math]i=1..N_x, j=1..N_y, k=1..N_z[/math] вычислить [math]C_{m,n,l}[/math].
  2. Для всех [math]i=0..M_x, j=0..M_y, k=0..M_z[/math] вычислить [math]\hat{u}_{h,i,j,k}[/math].

1.5 Схема реализации последовательного алгоритма

Первый этап на языке Fortran (для наглядности вложенные конструкции упрощены):

   Do i j k = 1 1 1, Nx Ny Nz
       r = 0.0D0
       Do i0 j0 k0 = 1 1 1, Mx My Mz
           x = i0*dx
           y = j0*dy
           z = k0*dz
           r = r + dx*dy*dz*f(i0,j0,k0)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)
       End Do
       c(i, j, k) = 8*r / (Pi**2*(Ly*Lz/Lx*i**2 + Lx*Lz/Ly*j**2 + Lx*Ly/Lz*k**2))
   End Do

Второй этап:

   Do i0 j0 k0 = 0 0 0, M_x M_y M_z
       x = i0*dx
       y = j0*dy
       z = k0*dz
       s = 0.0D0
       Do i j k = 1 1 1, N_x N_y N_z
           s = s + c(i, j, k)*Sin(Pi*i*x/Lx)*Sin(Pi*j*y/Ly)*Sin(Pi*k*z/Lz)
       End Do
       u(i0, j0, k0) = s
   End Do

1.6 Последовательная сложность алгоритма

Вычислительную сложность первого варианта алгоритма можно оценить как [math]O(N_x N_y N_z M_x M_y M_z)[/math] операций с плавающей точкой.

1.7 Информационный граф

Рисунок 1. Информационный граф метода Галеркина.
  • На нулевом ярусе алгоритма происходит генерация или считывание правой части уравнения.
  • На первом ярусе вычисляются коэффициенты.
  • На втором ярусе происходит объединение их в общий массив.
  • На третьем ярусе вычисляется сеточная функция.
  • На четвертом ярусе происходит вывод.

1.8 Ресурс параллелизма алгоритма

Информационный граф показывает, что коэффициенты [math]C_{m,n,l}[/math] и [math]\hat{u}_{h,i,j,k}[/math] можно вычислять параллельно. Так как каждое из этих значений вычисляется в виде сумм, дополнительного увеличения производительности можно достичь за счет параллельного суммирования. Таким образом, если [math]P[/math] — количество вычислительных узлов, при [math]P \le min(N_x N_y N_z, M_x M_y M_z)[/math], можно достичь производительности в [math]O(\frac{N_x N_y N_z M_x M_y M_z}{P})[/math] операций.
При [math]P \gt min(N_x N_y N_z, M_x M_y M_z)[/math], положив [math]Q = mod(P, min(N_x N_y N_z, M_x M_y M_z))[/math], за счет параллельного суммирования, эта величина равна [math]O(\frac{N_x N_y N_z + M_x M_y M_z}{Q})[/math].

1.9 Входные и выходные данные алгоритма

В качестве входных данных выступает трехмерный массив [math]M_x \times M_y \times M_z[/math] правой части уравнения. Выходные данные — трехмерный массив решения той же размерности.

1.10 Свойства алгоритма

2 Программная реализация алгоритма

2.1 Особенности реализации последовательного алгоритма

2.2 Локальность данных и вычислений

2.3 Возможные способы и особенности параллельной реализации алгоритма

2.4 Масштабируемость алгоритма и его реализации

Для оценки масштабируемости были выбраны значения [math]N_x=N_y=N_z=M_x=M_y=M_z=64[/math]. Все тесты проводились на суперкомпьютере Ломоносов-1.

Рисунок 2. Оценка сильной масштабируемости метода Галеркина.

Анализируя график, видно, что производительность растет линейно с увеличением количества вычислительных узлов. Шкала на данном графике логарифмическая. Это можно объяснить отсутствием накладных расходов на обмен данными между процессами (то есть все данные, необходимые для соответствующего вычисления, локальны относительно процесса) при вычислении коэффициентов приближенного решения и значений функции, а также лишь двумя обменами данными между этапами вычислений.

2.5 Динамические характеристики и эффективность реализации алгоритма

2.6 Выводы для классов архитектур

2.7 Существующие реализации алгоритма

  • [1] Реализация метода Галеркина для интегрального уравнения с использованием MPI.
  • [2] Реализация метода Галеркина для задач CFD с использованием CUDA.

3 Литература

Абакумов М.В., Гулин А.В. Лекции по численным методам математической физики: Учеб. пособие. - М.:ИНФРА-М,2013
Самарский А. А. Введение в численные методы, 1982.