Рассмотрим пример трехдиагональной глобальной матрицы 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.
Все три вектора должны иметь одинаковую длину, равную длине вектора главной диагонали ( 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 * |
Символом "*" отмечены элементы, которые не используются при вычислениях.
Если предполагается, что в памяти сохраняется нижняя диагональ матрицы 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, можно найти в конце раздела документации Схема размещения в локальной памяти и блочно - столбцовое разбиение ленточных матриц".