5.4 Многосеточный предобуславливатель

Пакет ML содержит классы для работы с многосеточными предобуславливателями.

Многосеточный метод для системы уравнений зависит от количества уровней грубых сеток и оператора на каждом уровне. Уровни нумеруются от самого грубого уровня, 0, к мелкому. Пред- (pre-) и после- (post-) сглаживатели (smoothers) обозначаются Sk(1) и Sk(2) соответственно. Rk-1,k это оператор огрубления (the restriction operator) от уровня k к уровню k-1, и Pk,k-1 это оператор продолжения (prolongator) от k-1 к k. В методе AMG ( алгебраический многосеточный метод) на грубых ячейках операторы Ak определяются как Ak-1 = Rk-1,k Ak Pk,k-1.

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

Рекурсивное определение схемы V-цикл MGM(x, b, количество уровней)

если k > 0

x = Sk(1)(x,b)

d = Rk-1,k(b - Akx)

v = 0

MGM(v,d,k-1)

x=x+Pk,k-1v

x = Sk(2)(x,b)

иначе

x = Ak-1b

Объекты ML как предобуславливатели AztecOO. ML может использоваться, как “черный ящик” при многоуровневом предобуславливании, используя процедуру сборки (aggregation), чтобы определить многоуровневую иерархию. Чтобы использовать ML в качестве предобуславливателя, необходимо определить AztecOO Solver, а также структуру для хранения данных. В ML нужно вызвать структуру ml_handle. Далее определить максимальное количество уровней, количество необходимой информации на выводе от 0 до 10, и создать структуру ML:

int N_levels = 10; 
ML_Set_PrintLevel(3); 
ML_Create(&ml_handle,N_levels);

Затем создать ML предобуславливатель для матрицы Epetra, дополнительно требуется структура, которая хранит информацию о сборке на каждом уровне, называемый ML_Aggregate:

EpetraMatrix2MLMatrix(ml_handle, 0, &A); 
ML_Aggregate *agg_object; 
ML_Aggregate_Create(&agg_object);

Многоуровневая иерархия строится по инструкции:

N_levels = ML_Gen_MGHierarchy_UsingAggregation(ml_handle, 
    0, ML_INCREASING, agg_object);

Здесь, 0 индекс самого мелкого уровня, а индексы более грубых уровней будут получаться увеличением на единицу этой величины.

Далее определяется сглаживатель, например симметричный Гаусса-Зейделя, и инициализируется решатель:

ML_Gen_Smoother_SymGaussSeidel(ml_handle, ML_ALL_LEVELS, 
ML_BOTH, 1, ML_DEFAULT); 
ML_Gen_Solver (ml_handle, ML_MGV, 0, N_levels-1);

Наконец, используется иерархия ML для создания Epetra_Operator, устанавливается оператор предобуславливания решателя AztecOO и вызывается Iterate() как обычно:

ML_Epetra::MultiLevelOperator MLop(ml_handle,comm,map,map); 
solver.SetPrecOperator(&MLop); 
solver.Iterate(Niters, 1e-12);

The ML Epetra::MultiLevelOperator Class. Как и другие Trilinos пакеты, ML может быть скомпилирован и запущен независимо от Epetra. Он принимает входную матрицу в отличном от Epetra_RowMatrix или Epetra_Operator формате.

Однако, как часть проекта Trilinos, ML может использоваться для определения оператора предобуславливателя для объекта Epetra_LinearProblem . Это означает, что в C++ , ML может определяться как объект Epetra_Operator, применительно к объекту Epetra_MultiVector, и используется как предобуславливатель для AztecOO. Это можно сделать двумя способами:

Определением объекта ML_Epetra::MultiLevelOperator, наследуемого от класса Epetra_Operator. Конструктор этого объекта требует уже заполненные структуры ML_Struct и ML_Aggregate. ML должен быть настроен с опцией enable-epetra.

Определением объекта ML_Epetra::MultiLevelPreconditioner, наследуемого из класса Epetra_RowMatrix. В основном, конструктору этого объекта необходимо задать указатель на объект класса Epetra_RowMatrix и параметр Teuchos, который содержит все параметры определяемые пользователем. ML должен быть настроен с опцией enable-epetra enable-teuchos.