4.3 Решатели и предобуславливатели

В hypre имеются различные решатели работающие с определенными интерфейсами (см. таблицу 5.1)







Решатели StructSStructFEIIJ





Jacobi X X





SMG X X





PFMG X X





SysPFMG X





Split X





FAC X





Maxwell X





BoomerAMG X X X





AMS X X X





MLI X X X





ParaSails X X X





Euclid X X X





PILUT X X X





PCG X X X X





GMRES X X X X





BiCGSTAB X X X X





Hybrid X X X X






Таблица 4.1: Решатели+предобуславливатели и интерфейсы

Обычно решатели используются с предобуславливателем, но можно использовать только предобуславливатель для решения линейной системы. Использование решателя и+или предобуславливателя в hypre можно разделить на 5 шагов:

1.
Инициализация матрицы и правой части системы линейных уравнений
2.
Создание решателя+предобуславливателя
3.
Задание параметров решателя+предобуславливателя
4.
Связывание предобуславливателя с решателем
5.
Решение системы уравнений

Рассмотрим пример использования решателя с предобуславливателем, для краткости инициализация матрицы и правой части была опущена, код начинается сразу со второго шага:

    /* Create an empty PCG Struct solver and 
        symmetric SMG as preconditioner  */ 
    HYPRE_StructSolver solver; 
    HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); 
    HYPRE_StructSolver precond; 
    HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); 
 
    /* Set PCG parameters */ 
    HYPRE_StructPCGSetTol(solver, 1.0e-06); 
    HYPRE_StructPCGSetPrintLevel(solver, 2); 
    HYPRE_StructPCGSetMaxIter(solver, 50); 
 
    /* Set SMG parameters */ 
    HYPRE_StructSMGSetMaxIter(precond, 1); 
    HYPRE_StructSMGSetTol(precond, 0.0); 
    HYPRE_StructSMGSetZeroGuess(precond); 
    HYPRE_StructSMGSetNumPreRelax(precond, 1); 
    HYPRE_StructSMGSetNumPostRelax(precond, 1); 
 
    /* Set preconditioner */ 
    HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, 
                              HYPRE_StructSMGSetup, precond); 
 
    /* Solve linear system */ 
    HYPRE_StructPCGSetup(solver, A, b, x); 
    HYPRE_StructPCGSolve(solver, A, b, x);