PETSc的一些解算器集成到它的KSP模塊,它實現了一些Krylow空間的方法。當然,KSP模塊允許您使用一些預處理方法。像SuperLU這樣的第三方解算器被實現爲預處理器。
基本策略是用你喜歡的求解器設置一個KSP對象和一個PC(預處理器)對象。然後,通過將KSP的類型設置爲KSPPREONLY(僅預處理),使KSP僅使用PC。
下面是我用於MUMPS的一個工作示例。當然,如果您解決多個相同類型的系統等問題,可以做得更快。您應該查閱PETSc手冊並修改代碼以適應您的需求。
Vec
solveWithMumps(const Mat mat, const Vec rhs)
{
MPI_Comm mpi_comm;
PETSC_WRAP(PetscObjectGetComm(
reinterpret_cast<PetscObject>(mat), &mpi_comm));
Vec solution;
PETSC_WRAP(MatGetVecs(mat, &solution, PETSC_NULL));
KSP ksp;
PETSC_WRAP(KSPCreate(mpi_comm, &ksp));
PETSC_WRAP(KSPSetOperators(ksp, mat, mat, DIFFERENT_NONZERO_PATTERN));
PC pc;
PETSC_WRAP(KSPGetPC(ksp, &pc));
PETSC_WRAP(KSPSetType(ksp, KSPPREONLY));
PETSC_WRAP(PCSetType(pc, PCLU));
PETSC_WRAP(PCFactorSetMatSolverPackage(pc, MAT_SOLVER_MUMPS));
PETSC_WRAP(KSPSetFromOptions(ksp));
PETSC_WRAP(KSPSolve(ksp, rhs, solution));
PETSC_WRAP(KSPDestroy(ksp));
return solution;
}
請將語言或API添加到您的標籤中。 – 2010-11-14 02:51:57