Решение системы с симметричной положительно определенной ленточной матрицей методом Холецкого
Подпрограмма вычисляет решение системы линейных уравнений
A(1 : N, JA : JA + N - 1) * X = B( IB : IB + N - 1, 1 : NRHS) , где A(1 : N, JA : JA + N - 1) - квадратная вещественная симметричная положительно определенная ленточная распределенная матрица порядка N с шириной ленты BW.
Разложение Холецкого используется для факторизации матрицы в виде множителей L и L '.
Матрицы A и B должны быть заданы в виде массивов двойной точности. Все вычисления проводятся в режиме DOUBLE PRECISION.
Литература:
http://www.netlib.org/scalapack/slug/index.html
A. Cleary and J. Dongarra, Implementation in scalapack of divide - and - conquer algorithms for banded and tridiagonal linear systems, Computer Science Dept. Technical Report CS - 97 - 358, University of Tennessee, Knoxville, TN, April 1997. (Also LAPACK Working Note #125).
CALL PDPBSV ( UPLO, N, BW, NRHS, A, JA, DESCA, B, IB, DESCB, WORK, LWORK, INFO)
Параметры
UPLO - |
если UPLO = ' U ', сохраняется верхний треугольник матрицы A (1 : N, JA : JA + N - 1); если UPLO = ' L ', сохраняется нижний треугольник матрицы A (1 : N, JA : JA + N - 1) (глобальный входной параметр, тип символьный); |
N - | порядок распределенной подматрицы A (1 : N, JA : JA + N - 1), N і 0 (глобальный входной параметр, тип целый); |
BW - | число поддиагоналей в L или U, 0 Ј BW Ј N - 1 (глобальный входной параметр, тип целый); |
NRHS - |
число правых частей, т.е. число столбцов распределенной подматрицы B ( IB : IB + N - 1, 1 : NRHS), NRHS і 0 (глобальный входной параметр, тип целый); |
A - |
указатель на локальную память, занимаемую массивом
двойной точности с первым размером
LLD_A і (bw + 1),
хранящимся в DESCA; на входе - этот массив содержит локальные куски факторизуемой распределенной матрицы A (1 : N, JA : JA + N - 1). Эта локальная порция хранится в запакованном ленточном формате, используемом в пакете LAPACK. Более подробно см. в разделе документации "Схема размещения в локальной памяти и блочно - столбцовое разбиение ленточных матриц"; на выходе - массив A содержит информацию, касающуюся подробностей факторизации; заметим, что перестановки выполняются над матрицей A так, что возвращаемые множители отличаются от тех, которые возвращаются в пакете LAPACK; |
JA - | номер столбца в глобальном массиве A, указывающий на начало матрицы (которая должна быть обработана либо всей матрицей A, либо подматрицей матрицы A) (глобальный входной параметр, тип целый); |
DESCA - |
дескриптор распределенной матрицы A (одномерный массив длины DLEN);
содержит информацию о размещении A в памяти; полное описание DESCA
см. в разделе документации
"Дескрипторы глобальных массивов"; если тип дескриптора одномерный ( DTYPE_A = 501), DLEN і 7, если тип дескриптора двумерный ( DTYPE_A = 1), DLEN і 9; (глобальный и локальный входной параметр, тип целый); |
B - |
указатель на локальную память, занимаемую массивом
двойной точности с локальной ведущей размерностью
lld_b і NB; на входе - этот массив содержит локальные куски правых частей B ( IB : IB + N - 1, 1 : NRHS); на выходе - он содержит локальный кусок распределенной матрицы решений X; |
IB - | номер строки в глобальном массиве B, указывающий на первую строку матрицы, которая должна быть обработана (которая может быть либо всей матрицей B, либо подматрицей матрицы B) (глобальный входной параметр, тип целый); |
DESCB - |
дескриптор распределенной матрицы B (одномерный массив длины DLEN),
содержащий информацию о размещении матрицы B
в памяти; полное описание DESCB см. в разделе документации
"Дескрипторы глобальных массивов"; если тип дескриптора одномерный ( DTYPE_B = 502), DLEN і 7, если тип дескриптора двумерный ( DTYPE_B = 1), DLEN і 9; (глобальный и локальный входной параметр, тип целый); |
WORK - | временное рабочее пространство двойной точности; это пространство может изменять свое содержимое между вызовами подпрограмм; WORK должно иметь длину, задаваемую параметром LWORK; на выходе - WORK (1) содержит минимальное значение LWORK (локальное рабочее пространство, локальный выходной параметр); |
LWORK - |
размер отводимого пользователем рабочего пространства
с именем WORK; если LWORK слишком мало, минимальный
приемлемый (допустимый) размер будет возвращен в
элементе WORK (1) и будет выдан код ошибки, LWORK і ( NB + 2 * bw) * bw + max ((bw * NRHS), bw * bw) (локальный или глобальный входной параметр, тип целый); |
INFO - | целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр) |
= 0 - | успешное завершение работы; |
< 0 - |
если i - ый фактический параметр является массивом
и его j - ый элемент имеет недопустимое значение, то INFO = - ( i * 100 + j ), если i - ый фактический параметр является скаляром и имеет недопустимое значение, то INFO = - i; |
> 0 - |
если INFO = K Ј NPROCS, то подматрица, хранящаяся
на процессоре INFO и локально факторизуемая, не
является положительно определенной, и факторизация
не может быть завершена; если INFO = K > NPROCS, то подматрица, хранящаяся на процессоре INFO - NPROCS, и представляющая взаимодействие с другими процессорами, не является положительно определенной, и факторизация не может быть завершена |
Версии
PSPBSV - PCPBSV PZPBSV | решение системы с симметричной (эрмитовой) положительно определенной ленточной матрицей методом Холецкого для случаев вещественной одинарной точности, комплексной одинарной точности и комплексной двойной точности матриц соответственно |
Вызываемые подпрограммы
Здесь указаны только базовые подпрограммы (2 - ого уровня), которые вызываются из целевой подпрограммы (1 - ого уровня).
PDPBTRF - PZPBTRF | Треугольное разложение симметричной (эрмитовой) положительно определенной ленточной матрицы методом Холецкого |
PDPBTRS - PZPBTRS | Решение системы линейных уравнений с симметричной (эрмитовой) положительно определенной ленточной матрицей, на основе разложения Холецкого, полученного подпрограммой PDPBTRF(PZPBTRF) |
Замечания по использованию
В подпрограммах PSPBSV, PCPBSV и PZPBSV параметры A, B и WORK имеют REAL, COMPLEX и DOUBLE COMPLEX соответственно | |
Используются подпрограммы BLACS_GRIDINFO ( из пакета BLACS), PXERBLA ( из пакета PBLAS) | |
Для того чтобы избежать дублирования, наибольшая часть проверок ошибок в этой подпрограмме не выполняется, эти проверки выполняются в подпрограммах PDPBTRF(PZPBTRF) и PDPBTRS(PZPBTRS) | |
Имеются следующие ограничения на входные параметры. |
1. |
Не циклическое ограничение P * NB і mod ( JA - 1, NB) + N |
2. | Ни один из процессоров не может содержать больше одного блока глобальной матрицы. |
3. |
Размер блока (NB) не может быть слишком маленьким: если матрица обрабатывается более чем на одном процессоре, должно быть выполнено следующее неравенство: NB і 2*BW Это объясняется тем, что на каждом процессоре действия выполняются над блоками матрицы размера O (NB). Если этот размер слишком мал, то выбор алгоритма "разделяй и властвуй" является неэффективным. |
4. | Чтобы избежать лишних передач сообщений между процессорами, при работе с подматрицами следует полагать JA = IB. |
Решается система уравнений A X = B ,
где A - симметричная положительно определенная ленточная матрица порядка 9
Пусть матрица А системы имеет вид:
2 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
-1 | 2 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | -1 | 2 | -1 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 1 |
Вектор правых частей В имеет вид:
| 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 1 |
Матрица разбивается по столбцам на 3 блока с размером блоков NB = 3.
Осуществляется пропуск программы на 3 процессах
и используется одномерная решетка процессов 1 на 3.
Фрагмент фортранного текста вызывающей программы
Полный текст теста можно получить в tpdpbsv.zip, а принятые обозначения - посмотреть в разделе документации "Обозначения и упрощения в примерах по использованию подпрограмм комплекса"
Другой (более удобный) вариант теста к этой подпрограмме с использованием служебной подпрограммы PDELSET для распределения элементов исходной глобальной матрицы по параллельным процессам (как это описано в разделах методического пособия в пп.12, 15, 16) и с использованием служебной подпрограммы PDLAPRNT (для выборки всех элементов распределенной матрицы/вектора со всех процессов и последующей распечатки их единым массивом) можно получить в tdpbsv1.zip.
PROGRAM TPDPBSV include 'mpif.h' INTEGER DLEN_, JA, IB, N, NB, RSRC, CSRC, $ MXLLDA, MXLLDB, NRHS, NBRHS, NOUT, $ MXLOCR, MXLOCC, MXRHSC, BW, LWORK PARAMETER ( DLEN_ = 7, JA = 1, IB = 1, $ N = 9, NB = 3, RSRC = 0, $ CSRC = 0, MXLLDA = 2, MXLLDB = 3, NRHS = 1, $ NBRHS = 1, NOUT = 6, MXLOCR = 2, MXLOCC = 3, $ MXRHSC = 1, BW = 1, LWORK = 6 ) CHARACTER UPLO PARAMETER ( UPLO = 'L' ) INTEGER ICTXT, INFO, MYCOL, MYROW, NPCOL, NPROW DOUBLE PRECISION ANORM, BNORM, EPS, RESID, XNORM INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ) DOUBLE PRECISION A( MXLLDA, MXLOCC ), B( MXLLDB, MXRHSC ), $ WORK( LWORK ) EXTERNAL BLACS_EXIT, BLACS_GRIDEXIT, BLACS_GRIDINFO, $ MATINIT, PDPBSV, SL_INIT INTRINSIC DBLE DATA NPROW / 1 / , NPCOL / 3 / CALL SL_INIT( ICTXT, NPROW, NPCOL ) CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL ) IF( MYROW.EQ.-1 ) GO TO 10 DESCA(1) = 501 DESCA(2) = ICTXT DESCA(3) = N DESCA(4) = NB DESCA(5) = CSRC DESCA(6) = 2 DESCA(7) = 0 DESCB(1) = 502 DESCB(2) = ICTXT DESCB(3) = N DESCB(4) = NB DESCB(5) = RSRC DESCB(6) = 3 DESCB(7) = 0 CALL MATINIT( A, DESCA, B, DESCB ) CALL PDPBSV( UPLO, N, BW, NRHS, A, JA, DESCA, $ B, IB, DESCB, WORK, LWORK, INFO) CALL BLACS_GRIDEXIT( ICTXT ) 10 CONTINUE CALL BLACS_EXIT( 0 ) STOP END SUBROUTINE MATINIT( A, DESCA, B, DESCB ) * Подпрограмма генерации и распределения по процессам матриц A и B INTEGER DESCA( * ), DESCB( * ) DOUBLE PRECISION A( * ), B( * ) INTEGER CTXT_ PARAMETER ( CTXT_ = 2 ) INTEGER ICTXT, MXLLDA, MYCOL, MYROW, NPCOL, NPROW DOUBLE PRECISION MO, T, Z EXTERNAL BLACS_GRIDINFO ICTXT = DESCA( CTXT_ ) CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL ) T = 2.0D0 Z = 0.0D0 MO = -1.0D0 * * Локальные части матриц A и B для процесса (0, 0) * IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 ) THEN A( 1 ) = T A( 2 ) = MO A( 3 ) = T A( 4 ) = MO A( 5 ) = T A( 6 ) = MO * B( 1 ) = Z B( 2 ) = Z B( 3 ) = Z * * Локальные части матриц A и B для процесса (0, 1) * ELSE IF( MYROW.EQ.0 .AND. MYCOL.EQ.1 ) THEN A( 1 ) = T A( 2 ) = MO A( 3 ) = T A( 4 ) = MO A( 5 ) = T A( 6 ) = MO * B( 1 ) = Z B( 2 ) = Z B( 3 ) = Z * * Локальные части матриц A и B для процесса (0, 2) * ELSE IF( MYROW.EQ.0 .AND. MYCOL.EQ.2 ) THEN A( 1 ) = T A( 2 ) = MO A( 3 ) = T A( 4 ) = MO A( 5 ) = 1.0D0 A( 6 ) = Z * B( 1 ) = Z B( 2 ) = Z B( 3 ) = 1.0D0 END IF RETURN END Результаты: Решение системы X = ( 1.D0, 2.D0, 3.D0, 4.D0, 5.D0, 6.D0, 7.D0, 8.D0, 9.D0 ) Значение INFO = 0