在接下来的几个月里,我将需要一起使用PETSc和SuperLU_DIST。在PETSc网页上,他们给出了PETSc“接口”其中一个是SuperLU_DIST的软件列表。
我不确定“接口”这个词是什么意思。我的意思是这两个库都是用C语言编写的。所以当然,如果我编写一个C代码并包含PETSc和SuperLU的相应头文件,它们肯定可以传递参数以及彼此之间的函数。
请原谅我,如果这听起来像是一个愚蠢的问题,但我之前在我自己的代码中并没有真正使用数字软件包/库,而且我对prgramming相当新。
谢谢
答案 0 :(得分:0)
PETSc将一些求解器集成到其KSP模块中,该模块实现了一些Krylow空间方法。当然,KSP模块允许您使用一些预处理方法。像SuperLU这样的第三方求解器被实现为预处理器。
基本策略是使用您喜欢的解算器设置KSP对象和PC(预处理器)对象。然后,通过将其类型设置为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;
}