2.3. Основные подпрограммы библиотеки Aztec
В состав библиотеки Aztec входит около 50 подпрограмм (функций в языке С), однако большая их часть имеет вспомогательный характер и не требуется прямое обращение к ним. Стандартное использование библиотеки требует обращения к 5-6 подпрограммам. Рассмотрим их в соответствии с очередностью вызовов этих подпрограмм в программах, основанных на библиотеке Aztec.
Функция идентификации процессоров AZ_processor_info
Эта функция является аналогом функции whoami в PSE и функций MPI_Comm_rank, MPI_Comm_size в MPI.
call AZ_processor_info(proc_config)
Информация возвращается в массив
integer 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; |
call AZ_broadcast(d, 8, proc_config, AZ_PACK) | - | упаковываем в буфер переменную d типа real*8; |
call AZ_broadcast(NULL, 0, proc_config, AZ_SEND) | - | посылаем буфер. |
Функция определения параметров декомпозиции матрицы AZ_read_update
Эта функция определяет, сколько строк глобальной матрицы должно находиться в данном процессоре и номера этих строк. Вызов функции имеет следующий вид:
call AZ_read_update(N_update, update, proc_config, nz, 1, 0)
N_update | - | целая переменная, возвращает количество строк на процессоре; |
update | - | массив целого типа размерности не меньше, чем N_update+1, после вызова содержит номера строк в глобальной нумерации; |
nz | - | размерность глобальной матрицы (входной параметр). |
Два последних параметра - константы.
После вызова всех рассмотренных выше функций в каждом процессоре должна быть сформирована размещенная в нем часть разреженной матрицы, представленная в виде двух массивов:
Этот этап целиком и полностью возлагается на программиста и требует от него некоторой
изобретательности.
Для 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; |
options(AZ_precond)=AZ_dom_decomp | - | выбор переобуславливателя; |
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.