Вычисление собственных значений вещественной симметричной матрицы, принадлежащих заданному интервалу
На первом этапе подпрограмма приводит симметричную матрицу A
к трехдиагональной форме методом отражений:
A = Q*D*QT, где Q - ортогональная матрица,
а D - симметричная трехдиагональная матрица. На втором этапе неявным
QL или QR алгоритмом находятся собственные значения матрицы D,
принадлежащие заданному интервалу (VL, VU), которые
совпадают с собственными значениями матрицы A, поскольку матрицы A и D
ортогонально подобны. Собственные значения вычисляются с заданной точностью.
CALL PDSYEV3 ( UPLO, N, A, IA, JA, DESCA, VL, VU, ABSTOL,
M, W, WORK, LWORK, IWORK, LIWORK, INFO)
Параметры
| UPLO - |
если UPLO = ' U ' - задается верхний
треугольник матрицы A; если UPLO = ' L ' - задается нижний треугольник матрицы A (глобальный входной параметр, тип символьный); |
| N - | порядок распределенной подматрицы sub (A); N ≥ 0 (глобальный входной параметр, тип целый); |
| A - |
массив двойной точности, распределенный по процессам блочно - циклическим
образом (см.),
глобальная размерность которого (N, N), а локальная
размерность ( LLD_A, LOCc ( JA + N - 1)); на входе - это симметричная матрица A; если UPLO = ' U ', то используется только верхняя треугольная часть матрицы A; если UPLO = ' L ', то используется только нижняя треугольная часть матрицы A; на выходе - нижний треугольник (при UPLO = ' L ' ) или верхний треугольник (при UPLO = ' U ' ) матрицы A, включая диагональ, не сохраняется (локальный входной параметр, локальное рабочее пространство); |
| IA - | глобальный номер строки матрицы A, который указывает на начало подматрицы (глобальный входной параметр, тип целый); |
| JA - | глобальный номер столбца матрицы A, который указывает на начало подматрицы (глобальный входной параметр, тип целый); |
| DESCA - |
дескриптор распределенной матрицы A (одномерный массив длины DLEN); если тип дескриптора одномерный ( DTYPE_A = 501), то DLEN ≥ 7, если тип дескриптора двумерный ( DTYPE_A = 1), то DLEN ≥ 9; DESCA содержит информацию о размещении A в памяти; полное описание DESCA см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый); |
| VL - | заданная нижняя граница интервала, в котором ищутся собственные значения (глобальный входной параметр, тип DOUBLE PRECISION); |
| VU - | заданная верхняя граница интервала, в котором ищутся собственные значения (глобальный входной параметр, тип DOUBLE PRECISION); |
| ABSTOL - |
заданная абсолютная точность, с которой должны быть вычислены
собственные значения; заданная точность считается достигнутой, если собственное значение лежит в интервале [a, b], ширина которого не превосходит ABSTOL + EPS * MAX ( | a |, | b | ), где EPS - машинная точность; если ABSTOL ≤ 0, то ABSTOL полагается равным EPS * norm ( D ), где norm ( D ) - первая норма трехдиагональной матрицы, полученной посредством преобразования матрицы A к трехдиагональной форме; собственные значения будут вычислены с наибольшей точностью, если ABSTOL = 2 * PDLAMCH ('S'), где PDLAMCH ('S') = sfmin - минимальное вещественное число, при котором 1 / sfmin не вызывает переполнения; (глобальный входной параметр, тип DOUBLE PRECISION); |
| M - | общее количество найденных в заданном интервале собственных значений; 0 ≤ M ≤ N; (глобальный выходной параметр, тип целый); |
| W - |
одномерный массив двойной точности длины N, если INFO = 0, первые M элементов массива содержат вычисленные собственные значения в возрастающем порядке (глобальный выходной параметр); |
| WORK - |
одномерный рабочий массив двойной точности длины LWORK; на выходе в элементе WORK (1) возвращается необходимая длина рабочего пространства (локальное рабочее пространство, локальный выходной параметр); |
| LWORK - |
задаваемая длина рабочего пространства WORK; LWORK ≥ 5*N + MAX (5 * NN, NB * (NP0 + 1 ) ), где NP0 = NUMROC ( NN, NB, 0, 0, NPROW) - число строк локальной части матрицы sub (A) на процессе с координатами (0,0); NN = MAX( N, NB, 2); Минимальная требуемая величина LWORK вычисляется самой подпрограммой, если к ней обратиться со значением LWORK = -1; при этом подпрограмма не производит никаких других вычислений, а требуемое значение LWORK возвращается в элементе массива WORK (1); (локальный или глобальный входной параметр, тип целый); |
| IWORK - |
одномерный рабочий массив целого типа длины LIWORK; на выходе в элементе IWORK (1) содержится необходимая длина рабочего пространства IWORK (локальное рабочее пространство, локальный выходной параметр); |
| LIWORK - |
задаваемая длина рабочего пространства IWORK; LIWORK ≥ 6 * NNP, где NNP = MAX (N, NPROW * NPCOL + 1, 4); минимальная требуемая величина LIWORK может быть вычислена самой подпрограммой, если к ней обратиться со значением LIWORK = - 1; при этом подпрограмма не производит никаких других вычислений, а требуемое значение LIWORK возвращается в элементе массива IWORK (1); (локальный или глобальный входной параметр, тип целый); |
| INFO - | целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр) |
| = 0 - | успешное завершение работы; |
| < 0 - |
если i - ый фактический параметр подпрограммы
является массивом и его j - ый элемент имеет
недопустимое значение, тогда INFO = - ( i * 100 + j ), если i - ый фактический параметр является скаляром и имеет недопустимое значение, тогда INFO = - i; |
| > 0 - | если (MOD(INFO/8,2) .NE. 0), то заданная точность не достигнута |
Версии
| PSSYEV3 - PCHEEV3 PZHEEV3 | вычисление собственных значений симметричной (эрмитовой) матрицы, принадлежащих заданному интервалу, для случаев вещественных данных одинарной точности, комплексных данных одинарной точности, комплексных данных двойной точности соответственно |
Вызываемые подпрограммы
Ниже указаны только базовые подпрограммы (2 - ого уровня), которые вызываются из целевой подпрограммы (1 - ого уровня).
| PDSYNTRD - PZHENTRD - | приведение симметричной (эрмитовой) матрицы к трехдиагональной форме методом отражений |
| PDSTEBZ - | вычисление собственных значений симметричной трехдиагональной матрицы |
| PDLAMCH - | вычисление машинных параметров для арифметики с плавающей запятой |
| PDLASET - | внедиагональные элементы матрицы полагаются равными ALFA, а диагональные элементы - равными BETA |
| PDLANSY - | вычисление значений 1 - ой нормы, нормы Фробениуса, бесконечной нормы или наибольшего абсолютного значения любого элемента вещественной симметричной, комплексной симметричной или эрмитовой матрицы |
| PDLASCL - | умножение вещественной матрицы на вещественный скаляр |
| PDLARED1D - | перераспределяет одномерный массив по процессам решетки процессов, предполагая, что входной массив является распределенным по строкам (т.е. по процессам, принадлежащим к одной и той же строке решетки процессов), и что все процессы, принадлежащие к одному и тому же столбцу решетки процессов, содержат копию той же самой части входного массива |
Замечания по использованию
| 1. | В подпрограммах PSSYEV3, PCHEEV3, PZHEEV3 параметры A и WORK имеют тип REAL, COMPLEX и DOUBLE COMPLEX соответственно, а параметры VL, VU, ABSTOL, W - тип REAL, REAL и DOUBLE PRECISION соответственно | |
| 2. |
Список параметров подпрограммы PZHEEV3 имеет следующий вид: PZHEEV3 (UPLO, N, A, IA, JA, DESCA, VL, VU, ABSTOL, M, W, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO), где дополнительные параметры RWORK и LRWORK означают: RWORK - одномерный рабочий массив двойной точности длины LRWORK;
на выходе в элементе RWORK (1) возвращается необходимая
длина рабочего массива RWORK (локальное рабочее пространство,
локальный выходной параметр);
LRWORK - задаваемая длина рабочего пространства RWORK;
LRWORK ≥ 5 * NN + 4 * N
(локальный входной параметр, тип целый);
| |
| 3. | Используются подпрограммы BLACS_GRIDINFO, DGEBS2D, DGEBR2D ( из пакета BLACS), DSCAL ( из пакета BLAS), LSAME, INDXG2P, NUMROC, CHK1MAT, PCHK1MAT, PXERBLA ( из библиотеки ScaLAPACK_TOOLS) |
1. Вычисление собственных значений, принадлежащих интервалу (VL,VU), симметричной матрицы A, которая имеет вид:
| 1 0 0 0 0 0 1 |
| 0 1 0 0 0 0 2 |
| 0 0 1 0 0 0 3 |
| 0 0 0 1 0 0 4 |
| 0 0 0 0 1 0 5 |
| 0 0 0 0 0 1 6 |
| 1 2 3 4 5 6 7 |
Порядок матрицы N = 7; VL = - 10, VU = 10.
Пусть матрица разбивается на блоки с размером блоков NB = 2.
Осуществляется пропуск программы на 4 процессах, которые образуют решетку 2 на 2.
Фрагмент фортранного текста вызывающей программы.
(полный текст теста можно получить в tdsyev3.zip,
а принятые обозначения - посмотреть в разделе документации
"Обозначения и упрощения в примерах
по использованию подпрограмм комплекса").
Матрица A инициализируется посредством обращения к подпрограмме PDELSET из библиотеки ScaLAPACK_TOOLS.
PROGRAM TDSYEV3
include 'mpif.h'
INTEGER LWORK, MAXN, LDA, MAXPROCS, NOUT, LIWORK
DOUBLE PRECISION ZERO, MONE
PARAMETER ( LDA = 100, LWORK = 70, LIWORK = 42,
$ MAXN = 100, MAXPROCS = 512, NOUT =6,
$ ZERO = 0.0D+0, MONE = -1.0D+0 )
CHARACTER UPLO
PARAMETER ( UPLO = 'U' )
INTEGER CTXT, I, IAM, INFO, M, MYCOL, MYROW, N, NB,
$ NPCOL, NPROCS, NPROW, IA, JA
DOUBLE PRECISION VL, VU, ABSTOL
INTEGER DESCA( 9 ), IWORK( LIWORK )
DOUBLE PRECISION A( LDA, LDA ), W( MAXN ),
$ WORK( LWORK ), WORK1( 7 )
EXTERNAL BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT,
$ BLACS_GRIDINFO, BLACS_GRIDINIT, BLACS_PINFO,
$ BLACS_SETUP, DESCINIT, PDMATINIT, PDLAPRNT,
$ PDSYEV3, PDLAMCH
*
N = 7
NB = 2
NPROW = 2
NPCOL = 2
IA = 1
JA = 1
VL = -10.0D0
VU = 10.0D0
*
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
ABSTOL = 2.0D0* PDLAMCH(CTXT,'U')
CALL DESCINIT( DESCA, N, N, NB, NB, 0, 0, CTXT, LDA, INFO )
* Построение матрицы A
CALL PDMATINIT( N, A, IA, JA, DESCA, INFO )
* Вычисление собственных значений
CALL PDSYEV3( UPLO, N, A, IA, JA, DESCA, VL, VU, ABSTOL, M, W,
$ WORK, LWORK, IWORK, LIWORK, INFO )
*
CALL BLACS_GRIDEXIT( CTXT )
20 CONTINUE
*
CALL BLACS_EXIT( 0 )
STOP
END
*
SUBROUTINE PDMATINIT( N, A, IA, JA, DESCA, INFO )
*
* PDMATINIT генерирует и распределяет матрицу A по решетке процессов
*
DOUBLE PRECISION ONE
PARAMETER ( ONE = 1.0D+0 )
INTEGER IA, INFO, JA, N
INTEGER DESCA( * )
DOUBLE PRECISION A( * )
INTEGER I, J, MYCOL, MYROW, NPCOL, NPROW
EXTERNAL BLACS_GRIDINFO, 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)
1 CONTINUE
2 CONTINUE
DO 4 J = 1, N
DO 3 I = 1, N
IF( I .EQ. J ) THEN
CALL PDELSET( A, I, J, DESCA, 1.0D0)
END IF
3 CONTINUE
4 CONTINUE
J = N
DO 5 I = 1, N
CALL PDELSET( A, I, J, DESCA, DBLE(I) )
5 CONTINUE
I = N
DO 6 J = 1, N
CALL PDELSET( A, I, J, DESCA, DBLE(J) )
6 CONTINUE
RETURN
END
Результаты:
Значение INFO = 0,
M = 6
Собственные значения:
W(1) = -6.D+00
W(2) = 1.D+00
W(3) = 1.D+00
W(4) = 1.D+00
W(5) = 1.D+00
W(6) = 1.D+00