Решение системы с симметричной положительно определенной матрицей методом Холецкого
Подпрограмма вычисляет решение вещественной системы линейных уравнений
sub(A) * X = sub(B) ,
где sub(A) = A ( IA : IA+N-1, JA : JA+N-1) - квадратная
симметричная положительно определенная
распределенная матрица порядка N,
X - распределенная матрица размеров N на NRHS,
sub(B) = B ( IB : IB+N-1, JB : JB+NRHS-1) - распределенная
матрица размеров N на NRHS.
Используется разложение Холецкого для представления матрицы sub (A) в виде
sub(A) = UT * U , если UPLO = ' U ' , или
sub(A) = L * LT , если UPLO = ' L ' ,
где U - верхняя треугольная матрица,
L - нижняя треугольная матрица.
Полученное разложение используется затем для решения указанной выше системы уравнений.
Матрицы A и B должны быть заданы в виде массивов двойной точности. Все вычисления проводятся в режиме DOUBLE PRECISION.
Литература:
http://www.netlib.org/scalapack/slug/index.html
CALL PDPOSV ( UPLO, N, NRHS, A, IA, JA, DESCA,
B, IB, JB, DESCB, INFO)
Параметры
| UPLO - |
если UPLO = ' U ', сохраняется верхняя треугольная
подматрица sub(A),
если UPLO = ' L ', сохраняется нижняя треугольная
подматрица sub(A)
(глобальный входной параметр, тип символьный);
|
| N - | порядок распределенной подматрицы sub (A), N ≥ 0 (глобальный входной параметр, тип целый); |
| NRHS - | число правых частей, т.е. столбцов распределенной подматрицы sub (B), NRHS ≥ 0 (глобальный входной параметр, тип целый); |
| A - |
указатель на локальную память, занимаемую массивом
двойной точности размерности
( LLD_A, LOCc ( JA + N - 1)); на входе - этот массив содержит локальные части квадратной ( N на N ) симметричной распределенной матрицы sub (A), которая должна быть разложена; если UPLO = ' U ', главная (ведущая) верхняя треугольная часть матрицы sub (A) размера N на N содержит верхнюю треугольную часть распределенной матрицы, а ее строго нижняя треугольная часть (под главной диагональю) не используется; если UPLO = ' L ', ведущая нижняя треугольная часть матрицы sub (A) размера N на N содержит нижнюю треугольную часть распределенной матрицы, а ее строго верхняя треугольная часть (над главной диагональю) не используется; на выходе, если INFO = 0, этот массив содержит локальные части множителей U или L, полученные при разложении Холецкого sub (A) = UT * U или sub (A) = L * LT (локальный входной и локальный выходной параметр); |
| IA - | номер строки в глобальном массиве A, указывающий на первую строку подматрицы sub (A) (глобальный входной параметр, тип целый); |
| JA - | номер столбца в глобальном массиве A, указывающий первый столбец подматрицы sub (A) (глобальный входной параметр, тип целый); |
| DESCA - |
дескриптор распределенной матрицы A (одномерный массив длины DLEN_); DESCA содержит информацию о размещении A в памяти; полное описание DESCA см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр); |
| B - |
указатель на локальную память, занимаемую массивом
двойной точности размерности
( LLD_B, LOC ( JB + NRHS - 1)); на входе - это локальные куски правой части распределенной матрицы sub (B); на выходе, если INFO = 0, на месте sub (B) записывается решение системы в виде распределенной матрицы X (локальный входной и локальный выходной параметр); |
| IB - | номер строки в глобальном массиве B, указывающий на первую строку подматрицы sub (B) (глобальный входной параметр); |
| JB - | номер столбца в глобальном массиве B, указывающий на первый столбец подматрицы sub (B) (глобальный входной параметр); |
| DESCB - |
дескриптор распределенной матрицы B (одномерный массив длины DLEN_); DESCB содержит информацию о размещении B в памяти; полное описание DESCB см. в разделе документации "Дескрипторы глобальных массивов" (глобальный входной параметр); |
| INFO - | целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр) |
| = 0 - | успешное завершение работы; |
| < 0 - |
если i - ый фактический параметр является массивом
и его j - ый элемент имеет недопустимое значение, то INFO = - ( i * 100 + j ), если i - ый фактический параметр является скаляром и имеет недопустимое значение, то INFO = - i; |
| > 0 - |
если INFO = K, то ведущий (угловой) минор порядка K - A( IA : IA+K-1, JA : JA+K-1) не является положительно определенным, и разложение матрицы не может быть завершено, а решение системы не может быть найдено |
Версии
| PSPOSV - PCPOSV PZPOSV | решение системы с симметричной (эрмитовой) положительно определенной матрицей методом Холецкого для вещественных данных одинарной точности, комплексных данных одинарной точности и комплексных данных двойной точности соответственно |
Вызываемые подпрограммы
Здесь указаны только базовые подпрограммы (2 - ого уровня), которые вызываются из целевой подпрограммы (1 - ого уровня).
| PDPOTRF - PZPOTRF | Треугольное разложение симметричной (эрмитовой) положительно определенной матрицы методом Холецкого |
| PDPOTRS - PZPOTRS | Решение системы с симметричной (эрмитовой) положительно определенной матрицей с использованием разложения Холецкого, полученного подпрограммой PDPOTRF(PZPOTRF) |
Замечания по использованию
| 1. | В подпрограммах PSPOSV, PCPOSV, PZPOSV параметры A и B имеют тип REAL, COMPLEX и DOUBLE COMPLEX соответственно | |
| 2. | Используются подпрограммы BLACS_GRIDINFO ( из пакета BLACS), PXERBA ( из пакета PBLAS), CHK1MAT, PCHK2MAT, INDXG2P, LSAME ( из библиотеки ScaLAPACK_TOOLS) |
Решается система уравнений A X = B ,
где A - квадратная симметричная положительно определенная матрица порядка 9
Пусть матрица А системы имеет вид:
| 2 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| -1 | 2 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 | |
| 0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 | |
| 0 | 0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | -1 | 2 | -1 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 1 |
Вектор правых частей В имеет вид:
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 1 |
Матрица разбивается на блоки размеров 2 на 2.
Осуществляется пропуск программы на 6 процессах
и используется двумерная решетка процессов 2 на 3.
Ниже показано, как разбитая на блоки матрица A распределяется
(блочно-циклически) по решетке процессов 2 * 3.
| 0 | 1 | 2 | |||
| 0 |
2 -1 -1 2 |
0 0 0 0 |
0 0 -1 0 |
0 0 |
0 0 0 0 |
|
0 0 0 0 |
0 0 -1 0 |
0 -1 0 0 |
0 0 |
2 -1 -1 2 | |
| 0 0 | 0 -1 | 0 0 | 1 | 0 0 | |
| 1 |
0 -1 0 0 |
0 0 0 0 |
2 -1 -1 2 |
0 0 |
0 0 -1 0 |
|
0 0 0 0 |
2 -1 -1 2 |
0 0 0 0 |
0 -1 |
0 -1 0 0 | |
Распределение матрицы B (блочно-циклическое) по процессам
| 0 | 1 | 2 | |
| 0 |
0 0 | ||
|
0 0 | |||
| 1 | |||
| 1 |
0 0 | ||
|
0 0 |
Фрагмент фортранного текста вызывающей программы
(полный текст теста можно получить в
tpdposv.zip,
а принятые обозначения - посмотреть в разделе документации
"Обозначения и упрощения в примерах
по использованию подпрограмм комплекса")
PROGRAM TPDPOSV
include 'mpif.h'
INTEGER DLEN_, IA, JA, IB, JB, M, N, MB, NB, RSRC,
$ CSRC, MXLLDA, MXLLDB, NRHS, NBRHS, NOUT,
$ MXLOCR, MXLOCC, MXRHSC
PARAMETER ( DLEN_ = 9, IA = 1, JA = 1, IB = 1, JB = 1,
$ M = 9, N = 9, MB = 2, NB = 2, RSRC = 0,
$ CSRC = 0, MXLLDA = 5, MXLLDB = 5, NRHS = 1,
$ NBRHS = 1, NOUT = 6, MXLOCR = 5, MXLOCC = 4,
$ MXRHSC = 1 )
CHARACTER UPLO
PARAMETER ( UPLO = 'U' )
INTEGER ICTXT, INFO, MYCOL, MYROW, NPCOL, NPROW
DOUBLE PRECISION ANORM, BNORM, EPS, RESID, XNORM
INTEGER DESCA( DLEN_ ), DESCB( DLEN_ )
DOUBLE PRECISION A( MXLLDA, MXLOCC ), B( MXLLDB, MXRHSC ),
$ WORK( MXLOCR )
EXTERNAL BLACS_EXIT, BLACS_GRIDEXIT, BLACS_GRIDINFO,
$ DESCINIT, PDMATINIT, PDPOSV, SL_INIT
DATA NPROW / 2 / , NPCOL / 3 /
CALL SL_INIT( ICTXT, NPROW, NPCOL )
CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
IF( MYROW.EQ.-1 ) GO TO 10
CALL DESCINIT( DESCA, M, N, MB, NB, RSRC, CSRC, ICTXT, MXLLDA,
$ INFO )
CALL DESCINIT( DESCB, N, NRHS, NB, NBRHS, RSRC, CSRC, ICTXT,
$ MXLLDB, INFO )
CALL PDMATINIT( N, A, IA, JA, DESCA, B, IB, JB, DESCB, INFO )
CALL PDPOSV( UPLO, N, NRHS, A, IA, JA, DESCA,
$ B, IB, JB, DESCB, INFO)
CALL BLACS_GRIDEXIT( ICTXT )
10 CONTINUE
CALL BLACS_EXIT( 0 )
STOP
END
*
SUBROUTINE PDMATINIT( N, A, IA, JA, DESCA, B, IB, JB, DESCB, INFO )
* PDMATINIT генерирует и распределяет матрицы A и B по решетке процессов 2 x 3
*
INTEGER DESCA( * ), DESCB( * ), N, IA, JA, IB, JB,
$ INFO
DOUBLE PRECISION A( * ), B( * )
*
INTEGER I, J
DOUBLE PRECISION T, MO, Z
*
EXTERNAL PDELSET
*
T = 2.0D0
MO = -1.0D0
Z = 0.0D0
*
DO 20 J = 1, N
DO 10 I = 1, N
IF( I.EQ.J ) THEN
CALL PDELSET( A, I, J, DESCA, T )
ELSE
CALL PDELSET( A, I, J ,DESCA, Z )
END IF
10 CONTINUE
20 CONTINUE
CALL PDELSET( A, 9, 9, DESCA, 1.0D0 )
*
DO 40 I = 1, N-1
J = I + 1
CALL PDELSET( A, I, J, DESCA, MO )
40 CONTINUE
DO 50 J = 1, N-1
I = J + 1
CALL PDELSET( A, I, J, DESCA, MO )
50 CONTINUE
J = 1
DO 30 I = 1, N
CALL PDELSET( B, I, J, DESCB, Z )
30 CONTINUE
CALL PDELSET( B, 9, 1, DESCB, 1.0D0 )
*
RETURN
END
Результаты:
Решение системы
X = ( 1.D0, 2.D0, 3.D0, 4.D0, 5.D0, 6.D0, 7.D0, 8.D0, 9.D0 )
Значение INFO = 0