5.3 AztecOO, Belos: линейные решатели

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

Итерационные методы решения систем линейных уравнений с AztecOO. AztecOO включает в себя итерационные методы Крылова для решения систем уравнений, такие как метод сопряженных градиентов (CG), обобщенный метод минимальных невязок (GMRES), стабилизированный метод бисопряженных градиентов (BiCGSTAB). AztecOO может использовать различные предобуславливатели, такие, как SOR, полиномиальный, декомпозиции области, неполной факторизации, а также предобуславливатели, предоставляемые другими пакетами Trilinos. AztecOO также содержит все пакеты линейных решателей Aztec, реализованных на языке Си, так что любое приложение, использующее Aztec, может использоваться библиотекой AztecOO.

AztecOO является объектно-ориентированным продолжением пакета Aztec [Tuminaro и соавт. 1999]. Он не только обладает всеми теми же возможностями Aztec, но и обеспечивает более удобный интерфейс и множество функциональных расширений. AztecOO решает линейные системы вида AX = B, где А – линейный оператор, X – составной вектор, содержащий одну или несколько начальных оценок на входе и решения на выходе, а В содержит соответствующие правые стороны.

AztecOO принимает матрицы и вектора, представленные как объекты Epetra. Оператор A и предобуславливатели, не обязательно должны быть объектами Epetra. В AztecOO А и M могут представляться как объекты Epetra_Operator или Epetra_RowMatrix. Оба являются чисто абстрактными классами.

Основы использования. Отметим основные шаги к использованию AztecOO для линейных систем.

Для решения линейной системы с AztecOO необходимо создать объект Epetra_LinearProblem командой:

Epetra_LinearProblem Problem(&A,&x,&b);

где A – матрица Epetra, x и b – вектора Epetra. Затем следует создать объект AztecOO:

AztecOO Solver(Problem);

Далее надо определить, как решить линейную систему. Все опции AztecOO устанавливаются с использованием двух векторов, один состоит из целых чисел, второй – из вещественных.

Чтобы выбрать среди различных параметров AztecOO, пользователь может создать два вектора, обычно называемых options и params, установить значения по умолчанию, затем переписать с желаемыми параметрами.

Значения по умолчанию устанавливаются как:

int options[AZ_OPTIONS_SIZE]; 
double params[AZ_PARAMS_SIZE]; 
AZ_defaults(options, params); 
Solver.SetAllAztecOptions( options ); 
Solver.SetAllAztecParams( params );

Последние две функции копируют значения options и params во внутренние переменные объекта AztecOO.

Также есть возможность установить специфичные параметры без создания options и params, используя функции SetAztecOption() и SetAztecParams(). Например:

Solver.SetAztecOption( AZ_precond, AZ_Jacobi );

для определения предобуславливателя Якоби.

В заключении решим линейную систему, с максимальным количеством итераций 1550 и нормой невязки 10 -9.

Solver.Iterate(1550,1E-9);

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

Предобуславливатели AztecOO. Предобуславливатели делятся на две категории. В первой категории предобуславливатели, которые являются функциями матриц коэффициентов, например, Якоби, Гаусса-Зейделя, неполной факторизации и предобуславливатель декомпозиции области. Ко второй категории относятся полиномиальные предобуславливатели, которые определяются действием матрицы ко множеству векторов. AztecOO принимает объекты Epetra_ Operator как предобуславливатели.

Сначала следует установить решаемую линейную задачу и создать объект AztecOO:

Epetra_LinearProblem A_Problem(&A, &x, &b); 
AztecOO A_Solver(A_Problem);

Далее нужно определить предобуславливатель. Заметим, что используем такую же Epetra_Matrix A в предобуславливании. Однако, матрицы могут отличаться:

Epetra_CrsMatrix P(A);

Затем создается линейная задача, которая будет использоваться как предобуславливатель. Все префиксы P относятся к предобуславливателю:

1. Создать решение линейной системы на каждом шаге предобуславливания:

Epetra_LinearProblem P_Problem; 
P_Problem.SetOperator(&P);

2. Определить объект AztecOO:

AztecOO P_Solver(P_Problem);

3. Установить частные предобуславливатели

P_Solver.SetAztecOption(AZ_precond, AZ_Jacobi); 
P_Solver.SetAztecOption(AZ_output, AZ_none); 
P_Solver.SetAztecOption(AZ_solver, AZ_cg);

Belos: Общая реализация методов Крылова. Belos содержит набор стандартных методов, таких, как сопряженных градиентов (CG), обобщенный метод минимальных невязок (GMRES), и бисопряженных градиентов (Bi-CGSTAB). Он также содержит гибкие и блочные варианты варианты CG,GMRES. Гибкие варианты позволяют менять предобуславливатели, например, их можно менять в каждой итерации. Блочные варианты позволяют решать с несколькими совместными правыми сторонами. Блочные методы также могут быть очень эффективными для задач, которые имеют несколько малых собственных значений, даже если требуется решение только одной правой части.

Belos считается общей реализацией, поскольку он опирается на TSF интерфейсы для доступа к линейным операторам, предобусловливателям и векторным объектам. Поэтому он явно не привязан к какой-либо конкретной библиотеке линейной алгебры и может, в принципе, быть использован с любой библиотекой, реализующей TSF интерфейс. В частности, может использоваться Epetra, т.к. Trilinos обеспечивает реализацию Epetra из TSF интерфейсов.