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

Назначение

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

Параметры

NAME - имя целевой подпрограммы, с помощью которой пользователь собирается решать свою задачу (одно из PDGESVD2, PDGESVD3, PDGESVD5, PDGESVD6); (входной параметр, тип символьный);
SV - если SV = 'R' - требуется вычислить только правые сингулярные векторы матрицы;
если SV = 'L' - требуется вычислить только левые сингулярные векторы матрицы;
если SV = 'A' - требуется вычислить и левые и правые сингулярные векторы матрицы;
(входной параметр, тип символьный);
M - число строк исходной матрицы (входной параметр, тип целый);
N - число столбцов исходной матрицы (входной параметр, тип целый);
NPROW - число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GESVD2(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NPCOL - число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GESVD2(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
AMEM - массив локальной рабочей памяти, в которую распределяется локальная часть исходной матрицы, хранятся элементы рабочих массивов, где формируются локальные части массивов сингулярных чисел и сингулярных векторов (входной параметр, тип DOUBLE PRECISION);
MEMSIZE - задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_GESVD2 (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NB - размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAR_GESVD2 (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
INFILEA - имя файла, содержащего исходную матрицу (A) (входной параметр, тип символьный);
OUTFILE - имя файла, в который в результате работы подпрограммы будут записаны результирующие массивы сингулярных чисел и сингулярных векторов (входной параметр, тип символьный).

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

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

PDGESVD2 - PDGESVD3   
PDGESVD5   
PDGESVD6   
сингулярное разложение квадратной матрицы с вычислением всех сингулярных чисел и сингулярных векторов;
сингулярное разложение квадратной матрицы с вычислением сингулярных чисел и правых и/или левых сингулярных векторов;
сингулярное разложение прямоугольной матрицы с вычислением всех сингулярных чисел и сингулярных векторов;
сингулярное разложение прямоугольной матрицы с вычислением сингулярных чисел и правых и/или левых сингулярных векторов,
соответственно

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

  1.  Используются подпрограммы BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO BLACS_GRIDINIT, BLACS_PINFO, BLACS_SETUP, IGSUM2D ( из пакета BLACS в составе MKL-библиотеки), DESCINIT, ICEIL, NUMROC, PDLAPRNT ( из пакета ScaLAPACK(TOOLS) в составе MKL-библиотеки), PDLAREAD, PDLAWRITE

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

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

           |   1   2   3   4   5   |
           |   2   1   3   4   5   |
           |   3   3   1   4   5   |
           |   4   4   4   1   5   |
           |   5   5   5   5   1   |

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

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

      PROGRAM   TCL_GESVD2
      include 'mpif.h'
      INTEGER                         M, N, NPROW, NPCOL, NB, MEMSIZE
      PARAMETER                  ( M=5, N=5, NB=2, MEMSIZE=104)
*
      DOUBLE PRECISION   AMEM( MEMSIZE )
      CHARACTER*(*)           NAME, SV
      CHARACTER                 INFILEA*(*), OUTFILE*(*)
      PARAMETER                 ( INFILEA = 'gesvdA_5.dat',
     $                                        OUTFILE = 'gesvd2_5.res')
*
      PARAMETER                 ( SV = 'A',
     $                                        NAME = 'PDGESVD2')
      EXTERNAL                    CAL_GESVD2
*
      NPROW = 2
      NPCOL = 2
*
      CALL CAL_GESVD2(NAME, SV, M, N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
     $                                    INFILEA, OUTFILE)
*
      STOP
      END

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

           5           5
     0.10000D+01
     0.20000D+01
     0.30000D+01
     0.40000D+01
     0.50000D+01

     0.20000D+01
     0.10000D+01
     0.30000D+01
     0.40000D+01
     0.50000D+01

     0.30000D+01
     0.30000D+01
     0.10000D+01
     0.40000D+01
     0.50000D+01

     0.40000D+01
     0.40000D+01
     0.40000D+01
     0.10000D+01
     0.50000D+01

     0.50000D+01
     0.50000D+01
     0.50000D+01
     0.50000D+01
     0.10000D+01

Результаты:

 сингулярные числа (в файле OUTFILE)

  S( 1 ) =  17.2323289653599;
  S( 2 ) =  5.42527830414530;
  S( 3 ) =  3.51682585287666;
  S( 4 ) =  2.29022480833794;
  S( 5 ) =  0.999999999999999;

 сингулярные векторы:

  Матрица U

 U (1, 1) = -0.404652434305128872
 U (2, 1) = -0.404652434305128927
 U (3, 1) = -0.425692654396723880
 U (4, 1) = -0.465693233173190002
 U (5, 1) = -0.523859133156270307

 U (1, 2) = -0.389791547190647292
 U (2, 2) = -0.389791547190647736
 U (3, 2) = -0.275993043075253408
 U (4, 2) = 0.045447631608895860
 U (5, 2) = 0.786058173694953233

 U (1, 3) = 0.247683855301383621
 U (2, 3) = 0.247683855301383732
 U (3, 3) = 0.084392957515293437
 U (4, 3) = -0.874087946343403921
 U (5, 3) = 0.325812072251903062

 U (1, 4) = -0.350673159755203467
 U (2, 4) = -0.350673159755202302
 U (3, 4) = 0.857607971563088323
 U (4, 4) = -0.130516617390330075
 U (5, 4) = -0.039123519154543346

 U (1, 5) = -0.707106781186547351
 U (2, 5) = 0.707106781186547795
 U (3, 5) = -0.000000000000000722
 U (4, 5) = 0.000000000000000056
 U (5, 5) = 0.000000000000000167

  Матрица VT

 VT (1, 1) = -0.404652434305128761
 VT (2, 1) = 0.389791547190647070
 VT (3, 1) = -0.247683855301383649
 VT (4, 1) = 0.350673159755203079
 VT (5, 1) = 0.707106781186547462

 VT (1, 2) = -0.404652434305128983
 VT (2, 2) = 0.389791547190647625
 VT (3, 2) = -0.247683855301383982
 VT (4, 2) = 0.350673159755202413
 VT (5, 2) = -0.707106781186547684

 VT (1, 3) = -0.425692654396723769
 VT (2, 3) = 0.275993043075253741
 VT (3, 3) = -0.084392957515293576
 VT (4, 3) = -0.857607971563088101
 VT (5, 3) = 0.000000000000000555

 VT (1, 4) = -0.465693233173189891
 VT (2, 4) = -0.045447631608895631
 VT (3, 4) = 0.874087946343404698
 VT (4, 4) = 0.130516617390329825
 VT (5, 4) = -0.000000000000000222

 VT (1, 5) = -0.523859133156270196
 VT (2, 5) = -0.786058173694953788
 VT (3, 5) = -0.325812072251903284
 VT (4, 5) = 0.039123519154543387
 VT (5, 5) = -0.000000000000000444