Вперед: 5.2.5. Пример использования библиотеки Aztec
Назад: 5.2.3. Основные подпрограммы библиотеки Aztec
К содержанию: Оглавление


5.2.4. Хранение разреженных матриц в MSR формате

При использовании пакета Aztec самой сложной задачей для программиста является формирование надлежащим образом распределенной по процессорам матрицы. На рисунке 5.13 представлен пример разреженной матрицы размера 6x6. Предположим, что мы хотим распределить ее в 3 процессора (нумерация процессоров с 0). Если бы мы воспользовались процедурой AZ_read_update, то, скорее всего, для каждого процессора значение переменной N_update было бы установлено равным 2, а в массив update на процессорах были бы занесены значения (0,1),(2,3),(4,5) соответственно. Однако, для общности, рассмотрим другой вариант распределения. Пусть 0-й процессор хранит нулевую, первую и третью строки, 1-й процессор - одну четвертую строку, 2-й процессор - вторую и пятую строки. Этим самым мы однозначно задаем значения переменной N_update и массива update. Наша задача состоит в том, чтобы заполнить массивы bindx и val так, чтобы они адекватно описывали принятое распределение.

Массив val формируется следующим образом. Сначала в этот массив заносятся диагональные элементы хранимых строк, одна позиция пропускается (это сделано для соответствия с bindx) и затем, строка за строкой, в массив заносятся недиагональные ненулевые элементы строк (в том порядке, в котором они перечислены в массиве update).

В начале массива bindx хранятся номера позиций, с которых в массиве val начинаются недиагональные элементы соответствующей строки (включая и первую несуществующую - для того, чтобы можно было определить, сколько элементов в последней строке). Далее в массиве следуют номера столбцов, соответствующих ненулевым матричным элементам. Значения, которые должны быть занесены в соответствующие массивы в каждом процессоре, приведены ниже на Рис 5.13. Напоминаем, что индексация массивов начинается с 0.

Разреженная исходная матрица

Рис. 5.13. Разреженная исходная матрица

Приведем значения переменных и массивов, которые надо установить для обеспечения требуемого способа распределения элементов матрицы.

Процессор 0:

N_update:3
update:013
Index:012345678910111213
bindx:479141340301245
N_update:a00a11a33--a01a03a04a10a13a30a31a32a34a35

Процессор 1:

N_update:1
update:4
Index:01234
bindx:25023
N_update:a44--a40a42a43

Процессор 2:

N_update:2
update:25
Index:01234567
bindx:36834523
N_update:a22a55--a23a24a25a52a53

На практике, как было сказано выше, библиотека Aztec применяется для решения систем линейных алгебраических уравнений, возникающих при решении дифференциальных уравнений в частных производных. Для таких матриц, как правило, заранее известно количество ненулевых матричных элементов в строке и их местоположение в матрице, поэтому алгоритмы заполнения массивов val и bindx бывают достаточно простые.



Вперед: 5.2.5. Пример использования библиотеки Aztec
Назад: 5.2.3. Основные подпрограммы библиотеки Aztec
К содержанию: Оглавление