Решение системы с симметричной положительно определенной матрицей методом Холецкого и оценка обратного числа обусловленности
Подпрограмма вычисляет решение вещественной системы линейных уравнений
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 или sub(A) = L * LT , где U - верхняя треугольная матрица, L - нижняя треугольная матрица.
Полученное разложение используется затем для оценки числа обусловленности матрицы A. Если обратное число обусловленности оказывается меньше машинной точности, выдается диагностическое сообщение о вырожденности матрицы sub(A). В противном случае ищется решение указанной выше системы уравнений.
Матрицы A и B должны быть заданы в виде массивов двойной точности. Все вычисления проводятся в режиме DOUBLE PRECISION.
Литература:
http://www.netlib.org/scalapack/slug/index.html
CALL PDPOSV1 ( UPLO, N, NRHS, A, IA, JA, DESCA, B, IB, JB, DESCB, RCOND, WORK, LWORK, IWORK, LIWORK, 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, LOCc ( JB + NRHS - 1)); на входе - это локальные куски правой части распределенной матрицы sub (B); на выходе, если INFO = 0, на месте sub (B) записывается решение системы в виде распределенной матрицы X (локальный входной и локальный выходной параметр); |
IB - | номер строки в глобальном массиве B, указывающий на первую строку подматрицы sub (B) (глобальный входной параметр); |
JB - | номер столбца в глобальном массиве B, указывающий на первый столбец подматрицы sub (B) (глобальный входной параметр); |
DESCB - |
дескриптор распределенной матрицы B (одномерный массив длины DLEN_); DESCB содержит информацию о размещении B в памяти; полное описание DESCB см. в разделе документации "Дескрипторы глобальных массивов" (глобальный входной параметр); |
RCOND - |
оценка обратного числа обусловленности матрицы A ( IA : IA + N - 1, JA : JA + N - 1); если RCOND меньше машинной точности (машинного epsilon) (в частности, если RCOND = 0), матрица A считается вырожденной; в этом случае код возврата INFO > 0 (глобальный выходной параметр, тип DOUBLE PRECISION); |
WORK - |
одномерный рабочий массив двойной точности длины LWORK; на выходе - WORK (1) содержит минимальную требуемую величину LWORK (локальное рабочее пространство, локальный выходной параметр); |
LWORK - |
размер рабочего пространства (массива) WORK; LWORK - локальный
входной параметр и должен быть не меньше, чем LWORK = PDPOCON ( LWORK ) + LOCr ( N_A); где PDPOCON ( LWORK ) означает величину рабочего массива WORK, которая требуется при работе вызываемой подпрограммы PDPOCON (см.ниже); смысл обозначений LOCr (...) и LOCc (...) можно найти в разделах документации "Схема размещения в локальной памяти и блочно - циклическое отображение плотных матриц" и "Пример блочно - циклического распределения плотной матрицы по решетке процессов"; минимальная требуемая величина LWORK может быть вычислена самой подпрограммой, если к ней обратиться со значением LWORK = - 1; при этом подпрограмма не производит никаких других вычислений, а требуемое значение LWORK возвращается в элементе массива WORK (1); при этом сообщений об ошибках не выдается (локальный или глобальный входной параметр); |
IWORK - | одномерный рабочий массив целого типа длины LIWORK; на выходе IWORK (1) содержит минимальную требуемую величину LIWORK (локальное рабочее пространство, локальный выходной параметр); |
LIWORK - |
размер рабочего пространства (массива) IWORK;
LIWORK - локальный входной параметр и должен быть не меньше,
чем LIWORK = LOCr ( N_A); см. раздел документации "Схема размещения в локальной памяти и блочно - циклическое отображение плотных матриц"; минимальная требуемая величина LIWORK может быть вычислена самой подпрограммой, если к ней обратиться со значением LIWORK = - 1; при этом подпрограмма не производит никаких других вычислений, а требуемое значение LIWORK возвращается в элементе массива IWORK (1); при этом сообщений об ошибках не выдается (локальный или глобальный входной параметр, тип INTEGER); |
INFO - | целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр) |
= 0 - | успешное завершение работы; |
< 0 - |
если i - ый фактический параметр является массивом
и его j - ый элемент имеет недопустимое значение,
то INFO = - ( i * 100 + j ), если i - ый фактический параметр является скаляром и имеет недопустимое значение, то INFO = - i; |
> 0 - | если INFO = k, и |
k Ј N - |
то ведущий (угловой) минор порядка k матрицы A ( IA : IA + k - 1, JA : JA + k - 1) не является положительно определенным, и разложение матрицы не может быть завершено, а решение системы не может быть найдено; |
k = N + 1 - | то RCOND меньше машинной точности; разложение завершено, но матрица считается вырожденной и решение системы не может быть найдено. |
Версии
PSPOSV1 - PCPOSV1 PZPOSV1 | решение системы с симметричной (эрмитовой) положительно определенной матрицей методом Холецкого и оценка обратного числа обусловленности для вещественных данных одинарной точности, комплексных данных одинарной точности и комплексных данных двойной точности соответственно |
Вызываемые подпрограммы
Здесь указаны только базовые подпрограммы (2 - ого уровня), которые вызываются из целевой подпрограммы (1 - ого уровня).
PDPOTRF - PZPOTRF | Треугольное разложение симметричной (эрмитовой) положительно определенной матрицы методом Холецкого |
PDPOTRS - PZPOTRS | Решение системы с симметричной (эрмитовой) положительно определенной матрицей с использованием разложения Холецкого, полученного подпрограммой PDPOTRF(PZPOTRF) |
PDPOCON - PZPOCON | Оценка обратного числа обусловленности симметричной (эрмитовой) положительно определенной матрицы |
Замечания по использованию
1. | В подпрограммах PSPOSV1, PCPOSV1, PZPOSV1 параметры A, B и WORK имеют тип REAL, COMPLEX и DOUBLE COMPLEX соответственно | |
2. | В версии подпрограммы PZPOSV1 вместо параметров IWORK и LIWORK целого типа используются параметры с именами RWORK и LRWORK. При этом параметр RWORK имеет тип DOUBLE PRECISION, а параметр LRWORK і 2 * LOCc (N_A). | |
3. | Используются подпрограммы BLACS_GRIDINFO ( из пакета BLACS), PXERBA ( из пакета PBLAS), CHK1MAT, PCHK2MAT, INDXG2P, INFOG2L, 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 |
Фрагмент фортранного текста вызывающей программы
Полный текст теста можно получить в
tdposv1.zip,
а принятые обозначения - посмотреть в разделе документации
"Обозначения и упрощения в примерах
по использованию подпрограмм комплекса";
в тесте используются: служебная подпрограмма
PDELSET (для распределения элементов
глобальной матрицы/вектора по паралельным процессам) и служебная подпрограмма
PDLAPRNT (для выборки и распечатки элементов
распределенной матрицы/вектора единым массивом)
PROGRAM TDPOSV1 include 'mpif.h' INTEGER DLEN_, IA, JA, IB, JB, M, N, MB, NB, RSRC, $ CSRC, MXLLDA, MXLLDB, NRHS, NBRHS, NOUT, $ MXLOCR, MXLOCC, MXRHSC, LWORK, LIWORK * 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, LIWORK = 5, LWORK = 24 ) * $ MXRHSC = 1, LIWORK = -1, LWORK = -1 ) * CHARACTER UPLO PARAMETER ( UPLO = 'U' ) INTEGER ICTXT, INFO, MYCOL, MYROW, NPCOL, NPROW DOUBLE PRECISION RCOND * INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), $ IWORK( LIWORK ) * $ IWORK( 5 ) DOUBLE PRECISION A( MXLLDA, MXLOCC ), B( MXLLDB, MXRHSC ), $ WORK1( NB ), WORK( LWORK ) * $ WORK1( NB ), WORK( 24 ) * EXTERNAL BLACS_EXIT, BLACS_GRIDEXIT, BLACS_GRIDINFO, $ DESCINIT, PDMATINIT, PDPOSV1, 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 PDPOSV1( UPLO, N, NRHS, A, IA, JA, DESCA, $ B, IB, JB, DESCB, RCOND, WORK, LWORK, $ IWORK, LIWORK, 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, RCOND = 0.55555556D-02