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

Назначение

Автоматизация подготовки входных данных и вызова целевых программ комплекса 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