2010-11-14 29 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; 
}