<?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=Andrclive</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=Andrclive"/>
	<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/Andrclive"/>
	<updated>2026-10-23T09:49:47Z</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19768</id>
		<title>Участник:Andrclive/Уравнения мелкой воды</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19768"/>
		<updated>2016-11-30T21:30:10Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:andrclive|А.В.Чаплыгин]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Уравнения мелкой воды (МВ) представляют собой упрощенную модель полных уравнений Навье-Стокса, описывающих пространственные&lt;br /&gt;
нестационарные течения. При выводе системы уравнений МВ предполагается, что среда представляет собой достаточно&lt;br /&gt;
тонкий слой, глубина которого много меньше его продольного размера, поэтому вертикальной составляющей скорости в слое можно пренебречь&lt;br /&gt;
и полагать, что продольные скорости постоянны по толщине слоя.&lt;br /&gt;
&lt;br /&gt;
Ситуации, когда глубина акватории много меньше горизонтальных размеров, достаточно обычна, поэтому уравнения мелкой воды находят широкое применение. Они используются с учётом кориолисовых сил при моделировании атмосферы и океана. Будем рассматривать вид задачи МВ, который используется при моделировании &lt;br /&gt;
циркуляции океана в модели INMOM (Institute of Numerical Mathematics Ocean Model).&lt;br /&gt;
&lt;br /&gt;
Уравнения мелкой воды в криволинейной системе координат при предположении &amp;lt;math&amp;gt; \zeta &amp;lt;&amp;lt; H &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; - это отклонение уровня,&lt;br /&gt;
а &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; - глубина, имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{\partial u}{\partial t} - lv = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial v}{\partial t} + lu = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial \zeta}{\partial t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x, y &amp;lt;/math&amp;gt; - широта и долгота,&lt;br /&gt;
&amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; - время,&lt;br /&gt;
&amp;lt;math&amp;gt; u, v &amp;lt;/math&amp;gt; - зональная и меридиональная компоненты скорости,&lt;br /&gt;
&amp;lt;math&amp;gt; l &amp;lt;/math&amp;gt; - параметр Кориолиса,&lt;br /&gt;
&amp;lt;math&amp;gt; r_x, r_y &amp;lt;/math&amp;gt; - метрические коэффициенты,&lt;br /&gt;
&amp;lt;math&amp;gt; p_a &amp;lt;/math&amp;gt; - атмосферное давление на поверхности,&lt;br /&gt;
&amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; - ускорение свободного падения,&lt;br /&gt;
&amp;lt;math&amp;gt; \rho_0 &amp;lt;/math&amp;gt; - средняя плотность жидкости.&lt;br /&gt;
&lt;br /&gt;
К этой задаче также добавляются граничные условия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; (\bar{U}, \bar{n}) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
на границе, где &amp;lt;math&amp;gt; \bar{U} = (u, v) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; \bar{n} &amp;lt;/math&amp;gt; &lt;br /&gt;
- единичная нормаль к границе.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения уравнений применяется техника построения разностных аппроксимаций по пространству второго порядка точности (в случае равномерной сетки)&lt;br /&gt;
на разнесенной &amp;quot;C&amp;quot; - сетке классификации Аракавы.&lt;br /&gt;
Уравнения требуют совместного решения сразу трех уравнений, записанных с использованием неявной схемы по времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{u^{j+1} - u^j}{\delta t} - lv^{j+1} + ru^{j+1} = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{v^{j+1} - v^j}{\delta t} + lu^{j+1} + rv^{j+1} = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\zeta^{j+1} - \zeta^j}{\delta t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в первые два уравнения дополнительно введены слагаемые, которые можно рассматривать как рэлеевское трение с коэффициентом &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt; для&lt;br /&gt;
дополнительного стока импульса. Они необходимы для регуляризации задачи, поскольку система может быть вырожденной. &lt;br /&gt;
&lt;br /&gt;
После дискретизации системы с учетом граничных условий получаем линейную систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, которую решаем итерационным методом GMRES.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Формирование матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; занимает довольно много времени и ресурсов при больших размерностях задачи, но матрица генерируется всего один раз в программе, в начале, затем на каждом шаге по времени генерируется правая часть &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; и решается система &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;.&lt;br /&gt;
В процессе решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; получается 7-диагональная плохо обусловленная матрица. Решать такую систему на каждом шаге по времени довольно затруднительно, особенно если шагов по времени довольно много, и поэтому основное время алгоритма приходится именно на этот этап.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру последовательного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW.png|center|200px]]&lt;br /&gt;
&lt;br /&gt;
Систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; на каждом шаге по времени решаем методом GMRES с помощью PETSc.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При решении системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES, необходимо провести довольно большее количество итераций - это связано со структурой матрицы  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, о которой писалось выше. Чтобы на каждом следующем шаге по времени это число итераций уменьшить, можно в методе GMRES использовать начальное приближение не нулевое, а как решение &amp;lt;math&amp;gt;x&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; u, v, \zeta &amp;lt;/math&amp;gt;) во вертикале и горизонтали, в итоге каждый процессор получает свой блок из общего массива над которым он будет выполнять работу. На рисунке изображен пример разбиения массива по процессорной сетке:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_grid.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Дополнительные внерасчетные границы добавляются, чтобы производить обмен зависимыми данными между процессорами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_border.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру работы параллельной версии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_MPI.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При декомпозиции области и решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; параллельным итерационным методом, вообще говоря, число итераций может увеличиться по сравнению с последовательной версией. Для уменьшения количества итераций на каждом шаге по времени можно решать систему с использованием начального приближения не нулевого, а как решения &amp;lt;math&amp;gt;x&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;
Как писалось выше, матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; - разряженная 7-диагональная плохо обусловленная матрица. Формируется и подается на вход решателю в формате &lt;br /&gt;
CSR (Compressed Sparse Row matrix).&lt;br /&gt;
&lt;br /&gt;
Выходные данные скоростей и уровня записываются в бинарный файл с последующим созданием заголовка .ctl для навигации по нему и работе с ним&lt;br /&gt;
в программе GrADS.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Задача рассчитывалась на сетке (1, 254)X(1, 128), на 5 дней с шагом по времени 1800 секунд (пол часа). &lt;br /&gt;
Матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на такой сетке имеет размеры 97920 на 97920.&lt;br /&gt;
Все тесты проводились на суперкомпьютере Ломоносов.&lt;br /&gt;
&lt;br /&gt;
Общее время расчета алгоритма:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_global.png|center]]&lt;br /&gt;
&lt;br /&gt;
Некоторое среднее время решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES с помощью пакета PETSc. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_local_sys.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Не очень хорошая масштабируемость алгоритма связана именно с параллельным решением системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;. Этот этап требует довольно большое количество пересылок между процессорами. Для достижения наилучшей производительности, сам PETSc рекомендует по 10000 неизвестных на один процессор, а лучше по 20000 ([https://www.mcs.anl.gov/petsc/documentation/faq.html#slowerparallel]).&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Н.А. Дианский. Моделирование циркуляции океана.&lt;br /&gt;
* К.М. Терехов. Параллельная реализация модели общей циркуляции оке­ана // Сборник тезисов лучших дипломных работ 2010.  ВМИК МГУ, Москва.&lt;br /&gt;
* PETSc [https://www.mcs.anl.gov/petsc/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19767</id>
		<title>Участник:Andrclive/Уравнения мелкой воды</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19767"/>
		<updated>2016-11-30T21:29:18Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:andrclive|А.В.Чаплыгин]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Уравнения мелкой воды (МВ) представляют собой упрощенную модель полных уравнений Навье-Стокса, описывающих пространственные&lt;br /&gt;
нестационарные течения. При выводе системы уравнений МВ предполагается, что среда представляет собой достаточно&lt;br /&gt;
тонкий слой, глубина которого много меньше его продольного размера, поэтому вертикальной составляющей скорости в слое можно пренебречь&lt;br /&gt;
и полагать, что продольные скорости постоянны по толщине слоя.&lt;br /&gt;
&lt;br /&gt;
Ситуации, когда глубина акватории много меньше горизонтальных размеров, достаточно обычна, поэтому уравнения мелкой воды находят широкое применение. Они используются с учётом кориолисовых сил при моделировании атмосферы и океана. Будем рассматривать вид задачи МВ, который используется при моделировании &lt;br /&gt;
циркуляции океана в модели INMOM (Institute of Numerical Mathematics Ocean Model).&lt;br /&gt;
&lt;br /&gt;
Уравнения мелкой воды в криволинейной системе координат при предположении &amp;lt;math&amp;gt; \zeta &amp;lt;&amp;lt; H &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; - это отклонение уровня,&lt;br /&gt;
а &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; - глубина, имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{\partial u}{\partial t} - lv = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial v}{\partial t} + lu = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial \zeta}{\partial t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x, y &amp;lt;/math&amp;gt; - широта и долгота,&lt;br /&gt;
&amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; - время,&lt;br /&gt;
&amp;lt;math&amp;gt; u, v &amp;lt;/math&amp;gt; - зональная и меридиональная компоненты скорости,&lt;br /&gt;
&amp;lt;math&amp;gt; l &amp;lt;/math&amp;gt; - параметр Кориолиса,&lt;br /&gt;
&amp;lt;math&amp;gt; r_x, r_y &amp;lt;/math&amp;gt; - метрические коэффициенты,&lt;br /&gt;
&amp;lt;math&amp;gt; p_a &amp;lt;/math&amp;gt; - атмосферное давление на поверхности,&lt;br /&gt;
&amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; - ускорение свободного падения,&lt;br /&gt;
&amp;lt;math&amp;gt; \rho_0 &amp;lt;/math&amp;gt; - средняя плотность жидкости.&lt;br /&gt;
&lt;br /&gt;
К этой задаче также добавляются граничные условия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; (\bar{U}, \bar{n}) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
на границе, где &amp;lt;math&amp;gt; \bar{U} = (u, v) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; \bar{n} &amp;lt;/math&amp;gt; &lt;br /&gt;
- единичная нормаль к границе.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения уравнений применяется техника построения разностных аппроксимаций по пространству второго порядка точности (в случае равномерной сетки)&lt;br /&gt;
на разнесенной &amp;quot;C&amp;quot; - сетке классификации Аракавы.&lt;br /&gt;
Уравнения требуют совместного решения сразу трех уравнений, записанных с использованием неявной схемы по времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{u^{j+1} - u^j}{\delta t} - lv^{j+1} + ru^{j+1} = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{v^{j+1} - v^j}{\delta t} + lu^{j+1} + rv^{j+1} = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\zeta^{j+1} - \zeta^j}{\delta t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в первые два уравнения дополнительно введены слагаемые, которые можно рассматривать как рэлеевское трение с коэффициентом &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt; для&lt;br /&gt;
дополнительного стока импульса. Они необходимы для регуляризации задачи, поскольку система может быть вырожденной. &lt;br /&gt;
&lt;br /&gt;
После дискретизации системы с учетом граничных условий получаем линейную систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, которую решаем итерационным методом GMRES.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Формирование матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; занимает довольно много времени и ресурсов при больших размерностях задачи, но матрица генерируется всего один раз в программе, в начале, затем на каждом шаге по времени генерируется правая часть &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; и решается система &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;.&lt;br /&gt;
В процессе решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; получается 7-диагональная плохо обусловленная матрица. Решать такую систему на каждом шаге по времени довольно затруднительно, особенно если шагов по времени довольно много, и поэтому основное время алгоритма приходится именно на этот этап.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру последовательного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW.png|center|200px]]&lt;br /&gt;
&lt;br /&gt;
Систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; на каждом шаге по времени решаем методом GMRES с помощью PETSc.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При решении системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES, необходимо провести довольно большее количество итераций - это связано со структурой матрицы  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, о которой писалось выше. Чтобы на каждом следующем шаге по времени это число итераций уменьшить, можно в методе GMRES использовать начальное приближение не нулевое, а как решение &amp;lt;math&amp;gt;x&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; u, v, \zeta &amp;lt;/math&amp;gt;) во вертикале и горизонтали, в итоге каждый процессор получает свой блок из общего массива над которым он будет выполнять работу. На рисунке изображен пример разбиения массива по процессорной сетке:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_grid.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Дополнительные внерасчетные границы добавляются, чтобы производить обмен зависимыми данными между процессорами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_border.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру работы параллельной версии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_MPI.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При декомпозиции области и решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; параллельным итерационным методом, вообще говоря, число итераций может увеличиться по сравнению с последовательной версией. Для уменьшения количества итераций на каждом шаге по времени можно решать систему с использованием начального приближения не нулевого, а как решения &amp;lt;math&amp;gt;x&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;
Как писалось выше, матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; - разряженная 7-диагональная плохо обусловленная матрица. Формируется и подается на вход решателю в формате &lt;br /&gt;
CSR (Compressed Sparse Row matrix).&lt;br /&gt;
&lt;br /&gt;
Выходные данные скоростей и уровня записываются в бинарный файл с последующим созданием заголовка .ctl для навигации по нему и работе с ним&lt;br /&gt;
в программе GrADS.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Задача рассчитывалась на сетке (1, 254)X(1, 128), на 5 дней с шагом по времени 1800 секунд (пол часа). &lt;br /&gt;
Матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на такой сетке имеет размеры 97920 на 97920.&lt;br /&gt;
Все тесты проводились на суперкомпьютере Ломоносов.&lt;br /&gt;
&lt;br /&gt;
Общее время расчета алгоритма:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_global.png|center]]&lt;br /&gt;
&lt;br /&gt;
Некоторое среднее время решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES с помощью пакета PETSc. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_local_sys.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Не очень хорошая масштабируемость алгоритма связана именно с параллельным решением системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;. Этот этап требует довольно большое количество пересылок между процессорами. Для достижения наилучшей производительности, сам PETSc рекомендует по 10000 неизвестных на один процесс, а лучше по 20000 ([https://www.mcs.anl.gov/petsc/documentation/faq.html#slowerparallel]).&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Н.А. Дианский. Моделирование циркуляции океана.&lt;br /&gt;
* К.М. Терехов. Параллельная реализация модели общей циркуляции оке­ана // Сборник тезисов лучших дипломных работ 2010.  ВМИК МГУ, Москва.&lt;br /&gt;
* PETSc [https://www.mcs.anl.gov/petsc/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19763</id>
		<title>Участник:Andrclive/Уравнения мелкой воды</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19763"/>
		<updated>2016-11-30T20:53:11Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:andrclive|А.В.Чаплыгин]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Уравнения мелкой воды (МВ) представляют собой упрощенную модель полных уравнений Навье-Стокса, описывающих пространственные&lt;br /&gt;
нестационарные течения. При выводе системы уравнений МВ предполагается, что среда представляет собой достаточно&lt;br /&gt;
тонкий слой, глубина которого много меньше его продольного размера, поэтому вертикальной составляющей скорости в слое можно пренебречь&lt;br /&gt;
и полагать, что продольные скорости постоянны по толщине слоя.&lt;br /&gt;
&lt;br /&gt;
Ситуации, когда глубина акватории много меньше горизонтальных размеров, достаточно обычна, поэтому уравнения мелкой воды находят широкое применение. Они используются с учётом кориолисовых сил при моделировании атмосферы и океана. Будем рассматривать вид задачи МВ, который используется при моделировании &lt;br /&gt;
циркуляции океана в модели INMOM (Institute of Numerical Mathematics Ocean Model).&lt;br /&gt;
&lt;br /&gt;
Уравнения мелкой воды в криволинейной системе координат при предположении &amp;lt;math&amp;gt; \zeta &amp;lt;&amp;lt; H &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; - это отклонение уровня,&lt;br /&gt;
а &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; - глубина, имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{\partial u}{\partial t} - lv = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial v}{\partial t} + lu = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial \zeta}{\partial t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x, y &amp;lt;/math&amp;gt; - широта и долгота,&lt;br /&gt;
&amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; - время,&lt;br /&gt;
&amp;lt;math&amp;gt; u, v &amp;lt;/math&amp;gt; - зональная и меридиональная компоненты скорости,&lt;br /&gt;
&amp;lt;math&amp;gt; l &amp;lt;/math&amp;gt; - параметр Кориолиса,&lt;br /&gt;
&amp;lt;math&amp;gt; r_x, r_y &amp;lt;/math&amp;gt; - метрические коэффициенты,&lt;br /&gt;
&amp;lt;math&amp;gt; p_a &amp;lt;/math&amp;gt; - атмосферное давление на поверхности,&lt;br /&gt;
&amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; - ускорение свободного падения,&lt;br /&gt;
&amp;lt;math&amp;gt; \rho_0 &amp;lt;/math&amp;gt; - средняя плотность жидкости.&lt;br /&gt;
&lt;br /&gt;
К этой задаче также добавляются граничные условия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; (\bar{U}, \bar{n}) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
на границе, где &amp;lt;math&amp;gt; \bar{U} = (u, v) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; \bar{n} &amp;lt;/math&amp;gt; &lt;br /&gt;
- единичная нормаль к границе.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения уравнений применяется техника построения разностных аппроксимаций по пространству второго порядка точности (в случае равномерной сетки)&lt;br /&gt;
на разнесенной &amp;quot;C&amp;quot; - сетке классификации Аракавы.&lt;br /&gt;
Уравнения требуют совместного решения сразу трех уравнений, записанных с использованием неявной схемы по времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{u^{j+1} - u^j}{\delta t} - lv^{j+1} + ru^{j+1} = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{v^{j+1} - v^j}{\delta t} + lu^{j+1} + rv^{j+1} = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\zeta^{j+1} - \zeta^j}{\delta t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в первые два уравнения дополнительно введены слагаемые, которые можно рассматривать как рэлеевское трение с коэффициентом &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt; для&lt;br /&gt;
дополнительного стока импульса. Они необходимы для регуляризации задачи, поскольку система может быть вырожденной. &lt;br /&gt;
&lt;br /&gt;
После дискретизации системы с учетом граничных условий получаем линейную систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, которую решаем итерационным методом GMRES.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Формирование матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; занимает довольно много времени и ресурсов при больших размерностях задачи, но матрица генерируется всего один раз в программе, в начале, затем на каждом шаге по времени генерируется правая часть &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; и решается система &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;.&lt;br /&gt;
В процессе решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; получается 7-диагональная плохо обусловленная матрица. Решать такую систему на каждом шаге по времени довольно затруднительно, особенно если шагов по времени довольно много, и поэтому основное время алгоритма приходится именно на этот этап.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру последовательного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW.png|center|200px]]&lt;br /&gt;
&lt;br /&gt;
Систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; на каждом шаге по времени решаем методом GMRES с помощью PETSc.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При решении системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES, необходимо провести довольно большее количество итераций - это связано со структурой матрицы  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, о которой писалось выше. Чтобы на каждом следующем шаге по времени это число итераций уменьшить, можно в методе GMRES использовать начальное приближение не нулевое, а как решение &amp;lt;math&amp;gt;x&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; u, v, \zeta &amp;lt;/math&amp;gt;) во вертикале и горизонтали, в итоге каждый процессор получает свой блок из общего массива над которым он будет выполнять работу. На рисунке изображен пример разбиения массива по процессорной сетке:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_grid.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Дополнительные внерасчетные границы добавляются, чтобы производить обмен зависимыми данными между процессорами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_border.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру работы параллельной версии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_MPI.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При декомпозиции области и решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; параллельным итерационным методом, вообще говоря, число итераций может увеличиться по сравнению с последовательной версией. Для уменьшения количества итераций на каждом шаге по времени можно решать систему с использованием начального приближения не нулевого, а как решения &amp;lt;math&amp;gt;x&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;
Как писалось выше, матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; - разряженная 7-диагональная плохо обусловленная матрица. Формируется и подается на вход решателю в формате &lt;br /&gt;
CSR (Compressed Sparse Row matrix).&lt;br /&gt;
&lt;br /&gt;
Выходные данные скоростей и уровня записываются в бинарный файл с последующим созданием заголовка .ctl для навигации по нему и работе с ним&lt;br /&gt;
в программе GrADS.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Задача рассчитывалась на сетке (1, 254)X(1, 128), на 5 дней с шагом по времени 1800 секунд (пол часа). &lt;br /&gt;
Матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на такой сетке имеет размеры 97920 на 97920.&lt;br /&gt;
Все тесты проводились на суперкомпьютере Ломоносов.&lt;br /&gt;
&lt;br /&gt;
Общее время расчета алгоритма:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_global.png|center]]&lt;br /&gt;
&lt;br /&gt;
Некоторое среднее время решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES с помощью пакета PETSc. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_local_sys.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Н.А. Дианский. Моделирование циркуляции океана.&lt;br /&gt;
* К.М. Терехов. Параллельная реализация модели общей циркуляции оке­ана // Сборник тезисов лучших дипломных работ 2010.  ВМИК МГУ, Москва.&lt;br /&gt;
* PETSc [https://www.mcs.anl.gov/petsc/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19762</id>
		<title>Участник:Andrclive/Уравнения мелкой воды</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19762"/>
		<updated>2016-11-30T20:51:45Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:andrclive|А.В.Чаплыгин]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Уравнения мелкой воды (МВ) представляют собой упрощенную модель полных уравнений Навье-Стокса, описывающих пространственные&lt;br /&gt;
нестационарные течения. При выводе системы уравнений МВ предполагается, что среда представляет собой достаточно&lt;br /&gt;
тонкий слой, глубина которого много меньше его продольного размера, поэтому вертикальной составляющей скорости в слое можно пренебречь&lt;br /&gt;
и полагать, что продольные скорости постоянны по толщине слоя.&lt;br /&gt;
&lt;br /&gt;
Ситуации, когда глубина акватории много меньше горизонтальных размеров, достаточно обычна, поэтому уравнения мелкой воды находят широкое применение. Они используются с учётом кориолисовых сил при моделировании атмосферы и океана. Будем рассматривать вид задачи МВ, который используется при моделировании &lt;br /&gt;
циркуляции океана в модели INMOM (Institute of Numerical Mathematics Ocean Model).&lt;br /&gt;
&lt;br /&gt;
Уравнения мелкой воды в криволинейной системе координат при предположении &amp;lt;math&amp;gt; \zeta &amp;lt;&amp;lt; H &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; - это отклонение уровня,&lt;br /&gt;
а &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; - глубина, имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{\partial u}{\partial t} - lv = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial v}{\partial t} + lu = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial \zeta}{\partial t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x, y &amp;lt;/math&amp;gt; - широта и долгота,&lt;br /&gt;
&amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; - время,&lt;br /&gt;
&amp;lt;math&amp;gt; u, v &amp;lt;/math&amp;gt; - зональная и меридиональная компоненты скорости,&lt;br /&gt;
&amp;lt;math&amp;gt; l &amp;lt;/math&amp;gt; - параметр Кориолиса,&lt;br /&gt;
&amp;lt;math&amp;gt; r_x, r_y &amp;lt;/math&amp;gt; - метрические коэффициенты,&lt;br /&gt;
&amp;lt;math&amp;gt; p_a &amp;lt;/math&amp;gt; - атмосферное давление на поверхности,&lt;br /&gt;
&amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; - ускорение свободного падения,&lt;br /&gt;
&amp;lt;math&amp;gt; \rho_0 &amp;lt;/math&amp;gt; - средняя плотность жидкости.&lt;br /&gt;
&lt;br /&gt;
К этой задаче также добавляются граничные условия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; (\bar{U}, \bar{n}) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
на границе, где &amp;lt;math&amp;gt; \bar{U} = (u, v) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; \bar{n} &amp;lt;/math&amp;gt; &lt;br /&gt;
- единичная нормаль к границе.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения уравнений применяется техника построения разностных аппроксимаций по пространству второго порядка точности (в случае равномерной сетки)&lt;br /&gt;
на разнесенной &amp;quot;C&amp;quot; - сетке классификации Аракавы.&lt;br /&gt;
Уравнения требуют совместного решения сразу трех уравнений, записанных с использованием неявной схемы по времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{u^{j+1} - u^j}{\delta t} - lv^{j+1} + ru^{j+1} = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{v^{j+1} - v^j}{\delta t} + lu^{j+1} + rv^{j+1} = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\zeta^{j+1} - \zeta^j}{\delta t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в первые два уравнения дополнительно введены слагаемые, которые можно рассматривать как рэлеевское трение с коэффициентом &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt; для&lt;br /&gt;
дополнительного стока импульса. Они необходимы для регуляризации задачи, поскольку система может быть вырожденной. &lt;br /&gt;
&lt;br /&gt;
После дискретизации системы с учетом граничных условий получаем линейную систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, которую решаем итерационным методом GMRES.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Формирование матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; занимает довольно много времени и ресурсов при больших размерностях задачи, но матрица генерируется всего один раз в программе, в начале, затем на каждом шаге по времени генерируется правая часть &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; и решается система &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;.&lt;br /&gt;
В процессе решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; получается 7-диагональная плохо обусловленная матрица. Решать такую систему на каждом шаге по времени довольно затруднительно, особенно если шагов по времени довольно много, и поэтому основное время алгоритма приходится именно на этот этап.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру последовательного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW.png|center]]&lt;br /&gt;
&lt;br /&gt;
Систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; на каждом шаге по времени решаем методом GMRES с помощью PETSc.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При решении системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES, необходимо провести довольно большее количество итераций - это связано со структурой матрицы  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, о которой писалось выше. Чтобы на каждом следующем шаге по времени это число итераций уменьшить, можно в методе GMRES использовать начальное приближение не нулевое, а как решение &amp;lt;math&amp;gt;x&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; u, v, \zeta &amp;lt;/math&amp;gt;) во вертикале и горизонтали, в итоге каждый процессор получает свой блок из общего массива над которым он будет выполнять работу. На рисунке изображен пример разбиения массива по процессорной сетке:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_grid.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Дополнительные внерасчетные границы добавляются, чтобы производить обмен зависимыми данными между процессорами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_border.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающую структуру работы параллельной версии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_MPI.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При декомпозиции области и решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; параллельным итерационным методом, вообще говоря, число итераций может увеличиться по сравнению с последовательной версией. Для уменьшения количества итераций на каждом шаге по времени можно решать систему с использованием начального приближения не нулевого, а как решения &amp;lt;math&amp;gt;x&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;
Как писалось выше, матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; - разряженная 7-диагональная плохо обусловленная матрица. Формируется и подается на вход решателю в формате &lt;br /&gt;
CSR (Compressed Sparse Row matrix).&lt;br /&gt;
&lt;br /&gt;
Выходные данные скоростей и уровня записываются в бинарный файл с последующим созданием заголовка .ctl для навигации по нему и работе с ним&lt;br /&gt;
в программе GrADS.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Задача рассчитывалась на сетке (1, 254)X(1, 128), на 5 дней с шагом по времени 1800 секунд (пол часа). &lt;br /&gt;
Матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на такой сетке имеет размеры 97920 на 97920.&lt;br /&gt;
Все тесты проводились на суперкомпьютере Ломоносов.&lt;br /&gt;
&lt;br /&gt;
Общее время расчета алгоритма:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_global.png|center]]&lt;br /&gt;
&lt;br /&gt;
Некоторое среднее время решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES с помощью пакета PETSc. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_local_sys.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Н.А. Дианский. Моделирование циркуляции океана.&lt;br /&gt;
* К.М. Терехов. Параллельная реализация модели общей циркуляции оке­ана // Сборник тезисов лучших дипломных работ 2010.  ВМИК МГУ, Москва.&lt;br /&gt;
* PETSc [https://www.mcs.anl.gov/petsc/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19741</id>
		<title>Участник:Andrclive/Уравнения мелкой воды</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19741"/>
		<updated>2016-11-30T19:21:56Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:andrclive|А.В.Чаплыгин]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&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; \zeta &amp;lt;&amp;lt; H &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; - это отклонение уровня,&lt;br /&gt;
а &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; - глубина, имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{\partial u}{\partial t} - lv = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial v}{\partial t} + lu = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial \zeta}{\partial t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u, v &amp;lt;/math&amp;gt; - зональная и меридиональная компоненты скорости,&lt;br /&gt;
&amp;lt;math&amp;gt; l &amp;lt;/math&amp;gt; - параметр Кориолиса,&lt;br /&gt;
&amp;lt;math&amp;gt; r_x, r_y &amp;lt;/math&amp;gt; - метрические коэффициенты,&lt;br /&gt;
&amp;lt;math&amp;gt; p_a &amp;lt;/math&amp;gt; - атмосферное давление на поверхности,&lt;br /&gt;
&amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; - ускорение свободного падения,&lt;br /&gt;
&amp;lt;math&amp;gt; \rho_0 &amp;lt;/math&amp;gt; - средняя плотность жидкости.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения уравнений применяется техника построения разностных аппроксимаций по пространству второго порядка точности (в случае равномерной сетки)&lt;br /&gt;
на разнесенной &amp;quot;C&amp;quot; - сетке классификации Аракавы.&lt;br /&gt;
Уравнения требуют совместного решения сразу трех уравнений, записанных с использованием неявной схемы по времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{u^{j+1} - u^j}{\delta t} - lv^{j+1} + ru^{j+1} = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{v^{j+1} - v^j}{\delta t} + lu^{j+1} + rv^{j+1} = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\zeta^{j+1} - \zeta^j}{\delta t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в первые два уравнения дополнительно введены слагаемые, которые можно рассматривать как рэлеевское трение с коэффициентом &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt; для&lt;br /&gt;
дополнительного стока импульса. Они необходимы для регуляризации задачи, поскольку система может быть вырожденной. &lt;br /&gt;
&lt;br /&gt;
После дискретизации получаем линейную систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, которую решаем итерационным методом GMRES.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Формирование матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; занимает довольно много времени и ресурсов при больших размерностях задачи, но матрица генерируется всего один раз в программе, в начале, затем на каждом шаге по времени генерируется правая часть &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; и решается система &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;.&lt;br /&gt;
В процессе решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; получается 7-диагональная плохо обусловленная матрица. Решать такую систему на каждом шаге по времени довольно затруднительно, особенно если шагов по времени довольно много, и поэтому основное время алгоритма приходится именно на этот этап.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW.png|center]]&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Параллельная реализация алгоритма использует метод двумерной декомпозиции области. При запуске программы из полученного числа процессоров формируется&lt;br /&gt;
двумерная сетка, которая накладывается на рабочие массивы (&amp;lt;math&amp;gt; u, v, \zeta &amp;lt;/math&amp;gt;) во вертикале и горизонтали, в итоге каждый процессор получает свой блок из общего массива над которым он будет выполнять работу. На рисунке изображен пример разбиения массива по процессорной сетке:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_grid.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Дополнительные внерасчетные границы добавляются, чтобы производить обмен зависимыми данными между процессорами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_border.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Приведем схему, показывающая структуру работы параллельной версии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_MPI.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Задача рассчитывалась на сетке (1, 254)X(1, 128), на 5 дней с шагом по времени 1800 секунд (пол часа). &lt;br /&gt;
Матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на такой сетке имеет размеры 97920 на 97920.&lt;br /&gt;
Все тесты проводились на суперкомпьютере Ломоносов.&lt;br /&gt;
&lt;br /&gt;
Общее время расчета алгоритма:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_global.png|center]]&lt;br /&gt;
&lt;br /&gt;
Время решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES с помощью пакета PETSc для 50 итераций:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_local_sys.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для многих пар алгоритм+компьютер уже созданы хорошие реализации, которыми можно и нужно пользоваться на практике. Данный раздел предназначен для того, чтобы дать ссылки на основные существующие последовательные и параллельные реализации алгоритма, доступные для использования уже сейчас. Указывается, является ли реализация коммерческой или свободной, под какой лицензией распространяется, приводится местоположение дистрибутива и имеющихся описаний. Если есть информация об особенностях, достоинствах и/или недостатках различных реализаций, то это также нужно здесь указать. Хорошими примерами реализации многих алгоритмов являются MKL, ScaLAPACK, PETSc, FFTW, ATLAS, Magma и другие подобные библиотеки.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_MPI.png&amp;diff=19740</id>
		<title>Файл:SW MPI.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_MPI.png&amp;diff=19740"/>
		<updated>2016-11-30T19:21:22Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19315</id>
		<title>Участник:Andrclive/Уравнения мелкой воды</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:Andrclive/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B9_%D0%B2%D0%BE%D0%B4%D1%8B&amp;diff=19315"/>
		<updated>2016-11-28T00:49:46Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: Новая страница: «Основные авторы описания: А.В.Чаплыгин  = Свойства и структура алгоритмо…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:andrclive|А.В.Чаплыгин]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&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; \zeta &amp;lt;&amp;lt; H &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; - это отклонение уровня,&lt;br /&gt;
а &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; - глубина, имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{\partial u}{\partial t} - lv = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial v}{\partial t} + lu = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\partial \zeta}{\partial t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u, v &amp;lt;/math&amp;gt; - зональная и меридиональная компоненты скорости,&lt;br /&gt;
&amp;lt;math&amp;gt; l &amp;lt;/math&amp;gt; - параметр Кориолиса,&lt;br /&gt;
&amp;lt;math&amp;gt; r_x, r_y &amp;lt;/math&amp;gt; - метрические коэффициенты,&lt;br /&gt;
&amp;lt;math&amp;gt; p_a &amp;lt;/math&amp;gt; - атмосферное давление на поверхности,&lt;br /&gt;
&amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; - ускорение свободного падения,&lt;br /&gt;
&amp;lt;math&amp;gt; \rho_0 &amp;lt;/math&amp;gt; - средняя плотность жидкости.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения уравнений применяется техника построения разностных аппроксимаций по пространству второго порядка точности (в случае равномерной сетки)&lt;br /&gt;
на разнесенной &amp;quot;C&amp;quot; - сетке классификации Аракавы.&lt;br /&gt;
Уравнения требуют совместного решения сразу трех уравнений, записанных с использованием неявной схемы по времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
  \begin{array}{ccc}&lt;br /&gt;
    \frac{u^{j+1} - u^j}{\delta t} - lv^{j+1} + ru^{j+1} = -\frac{1}{r_x}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial x} - g\frac{\partial \zeta}{\partial x} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{v^{j+1} - v^j}{\delta t} + lu^{j+1} + rv^{j+1} = -\frac{1}{r_y}( \frac{1}{\rho_0}\frac{\partial p_a}{\partial y} - g\frac{\partial \zeta}{\partial y} ) \\&lt;br /&gt;
    \\&lt;br /&gt;
    \frac{\zeta^{j+1} - \zeta^j}{\delta t} = \frac{1}{r_x r_y} ( \frac{\partial r_y u H}{\partial x} + \frac{\partial r_x v H}{\partial y} ) \\&lt;br /&gt;
   \end{array}&lt;br /&gt;
  \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в первые два уравнения дополнительно введены слагаемые, которые можно рассматривать как рэлеевское трение с коэффициентом &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt; для&lt;br /&gt;
дополнительного стока импульса. Они необходимы для регуляризации задачи, поскольку система может быть вырожденной. &lt;br /&gt;
&lt;br /&gt;
После дискретизации получаем линейную систему &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, которую решаем итерационным методом GMRES.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Формирование матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; занимает довольно много времени и ресурсов при больших размерностях задачи, но матрица генерируется всего один раз в программе, в начале, затем на каждом шаге по времени генерируется правая часть &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; и решается система &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;.&lt;br /&gt;
В процессе решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; получается 7-диагональная плохо обусловленная матрица. Решать такую систему на каждом шаге по времени довольно затруднительно, особенно если шагов по времени довольно много, и поэтому основное время алгоритма приходится именно на этот этап.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW.png|center]]&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Параллельная реализация алгоритма использует метод двумерной декомпозиции области. При запуске программы из полученного числа процессоров формируется&lt;br /&gt;
двумерная сетка, которая накладывается на рабочие массивы (&amp;lt;math&amp;gt; u, v, \zeta &amp;lt;/math&amp;gt;) во вертикале и горизонтали, в итоге каждый процессор получает свой блок из общего массива над которым он будет выполнять работу. На рисунке изображен пример разбиения массива по процессорной сетке:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_grid.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
Дополнительные внерасчетные границы добавляются, чтобы производить обмен зависимыми данными между процессорами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_proc_border.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Приведем информационный граф работы параллельной версии:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Задача рассчитывалась на сетке (1, 254)X(1, 128), на 5 дней с шагом по времени 1800 секунд (пол часа). &lt;br /&gt;
Матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на такой сетке имеет размеры 97920 на 97920.&lt;br /&gt;
Все тесты проводились на суперкомпьютере Ломоносов.&lt;br /&gt;
&lt;br /&gt;
Общее время расчета алгоритма:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_global.png|center]]&lt;br /&gt;
&lt;br /&gt;
Время решения системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; методом GMRES с помощью пакета PETSc для 50 итераций:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SW_local_sys.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для многих пар алгоритм+компьютер уже созданы хорошие реализации, которыми можно и нужно пользоваться на практике. Данный раздел предназначен для того, чтобы дать ссылки на основные существующие последовательные и параллельные реализации алгоритма, доступные для использования уже сейчас. Указывается, является ли реализация коммерческой или свободной, под какой лицензией распространяется, приводится местоположение дистрибутива и имеющихся описаний. Если есть информация об особенностях, достоинствах и/или недостатках различных реализаций, то это также нужно здесь указать. Хорошими примерами реализации многих алгоритмов являются MKL, ScaLAPACK, PETSc, FFTW, ATLAS, Magma и другие подобные библиотеки.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_local_sys.png&amp;diff=19314</id>
		<title>Файл:SW local sys.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_local_sys.png&amp;diff=19314"/>
		<updated>2016-11-28T00:33:58Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_global.png&amp;diff=19313</id>
		<title>Файл:SW global.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_global.png&amp;diff=19313"/>
		<updated>2016-11-28T00:33:46Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_proc_border.png&amp;diff=19311</id>
		<title>Файл:SW proc border.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_proc_border.png&amp;diff=19311"/>
		<updated>2016-11-27T23:31:46Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_proc_grid.png&amp;diff=19310</id>
		<title>Файл:SW proc grid.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW_proc_grid.png&amp;diff=19310"/>
		<updated>2016-11-27T23:23:34Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW.png&amp;diff=19309</id>
		<title>Файл:SW.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SW.png&amp;diff=19309"/>
		<updated>2016-11-27T23:06:13Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive&amp;diff=19300</id>
		<title>Участник:Andrclive</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:Andrclive&amp;diff=19300"/>
		<updated>2016-11-27T20:50:00Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Чаплыгин Андрей Викторович&lt;br /&gt;
&lt;br /&gt;
ВМК МГУ&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive&amp;diff=19298</id>
		<title>Участник:Andrclive</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:Andrclive&amp;diff=19298"/>
		<updated>2016-11-27T20:49:29Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Чаплыгин Андрей Викторович&lt;br /&gt;
ВМК МГУ&lt;/div&gt;</summary>
		<author><name>Andrclive</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:Andrclive&amp;diff=19297</id>
		<title>Участник:Andrclive</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:Andrclive&amp;diff=19297"/>
		<updated>2016-11-27T20:46:55Z</updated>

		<summary type="html">&lt;p&gt;Andrclive: Создана пустая страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrclive</name></author>
	</entry>
</feed>