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

Назначение

Вычисление всех собственных значений в обобщенной проблеме собственных значений для вещественных симметричных матриц A и B

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

Данная подпрограмма реализует алгоритм вычисления всех собственных значений уравнений вида:

          (1)     Аx  =  λBx   ,

          (2)   АBx  =  λx   ,

          (3)   BАx  =  λx   ,

где  A  и  B - вещественные симметричные матрицы и матрица B положительно определена.

При помощи разложения Холецкого для матрицы B:  В = LLT исходные уравнения (1),(2) или (3) приводятся к стандартному виду Cy = λy, где

    для (1):  C  =  L - 1AL - T,  а   y  =  L-Tx .
    для (2):  C  =  L TAL   ,    а   y  =  L-Tx .
    для (3):  C  =  L TAL   ,    а   y  =  Lx .

Стандартная задача решается путем приведения симметричной матрицы C к трехдиагональному виду и вычисления собственных значений  λ неявным  QL - или QR - алгоритмом.

Подробнее см. в //http://srcc.msu.su/num_anal/par_prog/

Дж.Х. Уилкинсон, Алгебраическая проблема собственных значений, "Hаука", M., 1970.

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

         CALL  PDSYGV1 ( IBTYPE, UPLO, N, A, IA, JA, DESCA, B, IB, JB, DESCB,
                                         W, WORK, LWORK, IFAIL, INFO)

Параметры

IBTYPE - определяет вид обобщенной проблемы собственных значений:
если IBTYPE = 1 -  вид (1);
если IBTYPE = 2 -  вид (2);
если IBTYPE = 3 -  вид (3);
(глобальный входной параметр, тип целый);
UPLO - если UPLO = ' U ' - задается верхний треугольник матрицы A;
если UPLO = ' L ' - задается нижний треугольник матрицы A
(глобальный входной параметр, тип символьный);
N - порядок распределенной подматрицы sub (A); N ≥ 0 (глобальный входной параметр, тип целый);
A - массив двойной точности, распределенный по процессам блочно - циклическим образом (см.), глобальная размерность которого (N, N), а локальная размерность ( LLD_A, LOCc ( JA + N - 1)),
на входе - это локальная часть распределенной симметричной подматрицы sub(A);
если UPLO = ' U ', то используется только верхняя треугольная часть подматрицы sub(A);
если UPLO = ' L ', то используется только нижняя треугольная часть подматрицы sub(A);
на выходе - нижний треугольник (при UPLO = ' L ' ) или верхний треугольник (при UPLO = ' U ' ) матрицы sub(A), включая диагональ, не сохраняется (локальный входной параметр и локальный выходной параметр);
IA - глобальный номер строки матрицы A, который указывает на начало подматрицы, которая должна быть обработана (глобальный входной параметр, тип целый);
JA - глобальный номер столбца матрицы A, который указывает на начало подматрицы, которая должна быть обработана (глобальный входной параметр, тип целый);
DESCA - дескриптор распределенной матрицы A (одномерный массив длины DLEN);
если тип дескриптора одномерный ( DTYPE_A = 501),  DLEN ≥ 7,
если тип дескриптора двумерный    ( DTYPE_A = 1),      DLEN ≥ 9;
DESCA содержит информацию о размещении A в памяти; полное описание DESCA см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый);
B - массив двойной точности, распределенный по процессам блочно - циклическим образом (см.), глобальная размерность которого (N, N), а локальная размерность ( LLD_B, LOCc ( JB + N - 1)),
на входе - это локальная часть распределенной симметричной подматрицы sub(B);
если UPLO = ' U ', то используется только верхняя треугольная часть подматрицы sub(B);
если UPLO = ' L ', то используется только нижняя треугольная часть подматрицы sub(B);
на выходе, если INFO <= N, часть матрицы sub(B) содержит матрицу, замененную на треугольный множитель L из разложения Холецкого  sub(B) = L*L T (локальный входной параметр и локальный выходной параметр);
IB - глобальный номер строки матрицы B, который указывает на начало подматрицы, которая должна быть обработана (глобальный входной параметр, тип целый);
JB - глобальный номер столбца матрицы B, который указывает на начало подматрицы, которая должна быть обработана (глобальный входной параметр, тип целый);
DESCB - дескриптор распределенной матрицы B (одномерный массив длины DLEN);
если тип дескриптора одномерный ( DTYPE_B = 501),  DLEN ≥ 7,
если тип дескриптора двумерный    ( DTYPE_B = 1),      DLEN ≥ 9;
DESCB содержит информацию о размещении B в памяти; полное описание DESCB см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый);
W - одномерный массив двойной точности длины N; если  INFO = 0, собственные значения располагаются в нем по возрастанию (глобальный выходной параметр);
WORK - одномерный рабочий массив двойной точности длины LWORK;
на выходе, в элементе WORK (1) возвращается необходимая длина рабочего пространства
(локальное рабочее пространство, локальный выходной параметр);
LWORK - задаваемая длина рабочего пространства WORK;
LWORK ≥ 5 * N + MAX ( 5 * NN * , NB *(NP0 + 1)), где
NP0 = NUMROC ( NN, NB, 0, 0, NPROW) - число строк локальной части матрицы sub (A);
NB = DESCA (NB_);
NN = MAX( N, NB, 2 )
Минимальная требуемая величина LWORK может быть вычислена самой подпрограммой, если к ней обратиться со значением LWORK = -1; при этом подпрограмма не производит никаких других вычислений, а требуемое значение LWORK возвращается в элементе массива WORK (1);
(локальный входной параметр, тип целый);
IFAIL - обеспечивает дополнительную информацию, когда INFO ≠ 0;
если MOD (INFO/16,2) ≠ 0, то IFAIL содержит порядок наименьшего минора матрицы  B, который не является положительно определенным
(глобальный выходной параметр, тип целый);
INFO - целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр)
= 0 - успешное завершение работы;
< 0 - если i - ый фактический параметр подпрограммы является массивом и его j - ый элемент имеет недопустимое значение, тогда INFO = - ( i * 100 + j ), если i - ый фактический параметр является скаляром и имеет недопустимое значение, тогда INFO = - i;
> 0 - если (MOD(INFO/8,2).NE.0), то значит подпрограмма PDSTEBZ не смогла вычислить собственные значения;
если (MOD(INFO/16,2).NE.0), то значит матрица  B не является положительно определенной, и IFAIL содержит порядок наименьшего минора, который не является положительно определеннным.

Версии

PSSYGV1 -   PCHEGV1     PZHEGV1     вычисление всех собственных значений в обобщенной проблеме собственных значений для вещественных симметричных (эрмитовых) матриц A и B для случаев вещественных данных одинарной точности, комплексных данных одинарной точности, комплексных данных двойной точности соответственно

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

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

PDSYNGST - PZHENGST    приведение обобщенной проблемы собственных значений к стандартной форме
PDSYEV1 - PZHEEV1    вычисление всех собственных значений симметричной (эрмитовой) матрицы в линейной проблеме собственных значений
PDPOTRF - PZPOTRF    приведение симметричной (эрмитовой) матрицы к трехдиагональной форме методом отражений
PDLAMCH - вычисление машинных параметров для арифметики с плавающей запятой

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

  1.  В подпрограммах PSSYGV1, PCHEGV1, PZHEGV1 параметры A, B и WORK имеют тип REAL, COMPLEX и DOUBLE COMPLEX соответственно, а параметр W - REAL, REAL и DOUBLE PRECISION соответственно
  2.  Список параметров подпрограммы PZHEGV1 имеет следующий вид:

PZHEGV1 (IBTYPE, UPLO, N, A, IA, JA, DESCA, B, IB, JB, DESCB, W,
         WORK, LWORK, RWORK, LRWORK, IFAIL, INFO),
где дополнительные параметры RWORK и LRWORK означают:
   RWORK - одномерный рабочий массив двойной точности длины LRWORK;
                      на выходе в элементе RWORK (1) возвращается необходимая
                      длина рабочего массива RWORK (локальное рабочее пространство,
                      локальный выходной параметр);
 LRWORK - задаваемая длина рабочего пространства RWORK;
                       LRWORK ≥5 * NN + 4 *N , где
                       NN = MAX(N,NB,2)
                       (локальный входной параметр, тип целый);
  3.  Используются подпрограммы BLACS_GRIDINFO ( из пакета BLACS),
DSCAL ( из пакета BLAS),
LSAME, INDXG2P, NUMROC, CHK1MAT, PCHK2MAT, PXERBLA ( из библиотеки ScaLAPACK_TOOLS)

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

Вычисление всех собственных значений в обобщенной проблеме собственных значений (1) для симметричных матриц A и B, которые имеют вид ( заданы только верхние треугольники ):

           |   10    2    3    1    1    |
           |    0   12    1    2    1    |
           |    0    0   11    1   -1    |
           |    0    0    0    9     1    |
           |    0    0    0    0   15    |

           |   12    1   -1    2    1    |
           |    0   14    1   -1    1    |
           |    0    0   16   -1    1    |
           |    0    0    0   12   -1    |
           |    0    0    0    0   11    |

Порядок матриц N = 5.
Пусть матрицы разбиваются на блоки с размером блоков NB = 2.

Осуществляется пропуск программы на 4 процессах, которые образуют решетку 2 на 2.

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

Матрицы A и B инициализируются посредством обращения к подпрограмме PDELSET из библиотеки ScaLAPACK_TOOLS.

      PROGRAM TDSYGV11
      include 'mpif.h'
      INTEGER                         LWORK, MAXN, LDA, MAXPROCS, NOUT
      PARAMETER                  ( LDA = 100, LWORK = 146, MAXN = 100,
    $                                         MAXPROCS = 512, NOUT =6 )
      CHARACTER                 UPLO
      PARAMETER                 ( UPLO = 'U' )
      INTEGER                        CTXT, I, IAM, INFO, MYCOL, MYROW, N, NB, IFAIL,
    $                                        NPCOL, NPROCS, NPROW, IA, JA, IB, JB, IBTYPE
*
      INTEGER                        DESCA( 9 ), DESCB(9)
      DOUBLE PRECISION   A( LDA, LDA ),  B( LDA, LDA ), W( MAXN ),
    $                                        WORK( LWORK )
*
      EXTERNAL                    BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT,
    $                                        BLACS_GRIDINFO, BLACS_GRIDINIT, BLACS_PINFO,
    $                                        BLACS_SETUP, DESCINIT, PDMATINIT, PDLAPRNT,
    $                                        PDSYGV1
*
      N = 5
      NB = 2
      NPROW = 2
      NPCOL = 2
      IA = 1
      JA = 1
      IB = 1
      JB = 1
      IBTYPE = 1
*
      CALL  BLACS_PINFO( IAM, NPROCS )
      IF( ( NPROCS .LT. 1 ) ) THEN
         CALL  BLACS_SETUP( IAM, NPROW*NPCOL )
      END IF
*
      CALL  BLACS_GET( -1, 0, CTXT )
      CALL  BLACS_GRIDINIT( CTXT, 'R', NPROW, NPCOL )
      CALL  BLACS_GRIDINFO( CTXT, NPROW, NPCOL, MYROW, MYCOL )

      IF( MYROW .EQ. -1 ) GO TO 20
*
      CALL  DESCINIT( DESCA, N, N, NB, NB, 0, 0, CTXT, LDA, INFO )
      CALL  DESCINIT( DESCB, N, N, NB, NB, 0, 0, CTXT, LDA, INFO )

* Построение матриц A и B

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

* Решение обобщенной проблемы собственных значений

      CALL  PDSYGV1( IBTYPE, UPLO, N, A, IA, JA, DESCA, B, IB, JB, DESCB,
                                    W, WORK, LWORK, IFAIL, INFO )
*
      CALL  BLACS_GRIDEXIT( CTXT )
 20 CONTINUE

      CALL  BLACS_EXIT( 0 )
      STOP
      END
*
      SUBROUTINE  PDMATINIT( N, A, IA, JA, DESCA, B, IB, JB, DESCB, INFO )
*
* PDMATINIT генерирует и распределяет матрицы A и B по решетке процессов
*
      INTEGER                        IA, INFO, JA, N
      INTEGER                        DESCA( * ), DESCB( * )
      DOUBLE PRECISION   A( * ), B( * )
      INTEGER                        I, J, MYCOL, MYROW, NPCOL, NPROW
      EXTERNAL                    PDELSET
      INTRINSIC                     DBLE
*
      INFO = 0
*
      IF( IA .NE. 1 ) THEN
         INFO = -3
      ELSE IF( JA .NE. 1 ) THEN
         INFO = -4
      END IF
*
      DO 2  J = 1, N
      DO 1  I = 1, N
       CALL  PDELSET( A, I, J, DESCA, 0.0D0)
       CALL  PDELSET( B, I, J, DESCB, 0.0D0)
   1 CONTINUE
   2 CONTINUE
*
      DO 3  I = 1, N-1
          J = I + 1
            CALL  PDELSET( A, I, J, DESCA, 1.0D0)
            CALL  PDELSET( B, I, J, DESCB, 1.0D0)
         END IF
   3 CONTINUE
*
      J = N
      DO 5  I = 1, N-1
       CALL  PDELSET( A, I, J, DESCA, 1.0D0)
       CALL  PDELSET( B, I, J, DESCB, 1.0D0)
   5 CONTINUE
*
       CALL  PDELSET( A, 1, 1, DESCA, 10.0D0)
       CALL  PDELSET( A, 1, 2, DESCA, 2.0D0)
       CALL  PDELSET( A, 1, 3, DESCA, 3.0D0)
       CALL  PDELSET( A, 1, 4, DESCA, 1.0D0)
       CALL  PDELSET( A, 2, 2, DESCA, 12.0D0)
       CALL  PDELSET( A, 2, 4, DESCA, 2.0D0)
       CALL  PDELSET( A, 3, 3, DESCA, 11.0D0)
       CALL  PDELSET( A, 3, 5, DESCA, -1.0D0)
       CALL  PDELSET( A, 4, 4, DESCA, 9.0D0)
       CALL  PDELSET( A, 5, 5, DESCA, 15.0D0)
*
       CALL  PDELSET( B, 1, 1, DESCA, 12.0D0)
       CALL  PDELSET( B, 1, 3, DESCA, -1.0D0)
       CALL  PDELSET( B, 1, 4, DESCA, 2.0D0)
       CALL  PDELSET( B, 2, 2, DESCA, 14.0D0)
       CALL  PDELSET( B, 2, 4, DESCA, -1.0D0)
       CALL  PDELSET( B, 3, 3, DESCA, 16.0D0)
       CALL  PDELSET( B, 3, 4, DESCA, -1.0D0)
       CALL  PDELSET( B, 4, 4, DESCA, 12.0D0)
       CALL  PDELSET( B, 4, 5, DESCA, -1.0D0)
       CALL  PDELSET( B, 5, 5, DESCA, 11.0D0)
*
      RETURN
      END

Результаты:

 Значение  INFO  =   0

 Собственные значения:

  W(1) =  0.432787211016963
  W(2) =  0.663662748392315
  W(3) =  0.943859004668386
  W(4) =  1.10928454001752
  W(5) =  1.49235323254300