Автоматизация подготовки входных данных и вызова целевых программ комплекса 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 CAL_SYEVZ(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE, NB, VL, VU, IL, IU, ABSTOL, ORFAC, INFILEA, OUTFILE)
Параметры
NAME - | имя целевой подпрограммы, с помощью которой пользователь собирается решать свою задачу (одно из PDSYEV2, PDSYEV4, PDSYEV6); (входной параметр, тип символьный); |
UPLO - | переменная символьного типа, означающая, используется верхний или нижний треугольник матрицы и принимающая значения 'U' или 'L' соответственно (входной параметр); |
N - | порядок исходной матрицы (входной параметр, тип целый); |
NPROW - | число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_SYEVZ(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
NPCOL - | число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_SYEVZ(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
AMEM - | массив локальной рабочей памяти, в которую распределяется локальная часть исходной матрицы, хранятся элементы рабочих массивов, где формируются локальные части массивов собственных значений и собственных векторов (входной параметр, тип DOUBLE PRECISION); |
MEMSIZE - | задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_SYEVZ (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
NB - | размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAR_SYEVZ (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
VL - | заданная нижняя граница интервала, в котором ищутся собственные значения и соответствующие собственные векторы(входной параметр, тип DOUBLE PRECISION); |
VU - | заданная верхняя граница интервала, в котором ищутся собственные значения и соответствующие собственные векторы(входной параметр, тип DOUBLE PRECISION); |
IL - |
заданная нижняя граница интервала индексов, в котором
ищутся собственные значения и соответствующие собственные векторы; предполагается, что собственные значения располагаются по возрастанию; IL ≥ 1; (входной параметр, тип целый); |
IU - | заданная верхняя граница интервала индексов, в котором ищутся собственные значения и соответствующие собственные векторы; предполагается, что собственные значения располагаются по возрастанию; min ( IL, N) ≤ IU ≤ N; (входной параметр, тип целый); |
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 - ого уровня), которые вызываются из целевых подпрограмм.
PDSYEV2 -
PDSYEV4 PDSYEV6 |
вычисление всех собственных значений и собственных векторов симметричной матрицы
для вещественных данных двойной точности; вычисление собственных значений и собственных векторов симметричной матрицы, принадлежащих заданному интервалу, для вещественных данных двойной точности; вычисление собственных значений и собственных векторов симметричной матрицы, принадлежащих заданному интервалу индексов, для вещественных данных двойной точности, соответственно |
PDSYTRD - | приведение симметричной матрицы к трехдиагональной форме методом отражений |
DSTEQR2 - | вычисление всех собственных значений и, возможно, собственных векторов симметричной трехдиагональной матрицы |
PDSYNTRD - | приведение симметричной матрицы к трехдиагональной форме методом отражений |
PDSTEBZ - | вычисление собственных значений симметричной трехдиагональной матрицы |
Замечания по использованию
1. | Используются подпрограммы BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO BLACS_GRIDINIT, BLACS_PINFO, BLACS_SETUP ( из пакета BLACS в составе MKL-библиотеки), DESCINIT, ICEIL, NUMROC, PDLAPRNT ( из пакета ScaLAPACK(TOOLS) в составе MKL-библиотеки), PDLAREAD, PDLAWRITE |
Необходимо вычислить собственные значения и собственные векторы матрицы с помощью
подпрограммы PDSYEV2.
Матрица - квадратная симметричная положительно определенная порядка 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 |
При предварительном обращении к подпрограмме PAR_SYEVZ были получены следующие
значения необходимых параметров.
Решетка процессов: NPROW = 2, NPCOL = 2;
NB = 2 (т.е. матрица разбивается на блоки размера 2 на 2),
MMIN = 114.
Фрагмент фортранного текста вызывающей программы
(полный текст теста можно получить в
tcl_syevz.zip)
PROGRAM TCL_SYEVZ include 'mpif.h' INTEGER N, NPROW, NPCOL, NB, MEMSIZE, IL, IU DOUBLE PRECISION VL, VU, ABSTOL, ORFAC PARAMETER ( N=7, NB=2, MEMSIZE=114) * DOUBLE PRECISION AMEM( MEMSIZE ) CHARACTER*(*) NAME, UPLO CHARACTER INFILEA*(*), OUTFILE*(*) PARAMETER ( INFILEA = 'syev_7.dat', $ OUTFILE = 'syevz_7.res') * PARAMETER ( UPLO = 'U', $ NAME = 'PDSYEV2') EXTERNAL CAL_SYEVZ * NPROW = 2 NPCOL = 2 * VL = 0.D0 VU = 0.D0 IL = 0 IU = 0 * IF( NAME .NE. 'PDSYEV4' ) GOTO 1 VL = -10.0D0 VU = 10.0D0 1 IF( NAME .NE. 'PDSYEV6' ) GOTO 2 IL = 2 IU = 7 2 ABSTOL = 10.0D-10 ORFAC = 0.0D0 * CALL CAL_SYEVZ(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE, NB, $ VL, VU, IL, IU, ABSTOL, ORFAC, INFILEA, OUTFILE) * STOP END Содержимое файла с исходной матрицей 'syev_7.dat': 7 7 0.10000D+01 0.00000D+00 0.00000D+00 0.00000D+00 0.00000D+00 0.00000D+00 0.10000D+01 0.00000D+00 0.10000D+01 0.00000D+00 0.00000D+00 0.00000D+00 0.00000D+00 0.20000D+01 0.00000D+00 0.00000D+00 0.10000D+01 0.00000D+00 0.00000D+00 0.00000D+00 0.30000D+01 0.00000D+00 0.00000D+00 0.00000D+00 0.10000D+01 0.00000D+00 0.00000D+00 0.40000D+01 0.00000D+00 0.00000D+00 0.00000D+00 0.00000D+00 0.10000D+01 0.00000D+00 0.50000D+01 0.00000D+00 0.00000D+00 0.00000D+00 0.00000D+00 0.00000D+00 0.10000D+01 0.60000D+01 0.10000D+01 0.20000D+01 0.30000D+01 0.40000D+01 0.50000D+01 0.60000D+01 0.70000D+01 Результаты: Собственные значения матрицы (в файле 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