2010-11-14 59 views
1

在接下来的几个月中,我将需要一起使用PETSc和SuperLU_DIST。在PETSc网页上,他们给出了PETSc“接口”之一的软件列表,其中之一是SuperLU_DIST。两个库之间的接口

我不太确定单词“interface”是什么意思。我的意思是这两个库都是用C语言编写的。所以如果我编写一个C代码并包含适当的PETSc和SuperLU头文件,它们肯定可以传递参数并在其他函数之间传递。

请原谅我,如果这听起来像一个愚蠢的问题,但我没有真正使用数字软件包/库在我自己的代码之前,我是相当新的prgramming。

谢谢

+0

请将语言或API添加到您的标签中。 – 2010-11-14 02:51:57

回答

0

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; 
}