<?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=S+s+serov</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=S+s+serov"/>
	<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/S_s_serov"/>
	<updated>2026-10-22T20:10:11Z</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24985</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24985"/>
		<updated>2017-12-04T20:20:36Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Чтение входных параметров: количества слоёв в геометрической модели, количества ячеек сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и количества ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а также количества итераций и границ рассматриваемого интервала по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление исходных значений участвующих в вычислениях величин во всех ячейках сеток по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части УП во всех точках сеток.&lt;br /&gt;
# Применение разностных схем для решения УП с известной правой частью в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для каждого значения &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Подсчет скалярного потока нейтронов в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational_graph.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначены вершины, производящие считывание данных, вычисление начальных значений необходимых переменных, а также вычисление правой части УП на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины, которые отвечают применению разностных схем для вычисления значений плотности потока нейтронов во всех ячейках сеток по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; последовательно и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначены вершины, отвечающие операции суммирования значений плотности потока нейтронов во всех ячейках сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для вычисления скалярного потока.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина, которая после завершения выполнения всех итераци, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24984</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24984"/>
		<updated>2017-12-04T20:08:36Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Чтение входных параметров: количества слоёв в геометрической модели, количества ячеек сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и количества ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а также количества итераций и границ рассматриваемого интервала по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление исходных значений участвующих в вычислениях величин во всех ячейках сеток по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части УП во всех точках сеток.&lt;br /&gt;
# Применение разностных схем для решения УП с известной правой частью в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для каждого значения &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Подсчет скалярного потока нейтронов в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational_graph.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:Informational_graph.svg&amp;diff=24983</id>
		<title>Файл:Informational graph.svg</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:Informational_graph.svg&amp;diff=24983"/>
		<updated>2017-12-04T20:06:47Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24949</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24949"/>
		<updated>2017-12-03T19:48:07Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Чтение входных параметров: количества слоёв в геометрической модели, количества ячеек сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и количества ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а также количества итераций и границ рассматриваемого интервала по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление исходных значений участвующих в вычислениях величин во всех ячейках сеток по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части УП во всех точках сеток.&lt;br /&gt;
# Применение разностных схем для решения УП с известной правой частью в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для каждого значения &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Подсчет скалярного потока нейтронов в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24947</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24947"/>
		<updated>2017-12-03T19:41:17Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Чтение входных параметров: количества слоёв в геометрической модели, количества ячеек сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и количества ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а также количества итераций и границ рассматриваемого интервала по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление исходных значений участвующих в вычислениях величин во всех ячейках сеток по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части УП во всех точках сеток.&lt;br /&gt;
# Применение разностных схем для решения УП с известной правой частью в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для каждого значения &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24940</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24940"/>
		<updated>2017-12-03T18:48:43Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Чтение входных параметров: количества слоёв в геометрической модели, количества ячеек сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и количества ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление исходных значений участвующих в вычислениях величин во всех ячейках сеток по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Вычисление правой части УП во всех точках сеток.&lt;br /&gt;
# Решение УП с известной правой частью в каждой точке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для каждого значения &amp;lt;math&amp;gt;\mu&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;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24935</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24935"/>
		<updated>2017-12-03T18:36:46Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24934</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24934"/>
		<updated>2017-12-03T18:36:13Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; делений, умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24719</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24719"/>
		<updated>2017-11-30T20:17:09Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10. Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24718</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24718"/>
		<updated>2017-11-30T20:16:14Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10.Геометрическую модель задачи для положительной полуоси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24714</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24714"/>
		<updated>2017-11-30T20:14:38Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10.Геометрическую модель задачи для положительно полуоси $x$ приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24713</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24713"/>
		<updated>2017-11-30T20:14:04Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10.Геометрическую модель задачи для положительно полуоси $x$ приведем на следующем рисунке.&lt;br /&gt;
&lt;br /&gt;
[[File:Geom_real.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:Geom_real.jpg&amp;diff=24712</id>
		<title>Файл:Geom real.jpg</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:Geom_real.jpg&amp;diff=24712"/>
		<updated>2017-11-30T20:13:56Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24654</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24654"/>
		<updated>2017-11-30T15:36:11Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;, количество областей по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; равно 10.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация на языке Fortran, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24648</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24648"/>
		<updated>2017-11-30T15:06:57Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим, что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24646</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24646"/>
		<updated>2017-11-30T14:56:59Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
DSn-метод решения уравнения переноса [http://www.oecd-nea.org/tools/abstract/detail/ccc-0514/ реализован] в параллельном режиме компанией EG$G, Idaho Inc. в США на языке Fortran.&lt;br /&gt;
&lt;br /&gt;
Также существует реализация, [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=vmp&amp;amp;paperid=361&amp;amp;option_lang=rus созданная] в ИПМ имени Келдыша в Москве.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24645</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24645"/>
		<updated>2017-11-30T14:30:56Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24644</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24644"/>
		<updated>2017-11-30T14:28:27Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений, делений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений, делений и и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24643</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24643"/>
		<updated>2017-11-30T14:04:08Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для значений &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; и слева направо &amp;amp;mdash; для значений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем. Далее приведем формулы для прохода слева направо:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24642</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24642"/>
		<updated>2017-11-30T13:59:18Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя. Это необходимо проделать как для положительных, так и для отрицательных значений &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; при проходах слева направо и справа налево. Далее приводятся формулы для прохода слева направо.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24641</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24641"/>
		<updated>2017-11-30T13:49:43Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем вакуумные краевые условия &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24640</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24640"/>
		<updated>2017-11-30T13:47:04Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24639</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24639"/>
		<updated>2017-11-30T13:45:54Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы: &amp;lt;math&amp;gt;N(x_{min},\mu) = 0, \forall \mu \in [0, 1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24638</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24638"/>
		<updated>2017-11-30T13:44:50Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;. На левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы точно такие же вакуумные краевые условия для нейтронов, влетающих слева направо через левую границу системы.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24375</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24375"/>
		<updated>2017-11-28T00:14:40Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей, 417 гр.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
DSn-метод обладает свойством сильной масштабируемости, потому что график сильной масштабируемости имеет сильно выпуклый вид наподобие функции &amp;lt;math&amp;gt;\frac{1}{n}&amp;lt;/math&amp;gt;. Из графика коэффициентов распараллеливания видно, что при увеличении числа параллельных процессов до 200 и выше издержки на пересылку данных между процессами становятся значительнее, и график эмпирического коэффициента отклоняется от графика теоретического. Визуально это отклонение отражено на последнем графике, который свидетельствует о том, что при использовании до 100 процессов эффективность распараллеливания составляет более 0.8, что является очень хорошим показателем, а нижнего приемлемого значения 0.35 она почти достигает при числе процессов, равном 500. Это означает, что использование большего числа процессов в одном параллельном запуске будет уже неэффективно.&lt;br /&gt;
&lt;br /&gt;
Заметим. что при количестве процессов, равном 5, наблюдается заметное уменьшение эффективности. Это связано с тем, что запускается нечетное число процессов и взаимодействие между ними происходит медленнее, чем для четного числа процессов.&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24374</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24374"/>
		<updated>2017-11-27T23:57:22Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метода &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы в секундах для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график зависимости времени выполнения программы от количества параллельных процессов, иллюстрирующий сильную масштабируемость алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим графики теоретического и эмпирического коэффициентов распараллеливания в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Построим график коэффициента эффективности в зависимости от количества использованных параллельных процессов.&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24373</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24373"/>
		<updated>2017-11-27T23:54:01Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Приведем результаты запусков параллельной реализации DSn-метода решения УП для на суперкомпьютере &amp;quot;Ломоносов&amp;quot; для разного числа процессов. Использованные параметры: число ячеек сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;I = 80000&amp;lt;/math&amp;gt;, число ячеек сетки по оси &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;M = 1000&amp;lt;/math&amp;gt;, количество итераций метод &amp;lt;math&amp;gt;\nu_0 = 50&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В прикрепленной таблице содержатся времена выполнения программы для разного числа запущенных процессов. В следующих столбцах указаны среднее время по 3-м запускам (для 200 и 500 процессов --- по 1-му), теоретическое время работы программы (рассчитанное как отношение времени работы на одном процессе к количеству параллельных процессов), теоретический и эмпирический коэффициенты распараллеливания (рассчитанные как отношение теоретического и эмпирического времени работы на нескольких процессах ко времени работы на одном процессе) и коэффициент эффективности (рассчитанный как отношение эмпирического коэффициента распараллеливания к теоретическому).&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24372</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24372"/>
		<updated>2017-11-27T23:36:07Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24371</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24371"/>
		<updated>2017-11-27T23:35:29Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[File:Table_stats.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Strong_scalability.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Parallelizing_coef.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effectiveness_coef.jpg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:Effectiveness_coef.png&amp;diff=24370</id>
		<title>Файл:Effectiveness coef.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:Effectiveness_coef.png&amp;diff=24370"/>
		<updated>2017-11-27T23:31:53Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:Parallelizing_coef.png&amp;diff=24369</id>
		<title>Файл:Parallelizing coef.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:Parallelizing_coef.png&amp;diff=24369"/>
		<updated>2017-11-27T23:31:30Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:Strong_scalability.png&amp;diff=24368</id>
		<title>Файл:Strong scalability.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:Strong_scalability.png&amp;diff=24368"/>
		<updated>2017-11-27T23:31:11Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24323</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24323"/>
		<updated>2017-11-27T02:01:53Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24322</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24322"/>
		<updated>2017-11-27T02:01:23Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I)&amp;lt;/math&amp;gt; сложений и умножений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24321</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24321"/>
		<updated>2017-11-27T02:01:01Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Имея в распоряжении &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; процессов, мы имеем возможность производить вычисления плотности потоков нейтронов в ячейках сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; для разных значений косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; независимо друг от друга. Это означает, что каждый процесс по отдельности может вычислять правую часть уравнения переноса, а затем и решать его с использованием разностных схем для некоторых выделенных ему значений параметра &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, а лишь затем, в конце итерации, обмениваться вычисленными значениями с другими процессами для пересчета правой части уравнения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность параллельной реализации будет составлять&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I) сложений и умножений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24320</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24320"/>
		<updated>2017-11-27T01:21:03Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24319</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24319"/>
		<updated>2017-11-27T01:20:48Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с &#039;&#039;линейной&#039;&#039; сложностью.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24318</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24318"/>
		<updated>2017-11-27T01:20:17Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с линейной сложностью.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24317</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24317"/>
		<updated>2017-11-27T01:19:57Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для решения уравнения переноса DSn-методом на каждой итерации требуется:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(I*M) умножений и сложений.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, последовательная сложность всего алгоритма составляет:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(\nu_0*I*M)&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, DSn-метод решения УП относится к алгоритмам с линейной сложностью.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24316</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24316"/>
		<updated>2017-11-27T01:01:13Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph2.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24315</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24315"/>
		<updated>2017-11-27T00:59:44Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Красным цветом&#039;&#039;&#039; обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Синим цветом&#039;&#039;&#039; обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на каждой итерации вычисляют сначала правую часть УП, а затем с помощью разностных схем --- значения плотности потока нейтронов во всех ячейках оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Желтым цветом&#039;&#039;&#039; обозначена вершина, отвечающая операции суммирования значений, насчитанных каждым процессом, и их рассылки всем участвующим в вычислениях процессам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Зеленым цветом&#039;&#039;&#039; обозначена вершина процесса, который, после завершения процессами выполнения всех итераций, собирает окончательные значения скалярного потока нейтронов в одном массиве и выводит результат работы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24314</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24314"/>
		<updated>2017-11-27T00:59:14Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
Красным цветом обозначена вершина процесса, считывающего данные, формирующего массивы исходных данных и рассылающего их всем остальным запущенным процессам, число которых меньше либо равно числу ячеек введенной сетки по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Синим цветом обозначены вершины всех процессов, которые для определенных ячеек сетки по &amp;lt;math&amp;gt;\mu&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;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24313</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24313"/>
		<updated>2017-11-27T00:21:24Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational graph.svg|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24312</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24312"/>
		<updated>2017-11-27T00:15:03Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Informational_graph.png|thumb|center|500px|]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24311</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24311"/>
		<updated>2017-11-26T23:15:23Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&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;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Характеристики программно-аппаратной среды ===&lt;br /&gt;
&lt;br /&gt;
Все вычисления были произведены на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для компиляции был использован компилятор языка C++ GNU 4.4.6, реализация MPI: Intel MPI 4.0.3.&lt;br /&gt;
&lt;br /&gt;
Вычисления производились в сегментах test, regular4 и regular6. Ограничений на время выполнения программы наложено не было.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24310</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24310"/>
		<updated>2017-11-26T23:12:11Z</updated>

		<summary type="html">&lt;p&gt;S s serov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&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;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24309</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24309"/>
		<updated>2017-11-26T23:11:07Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&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;
Входные данные: массив &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя, массив &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;3k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; --- количество слоев в геометрии задачи.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: массив &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24304</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24304"/>
		<updated>2017-11-26T22:32:17Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем:&lt;br /&gt;
##: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
##: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
##: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24303</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24303"/>
		<updated>2017-11-26T22:24:00Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем.&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24302</id>
		<title>Участник:S s serov/DSn-метод решения уравнения переноса</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:S_s_serov/DSn-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%B0&amp;diff=24302"/>
		<updated>2017-11-26T22:18:06Z</updated>

		<summary type="html">&lt;p&gt;S s serov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Серов Сергей&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Уравнение переноса нейтронов описывает процессы поглощения, рассеяния и размножения, происходящие в ядерном реакторе. Одним из популярных детерминистических методов его решения, как известно, является DSn-метод &amp;lt;ref name=&amp;quot;Karlson&amp;quot;&amp;gt;Карлсон Б.Г., Латроп К.Д. Теория переноса. Метод дискретных ординат. В сб.: Вычислительные методы в физике реакторов, М.: 1972, с. 102-157.&amp;lt;/ref&amp;gt;. Далее описывается DSn-метод решения стационарного одногруппового уравнения переноса нейтронов в 1D плоско-параллельной геометрии с изотропным рассеянием.&lt;br /&gt;
&lt;br /&gt;
Геометрическая модель решаемой задачи имеет следующий вид: перпендикулярно единственной участвующей в рассмотрении оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (будем считать, что она направлена слева направо) расположено несколько бесконечных по осям &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; плоско-параллельных слоев некоторого вещества (например, урана, свинца, воды, воздуха и т.д.) заданной толщины, прилегающих друг к другу.&lt;br /&gt;
&lt;br /&gt;
Само уравнение переноса (УП) нейтронов записывается в следующем виде:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mu \frac{dN(x,\mu)}{dx} + \sigma(x)N(x,\mu) = Q(x,\mu),&amp;lt;/math&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
:&amp;lt;math&amp;gt;Q(x,\mu) = \frac{\sigma_S^0(x)}{2}\int_{-1}^1 N(x,\mu&#039;)d\mu&#039; + \frac{1}{2}q(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используемые обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = cos(\theta)&amp;lt;/math&amp;gt; --- косинус угла &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между направлением полета нейтрона и положительным направлением оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; --- плотность потока нейтронов, летящих в заданном направлении &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; в слое с координатой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x) = \int_{-1}^1 N(x,\mu&#039;)d\mu&#039;&amp;lt;/math&amp;gt; --- скалярный поток нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; --- макроскопическое сечение взаимодействия нейтронов со средой в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, т.е. коэффициент обобщенного поглощения нейтронов физическим материалом, расположенным в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; --- изотропное макроскопическое сечение обобщенного рассеяния нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; среды, т.е. коэффициент обобщенного рассеяния нейтронов в этой точке среды;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; --- независимый изотропный источник нейтронов в точке &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одногрупповое УП является интегро-дифференциальным. Левая его часть представляет собой обыкновенный дифференциальный оператор, который отвечает за пролет нейтронов через физическую среду. Правая часть УП содержит интеграл столкновений, который отвечает за рождение вторичных частиц в реакциях упругого и неупругого рассеяния, деления нейтронов, реакций типа &amp;lt;math&amp;gt;(n,2n)&amp;lt;/math&amp;gt; и других, а также независимый источник нейтронов. Целью решаемой задачи является нахождение плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; или скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Для решения задачи достаточно вычислить только скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;, так как дифференциальная плотность потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; может быть получена из решения ОДУ с известной правой частью, в которую входит скалярный поток &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;. Таким образом, целью расчета является нахождение стационарного (на бесконечности по времени) распределения плотности потока нейтронов &amp;lt;math&amp;gt;N(x,\mu)&amp;lt;/math&amp;gt; и скалярного потока &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого слоя вещества необходимый набор параметров (&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_S^0&amp;lt;/math&amp;gt;), задающих его физические свойства, известен, а также известны краевые условия на левом и правом концах рассматриваемой системы. В рассматриваемой постановке задачи мы считаем, что правее &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt; находится вакуум, то есть плотность потока нейтронов равна нулю по всем направлениям полета нейтронов, влетающих справа налево через правую границу системы: &amp;lt;math&amp;gt;N(x_{max},\mu) = 0, \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;; а на левой границе &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; заданы краевые условия зеркального отражения, при котором нейтроны, прилетевшие справа на левую границу, отражаются от нее, изменяя направление своего полета с &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;-\mu&amp;lt;/math&amp;gt;, то есть краевое условие имеет вид: &amp;lt;math&amp;gt;N(x_{min},-\mu) = N(x_{min},\mu), \forall \mu \in [-1, 0]&amp;lt;/math&amp;gt;.&lt;br /&gt;
Также значения параметров &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; будем считать постоянными в каждом из слоев. Слой с одинаковыми макросечениями и независимым источником нейтронов будем также называть областью.&lt;br /&gt;
&lt;br /&gt;
Для численного решения задачи вводятся 2 одномерные дискретные сетки: по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по косинусу угла &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому данный метод решения УП нейтронов и получил название метода дискретных ординат (по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; на плоскости &amp;lt;math&amp;gt;(x,\mu)&amp;lt;/math&amp;gt;), или DSn – метода&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&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;
* геометрическая модель задачи (количество слоев, их расположение на оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и толщина);&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_S^0(x)&amp;lt;/math&amp;gt; для каждого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; для каждого слоя.&lt;br /&gt;
&lt;br /&gt;
Параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; --- количество ячеек дискретной сетки по параметру &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\nu_0&amp;lt;/math&amp;gt; --- количество итераций по правой части УП.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;SN(x)&amp;lt;/math&amp;gt; для каждой ячейки введенной сетки.&lt;br /&gt;
&lt;br /&gt;
Введем дискретную сетку по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и по &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{X} = \{x_i, i \in \{1, \dots, I + 1\} | x_{i+1} = x_i + \Delta x, x_1 = x_{min}, \Delta x = \frac{x_{max} - x_{min}}{I}\},&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbb{M} = \{\mu_m, m \in \{1, \dots, M + 1\} | \mu_{m+1} = \mu_m + \Delta \mu, \mu_1 = -1, \Delta \mu = \frac{2}{M}\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
Середины ячеек соответствующих сеток будем обозначать как &amp;lt;math&amp;gt;x_{i+1/2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu_{m+1/2}&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;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Для решения интегро-дифференциального УП нейтронов используем метод итераций источника, то есть организуем итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; по правой части УП, которая называется источником (он является суммой интеграла столкновений и независимого источника нейтронов). Независимый источник &amp;lt;math&amp;gt;q_{i+1/2}&amp;lt;/math&amp;gt; от номера итерации не зависит и является постоянным на всех итерациях. Интеграл столкновений &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; нужно перевычислять на каждой итерации. Более конкретно, по уже известному с предыдущей итерации или из краевого условия распределению &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt; вычисляем правую часть УП, то есть &amp;lt;math&amp;gt;Q_{i+1/2}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i \in \{1, \dots, I\}&amp;lt;/math&amp;gt;. Далее задача сводится к решению ОДУ на каждой итерации по правой части УП.&lt;br /&gt;
# Алгоритм решения ОДУ на каждой итерации по правой части является неоднородным. Сначала рассчитываются все направления полета нейтронов с отрицательными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. При этом на правой границе системы задаются вакуумные краевые условия, то есть &amp;lt;math&amp;gt;N(x_{max},\mu)=0&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;. Расчет по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется справа налево, то есть по убыванию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. На левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; формируются краевые условия отражения &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; (для всех &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt;). Далее они будут использоваться как краевые условия на левой границе системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; при расчете всех направлений &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Рассчитываем все направления &amp;lt;math&amp;gt;\mu_{m+1/2} &amp;gt; 0&amp;lt;/math&amp;gt;. При этом порядок расчета по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; будет следующим: от левой границы системы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; к правой &amp;lt;math&amp;gt;x_{max}&amp;lt;/math&amp;gt;, то есть по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Чтобы &amp;quot;оттолкнуться&amp;quot; от левой границы &amp;lt;math&amp;gt;x_{min}&amp;lt;/math&amp;gt; используем уже сформированные при расчете случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; краевые условия &amp;lt;math&amp;gt;N_{Left}(\mu_{m+1/2})&amp;lt;/math&amp;gt; на левой границе системы. Продолжаем для случая &amp;lt;math&amp;gt;\mu &amp;gt; 0&amp;lt;/math&amp;gt; накапливать массив &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt;. В конце расчета всех &amp;lt;math&amp;gt;\mu_{m+1/2}&amp;lt;/math&amp;gt; в массиве &amp;lt;math&amp;gt;SN_{i+1/2}^{new}&amp;lt;/math&amp;gt; уже насчитаны новые значения &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; для следующей итерации &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Их нужно только присвоить в нужном месте программы снова в массив &amp;lt;math&amp;gt;SN_{i+1/2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Теперь опишем метод решения обыкновенного дифференциального уравнения с известной правой частью и используемые для этого разностные схемы&amp;lt;ref name=&amp;quot;Bass&amp;quot;&amp;gt;Басс Л.П., Волощенко А.М., Гермогенова Т.А. Методы дискретных ординат в задачах о переносе излучения, Препринт ИПМ АН СССР, М., 1986.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;. Также учитываем, что в указанной постановке задачи параметры &amp;lt;math&amp;gt;\sigma(x), \sigma_S^0(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q(x)&amp;lt;/math&amp;gt; заданы постоянными для каждого слоя.&lt;br /&gt;
#: Уравнение имеет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2} \frac{dN(x,\mu_{m+1/2})}{dx} + \sigma(x)N(x,\mu_{m+1/2}) = Q(x,\mu_{m+1/2}).&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Проинтегрируем его по ячейке &amp;lt;math&amp;gt;T_{i+1/2} = [x_i, x_{i+1}]&amp;lt;/math&amp;gt; и получим уравнение баланса нейтронов (сечение взаимодействия нейтронов со средой &amp;lt;math&amp;gt;\sigma(x) = Const&amp;lt;/math&amp;gt; в каждой области вещества и может быть вынесено за знак интеграла):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma(x) \int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Далее по теореме о среднем:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\int_{x_i}^{x_{i+1}} N(x,\mu_{m+1/2})dx = \bar{N}\cdot \Delta x, \int_{x_i}^{x_{i+1}} Q(x,\mu_{m+1/2})dx = \bar{Q}\cdot \Delta x, \Delta x = x_{i+1} - x_i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Тогда уравнение (называемое уравнением баланса) примет вид:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\mu_{m+1/2}(N_{i+1} - N_i) + \sigma \bar{N} \Delta x = \bar{Q} \Delta x.&amp;lt;/math&amp;gt;&lt;br /&gt;
# При решении УП нейтронов на основе традиционного DSn-метода обычно используются 2 основные конечно-разностные схемы&amp;lt;ref name=&amp;quot;Karlson&amp;quot; /&amp;gt;: DD (diamond difference) – алмазная и St (step) – шаговая. Приведем далее формулы, соответствующие случаю расчета всех направлений полета нейтронов с положительными &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Напомним, что в этом случае расчет по координате &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ведется по возрастанию индекса &amp;lt;math&amp;gt;i+1/2&amp;lt;/math&amp;gt;. Для случая &amp;lt;math&amp;gt;\mu &amp;lt; 0&amp;lt;/math&amp;gt; формулы для DD– и St– схем выводятся аналогично.&lt;br /&gt;
#: St-схема (шаговая) (&amp;lt;math&amp;gt;\bar{N} = N_{i+1})&amp;lt;/math&amp;gt;:&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}, N_{i+1} = \frac{\bar{Q} \Delta x + \mu_{m+1/2} N_i}{\sigma \Delta x + \mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: DD-схема (алмазная) (&amp;lt;math&amp;gt;\bar{N} = \frac{1}{2}(N_i + N_{i+1}), N_{i+1} = 2\bar{N} - N_i&amp;lt;/math&amp;gt;):&lt;br /&gt;
#: :&amp;lt;math&amp;gt;\bar{N} = \frac{\bar{Q} \Delta x + 2\mu_{m+1/2} N_i}{\sigma \Delta x + 2\mu_{m+1/2}}, N_{i+1} = \frac{2\bar{Q} \Delta x + (2\mu_{m+1/2} - \sigma \Delta x) N_i}{\sigma \Delta x + 2\mu_{m+1/2}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Алмазная DD-схема имеет 2-ой порядок аппроксимации и поэтому является более точной, чем St-схема 1-го порядка аппроксимации, однако не обладает свойствами положительности и монотонности, в отличие от последней, вследствие чего в некоторых случаях может давать отрицательные значения плотности потока, что недопустимо с точки зрения физики явления (невозможно в реальной физической ситуации). В связи с этим традиционный DSn–метод использует обе конечно-разностные схемы для обеспечения, с одной стороны, максимальной точности разностного решения, а с другой – гарантированной его неотрицательности, то есть физичности.&lt;br /&gt;
#: Переключающий критерий устроен следующим образом: если использование алмазной DD-схемы в какой либо ячейке сетки приводит к отрицательным значениям плотности потока внутри ячейки или на выходе из нее, то расчет этой же ячейки сетки проводится на основе использования шаговой St-схемы, гарантирующей неотрицательность сеточного решения.&lt;br /&gt;
&lt;br /&gt;
В случае использования подробных дискретных сеток время работы приведенного алгоритма может быть достаточно большим. В этом случае актуальной задачей является распараллеливание этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&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;
# Задать неотрицательное распределение скалярного потока нейтронов &amp;lt;math&amp;gt;SN&amp;lt;/math&amp;gt; в системе.&lt;br /&gt;
# На каждой итерации:&lt;br /&gt;
## Вычислить правую часть УП для каждой ячейки двумерной сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Провести вычисление плотностей потока нейтронов в каждой ячейке двумерной сетки справа налево по оси &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; с использованием алмазной и шаговой (при необходимости) разностных схем.&lt;br /&gt;
## Вычислить скалярный поток нейтронов в каждой ячейке сетки по &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; путем интегрирования плотностей потока нейтронов по всем значениям косинуса угла полета &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>S s serov</name></author>
	</entry>
</feed>