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

Назначение

Автоматизация подготовки входных данных и вызова целевой программы комплекса PARALG вычисления собственных значений матрицы общего вида

Описание

Эта служебная подпрограмма организует за пользователя правильный вызов целевой программы вычисления собственных значений матрицы общего вида на распределенной памяти. Она считывает из внешнего файла исходную матрицу, распределяет ее части(блоки) по параллельным процессам в соответствии с используемыми алгоритмами и формирует правильный список фактических параметров для целевой программы PDGEEV1. После чего осуществляет вызов этой программы. Полученный в результате счета массив собственных значений записывается во внешний файл.

Литература:

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_GEEV1(N, NPROW, NPCOL, AMEM, MEMSIZE,
                                            NB, INFILEA, OUTFILE)

Параметры

N - порядок исходной матрицы (входной параметр, тип целый);
NPROW - число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GEEV1(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NPCOL - число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GEEV1(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
AMEM - массив локальной рабочей памяти, в которую распределяется локальная часть исходной матрицы, хранятся элементы рабочих массивов, где формируется массив собственных значений (входной параметр, тип DOUBLE PRECISION);
MEMSIZE - задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_GEEV1 (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NB - размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAR_GEEV1 (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
INFILEA - имя файла, содержащего исходную матрицу (A) (входной параметр, тип символьный);
OUTFILE - имя файла, в который в результате работы подпрограммы будет записан результирующий массив собственных значений (входной параметр, тип символьный).

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

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

PDGEEV1 - вычисление всех собственных значений матрицы общего вида для вещественных данных двойной точности;
PDGEHRD -
   
приведение матрицы общего вида к верхней форме Хессенберга
PDLAHQR -
   
вычисление собственных значений матрицы в форме Хессенберга

Замечания по использованию

  1.  В случае самостоятельного выбора размера блока (NB), на которые разбивается матрица A при распределении ее частей по паралельным процессам, напоминаем, что в настоящей реализации подпрограммы PDGEEV1 нельзя задавать размер блока (NB), меньше 7. NB является частью дескриптора DESCA. См. раздел документации "Дескрипторы глобальных массивов"
  2.  Используются подпрограммы BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO BLACS_GRIDINIT, BLACS_PINFO, BLACS_SETUP ( из пакета BLACS в составе MKL-библиотеки), DESCINIT, ICEIL, INDXG2P, INFOG2L, NUMROC, PXERBLA, PDLAPRNT ( из пакета ScaLAPACK(TOOLS) в составе MKL-библиотеки), PDLAREAD, PDLAWRITE

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

Необходимо вычислить все собственные значения матрицы с помощью программы PDGEEV1.
Матрица - квадратная общего вида порядка 20.
Пусть матрица А имеет вид:

    |   1   0   0   0   0   0   0   0   0   0    0    0    0    0    0    0    0    0    0    1   |
    |   0   1   0   0   0   0   0   0   0   0    0    0    0    0    0    0    0    0    0    2   |
    |   0   0   1   0   0   0   0   0   0   0    0    0    0    0    0    0    0    0    0    3   |
    |   0   0   0   1   0   0   0   0   0   0    0    0    0    0    0    0    0    0    0    4   |
    |   0   0   0   0   1   0   0   0   0   0    0    0    0    0    0    0    0    0    0    5   |
    |   0   0   0   0   0   1   0   0   0   0    0    0    0    0    0    0    0    0    0    6   |
    |   0   0   0   0   0   0   1   0   0   0    0    0    0    0    0    0    0    0    0    7   |
    |   0   0   0   0   0   0   0   1   0   0    0    0    0    0    0    0    0    0    0    8   |
    |   0   0   0   0   0   0   0   0   1   0    0    0    0    0    0    0    0    0    0    9   |
    |   0   0   0   0   0   0   0   0   0   1    0    0    0    0    0    0    0    0    0  10   |
    |   0   0   0   0   0   0   0   0   0   0    1    0    0    0    0    0    0    0    0  11   |
    |   0   0   0   0   0   0   0   0   0   0    0    1    0    0    0    0    0    0    0  12   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    1    0    0    0    0    0    0  13   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    0    1    0    0    0    0    0  14   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    0    0    1    0    0    0    0  15   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    0    0    0    1    0    0    0  16   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    0    0    0    0    1    0    0  17   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    0    0    0    0    0    1    0  18   |
    |   0   0   0   0   0   0   0   0   0   0    0    0    0    0    0    0    0    0    1  19   | 
    |   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  | 

Порядок матрицы N = 20.

При предварительном обращении к подпрограмме PAR_GEEV1 были получены следующие значения необходимых параметров.
Решетка процессов: NPROW = 2, NPCOL = 4;
NB = 8 (т.е. матрица разбивается на блоки размера 8 на 8), MMIN = 373 .

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

      PROGRAM TCL_GEEV1
      include 'mpif.h'
      INTEGER                         N, NPROW, NPCOL, NB, MEMSIZE
      PARAMETER                  ( N=20, NB=8, MEMSIZE=  373)
*
      DOUBLE PRECISION   AMEM( MEMSIZE )
      CHARACTER          INFILEA*(*), OUTFILE*(*)
      PARAMETER         ( INFILEA = 'geev_20.dat',
     $                                OUTFILE = 'geev1_20.res')
*
      EXTERNAL CAL_GEEV1
*
      NPROW = 2
      NPCOL = 4
*
      CALL CAL_GEEV1(N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
     $                                  INFILEA, OUTFILE)
*
      STOP
      END
*

Результаты:

 Значение  INFO  =   0

 Собственные значения:

  WE(1) = -40.0989D+00
  WE(2) =  61.0989D+00
  WE(3) =   1.D+00
  WE(4) =   1.D+00
  WE(5) =   1.D+00
  WE(6) =   1.D+00
  WE(7) =   1.D+00
  WE(8) =   1.D+00
  WE(9) =   1.D+00
  WE(10) =  1.D+00
  WE(11) =  1.D+00
  WE(12) =  1.D+00
  WE(13) =  1.D+00
  WE(14) =  1.D+00
  WE(15) =  1.D+00
  WE(16) =  1.D+00
  WE(17) =  1.D+00
  WE(18) =  1.D+00
  WE(19) =  1.D+00
  WE(20) =  1.D+00

  WI(1) =   0.D+00
  WI(2) =   0.D+00
  WI(3) =   0.D+00
  WI(4) =   0.D+00
  WI(5) =   0.D+00
  WI(6) =   0.D+00
  WI(7) =   0.D+00
  WI(8) =   0.D+00
  WI(9) =   0.D+00
  WI(10) =  0.D+00
  WI(11) =  0.D+00
  WI(12) =  0.D+00
  WI(13) =  0.D+00
  WI(14) =  0.D+00
  WI(15) =  0.D+00
  WI(16) =  0.D+00
  WI(17) =  0.D+00
  WI(18) =  0.D+00
  WI(19) =  0.D+00
  WI(20) =  0.D+00