两个库之间的接口

时间:2010-11-14 02:47:40

标签: api

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

我不确定“接口”这个词是什么意思。我的意思是这两个库都是用C语言编写的。所以当然,如果我编写一个C代码并包含PETSc和SuperLU的相应头文件,它们肯定可以传递参数以及彼此之间的函数。

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

谢谢

1 个答案:

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