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

Назначение

Автоматизация подготовки входных данных и вызова целевых программ комплекса 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_SYEV1(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE,
                                            NB, VL, VU, IL, IU, ABSTOL, INFILEA, OUTFILE)

Параметры

NAME - имя целевой подпрограммы, с помощью которой пользователь собирается решать свою задачу (одно из PDSYEV1, PDSYEV3, PDSYEV5); (входной параметр, тип символьный);
UPLO - переменная символьного типа, означающая, используется верхний или нижний треугольник матрицы и принимающая значения 'U' или 'L' соответственно (входной параметр);
N - порядок исходной матрицы (входной параметр, тип целый);
NPROW - число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_SYEV1(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NPCOL - число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_SYEV1(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
AMEM - массив локальной рабочей памяти, в которую распределяется локальная часть исходной матрицы, хранятся элементы рабочих массивов, где формируются локальные части массива собственных значений (входной параметр, тип DOUBLE PRECISION);
MEMSIZE - задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_SYEV1 (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NB - размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAR_SYEV1 (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
VL - заданная нижняя граница интервала, в котором ищутся собственные значения при использовании подпрограммы PDSYEV3 (в других случаях положить равной нулю) (входной параметр, тип DOUBLE PRECISION);
VU - заданная верхняя граница интервала, в котором ищутся собственные значения при использовании подпрограммы PDSYEV3 (в других случаях положить равной нулю) (входной параметр, тип DOUBLE PRECISION);
IL - заданная нижняя граница интервала индексов, в котором ищутся собственные значения при использовании подпрограммы PDSYEV5 (в других случаях положить равной нулю);
предполагается, что собственные значения располагаются по возрастанию; IL ≥ 1; (входной параметр, тип целый);
IU - заданная верхняя граница интервала индексов, в котором ищутся собственные значения при использовании подпрограммы PDSYEV5 (в других случаях положить равной нулю); предполагается, что собственные значения располагаются по возрастанию; min ( IL, N) ≤ IU ≤ N; (входной параметр, тип целый);
ABSTOL - заданная абсолютная точность, с которой должны быть вычислены собственные значения (при NAME = 'PDSYEV1' не используется);
заданная точность считается достигнутой, если собственное значение лежит в интервале [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);
INFILEA - имя файла, содержащего исходную матрицу (A) (входной параметр, тип символьный);
OUTFILE - имя файла, в который в результате работы подпрограммы будет записан результирующий массив собственных значений (входной параметр, тип символьный).

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

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

PDSYEV1 - PDSYEV3   
PDSYEV5   
вычисление всех собственных значений симметричной матрицы для вещественных данных двойной точности;
вычисление собственных значений симметричной матрицы, принадлежащих заданному интервалу, для вещественных данных двойной точности;
вычисление собственных значений симметричной матрицы, принадлежащих заданному интервалу индексов, для вещественных данных двойной точности,
соответственно
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

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

Необходимо вычислить собственные значения матрицы с помощью подпрограммы PDSYEV1.
Матрица - квадратная симметричная положительно определенная порядка 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_SYEV1 были получены следующие значения необходимых параметров.
Решетка процессов: NPROW = 2, NPCOL = 2;
NB = 2 (т.е. матрица разбивается на блоки размера 2 на 2), MMIN = 74.

Фрагмент фортранного текста вызывающей программы
(полный текст теста можно получить в tcl_syev1.zip)

      PROGRAM TCL_SYEV1
      include 'mpif.h'
      INTEGER                         N, NPROW, NPCOL, NB, MEMSIZE, IL, IU
      DOUBLE PRECISION   VL, VU, ABSTOL
      PARAMETER                  ( N=7, NB=2, MEMSIZE=74)
*
      DOUBLE PRECISION   AMEM( MEMSIZE )
      CHARACTER*(*)           NAME, UPLO
      CHARACTER          INFILEA*(*), OUTFILE*(*)
      PARAMETER         ( INFILEA = 'syev_7.dat',
     $                                OUTFILE = 'syev1_7.res')
*
      PARAMETER         ( UPLO = 'U',
     $                                NAME = 'PDSYEV1')
      EXTERNAL CAL_SYEV1
*
      NPROW = 2
      NPCOL = 2
*
      VL = 0.D0
      VU = 0.D0
      IL = 0
      IU = 0
*
      IF( NAME .NE. 'PDSYEV3' ) GOTO 1
      VL = -10.0D0
      VU =  10.0D0
   1 IF( NAME .NE. 'PDSYEV5' ) GOTO 2
      IL = 2
      IU = 7
   2 ABSTOL = 10.0D-10
*
      CALL CAL_SYEV1(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
     $                                  VL, VU, IL, IU, ABSTOL, 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