Автоматизация подготовки входных данных и вызова целевых программ комплекса PARALG вычисления собственных значений и собственных векторов в линейной проблеме собственных значений для эрмитовых матриц
Эта служебная подпрограмма организует за пользователя правильный вызов целевых программ вычисления собственных значений и собственных векторов в линейной проблеме собственных значений для эрмитовых матриц на распределенной памяти. Она считывает из внешнего файла исходную матрицу, распределяет ее части(блоки) по параллельным процессам в соответствии с используемыми алгоритмами и формирует правильный список фактических параметров для выбранной пользователем целевой программы. После чего осуществляет вызов этой программы. Полученные в результате счета массивы собственных значений и собственных векторов записываются во внешние файлы.
Литература:
http://software.intel.com/en-us/articles/intel-math-kernel-library-documentation/
http://www.netlib.org/scalapack/slug/index.html
http://num_anal.srcc.msu.ru/par_prog/
CALL CAZ_HEEVZ(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE,
NB, VL, VU, IL, IU, ABSTOL, ORFAC, INFILEA, OUTFILE)
Параметры
| NAME - | имя целевой подпрограммы, с помощью которой пользователь собирается решать свою задачу (одно из PZHEEV2, PZHEEV4, PZHEEV6); (входной параметр, тип символьный); |
| UPLO - | переменная символьного типа, означающая, используется верхний или нижний треугольник матрицы и принимающая значения 'U' или 'L' соответственно (входной параметр); |
| N - | порядок исходной матрицы (входной параметр, тип целый); |
| NPROW - | число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAZ_HEEVZ(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| NPCOL - | число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAZ_HEEVZ(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| AMEM - | массив локальной рабочей памяти, в которую распределяются локальные части исходной матрицы, хранятся элементы рабочих массивов, где формируются локальные части массивов собственных значений и собственных векторов (входной параметр, тип DOUBLE COMPLEX); |
| MEMSIZE - | задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAZ_HEEVZ (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| NB - | размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAZ_HEEVZ (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| VL - | заданная нижняя граница интервала, в котором ищутся собственные значения и соответствующие собственные векторы; при NAME='PZHEEV2', VL полагается равным 0.D0 (входной параметр, тип DOUBLE PRECISION); |
| VU - | заданная верхняя граница интервала, в котором ищутся собственные значения и соответствующие собственные векторы; при NAME='PZHEEV2', VU полагается равным 0.D0 (входной параметр, тип DOUBLE PRECISION); |
| IL - |
заданная нижняя граница интервала индексов, в котором
ищутся собственные значения и соответствующие собственные векторы; предполагается, что собственные значения располагаются по возрастанию; IL ≥ 1; при NAME='PZHEEV2', IL полагается равным 0 (входной параметр, тип целый); |
| IU - | заданная верхняя граница интервала индексов, в котором ищутся собственные значения и соответствующие собственные векторы; предполагается, что собственные значения располагаются по возрастанию; min ( IL, N) ≤ IU ≤ N; при NAME='PZHEEV2', IU полагается равным 0 (входной параметр, тип целый); |
| 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); |
| ORFAC - |
определяет, какие собственные векторы должны быть подвергнуты
процессу переортогонализации [1]; собственные векторы, которые
соответствуют собственным значениям, находящимся на
расстоянии tol = ORFAC * norm (A)
друг от друга, должны быть переортогонализованы; однако если рабочего
пространства недостаточно, tol может быть
уменьшено, чтобы все собственные векторы, которые должны
быть переортогонализованы, могли быть заданы в одном
процессе; если ORFAC = 0, переортогонализация не выполняется;
если ORFAC задан отрицательным (< 0), то он полагается равным
10 - 3 (входной параметр, тип DOUBLE PRECISION); |
| INFILEA - | имя файла, содержащего исходную матрицу (A) (входной параметр, тип символьный); |
| OUTFILE - | имя файла, в который в результате работы подпрограммы будут записаны результирующие массивы собственных значений и соответствующих собственных векторов (входной параметр, тип символьный). |
Вызываемые подпрограммы
Здесь указаны только целевые (1 - ого уровня) и базовые подпрограммы (2 - ого уровня), которые вызываются из целевых подпрограмм.
|
PZHEEV2 - PZHEEV4 PZHEEV6 |
вычисление всех собственных значений и собственных векторов эрмитовой матрицы
для комплексных данных двойной точности; вычисление собственных значений и собственных векторов эрмитовой матрицы, принадлежащих заданному интервалу, для комплексных данных двойной точности; вычисление собственных значений и собственных векторов эрмитовой матрицы, принадлежащих заданному интервалу индексов, для комплексных данных двойной точности, соответственно |
| PZPOTRF - | Треугольное разложение эрмитовой положительно определенной матрицы методом Холецкого |
| PZHETRD - | приведение эрмитовой матрицы к трехдиагональной форме методом отражений |
| ZSTEQR2 - | вычисление всех собственных значений и, возможно, собственных векторов эрмитовой трехдиагональной матрицы |
| PZHENTRD - | приведение эрмитовой матрицы к трехдиагональной форме методом отражений |
Замечания по использованию
| 1. | Используются подпрограммы BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO BLACS_GRIDINIT, BLACS_PINFO, BLACS_SETUP ( из пакета BLACS в составе MKL-библиотеки), DESCINIT, ICEIL, NUMROC, PZLAPRNT ( из пакета ScaLAPACK(TOOLS) в составе MKL-библиотеки), PZLAREAD, PZLAWRITE |
Необходимо вычислить собственные значения и собственные векторы в линейной проблеме
собственных значений для эрмитовой матрицы с помощью подпрограммы PZHEEV2.
Матрица - квадратная эрмитова порядка 7.
Пусть матрица А имеет вид:
| 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 |
При предварительном обращении к подпрограмме PAZ_HEEVZ были получены следующие
значения необходимых параметров.
Решетка процессов: NPROW = 2, NPCOL = 2;
NB = 2 (т.е. матрицы разбиваются на блоки размера 2 на 2),
MMIN = 100.
Фрагмент фортранного текста вызывающей программы
(полный текст теста можно получить в
tcz_heevz.zip)
PROGRAM TCZ_HEEVZ
include 'mpif.h'
INTEGER N, NPROW, NPCOL, NB, MEMSIZE, IBTYPE, IL, IU
DOUBLE PRECISION VL, VU, ABSTOL, ORFAC
PARAMETER ( N=7, NB=2, MEMSIZE=100)
*
DOUBLE COMPLEX AMEM( MEMSIZE )
CHARACTER*(*) NAME, UPLO
CHARACTER INFILEA*(*), OUTFILE*(*)
PARAMETER ( INFILEA = 'heev_7.dat',
$ OUTFILE = 'heevz_7.res')
*
PARAMETER ( UPLO = 'U',
$ NAME = 'PZHEEV2')
EXTERNAL CAZ_HEEVZ
*
NPROW = 2
NPCOL = 2
*
VL = 0.D0
VU = 0.D0
IL = 0
IU = 0
*
IF( NAME .NE. 'PZHEGV4' ) GOTO 1
VL = -10.0D0
VU = 10.0D0
1 IF( NAME .NE. 'PZHEGV6' ) GOTO 2
IL = 2
IU = 7
2 ABSTOL = 10.0D-10
ORFAC = 0.0D0
*
CALL CAZ_HEEVZ(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
$ VL, VU, IL, IU, ABSTOL, ORFAC, INFILEA, OUTFILE)
*
STOP
END
Содержимое файла с исходной матрицей:
'heev_7.dat':
7 7
0.10000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.10000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.10000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.20000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.10000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.30000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.10000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.40000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.10000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.50000D+01 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.00000D+00 0.00000D+00
0.10000D+01 0.00000D+00
0.60000D+01 0.00000D+00
0.10000D+01 0.00000D+00
0.20000D+01 0.00000D+00
0.30000D+01 0.00000D+00
0.40000D+01 0.00000D+00
0.50000D+01 0.00000D+00
0.60000D+01 0.00000D+00
0.70000D+01 0.00000D+00
Результаты:
Собственные значения матрицы (в файле OUTFILE)
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
W(7) = 14.D+00
собственные векторы:
Z (1, 1) = 0.084515425472851666
Z (2, 1) = 0.169030850945703331
Z (3, 1) = 0.253546276418554983
Z (4, 1) = 0.338061701891406663
Z (5, 1) = 0.422577127364258343
Z (6, 1) = 0.507092552837110078
Z (7, 1) = -0.591607978309961591
Z (1, 2) = -0.013491967198794509
Z (2, 2) = 0.973016065602410940
Z (3, 2) = -0.040475901596383528
Z (4, 2) = -0.053967868795178037
Z (5, 2) = -0.067459835993972539
Z (6, 2) = -0.209656967344383660
Z (7, 2) = 0.000000000000000000
Z (1, 3) = -0.020237950798191764
Z (2, 3) = -0.040475901596383528
Z (3, 3) = 0.939286147605424726
Z (4, 3) = -0.080951803192767055
Z (5, 3) = -0.101189753990958822
Z (6, 3) = -0.314485451016575490
Z (7, 3) = 0.000000000000000000
Z (1, 4) = -0.026983934397589018
Z (2, 4) = -0.053967868795178037
Z (3, 4) = -0.080951803192767055
Z (4, 4) = 0.892064262409643982
Z (5, 4) = -0.134919671987945078
Z (6, 4) = -0.419313934688767320
Z (7, 4) = 0.000000000000000000
Z (1, 5) = -0.033729917996986269
Z (2, 5) = -0.067459835993972539
Z (3, 5) = -0.101189753990958808
Z (4, 5) = -0.134919671987945078
Z (5, 5) = 0.831350410015068597
Z (6, 5) = -0.524142418360959095
Z (7, 5) = 0.000000000000000000
Z (1, 6) = 0.993254016400602735
Z (2, 6) = -0.013491967198794509
Z (3, 6) = -0.020237950798191764
Z (4, 6) = -0.026983934397589018
Z (5, 6) = -0.033729917996986269
Z (6, 6) = -0.104828483672191830
Z (7, 6) = 0.000000000000000000
Z (1, 7) = 0.062017367294604227
Z (2, 7) = 0.124034734589208454
Z (3, 7) = 0.186052101883812687
Z (4, 7) = 0.248069469178416907
Z (5, 7) = 0.310086836473021155
Z (6, 7) = 0.372104203767625430
Z (7, 7) = 0.806225774829855024