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