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

Назначение

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

Параметры

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

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

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

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

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

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

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

      PROGRAM   TCZ_HEEV1
      include 'mpif.h'
      INTEGER                         N, NPROW, NPCOL, NB, MEMSIZE, IL, IU
      DOUBLE PRECISION   VL, VU, ABSTOL
      PARAMETER                  ( N=7, NB=2, MEMSIZE=81)
*
      DOUBLE COMPLEX     AMEM( MEMSIZE )
      CHARACTER*(*)           NAME, UPLO
      CHARACTER                 INFILEA*(*), OUTFILE*(*)
      PARAMETER                 ( INFILEA = 'heev_7.dat',
     $                                        OUTFILE = 'heev1_7.res')
*
      PARAMETER                 ( UPLO = 'U',
     $                                        NAME = 'PZHEEV1')
      EXTERNAL                    CAZ_HEEV1
*
      NPROW = 2
      NPCOL = 2
*
      VL = 0.D0
      VU = 0.D0
      IL = 0
      IU = 0
*
      IF( NAME .NE. 'PZHEEV3' ) GOTO 1
      VL = -10.0D0
      VU =  10.0D0
    1 IF( NAME .NE. 'PZHEEV5' ) GOTO 2
      IL = 2
      IU = 7
    2 ABSTOL = 10.0D-10
*
      CALL CAZ_HEEV1(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
     $                                  VL, VU, IL, IU, ABSTOL, 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