Подпрограмма:  PDGESV3

Назначение

Решение системы  A * X = B или  AT * X = B с матрицей общего вида методом Гаусса с выбором ведущего элемента по столбцу, с итерационным уточнением решения и оценкой границ ошибок

Математическое описание

Подпрограмма вычисляет решение вещественной системы линейных уравнений

(1)         sub(A) * X   =  sub(B)     или

(2)         sub(A)T * 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 (AF). Полученное LU - разложение используется для решения системы  sub (A) * X = sub (B)  или  sub (A) T * X = sub (B).

Итерационное уточнение решения и невязка вычисляются с той же точностью, которую имеют входные данные.

Матрицы A, AF, B и X должны быть заданы в виде массивов двойной точности. Все вычисления проводятся в режиме DOUBLE PRECISION.

Литература

http://www.netlib.org/scalapack/slug/index.html

Использование

         CALL  PDGESV3 ( TRANS, N, NRHS, A, IA, JA, DESCA, AF, IAF, JAF,
                                         DESCAF, IPIV, B, IB, JB, DESCB, X, IX, JX, DESCX, FERR,
                                         BERR, WORK, LWORK, IWORK, LIWORK, INFO)

Параметры

TRANS - если TRANS = ' N ', решается система (1),
если TRANS = ' T ', решается система (2),
(глобальный входной параметр, тип символьный);
N - порядок распределенной подматрицы sub (A), N ≥ 0 (глобальный входной параметр, тип целый);
NRHS - число правых частей, т.е. число столбцов распределенной подматрицы sub (B), NRHS ≥ 0 (глобальный входной параметр, тип целый);
A - указатель на локальную память, занимаемую массивом двойной точности размерности ( LLD_A, LOCc ( JA + N - 1));
это - локальные части факторизуемой распределенной матрицы sub(A) порядка N (локальный входной параметр);
IA - номер строки в глобальном массиве A, указывающий на первую строку подматрицы sub (A) (глобальный входной параметр, тип целый);
JA - номер столбца в глобальном массиве A, указывающий на первый столбец подматрицы sub (A) (глобальный входной параметр, тип целый);
DESCA - дескриптор распределенной матрицы A (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый);
AF - указатель на локальную память, занимаемую массивом двойной точности размерности ( LLD_AF, LOCc ( JA + N - 1)); на выходе - массив AF содержит локальные части распределенных множителей L и U, полученных при разложении (факторизации) подматрицы в виде sub (A) = P * L * U; единичные диагональные элементы матрицы L в памяти не хранятся (локальный выходной параметр);
IAF - номер строки в глобальном массиве AF, указывающий на первую строку подматрицы sub (AF) (глобальный входной параметр, тип целый);
JAF - номер столбца в глобальном массиве AF, указывающий на первый столбец подматрицы sub (AF) (глобальный входной параметр, тип целый);
DESCAF - дескриптор распределенной матрицы AF (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый);
IPIV - одномерный массив длины ( LOCr (N_AF) + NB_AF), содержащий информацию о выборе ведущего элемента на каждом шаге исключения Гаусса;
элемент массива IPIV ( i ) содержит глобальный номер строки, которая переставляется со строкой, имеющей локальный номер  i;
этот массив содержит информацию о перестановках строк распределенной матрицы A (локальный выходной параметр, тип целый);
B - указатель на локальную память, занимаемую массивом двойной точности размерности ( LLD_B, LOCc ( JB + NRHS - 1)), в котором задаются локальные части распределенной матрицы sub (B) правой части (локальный входной параметр);
IB - номер строки в глобальном массиве B, указывающий на первую строку подматрицы sub (B) (глобальный входной параметр, тип целый);
JB - номер столбца в глобальном массиве B, указывающий на первый столбец подматрицы sub (B) (глобальный входной параметр, тип целый);
DESCB - дескриптор распределенной матрицы B (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый);
X - указатель на локальную память, занимаемую массивом двойной точности размерности ( LLD_X, LOCc ( JX + NRHS - 1)); на выходе (если INFO = 0) - это распределенная матрица X, столбцы которой образуют NRHS векторов решений исходной системы, полученных в результате итерационного уточнения (локальный выходной параметр);
IX - номер строки в глобальном массиве X, указывающий на первую строку подматрицы sub ( X ) (глобальный входной параметр, тип целый);
JX - номер столбца в глобальном массиве X, указывающий на первый столбец подматрицы sub ( X ) (глобальный входной параметр, тип целый);
DESCX - дескриптор распределенной матрицы X (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый);
FERR - одномерный массив длины LOCc ( N_B), каждый элемент FERR ( j ) которого содержит оценку границы относительной ошибки вычисленного вектора решений X ( j ) (т.е.  j - ого столбца матрицы X ( IX : IX + N - 1, JX : JX + NRHS - 1) ), полученную в соответствии с описанием в http://www.netlib.org/scalapack/slug/, раздел 4.6 (см. также [12, 25, 27, 28]) (локальный выходной параметр, тип DOUBLE PRECISION );
BERR - одномерный массив длины LOCc ( N_B); содержащий покомпонентные оценки границ при обратном анализе относительных ошибок для каждого вектора решений X ( j ), т.е. наименьшее относительное возмущение в любом элементе матрицы A ( IA : IA + N - 1, JA : JA + N - 1) или B ( IB : IB + N - 1, JB : JB + NRHS - 1), которое делает X ( j ) точным решением (см. описание в http://www.netlib.org/scalapack/slug/, раздел 4.6 а также [12, 25, 27, 28]) (локальный выходной параметр, тип DOUBLE PRECISION );
WORK - одномерный рабочий массив двойной точности длины LWORK; на выходе - WORK (1) содержит минимальную требуемую величину LWORK (локальное рабочее пространство, локальный выходной параметр);
LWORK - размер рабочего пространства (массива) WORK;  LWORK - локальный входной параметр и должен быть не меньше, чем
LWORK = PDGERFS(LWORK) + LOCr(N_A),
где PDGERFS(LWORK) означает величину рабочего массива WORK, которая требуется при работе вызываемой подпрограммы PDGERFS (см. ниже);
смысл обозначений 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, то элемент U( IA+K-1, JA+K-1) является точным нулем; разложение завершено, но матрица U вырождена и поэтому решение системы и оценки границ ошибок не вычисляются.

Версии

PSGESV3 -   PCGESV3     PZGESV3     решение системы с матрицей общего вида методом Гаусса с выбором ведущего элемента по столбцу для вещественных данных одинарной точности, комплексных данных одинарной точности и комплексных данных двойной точности соответственно

Вызываемые подпрограммы

Здесь указаны только базовые подпрограммы (2 - ого уровня), которые вызываются из целевой подпрограммы (1 - ого уровня).

PDGETRF - PZGETRF    LU - разложение матрицы общего вида методом Гаусса с выбором ведущего элемента по столбцу
PDGETRS - PZGETRS    Решение системы A X = B, AT X = B или AH X = B на основе LU - разложения, полученного подпрограммой PDGETRF
PDGERFS - PZGERFS    Выполнение итерационного уточнения решения системы A X = B, AT X = B или AH X = B, полученного подпрограммой PDGETRS (PZGETRS), и оценка границ ошибок полученного решения

Замечания по использованию

  1.  В подпрограммах PSGESV3, PCGESV3, PZGESV3 параметры A, B, AF, X, FERR и BERR имеют тип REAL, COMPLEX и DOUBLE COMPLEX соответственно
  2.  В версии подпрограммы PZGESV3 вместо параметров IWORK и LIWORK целого типа используются параметры с именами RWORK и LRWORK. При этом параметр RWORK имеет тип DOUBLE PRECISION, а параметр LRWORK ≥ 2 * LOCc (N_A).
  3.  Используются подпрограммы BLACS_GRIDINFO ( из пакета BLACS), LSAME ( из пакета BLAS), PXERBA ( из пакета PBLAS), ICEIL,CHK1MAT, PCHK2MAT, INDXG2P, INFOG2L, NUMROC, ILCM ( из библиотеки ScaLAPACK_TOOLS), PDLACPY ( из пакета ScaLAPACK)

Пример использования

Решение системы 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

Фрагмент фортранного текста вызывающей программы
Полный текст теста можно получить в tdgesv3.zip, а принятые обозначения - посмотреть в разделе документации "Обозначения и упрощения в примерах по использованию подпрограмм комплекса"; в тесте используются: служебная подпрограмма PDELSET (для распределения элементов глобальной матрицы/вектора по паралельным процессам) и служебная подпрограмма PDLAPRNT (для выборки и распечатки элементов распределенной матрицы/вектора единым массивом)

      PROGRAM TDGESV3
      include 'mpif.h'

      INTEGER     DLEN_, IA, JA, IB, JB, N, NB, RSRC, NRHS, NBRHS, NOUT,
     $                     IAF, JAF, IX, JX, CSRC, MXLLDA, MXLLDAF, MXLLDB, MXLLDX,
     $                     MXLOCR, MXLOCC, MXRHSC, LWORK, LIWORK
      PARAMETER   ( DLEN_ = 9, IA = 1, JA = 1, IB = 1, JB = 1,
     $                           IAF = 1, JAF = 1, IX = 1, JX = 1, N = 9, NB = 2, RSRC = 0,
     $                           CSRC = 0, MXLLDA = 5, MXLLDB = 5, MXLLDAF = 5,
     $                           MXLLDX = 5,  NRHS = 1, NBRHS = 1, NOUT = 6, MXLOCR = 5,
     $                           MXLOCC = 4, MXRHSC = 1, LWORK = 26, LIWORK = 5 )

      CHARACTER   TRANS
      PARAMETER   ( TRANS = 'N' )

      INTEGER   ICTXT, INFO, MYCOL, MYROW, NPCOL, NPROW
      DOUBLE PRECISION   ANORM, BNORM, EPS, RESID, XNORM

      INTEGER   DESCA( DLEN_ ), DESCB( DLEN_ ), DESCAF( DLEN_ ),
     $                   DESCX( DLEN_ ), IPIV( MXLOCR+NB ), IWORK( LIWORK )

      DOUBLE PRECISION  A( MXLLDA, MXLOCC ), B( MXLLDB, MXRHSC ),
     $                                      AF( MXLLDAF, MXLOCC ), X( MXLLDX, MXRHSC ),
     $                                      WORK( LWORK ), FERR( MXRHSC ), BERR( MXRHSC )

      EXTERNAL   BLACS_EXIT, BLACS_GRIDEXIT, BLACS_GRIDINFO,
     $                       DESCINIT, PDMATINIT, PDGESV3, 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, N, N, NB, NB, RSRC, CSRC, ICTXT, MXLLDA,
     $                               INFO )
      CALL  DESCINIT( DESCAF, N, N, NB, NB, RSRC, CSRC, ICTXT, MXLLDAF,
     $                               INFO )
      CALL  DESCINIT( DESCB, N, NRHS, NB, NBRHS, RSRC, CSRC, ICTXT,
     $                               MXLLDB, INFO )
      CALL  DESCINIT( DESCX, N, NRHS, NB, NBRHS, RSRC, CSRC, ICTXT,
     $                               MXLLDX, INFO )

      CALL  PDMATINIT( N, A, IA, JA, DESCA, B, IB, JB, DESCB, INFO )

      CALL  PDGESV3( TRANS, N, NRHS, A, IA, JA, DESCA, AF, IAF, JAF, DESCAF,
     $                              IPIV, B, IB, JB, DESCB, X, IX, JX, DESCX, FERR, BERR,
     $                              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            IA, IB, INFO, JA, JB, N
      INTEGER            DESCA( * ), DESCB( * )
      DOUBLE PRECISION   A( * ), B( * )
*
* Локальные переменные
      INTEGER            I, J
      DOUBLE PRECISION   AIJ, BIJ
*
* Внешние подпрограммы
      EXTERNAL           PDELSET
*
* Выполняемые операторы
      INFO = 0
*
      IF( IA.NE.1 ) THEN
         INFO = -3
      ELSE IF(JA .NE.1) THEN
         INFO = -4
      END IF
*
      AIJ = 19.0D0
*
      DO 20 J = 1, N
         DO 10 I = 1, N 
            IF( I.LE.J ) THEN
                CALL PDELSET( A, I, J, DESCA, AIJ )
            ELSE
                CALL PDELSET( A, I, J ,DESCA, -AIJ )
            END IF
   10 CONTINUE
         IF( J.EQ.1 .OR. J.EQ.7 ) AIJ = 3.0D0
         IF( J.EQ.2 .OR. J.EQ.4 .OR. J.EQ.6 ) AIJ = 1.0D0
         IF( J.EQ.3 ) AIJ = 12.0D0
         IF( J.EQ.5 ) AIJ = 16.0D0
         IF( J.EQ.8 ) AIJ = 11.0D0
   20 CONTINUE

      CALL PDELSET( A, 8, 2, DESCA, 3.0D0 )
*
      BIJ = 0.0D0
*
      J = 1
      DO 30 I = 1, N
        CALL PDELSET( B, I, J, DESCB, BIJ )
   30 CONTINUE

      CALL PDELSET( B, 3, 1, DESCB, 1.0D0 )
*
      RETURN
      END

Результаты:

 Решение системы

 X = ( 0.D0, - 0.16666666666667D0, 0.5D0, 0.D0, 0.D0, 0.D0, - 0.5D0, 0.16666666666667D0, 0.D0 )

 Значение   INFO  =  0
                   FERR  =  0.56066263E-14
                   BERR  =  0.13877788E-16