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

Назначение

Решение системы с симметричной положительно определенной матрицей методом Холецкого и оценка обратного числа обусловленности

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

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

         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