В состав библиотеки Aztec входит около 50 подпрограмм (функций в языке С), однако большая их часть имеет вспомогательный характер и прямое обращение к ним не требуется. Стандартное использование библиотеки требует обращения к 5-6 подпрограммам. Рассмотрим их в соответствии с очередностью вызовов этих подпрограмм.
Эта функция инициализирует коммуникационную среду и возвращает номер процесса, вызвавшего функцию и общее количество запущенных процессов.
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) | - общее число процессоров, доступных программе. |
Эта функция является аналогом функции 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.
Эта функция определяет, сколько строк глобальной матрицы должно находиться в указанном процессоре и номера этих строк. Вызов функции имеет вид:
call AZ_read_update(N_update, update, proc_config, nz, 1, 0)
N_update | - целая переменная, возвращает количество строк на процессоре; |
update | - массив целого типа размерности не меньше, чем N_update+1, после вызова содержит номера строк в глобальной нумерации; |
nz | - размерность глобальной матрицы (входной параметр). |
Два последних параметра вызова процедуры - константы.
После вызова всех рассмотренных выше функций в каждом процессоре должна быть сформирована размещенная
в нем часть разреженной матрицы, представленная в виде двух массивов:
Этот этап целиком и полностью возлагается на программиста и требует от него некоторой изобретательности. Для VBR формата требуется сохранять больше информации (в данном пособии мы его рассматривать не будем). Кроме того, должны быть сформированы векторы правых частей b и начальное приближение решения x (только расположенные в данном процессоре части).
Вызов функции имеет вид:
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
Вызов функции имеет вид:
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. |
Эта функция является основной <рабочей лошадкой> пакета. Ее вызов имеет следующий вид:
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)