Вперед: 5.2.4. Хранение разреженных матриц в MSR формате
Назад: 5.2.2. Конфигурационные параметры библиотеки Aztec
К содержанию: Оглавление


5.2.3. Основные подпрограммы библиотеки Aztec

В состав библиотеки Aztec входит около 50 подпрограмм (функций в языке С), однако большая их часть имеет вспомогательный характер и прямое обращение к ним не требуется. Стандартное использование библиотеки требует обращения к 5-6 подпрограммам. Рассмотрим их в соответствии с очередностью вызовов этих подпрограмм.

Функция идентификации процессоров AZ_processor_info

Эта функция инициализирует коммуникационную среду и возвращает номер процесса, вызвавшего функцию и общее количество запущенных процессов.

call AZ_processor_info(proc_config)

Информация возвращается в массив целого типа proc_config(0:AZ_PROC_SIZE).
При этом номер текущего процессора IAM и количество процессоров NPROCS заносятся в соответствующие элементы этого массива:

IAM = proc_config(AZ_node) - номер вызывающего процессора;
NPROCS = proc_config (AZ_N_procs) - общее число процессоров, доступных программе.

Функция рассылки информации по процессорам AZ_broadcast

Эта функция является аналогом функции MPI_Bcast. Ее реализация выполнена в стиле PVM: рассылаемая информация сначала упаковывается в системный буфер, а затем посылается одной командой. Выполнять рассылку может только 0-й процессор. Вызов функции имеет вид:

call AZ_broadcast(n, 4, proc_config, AZ_PACK) - упаковка в буфер переменной n типа integer
call AZ_broadcast(d, 8, proc_config, AZ_PACK) - упаковка в буфер переменной d типа real*8
call AZ_broadcast(NULL, 0, proc_config, AZ_SEND) - рассылка буфера.

Вместо этой функции можно использовать стандартные подпрограммы из коммуникационных библиотек, например, MPI_Bcast из коммуникационной библиотеки MPI.

Функция определения параметров декомпозиции матрицы AZ_read_update

Эта функция определяет, сколько строк глобальной матрицы должно находиться в указанном процессоре и номера этих строк. Вызов функции имеет вид:

call AZ_read_update(N_update, update, proc_config, nz, 1, 0)

N_update - целая переменная, возвращает количество строк на процессоре;
update - массив целого типа размерности не меньше, чем N_update+1, после вызова содержит номера строк в глобальной нумерации;
nz - размерность глобальной матрицы (входной параметр).

Два последних параметра вызова процедуры - константы.
После вызова всех рассмотренных выше функций в каждом процессоре должна быть сформирована размещенная в нем часть разреженной матрицы, представленная в виде двух массивов:

  1. массива двойной точности val, в котором хранятся ненулевые матричные элементы,
  2. целого массива bindx, в котором хранятся номера столбцов ненулевых матричных элементов (в случае хранения в формате MSR).

Этот этап целиком и полностью возлагается на программиста и требует от него некоторой изобретательности. Для VBR формата требуется сохранять больше информации (в данном пособии мы его рассматривать не будем). Кроме того, должны быть сформированы векторы правых частей b и начальное приближение решения x (только расположенные в данном процессоре части).

Функция преобразования глобальной индексации в локальную AZ_transform

Вызов функции имеет вид:

call AZ_transform(proc_config, external, bindx, val, update,
$ update_index, extern_index, data_org, N_update,
$ NULL, NULL, NULL, NULL, AZ_MSR_MATRIX)

Входные параметры этой процедуры proc_config, bindx, val, update, N_update рассмотрены выше. Выходные параметры - целые массивы external, update_index, extern_index, data_org размерности не меньше, чем N_update + 1 - будут передаваться процедуре решения системы уравнений AZ_solve. Параметры, имеющие значения NULL, в случае MSR формата не используются.

Перед обращением к процедуре решения системы вектор правых частей и начальное приближение должны быть переопределены в соответствии с новой индексацией.

do i = 0, N_update-1
xn(update_index(i)) = x(i)
bn(update_index(i)) = b(i)
end do

Функция инициализации предопределенных параметров решателя AZ_defaults

Вызов функции имеет вид:

call AZ_defaults(options, params)

В данной процедуре оба параметра выходные и были подробно рассмотрены выше. Установки по умолчанию могут быть переопределены:

options(AZ_solver) = AZ_cgs - выбор метода решения CGS;
option[AZ_precond] = AZ_dom_decomp;
options[AZ_subdomain_solve] = xxx;
где ххх = AZ_ilu | AZ_ilut | AZ_bilu
- выбор переобуславливателя;
options(AZ_subdomain_solve) = AZ_ilu - неполное LU разложение;
options(AZ_output) = AZ_none - диагностику не выдавать;
options(AZ_max_iter) = 1000 - максимальное число итераций 1000;
params(AZ_tol) = 1.d-8 - критерий сходимости 10-8.

Функция решения системы линейных алгебраических уравнений AZ_solve

Эта функция является основной <рабочей лошадкой> пакета. Ее вызов имеет следующий вид:

call AZ_solve(xn, bn, options, params, NULL, bindx, NULL,
$ NULL, NULL, val, data_org, status, proc_config)

Параметры NULL не используются в случае MSR формата хранения матрицы. Выходными параметрами являются xn - распределенное по процессорам решение системы, и рассмотренный выше массив status. После обращения к функции необходимо вернуть исходную нумерацию компонентов решения:

do i = 0, N_update-1
x(i) = xn(update_index(i))
end do

и произвести сборку полного вектора решения xall

call MPI_Allgather(N_update ,1, MPI_INTEGER, recb, 1,
$MPI_INTEGER,MPI_COMM_WORLD, ierror)
disp(0) = 0
do 404 i = 1,NPROCS-1
404 disp(i) = disp(i-1) + recb(i-1)
call MPI_Allgatherv(x, N_update, MPI_DOUBLE_PRECISION, xall, recb,
$disp, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD, ierror)


Вперед: 5.2.4. Хранение разреженных матриц в MSR формате
Назад: 5.2.2. Конфигурационные параметры библиотеки Aztec
К содержанию: Оглавление