Схема размещения в локальной памяти трехдиагональных матриц.

Рассмотрим пример трехдиагональной глобальной матрицы  A размером 7 * 7 ( N_A = 7)

a11 a12 0 0 0 0 0
a21 a22 a23 0 0 0 0
0 a32 a33 a34 0 0 0
0 0 a43 a44 a45 0 0
0 0 0 a54 a55 a56 0
0 0 0 0 a65 a66 a67
0 0 0 0 0 a76 a77

Как и ленточные матрицы, трехдиагональные следует распределять по одномерной решетке процессов. Пусть нам необходимо распределить указанную матрицу по решетке процессов 1 * 3.

1. Если матрица A несимметричная,
она представляется в памяти в виде трех отдельных векторов ( D, DL, DU ), каждый из которых содержит элементы одной из диагоналей.

Все три вектора должны иметь одинаковую длину, равную длине вектора главной диагонали ( D ), т.е. быть выровнены. В нашем примере длина всех векторов должна быть равна 7. При этом элементы нижней диагонали должны быть сдвинуты к концу вектора  DL, т.е. первый элемент нижней диагонали должен занимать положение второго элемента вектора  DL. И, наоборот, элементы верхней диагонали должны быть сдвинуты к началу вектора  DU, т.е. ее последний элемент должен занимать положение предпоследнего элемента вектора DU.

Сказанное проиллюстрировано на рисунке ниже. На нем также показано, как эти векторы должны быть разделены на блоки (если величина блока  NB_A выбрана равной 3). Как и в случае ленточных матриц, здесь действует аналогичное правило: в локальную память каждого из процессов должен быть распределен один блок главной диагонали матрицы  A, а также по одному блоку двух других диагоналей.

                                          Процессы
(0,0) (0,1) (0,2)
DL
D
DU
 *   a21  a32
a11  a22  a33
a12  a23  a34
a43  a54  a65
a44  a55  a66
a45  a56  a67
a76
a77
 *

Символом "*" отмечены элементы, которые не используются при вычислениях.

2. Если трехдиагональная матрица A является симметричной положительно определенной,
она должна быть представлена в памяти в виде двух векторов, один из которых ( D ), содержит элементы главной диагонали, а другой ( E ) - элементы одной из кодиагоналей.

Если предполагается, что в памяти сохраняется нижняя диагональ матрицы  A (параметр UPLO в соответствующей подпрограмме полагается равным "L"), то вектор E содержит элементы нижней диагонали.

Если предполагается, что в памяти сохраняется верхняя диагональ матрицы  A (параметр UPLO полагается равным "U"), то вектор  E содержит элементы верхней диагонали. Оба вектора  D и E должны иметь одинаковую длину, равную длине вектора  D, т.е. быть выровнены. При этом элементы верхней или нижней диагонали сдвигаются к началу вектора  E, т.е. последний элемент кодиагонали становится предпоследним элементом вектора  E.

Сказанное проиллюстрировано на двух рисунках ниже (первый - для  UPLO = "L", второй - для  UPLO = "U"). На них также показано распределение векторов, разбитых на блоки длиной  NB_A = 3, в локальную память каждого из трех процессов.

                                          Процессы
(0,0) (0,1) (0,2)
D
E
a11  a22  a33
a21  a32  a43
a44  a55  a66
a54  a65  a76
a77
 
                                          Процессы
(0,0) (0,1) (0,2)
D
E
a11  a22  a33
a12  a23  a34
a44  a55  a66
a45  a56  a67
a77
 

Правила распределения по решетке процессов вектора (или матрицы) правых частей B, соответствующего ленточной или трехдиагональной матрице коэффициентов системы  A, можно найти в конце раздела документации Схема размещения в локальной памяти и блочно - столбцовое разбиение ленточных матриц".