Лекция 5. Метод конечных разностей (параллельные...
Post on 15-Apr-2017
889 Views
Preview:
TRANSCRIPT
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Пазников Алексей Александрович
Параллельные вычислительные технологии СибГУТИ (Новосибирск) Осенний семестр 2015
www: cpct.sibsutis.ru/~apaznikov/teaching q/a: piazza.com/sibsutis.ru/fall2015/pct2015fall
Дифференциальные уравнения в частных производных
3
Дифференциальные уравнения в частных производных
Обычное дифференциальное уравнение – уравнение, содержащее производные функций одной переменной.
Дифференциальное уравнение в частных производных (ДУЧП) – уравнение, содержащее частные производные функции нескольких переменных.
Многие физические явления моделируются с помощью ДУЧП, например:
▪ Обтекание крыла самолёта.
▪ Циркуляция крови в теле человека.
▪ Циркуляция воды в океане.
▪ Деформация моста под действием транспорта.
▪ Моделирование климатических явлений (“прогноз погоды”).
▪ Моделирование стихийных бедствий.
▪ Изменение температуры различных объектов.
▪ и т.д.
Методы решения ДУЧП:
▪ Методы конечных элементов.
▪ Методы конечных разностей.
4
Методы решения ДУЧП:
▪ Методы конечных элементов.
▪ Методы конечных разностей (МКР).
Метод конечных разностей предполагает представления ДУЧП в виде СЛАУ. Матрицы, полученные в результате этого, разрежены. Поэтому реализации МКР разделяются на две категории в зависимости от того, как представлены разреженные матрицы.
▪ Матрицы представлены явно, с использованием структур, которые поддерживают эффективный доступ к ненулевым элементам.
▪ Матрицы представлены неявно.
Дифференциальные уравнения в частных производных
5
u = f(x, y) – u – функция от двух переменных
ux – частная производная функции u по x
yu – частная производная функции u по y
Порядок k – это взятие k частных производных (например, для функции u имеет место три частных производных второго порядка: uxx, uxy, uyy.
ДУЧП второго порядка не содержит производные порядка больше двух.
Линейное ДУЧП представляет собой уравнение следующего вида:
Auxx + 2Buxx + Cuyy + Eux + Fuy + Gu = H
где A, B, C, D, E, F, G, H – это функции от x и y.
Примеры линейных ДУЧП:
4uxx + 6xyuxy = 0
2uxy + x2uyy = sin(xy)
Примеры нелинейных ДУЧП второго порядка:
u2xx + uyy = 0
uuxy + sin(xy)uyy = x + y
Классификация ДУЧП
Линейное ДУЧП представляет собой уравнение следующего вида:
Auxx + 2Buxx + Cuyy + Eux + Fuy + Gu = H
где A, B, C, D, E, F, G, H – это функции от x и y.
В зависимости от значений A, B, C, линейные ДУЧП второго порядка классифицируются:
▪ Эллиптические ДУЧП: B2 – AC < 0
▪ Параболические ДУЧП: B2 – AC = 0
▪ Гиперболические ДУЧП: B2 – AC > 0
Примеры:
Уравнение Пуассона uxx + uyy = f(x, y) – пример эллиптического ДУЧП. С помощью него моделируются проблемы электричества, магнетизма, гравитации, процессы распределения тепла или электричества в однородных проводниках. Если f(x, y) = 0, уравнение Пуассона называется уравнением Лапласа.
Уравнение теплопроводности kuxx = ut – пример параболического ДУЧП. Уравнение описывает передачу тепла в твёрдых телах. Также этим уравнением описывается професс диффузии жидкостей и газов (уравнение диффузии).
Волновое уравнение c2uxx = utt – пример гиперболического ДУЧП. Волновое уравнение позволяет моделировать распространение волны и вибрацию струн и мембран.
6
Классификация линейных ДУЧП
Метод конечных разностей приближает решение ДУЧП путем разделения переменных (по времени и пространству) на дискретные интервалы.
Рассмотрим функцию f. Необходимо расчитать первую и вторую производные этой функции в точке x. Приближенное вычисление производной:
f'(x) ≈ [ f(x + h / 2) – f(x – h / 2)] / h
7
Разностные отношения
f(x + h / 2)
f(x – h / 2)
f'(x)
x – h x – h / 2 x x + h / 2 x + h
Вторая производная f''(x) = f'(f'(x)):
f''(x) ≈ ([f(x + h / 2 – h / 2) – f(x + h / 2 – h / 2)] / h – [f(x – h / 2 + h / 2) – f(x – h / 2 – h / 2)]) / h ≈≈ [f(x + h) – f(x) – ((f(x) – f(x – h))] / h2 ≈≈ [f(x + h) – 2f(x) + f(x – h)] / h2
Моделирование вибрации страны
Цель состоит в моделировании вибрации струны (такой, как, например, гитарная). В частности, требуется определить позицию струны в определённый момент времени на основе текущей позиции.
▪ Концы струны зафиксированы.
▪ Переменная x отражает положение точки между концами струны. Левый конец соответствует x = 0, правый – x = 1. Т.е. 0 ≤ x ≤ 1.
▪ Переменная t ≥ 0 соответствует времени. Изначальная позиция струны – это её позиция в момент t = 0.
▪ Функция u(x, t) описывает смещение струны в точке x в момент времени t.
9
Моделирование вибрации струны
1.5
1.0
0.5
0
– 0.5
– 1.0
– 1.5
t = 0.0 и 1.0
t = 0.1 и 0.9
t = 0.2 и 0.8
t = 0.3 и 0.7
t = 0.5
t = 0.4 и 0.6
Данная проблема моделируется множеством уравнений.
Первое уравнение – линейное ДУЧП второго порядка, отражает процесс изменения смещений струны:
4uxx = utt, 0 < x < 1, 0 < t
Второе уравнение описывает то, что струна зафиксирована с двух сторон:
u(0, t) = u(1, t) = 0, t > 0
Третье и четвёртое уравнения описывают начальную позицию и скорость струны в начальный момент времени:
u(x, 0) = sin(πx), ut(x, 0) = 0, 0 ≤ x ≤ 1
Данный вид уравнений – частный случай волнового уравнения общего вида:
c2uxx = utt, 0 ≤ x ≤ 0, t ≥ 0
u(x, 0) = F(x) и ut(x, 0) = G(x) на [0, a]
u(0, t) = u(a, t) = 0
10
Моделирование вибрации струны
Необходимо найти решение задачи для значений x, заключённых между 0 и a, во все моменты времени от 0 до T.
Разобьём пространственный интервал на n частей и временной интервал на m частей:
▪ h = a / n – шаг по пространству
▪ k = T / m – шаг по времени
Если шаг k будет слишком большим (kc / h > 1), то дискретизация будет слишком грубой и решение не будет сходиться к истинному.
Если шаг k будет слишком малым (kc / h < 1), то ошибки округления будут накапливаться и это также уменьшит точность решения.
Поэтому оптимальным вариантом будет случай, когда kc / h = 1.
Пусть
▪ xi = ih, i = 0, 1, …, n
▪ tj = jk, j = 0, 1, …, m
Тогда
▪ ui, j = u(xi, tj) – смещение струны в позиции xi в момент времени tj
11
Моделирование вибрации струны
Используя полученные формулы для апроксимации производной
f''(x) ≈ [f(x + h) – 2f(x) + f(x – h)] / h2
можно расчитать вторые производные uxx и utt:
uxx(xi, tj) ≈ [u(xi + h, tj) – 2u(xi, tj) + u(xi – h, tj)] / h2 ≈ [ui+1,j – 2ui,j + ui–1,j] / h
2
utt(xi, tj) ≈ [u(xi, tj + k) – 2u(xi, tj) + u(xi, tj – k)] / k2 ≈ [ui,j+1 – 2ui,j + ui,j–1 ] / k2
Эти формулы теперь можно подставить в исходное волновое уравнение!
12
Моделирование вибрации струны
k
T
x a
ui,j= u(xi, tj)
ui, j+1
ui, j–1
ui–1, j+1 ui+1, j+1
ui+1, j–1ui–1, j–1
ui–1, j ui+1, j
Используя полученные формулы для апроксимации производной
f''(x) ≈ [f(x + h) – 2f(x) + f(x – h)] / h2
можно расчитать вторые производные uxx и utt:
uxx(xi, tj) ≈ [u(xi + h, tj) – 2u(xi, tj) + u(xi – h, tj)] / h2 ≈ [ui+1,j – 2ui,j + ui–1,j] / h
2
utt(xi, tj) ≈ [u(xi, tj + k) – 2u(xi, tj) + u(xi, tj – k)] / k2 ≈ [ui,j+1 – 2ui,j + ui,j–1 ] / k2
Эти формулы теперь можно подставить в исходное волновое уравнение
и выразить смещение:
ui,1 ≈ L / 2 × (ui+1, 0 + ui-1, 0) + (1 – L) ui, 0 + kG(ih)
ui, j + 1 ≈ 2 × (1 – L) × uij + L (ui+1, j + ui – 1, j) – ui, j – 1
13
Моделирование вибрации струны
14
Последовательная версия программы
#define F(x) sin(M_PI * (x)) // Начальная позиция струны#define G(x) 0.0 // Начальная скорость струны#define a 1.0 // Длина струны#define c 2.0 // Константа#define m 20 // Количество временных интервалов#define n 8 // Количество пространственных интервалов#define T 1.0 // Временной отрезок моделирования
int main() { const double h = a / n; // Шаг по пространству const double k = T / m; // Шаг по времени const double L = (k * c / h) * (k * c / h); double u[m + 1][n + 1]; // Смещения струны
for (j = 0; j <= m; j++) // Смещение на концах струны u[j][0] = u[j][n] = 0;
for (i = 1; i < n; i++) // Смещение в начальный момент времени u[0][i] = F(i * h);
for (i = 1; i < n; i++) // Смещение в момент, следующий после начального u[1][i] = (L / 2.0) * (u[0][i + 1] + u[0][i - 1]) + (1.0 - L) * u[0][i] + k * G(i * h);
for (j = 1; j < m; j++) // Смещение в остальные моменты времени for (i = 1; i < n; i++) u[j + 1][i] = 2.0 * (1.0 - L) * u[j][i] + L * (u[j][i + 1] + u[j][i - 1]) - u[j - 1][i];
for (j = 0; j <= m; j++) { // Печать результатов for (i = 0; i <= n; i++) printf("%6.3f ", u[j][i]); putchar('\n'); }
Новое значение u[j + 1][i] зависит от значений u[j][i - 1], u[j][i], u[j][i + 1] и u[j - 1][i]:
15
Параллельный алгоритм моделирования вибрации струны
u[j+1][i]
u[j][i+1] u[j][i-1]
u[j-1][i]
u[j][i]
Вычисление смещения в конкретной точке для различных моментов времени полностью последовательно: u[j + 1][i] зависит от u[j][i] и u[j - 1][i].
Поэтому декомпозицию для распараллеливания необходимо выполнять по пространству.
Разобьём n интервалов струны между p процессами, каждый получит n / p элементов.
Любой процесс на очередном временном шаге вычисляет значения n / p элементов, при этом все значения, кроме крайних элементов, он может рассчитать самостоятельно, а для крайних (отмечены цветом) необходимо получить значения от соседних процессов (помечены пунктиром):
16
Процесс k
j + 1
j
j - 1
...
i i + 1 ... k * n / p
Т.о., схема взаимодействия процесов:
Процесс k
...
i i + 1 ... k * n / p
Процесс k – 1
j + 1
j
j - 1
Процесс k + 1
Параллельный алгоритм моделирования вибрации струны
Т.о., схема взаимодействия процесов:
17
Процесс k
...
i i + 1 ... k * n / p
Процесс k – 1
j + 1
j
j - 1
Процесс k + 1
Параллельный алгоритм моделирования вибрации струны
Для удобства программирования рекомендуется ввести дополнительный столбец для обмена граничными элементами:
Процесс k
...
Процесс k – 1 Процесс k + 1
...... ...
Для сокращения количества обменов на каждой итерации рассчитывается сразу несколько временных шагов. При этом передаётся сразу несколько элементов
18
Параллельный алгоритм моделирования вибрации струны
Процесс k
j + 1
j
j - 1
Процесс k + 1
... ...
Процесс k
j + 1
j
j - 1
Процесс k + 1
... ...
j + 2
j + 1
j
j - 1
Процесс k + 1
j + 2
......
j + 3
Процесс k
Передаётся один элемент, рассчитывается один шаг по времени.
Передаётся два элемента, рассчитывается два шага по времени, один элемент избыточный.
Передаётся три элемента, рассчитывается три шага по времени, три элемента вычисляются избыточно.
Увеличение граничных элементов (временных шагов, рассчитываемых за одну итерацию) приводит к следующим последствиям:1. Увеличение длины сообщения.2. Уменьшение частоты передачи сообщений (уменьшение латентности).3. Добавление избыточных вычислений.
Рассчитаем количество избыточно вычисленных элементов. Если с каждой стороны области k граничных элементов, тогда сообщение длины k отправляется и присылается от соседних процессов каждые k итераций. Число избыточно рассчитанных элементов:
k – 1 i = k (k – 1) / 2
i = 1График зависимости накладных расходов от числа граничных элементов:
19
Параллельный алгоритм моделирования вибрации струны
∑
Нак
ладн
ые
расх
оды
Число граничных элементов
Увеличение числа граничных элементов позволяет сократить накладные расходы до точки, после которой время выполнения избыточных вычислений станет превышать пользу от сокращения числа информационных обменов.
Задача стационарного распределения тепла
Рассматривается параллельная версия программы определения стационарного распределенгия тепла для тонкой прямоугольной пластины.
Задача стационарного распределения тепла в общем случае описывается уравнением Пуассона:
uxx + uyy = f(x, y), 0 ≤ x ≤ a, 0 ≤ y ≤ b
с заданными граничными условиями (значение функции на границе области):
u(x, 0) = G1(x) и u(x, b) = G2(x) 0 ≤ x ≤ a
u(0, y) = G3(y) и u(a, y) = G4(y) 0 ≤ y ≤ b
Если область прямоугольная, то задача называется задачей Дирихле.
Если функции G1, G2, G3 и G4 непрерывны и функция f непрерывна внутри прямоугольной области, то задача имеет единственное решение.
Для моделирования составим прямоугольную сетку. Каждая точка (xi, yj) этой сетки соответствует конкретной координате (x, y) внутри прямоугольной области.
Моделирование состоит в периодическом вычислении значений во внутренних узлах сетки.
21
Задача стационарного распределения тепла
Для моделирования составим прямоугольную сетку. Каждая точка (xi, yj) этой сетки соответствует конкретной координате (x, y) внутри прямоугольной области.
Моделирование состоит в периодическом вычислении значений во внутренних узлах сетки.
22
G1(x)
G4(x) G2(x)
G1(x)
G4(x) G2(x)
G3(x)G3(x)
(xi, yj)
uxx + uyy = f(x, y)
0 a
b
x
y
Задача стационарного распределения тепла
Разобьём пространственную размерность x на n частей и пространственную размерность y на m частей. Определим h = x / n, k = y / m.
Вычислим приблеженно вторые производные по x и по y:
uxx(xi, yj) ≈ [ u(xi + h, yj) – 2u(xi, yj) + u(xi – h, yj) ] / h2 ≈
≈ [ ui + 1, j – 2ui, j + ui – 1, j ] / h2
uyy(xi, yj) ≈ [ ui, j + 1 – 2ui, j + ui, j – 1] / k2
Подставляя выражения для производных в уравнение Пуассона, получаем:
(ui + 1, j – 2ui, j + ui – 1, j) / h2 + (ui, j + 1 – 2ui, j + ui, j – 1) / k
2 = f(xi, yj)
Положим λ = k / h. После серии элементарных преобразований получаем:
ui, j = [ λ2 (ui + 1, j + ui – 1, j) + ui, j + 1 + ui, j – 1 – k2 fi, j ] / [ 2 (1 + λ2) ]
Теперь рассмотрим конкретную задачу. Необходимо выполнить моделирование для тонкой стальной пластины, с трёх сторон окружённая водяным паром (температура 100°С), а с четвёртой стороны граничащая со льдом (температура 0°С). Сверху и снизу пластины находится изолирующий слой.
Цель моделирования – отыскать стационарное распределение температуры во внутренних точках пластины.
23
Задача стационарного распределения тепла
Теперь рассмотрим конкретную задачу. Необходимо выполнить моделирование для тонкой стальной пластины, с трёх сторон окружённая водяным паром (температура 100°С), а с четвёртой стороны граничащая со льдом (температура 0°С). Сверху и снизу пластины находится изолирующий слой.
Цель моделирования – отыскать стационарное распределение температуры во внутренних точках пластины.
24
ui + 1, j
ui, j + 1 ui, j – 1
ui – 1, j
ui, j
Поскольку точки распределены равномерно, то h = k и λ = 1.
Поскольку пластина изолирована, тепло не проникает внутрь и распространяется только с границ. Это означает, что fi, j = 0. Поэтому можно записать:
ui, j = (ui + 1, j + ui – 1, j + ui, j + 1 + ui, j – 1) / 4
Начиная с начальных значений, по известным значениям можно рассчитывать все последующие значения wi, j – и так до тех пор, пока значения не будут сходиться. Новое значение ui,j зависит от
четырёх предыдущих ui, j – 1 , ui + 1, j , ui, j + 1 , ui – 1, j
Задача стационарного распределения тепла
25
Последовательная программа
#include <stdio.h>#include <math.h>
#define N 100#define EPS 0.01
int main(int argc, char *argv[]){ double diff; // Изменение значений int i, j; double mean; // Среднее значение на границах double u[N][N]; // Старые значения double v[N][N]; // Новые значения
// Установить граничные значения и расчитать среднее значение на границах mean = 0.0; for (i = 0; i < N; i++) { u[i][0] = u[i][N - 1] = u[0][i] = 100.0; u[N - 1][i] = 0.0; mean += u[i][0] + u[i][N - 1] + u[0][i] + u[N - 1][i]; } mean /= (4.0 * N); // Проинициализировать внутренние значения for (i = 1; i < N - 1; i++) for (j = 1; j < N - 1; j++) u[i][j] = mean;
26
Последовательная программа
// Расчитать стационарное состояние for (;;) { diff = 0.0; for (i = 1; i < N - 1; i++) for (j = 1; j < N - 1; j++) { v[i][j] = (u[i - 1][j] + u[i + 1][j] + u[i][j - 1] + u[i][j + 1]) / 4.0;
if (fabs(v[i][j] - u[i][j]) > diff) diff = fabs(v[i][j] - u[i][j]); }
if (diff <= EPS) break;
for (i = 1; i < N - 1; i++) for (j = 1; j < N - 1; j++) u[i][j] = v[i][j]; }
// Распечатать решение for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%6.2f ", u[i][j]); putchar('\n'); }}
u[i + 1] [j]
u[i][j + 1] u[i][j – 1]
u[i – 1][j]
v[i][j]
27
Последовательная программа
// Расчитать стационарное состояние for (;;) { diff = 0.0; for (i = 1; i < N - 1; i++) for (j = 1; j < N - 1; j++) { v[i][j] = (u[i - 1][j] + u[i + 1][j] + u[i][j - 1] + u[i][j + 1]) / 4.0;
if (fabs(v[i][j] - u[i][j]) > diff) diff = fabs(v[i][j] - u[i][j]); }
if (diff <= EPS) break;
for (i = 1; i < N - 1; i++) for (j = 1; j < N - 1; j++) u[i][j] = v[i][j]; }
// Распечатать решение for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%6.2f ", u[i][j]); putchar('\n'); }}
u[i + 1] [j]
u[i][j + 1] u[i][j – 1]
u[i – 1][j]
v[i][j]
Вычисление новых значений v[i][j] температуры можно выполнять
параллельно!
Вычислительная сложность (для квадратной решётки): T = O(n2)
28
Параллельный алгоритм
P0
P1
…
Pp
P0 P1 P2 P3
P4 P5
Pp…
… … … …
… …
P6 P7
Декомпозиция по строкам Декомпозиция по блокам
29
Параллельный алгоритм
Декомпозиция по строкам Декомпозиция по блокам
P0
P1
…
Pp
P0 P1 P2 P3
P4 P5
Pp…
… … … …
… …
P6 P7
Вычислительная сложность: O(n2 / p)Коммуникационная сложность: O(n)Общее количество пересылаемых
элементов на одной итерации: O(np)
Вычислительная сложность: O( [n / sqrt(p)]2 )Коммуникационная сложность: O(n / sqrt(p))
Общее количество пересылаемых элементов на одной итерации: O(n sqrt(p))
top related