From 697bb39b379cd76e1fcc6a080f96fefe9ab0bab3 Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon.praetorius@tu-dresden.de>
Date: Tue, 22 Jan 2019 13:53:07 +0100
Subject: [PATCH] resolve problem after petsc version update

---
 AMDiS/cmake3/target_enable_petsc.cmake        |  3 ++-
 AMDiS/src/parallel/PetscHelper.cc             |  4 +--
 AMDiS/src/parallel/PetscHelper.h              |  2 +-
 AMDiS/src/parallel/PetscSolverFeti.cc         |  7 ++---
 AMDiS/src/parallel/PetscSolverGlobalMatrix.cc | 11 ++++----
 AMDiS/src/utility/PetscWrapper.h              | 26 +++++++++++++++++++
 6 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/AMDiS/cmake3/target_enable_petsc.cmake b/AMDiS/cmake3/target_enable_petsc.cmake
index f983704c..2719c0cf 100644
--- a/AMDiS/cmake3/target_enable_petsc.cmake
+++ b/AMDiS/cmake3/target_enable_petsc.cmake
@@ -39,7 +39,8 @@ macro(target_enable_petsc _TARGET_ _SCOPE_)
             $ENV{PETSC_ROOT}/lib/pkgconfig
             /usr/lib/petsc/lib/pkgconfig
             /usr/lib/petsc/linux-gnu-cxx-opt/lib/pkgconfig
-            /usr/lib/petsc/linux-gnu-c-opt/lib/pkgconfig)
+            /usr/lib/petsc/linux-gnu-c-opt/lib/pkgconfig
+      PATHS $ENV{PKG_CONFIG_PATH})
     if (PETSC_PKG_CONFIG)
       get_filename_component(PETSC_PKG_CONFIG_PATH "${PETSC_PKG_CONFIG}" PATH CACHE)
       set(ENV{PKG_CONFIG_PATH} ${PETSC_PKG_CONFIG_PATH})
diff --git a/AMDiS/src/parallel/PetscHelper.cc b/AMDiS/src/parallel/PetscHelper.cc
index 431e24a2..d49eadd1 100644
--- a/AMDiS/src/parallel/PetscHelper.cc
+++ b/AMDiS/src/parallel/PetscHelper.cc
@@ -284,7 +284,7 @@ namespace AMDiS
 			  const char* kspPrefix,
 			  KSPType kspType,
 			  PCType pcType,
-			  const MatSolverPackage matSolverPackage,
+			  const petsc::MatSolverPackage_t matSolverPackage,
 			  PetscReal rtol,
 			  PetscReal atol,
 			  PetscInt maxIt)
@@ -300,7 +300,7 @@ namespace AMDiS
 	KSPGetPC(ksp, &pc);
 	PCSetType(pc, pcType);
 	if (matSolverPackage != PETSC_NULL)
-	  PCFactorSetMatSolverPackage(pc, matSolverPackage);
+	  petsc::pc_factor_set_mat_solver_package(pc, matSolverPackage);
 	PCSetFromOptions(pc);
 
 #ifndef NDEBUG
diff --git a/AMDiS/src/parallel/PetscHelper.h b/AMDiS/src/parallel/PetscHelper.h
index 00c392bc..74ad6697 100644
--- a/AMDiS/src/parallel/PetscHelper.h
+++ b/AMDiS/src/parallel/PetscHelper.h
@@ -104,7 +104,7 @@ namespace AMDiS
 			  const char* kspPrefix,
 			  KSPType kspType,
 			  PCType pcType,
-			  const MatSolverPackage matSolverPackage,
+			  const petsc::MatSolverPackage_t matSolverPackage,
 			  PetscReal rtol = PETSC_DEFAULT,
 			  PetscReal atol = PETSC_DEFAULT,
 			  PetscInt maxIt = PETSC_DEFAULT);
diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc
index a53499a6..fdb210f7 100644
--- a/AMDiS/src/parallel/PetscSolverFeti.cc
+++ b/AMDiS/src/parallel/PetscSolverFeti.cc
@@ -31,6 +31,7 @@
 #include "parallel/MpiHelper.h"
 #include "parallel/PetscSolverGlobalMatrix.h"
 #include "io/VtkWriter.h"
+#include "utility/PetscWrapper.h"
 
 namespace AMDiS { namespace Parallel {
 
@@ -1077,7 +1078,7 @@ namespace AMDiS { namespace Parallel {
       PC pc_schur_primal;
       KSPGetPC(ksp_schur_primal, &pc_schur_primal);
       PCSetType(pc_schur_primal, PCLU);
-      PCFactorSetMatSolverPackage(pc_schur_primal, MATSOLVERMUMPS);
+      petsc::pc_factor_set_mat_solver_package(pc_schur_primal, MATSOLVERMUMPS);
       KSPSetFromOptions(ksp_schur_primal);
 
 
@@ -1588,10 +1589,10 @@ namespace AMDiS { namespace Parallel {
     KSPGetPC(ksp_interior, &pc_interior);
     if (isSymmetric) {
       PCSetType(pc_interior, PCCHOLESKY);
-      PCFactorSetMatSolverPackage(pc_interior, MATSOLVERMUMPS);
+      petsc::pc_factor_set_mat_solver_package(pc_interior, MATSOLVERMUMPS);
     } else {
       PCSetType(pc_interior, PCLU);
-      PCFactorSetMatSolverPackage(pc_interior, MATSOLVERUMFPACK);
+      petsc::pc_factor_set_mat_solver_package(pc_interior, MATSOLVERUMFPACK);
     }
     KSPSetFromOptions(ksp_interior);
 
diff --git a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
index 5394a7d6..dc676eaf 100644
--- a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
+++ b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
@@ -26,6 +26,7 @@
 #include "parallel/StdMpi.h"
 #include "parallel/MpiHelper.h"
 #include "solver/PetscTypes.h"
+#include "utility/PetscWrapper.h"
 
 using namespace std;
 
@@ -336,13 +337,13 @@ namespace AMDiS { namespace Parallel {
     KSPGetPC(kspInterior, &pcInterior);
     if (isSymmetric) {
       PCSetType(pcInterior, PCCHOLESKY);
-      PCFactorSetMatSolverPackage(pcInterior, MATSOLVERMUMPS);
+      petsc::pc_factor_set_mat_solver_package(pcInterior, MATSOLVERMUMPS);
     } else {
       PCSetType(pcInterior, PCLU);
       if (localMatrix)
-	PCFactorSetMatSolverPackage(pcInterior, MATSOLVERUMFPACK);
+	petsc::pc_factor_set_mat_solver_package(pcInterior, MATSOLVERUMFPACK);
       else
-	PCFactorSetMatSolverPackage(pcInterior, MATSOLVERMUMPS);
+	petsc::pc_factor_set_mat_solver_package(pcInterior, MATSOLVERMUMPS);
     }
     KSPSetFromOptions(kspInterior);
   }
@@ -469,7 +470,7 @@ namespace AMDiS { namespace Parallel {
       MatNullSpaceDestroy(&matNullspace);
       VecDestroy(&nullspaceBasis);
     }
-    
+
     // delete allocated memory
     delete basisVec;
 
@@ -600,7 +601,7 @@ namespace AMDiS { namespace Parallel {
     IS isrow, iscol;
     interiorMap->createIndexSet(isrow, startRow, numberOfRows);
     interiorMap->createIndexSet(iscol, startCol, numberOfCols);
-    MatGetSubMatrix(input, isrow, iscol, MAT_INITIAL_MATRIX, output);
+    petsc::mat_get_sub_matrix(input, isrow, iscol, MAT_INITIAL_MATRIX, output);
     ISDestroy(&iscol);
     ISDestroy(&isrow);
   }
diff --git a/AMDiS/src/utility/PetscWrapper.h b/AMDiS/src/utility/PetscWrapper.h
index ebe664f0..a881269d 100644
--- a/AMDiS/src/utility/PetscWrapper.h
+++ b/AMDiS/src/utility/PetscWrapper.h
@@ -102,6 +102,32 @@ namespace AMDiS
 #endif
     }
 
+#if (PETSC_VERSION_MINOR >= 9)
+    using MatSolverPackage_t = MatSolverType;
+    inline PetscErrorCode pc_factor_set_mat_solver_package(PC pc, MatSolverType stype)
+    {
+      return PCFactorSetMatSolverType(pc, stype);
+    }
+#else
+    using MatSolverPackage_t = MatSolverPackage;
+    inline PetscErrorCode pc_factor_set_mat_solver_package(PC pc, MatSolverPackage stype)
+    {
+      return PCFactorSetMatSolverPackage(pc, stype);
+    }
+#endif
+
+#if (PETSC_VERSION_MINOR >= 8)
+    inline PetscErrorCode mat_get_sub_matrix(Mat mat, IS isrow, IS iscol, MatReuse cll, Mat *newmat)
+    {
+      return MatCreateSubMatrix(mat, isrow, iscol, cll, newmat);
+    }
+#else
+    inline PetscErrorCode mat_get_sub_matrix(Mat mat, IS isrow, IS iscol, MatReuse cll, Mat *newmat)
+    {
+      return MatGetSubMatrix(mat, isrow, iscol, cll, newmat);
+    }
+#endif
+
   } // end namespace petsc
 } // end namespace AMDiS
 
-- 
GitLab