Решение системы с матрицей общего вида методом Гаусса с выбором ведущего элемента по столбцу
Подпрограмма вычисляет решение вещественной системы линейных уравнений
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.
Используется LU - разложение методом Гаусса с выбором ведущего элемента по столбцу для факторизации матрицы sub(A) в виде
sub(A) = P * L * U , где P - матрица перестановок, L - нижняя треугональная матрица с единичными диагональными элементами, U - верхняя треугональная матрица.
Матрицы L и U помещаются в памяти на место матрицы sub (A). Полученное LU - разложение используется для решения системы sub (A) * X = sub (B).
Матрицы A и B должны быть заданы в виде массивов двойной точности. Все вычисления проводятся в режиме DOUBLE PRECISION.
Литература:
http://www.srcc.msu.su/num_anal/
http://www.netlib.org/scalapack/slug/index.html
CALL PDGESV ( N, NRHS, A, IA, JA, DESCA, IPIV, B, IB, JB, DESCB, INFO)
Параметры
N - | порядок распределенной подматрицы sub (A), N і 0 (глобальный входной параметр, тип целый); |
NRHS - | число правых частей, т.е. число столбцов распределенной подматрицы sub (B), NRHS і 0 (глобальный входной параметр, тип целый); |
A - |
указатель на локальную память, занимаемую массивом двойной
точности размерности
( LLD_A, LOCc ( JA + N - 1)); на входе - это локальные части факторизуемой распределенной матрицы sub(A) порядка N; на выходе - массив A содержит локальные части множителей L и U, полученные при разложении (факторизации) подматрицы в виде sub (A) = P * L * U; единичные диагональные элементы матрицы L не хранятся в памяти (локальный входной и локальный выходной параметр); |
IA - | номер строки в глобальном массиве A, указывающий на первую строку подматрицы sub (A) (глобальный входной параметр, тип целый); |
JA - | номер столбца в глобальном массиве A, указывающий на первый столбец подматрицы sub (A) (глобальный входной параметр, тип целый); |
DESCA - | дескриптор распределенной матрицы A (одномерный массив длины DLEN_); подробное описание см. в п.5.2 (глобальный и локальный входной параметр, тип целый); |
IPIV - |
одномерный массив длины ( LOCr (M_A) + MB_A),
содержащий информацию о выборе ведущего элемента на каждом шаге
исключения Гаусса; элемент массива IPIV ( i ) содержит глобальный номер строки, которая переставляется со строкой, имеющей локальный номер i; этот массив содержит информацию о перестановках строк распределенной матрицы A (локальный выходной параметр, тип целый); |
B - |
указатель на локальную память, занимаемую массивом
двойной точности размерности
( LLD_B, LOCc ( JB + NRHS - 1)); на входе - это распределенная матрица sub (B) правой части; на выходе (если INFO = 0) на месте sub (B) находится распределенная матрица X, столбцы которой образуют NRHS векторов решений исходной системы (локальный входной и локальный выходной параметр); |
IB - | номер строки в глобальном массиве B, указывающий на первую строку подматрицы sub (B) (глобальный входной параметр, тип целый); |
JB - | номер столбца в глобальном массиве B, указывающий на первый столбец подматрицы sub (B) (глобальный входной параметр, тип целый); |
DESCB - | дескриптор распределенной матрицы B (одномерный массив длины DLEN_); подробное описание см. в п.3 (глобальный и локальный входной параметр, тип целый); |
INFO - | целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр) |
= 0 - | успешное завершение работы; |
< 0 - |
если i - ый фактический параметр является массивом
и его j - ый элемент имеет недопустимое значение, то INFO = - ( i * 100 + j ), если i - ый фактический параметр является скаляром и имеет недопустимое значение, то INFO = - i; |
> 0 - | если INFO = K, то элемент U( IA+K-1, JA+K-1) является точным нулем; разложение завершено, но матрица U вырождена, и поэтому решение системы не вычисляется |
Версии
PSGESV - PCGESV PZGESV | решение системы с матрицей общего вида методом Гаусса с выбором ведущего элемента по столбцу для вещественных данных одинарной точности, комплексных данных одинарной точности и комплексных данных двойной точности соответственно |
Вызываемые подпрограммы
Здесь указаны только базовые подпрограммы (2 - ого уровня), которые вызываются из целевой подпрограммы (1 - ого уровня).
PDGETRF - PZGETRF | LU - разложение матрицы общего вида методом Гаусса с выбором ведущего элемента по столбцу |
PDGETRS - PZGETRS | Решение системы AX = B, AT X = B или AH X = B на основе LU - разложения, полученного подпрограммой PDGETRF(PZGETRF) |
Замечания по использованию
1. | В подпрограммах PSGESV, PCGESV, PZGESV параметры A и B имеют тип REAL, COMPLEX и DOUBLE COMPLEX соответственно | |
2. | Используются подпрограммы BLACS_GRIDINFO ( из пакета BLACS), PXERBA ( из пакета PBLAS), CHK1MAT, PCHK2MAT, INDXG2P ( из библиотеки ScaLAPACK_TOOLS) |
Решение системы A X = B , где A - матрица порядка 9 Пусть матрица А системы имеет вид:
19 | 3 | 1 | 12 | 1 | 16 | 1 | 3 | 11 | |
-19 | 3 | 1 | 12 | 1 | 16 | 1 | 3 | 11 | |
-19 | -3 | 1 | 12 | 1 | 16 | 1 | 3 | 11 | |
-19 | -3 | -1 | 12 | 1 | 16 | 1 | 3 | 11 | |
-19 | -3 | -1 | -12 | 1 | 16 | 1 | 3 | 11 | |
-19 | -3 | -1 | -12 | -1 | 16 | 1 | 3 | 11 | |
-19 | -3 | -1 | -12 | -1 | -16 | 1 | 3 | 11 | |
-19 | 3 | -1 | -12 | -1 | -16 | -1 | 3 | 11 | |
-19 | -3 | -1 | -12 | -1 | -16 | -1 | -3 | 11 |
Вектор правых частей В имеет вид:
0 0 1 0 0 0 0 0 0 |
Матрица разбивается на блоки размеров 2 на 2.
Осуществляется пропуск программы на 6 процессах и используется двумерная решетка процессов 2 на 3.
Ниже показано, как разбитая на блоки матрица A распределяется (блочно-циклически) по решетке процессов 2 * 3.
0 | 1 | 2 | |||
0 |
19 3 -19 3 |
1 3 1 3 |
1 12 1 12 |
11 11 |
1 16 1 16 |
-19 -3 -19 -3 |
1 3 1 3 |
-1 -12 -1 -12 |
11 11 |
1 16 -1 16 | |
-19 -3 | -1 -3 | -1 -12 | 11 | -1 -16 | |
1 |
-19 -3 -19 -3 |
1 3 1 3 |
1 12 -1 12 |
11 11 |
1 16 1 16 |
-19 -3 -19 3 |
1 3 -1 3 |
-1 -12 -1 -12 |
11 11 |
-1 -16 -1 -16 |
Распределение матрицы B (блочно-циклическое) по процессам
0 | 1 | 2 | |
0 |
0 0 | ||
0 0 | |||
0 | |||
1 |
1 0 | ||
0 0 |
Фрагмент фортранного текста вызывающей программы
(принятые в тестах обозначения можно посмотреть
в п.8.3)
PROGRAM TPDGESV 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 ) DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D+0 ) INTEGER ICTXT, INFO, MYCOL, MYROW, NPCOL, NPROW INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), IPIV( MXLOCR+NB ) DOUBLE PRECISION A( MXLLDA, MXLOCC ), B( MXLLDB, MXRHSC ), $ WORK( MXLOCR ) EXTERNAL BLACS_EXIT, BLACS_GRIDEXIT, BLACS_GRIDINFO, $ DESCINIT, MATINIT, PDGESV, SL_INIT INTRINSIC DBLE 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 MATINIT( A, DESCA, B, DESCB ) CALL PDGESV( N, NRHS, A, IA, JA, DESCA, IPIV, B, IB, JB, DESCB, $ INFO ) CALL BLACS_GRIDEXIT( ICTXT ) 10 CONTINUE CALL BLACS_EXIT( 0 ) STOP END SUBROUTINE MATINIT( AA, DESCA, B, DESCB ) * MATINIT генерирует и распределяет матрицы A и B по решетке процессов 2 x 3 INTEGER DESCA( * ), DESCB( * ) DOUBLE PRECISION AA( * ), B( * ) INTEGER CTXT_, LLD_ PARAMETER ( CTXT_ = 2, LLD_ = 9 ) INTEGER ICTXT, MXLLDA, MYCOL, MYROW, NPCOL, NPROW DOUBLE PRECISION A, C, K, L, P, S EXTERNAL BLACS_GRIDINFO ICTXT = DESCA( CTXT_ ) CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL ) S = 19.0D0 C = 3.0D0 A = 1.0D0 L = 12.0D0 P = 16.0D0 K = 11.0D0 MXLLDA = DESCA( LLD_ ) * Локальные части матриц A и B для процесса (0, 0) IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 ) THEN AA( 1 ) = S AA( 2 ) = -S AA( 3 ) = -S AA( 4 ) = -S AA( 5 ) = -S AA( 1+MXLLDA ) = C AA( 2+MXLLDA ) = C AA( 3+MXLLDA ) = -C AA( 4+MXLLDA ) = -C AA( 5+MXLLDA ) = -C AA( 1+2*MXLLDA ) = A AA( 2+2*MXLLDA ) = A AA( 3+2*MXLLDA ) = A AA( 4+2*MXLLDA ) = A AA( 5+2*MXLLDA ) = -A AA( 1+3*MXLLDA ) = C AA( 2+3*MXLLDA ) = C AA( 3+3*MXLLDA ) = C AA( 4+3*MXLLDA ) = C AA( 5+3*MXLLDA ) = -C B( 1 ) = 0.0D0 B( 2 ) = 0.0D0 B( 3 ) = 0.0D0 B( 4 ) = 0.0D0 B( 5 ) = 0.0D0 * Локальная часть матрицы A для процесса (0, 1) ELSE IF( MYROW.EQ.0 .AND. MYCOL.EQ.1 ) THEN AA( 1 ) = A AA( 2 ) = A AA( 3 ) = -A AA( 4 ) = -A AA( 5 ) = -A AA( 1+MXLLDA ) = L AA( 2+MXLLDA ) = L AA( 3+MXLLDA ) = -L AA( 4+MXLLDA ) = -L AA( 5+MXLLDA ) = -L AA( 1+2*MXLLDA ) = K AA( 2+2*MXLLDA ) = K AA( 3+2*MXLLDA ) = K AA( 4+2*MXLLDA ) = K AA( 5+2*MXLLDA ) = K * Локальная часть матрицы A для процесса (0, 2) ELSE IF( MYROW.EQ.0 .AND. MYCOL.EQ.2 ) THEN AA( 1 ) = A AA( 2 ) = A AA( 3 ) = A AA( 4 ) = -A AA( 5 ) = -A AA( 1+MXLLDA ) = P AA( 2+MXLLDA ) = P AA( 3+MXLLDA ) = P AA( 4+MXLLDA ) = P AA( 5+MXLLDA ) = -P * Локальные части матриц A и B для процесса (1, 0) ELSE IF( MYROW.EQ.1 .AND. MYCOL.EQ.0 ) THEN AA( 1 ) = -S AA( 2 ) = -S AA( 3 ) = -S AA( 4 ) = -S AA( 1+MXLLDA ) = -C AA( 2+MXLLDA ) = -C AA( 3+MXLLDA ) = -C AA( 4+MXLLDA ) = C AA( 1+2*MXLLDA ) = A AA( 2+2*MXLLDA ) = A AA( 3+2*MXLLDA ) = A AA( 4+2*MXLLDA ) = -A AA( 1+3*MXLLDA ) = C AA( 2+3*MXLLDA ) = C AA( 3+3*MXLLDA ) = C AA( 4+3*MXLLDA ) = C B( 1 ) = 1.0D0 B( 2 ) = 0.0D0 B( 3 ) = 0.0D0 B( 4 ) = 0.0D0 * Локальная часть матрицы A для процесса (1, 1) ELSE IF( MYROW.EQ.1 .AND. MYCOL.EQ.1 ) THEN AA( 1 ) = A AA( 2 ) = -A AA( 3 ) = -A AA( 4 ) = -A AA( 1+MXLLDA ) = L AA( 2+MXLLDA ) = L AA( 3+MXLLDA ) = -L AA( 4+MXLLDA ) = -L AA( 1+2*MXLLDA ) = K AA( 2+2*MXLLDA ) = K AA( 3+2*MXLLDA ) = K AA( 4+2*MXLLDA ) = K * Локальная часть матрицы A для процесса (1, 2) ELSE IF( MYROW.EQ.1 .AND. MYCOL.EQ.2 ) THEN AA( 1 ) = A AA( 2 ) = A AA( 3 ) = -A AA( 4 ) = -A AA( 1+MXLLDA ) = P AA( 2+MXLLDA ) = P AA( 3+MXLLDA ) = -P AA( 4+MXLLDA ) = -P END IF RETURN END Результаты: Решение системы X = ( 0.D0, - 0.16666666666667D0, 0.5D0, 0.D0, 0.D0, 0.D0, - 0.5D0, 0.16666666666667D0, 0.D0 ) Значение INFO = 0