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

Назначение

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

Описание

Эта служебная подпрограмма организует за пользователя правильный вызов целевых программ вычисления на распределенной памяти собственных значений в обобщенной проблеме собственных значений одного из трех видов
(1)     Аx = λBx ,
(2)     АBx = λx     или
(3)     BАx = λx
для эрмитовых матриц. Она считывает из внешнего файла исходные матрицы, распределяет их части(блоки) по параллельным процессам в соответствии с используемыми алгоритмами и формирует правильный список фактических параметров для выбранной пользователем целевой программы. После чего осуществляет вызов этой программы. Полученный в результате счета массив собственных значений записывается во внешний файл.

Литература:

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_HEGV1(IBTYPE, NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE,
                                            NB, VL, VU, IL, IU, ABSTOL, INFILEA, INFILEB, OUTFILE)

Параметры

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

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

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

PZHEGV1 - PZHEGV3   
PZHEGV5   
вычисление всех собственных значений в обобщенной проблеме собственных значений для эрмитовых матриц двойной точности;
вычисление собственных значений, принадлежащих заданному интервалу, в обобщенной проблеме собственных значений для эрмитовых матриц двойной точности;
вычисление собственных значений, принадлежащих заданному интервалу индексов, в обобщенной проблеме собственных значений для эрмитовых матриц двойной точности,
соответственно
PZHEEV1 - PZHEEV3   
PZHEEV5   
вычисление всех собственных значений эрмитовой матрицы для комплексных данных двойной точности;
вычисление собственных значений эрмитовой матрицы, принадлежащих заданному интервалу, для комплексных данных двойной точности;
вычисление собственных значений эрмитовой матрицы, принадлежащих заданному интервалу индексов, для комплексных данных двойной точности,
соответственно
PZPOTRF - Треугольное разложение эрмитовой положительно определенной матрицы методом Холецкого
PZHETRD - приведение эрмитовой матрицы к трехдиагональной форме методом отражений
ZSTEQR2 - вычисление всех собственных значений и, возможно, собственных векторов эрмитовой трехдиагональной матрицы
PZHENTRD - приведение эрмитовой матрицы к трехдиагональной форме методом отражений
PZHENGST -
приведение обобщенной проблемы собственных значений к стандартному виду
PZTRMM - выполнение операций над двумя комплексными матрицами
PZTRSM - решение матричных уравнений с двумя комплексными матрицами

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

  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

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

Необходимо вычислить собственные значения в обобщенной проблеме собственных значений ( Аx = λ Bx ) для эрмитовых матриц с помощью подпрограммы PZHEGV1.
Матрицы - квадратные эрмитовы порядка 5.
Пусть матрицы А и B имеют вид:

           |   10,0    2,0    3,0    1,0    1,0    |
           |    0,0   12,0    1,0    2,0    1,0    |
           |    0,0    0,0   11,0    1,0   -1,0    |
           |    0,0    0,0    0,0    9,0     1,0    |
           |    0,0    0,0    0,0    0,0   15,0    |

           |   12,0    1,0   -1,0    2,0    1,0    |
           |    0,0   14,0    1,0   -1,0    1,0    |
           |    0,0    0,0   16,0   -1,0    1,0    |
           |    0,0    0,0    0,0   12,0   -1,0    |
           |    0,0    0,0    0,0    0,0   11,0    |

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

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

      PROGRAM   TCZ_HEGV1
      include 'mpif.h'
      INTEGER                         N, NPROW, NPCOL, NB, MEMSIZE, IBTYPE, IL, IU
      DOUBLE PRECISION   VL, VU, ABSTOL
      PARAMETER                  ( N=5, NB=2, MEMSIZE=5649)
*
      DOUBLE COMPLEX     AMEM( MEMSIZE )
      CHARACTER*(*)           NAME, UPLO
      CHARACTER                 INFILEA*(*), INFILEB*(*), OUTFILE*(*)
      PARAMETER                 ( INFILEA = 'hegvA_5.dat',
     $                                         INFILEB = 'hegvB_5.dat',
     $                                        OUTFILE = 'hegv1_5.res')
*
      PARAMETER                 ( UPLO = 'U',
     $                                        NAME = 'PZHEGV1')
      EXTERNAL                    CAZ_HEGV1
*
      IBTYPE = 1
      NPROW = 2
      NPCOL = 2
*
      VL = 0.D0
      VU = 0.D0
      IL = 0
      IU = 0
*
      IF( NAME .NE. 'PZHEGV3' ) GOTO 1
      VL = 0.5D0
      VU = 1.5D0
    1 IF( NAME .NE. 'PZHEGV5' ) GOTO 2
      IL = 2
      IU = 7
    2 ABSTOL = 10.0D-10
      ORFAC = 0.0D0
*
      CALL CAZ_HEGV1(IBTYPE, NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
     $                                  VL, VU, IL, IU, ABSTOL, INFILEA, INFILEB, OUTFILE)
*
      STOP
      END

Содержимое файлов с исходными матрицами:
  'hegvA_5.dat':

           5           5
     0.10000D+02  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.12000D+02  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.10000D+01  0.00000D+00
     0.11000D+02  0.00000D+00
     0.00000D+00  0.00000D+00
     0.00000D+00  0.00000D+00

     0.10000D+01  0.00000D+00
     0.20000D+01  0.00000D+00
     0.10000D+01  0.00000D+00
     0.90000D+01  0.00000D+00
     0.00000D+00  0.00000D+00

     0.10000D+01  0.00000D+00
     0.10000D+01  0.00000D+00
    -0.10000D+01  0.00000D+00
     0.10000D+01  0.00000D+00
     0.15000D+02  0.00000D+00

 'hegvB_5.dat':

           5           5
     0.12000D+02  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.14000D+02  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.10000D+01  0.00000D+00
     0.16000D+02  0.00000D+00
     0.00000D+00  0.00000D+00
     0.00000D+00  0.00000D+00

     0.20000D+01  0.00000D+00
    -0.10000D+01  0.00000D+00
    -0.10000D+01  0.00000D+00
     0.12000D+02  0.00000D+00
     0.00000D+00  0.00000D+00 

     0.10000D+01  0.00000D+00
     0.10000D+01  0.00000D+00
     0.10000D+01  0.00000D+00
    -0.10000D+01  0.00000D+00
     0.11000D+02  0.00000D+00

Результаты:

 Собственные значения (в файле OUTFILE):

  W(1) =  0.432787211016963
  W(2) =  0.663662748392315
  W(3) =  0.943859004668386
  W(4) =  1.10928454001752
  W(5) =  1.49235323254300