From 24b520f633c64492ccb198aec286a082c0c9ea36 Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Fri, 21 Oct 2016 18:17:32 +0200 Subject: [PATCH 1/2] added implementation for PetscOptionsInsertString with switch on PETSC_VERSION --- AMDiS/src/parallel/PetscSolver.cc | 2 +- AMDiS/src/parallel/PetscSolverGlobalMatrix.cc | 20 +++++++++---------- AMDiS/src/solver/PetscSolver.h | 2 +- AMDiS/src/solver/PetscSolver.hh | 14 ++++++------- AMDiS/src/solver/PetscTypes.h | 12 +++++++++++ 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/AMDiS/src/parallel/PetscSolver.cc b/AMDiS/src/parallel/PetscSolver.cc index bf85a99e..0393acba 100644 --- a/AMDiS/src/parallel/PetscSolver.cc +++ b/AMDiS/src/parallel/PetscSolver.cc @@ -49,7 +49,7 @@ namespace AMDiS { namespace Parallel { Parameters::get(name + "->ksp", kspStr); if (kspStr != "") - PetscOptionsInsertString(kspStr.c_str()); + petsc_options_insert_string(kspStr.c_str()); Parameters::get(name + "->remove rhs null space", removeRhsNullspace); Parameters::get(name + "->has constant null space", hasConstantNullspace); diff --git a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc index a8e5982e..aa8e5a3f 100644 --- a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc +++ b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc @@ -50,15 +50,15 @@ namespace AMDiS { namespace Parallel { if (params.matSolverPackage.find(kspSolver) != params.matSolverPackage.end()) { // direct solvers - PetscOptionsInsertString(("-" + kspPrefix + "ksp_type preonly").c_str()); - PetscOptionsInsertString(("-" + kspPrefix + "pc_type lu").c_str()); - PetscOptionsInsertString(("-" + kspPrefix + "pc_factor_mat_solver_package " + kspSolver).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_type preonly").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "pc_type lu").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "pc_factor_mat_solver_package " + kspSolver).c_str()); setMaxIterations(1); zeroStartVector = true; matSolverPackage = true; } else if (params.emptyParam.find(kspSolver) == params.emptyParam.end() && solverName != "petsc") { // other solvers - PetscOptionsInsertString(("-" + kspPrefix + "ksp_type " + kspSolver).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_type " + kspSolver).c_str()); } // set the preconditioner @@ -70,17 +70,17 @@ namespace AMDiS { namespace Parallel { Parameters::get(name + "->right precon", precon); if (!matSolverPackage && params.emptyParam.find(precon) == params.emptyParam.end()) { precon = (params.preconMap.find(precon) != params.preconMap.end() ? params.preconMap[precon] : precon); - PetscOptionsInsertString(("-" + kspPrefix + "pc_type " + precon).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "pc_type " + precon).c_str()); } - PetscOptionsInsertString(("-" + kspPrefix + "ksp_max_it " + boost::lexical_cast(getMaxIterations())).c_str()); - PetscOptionsInsertString(("-" + kspPrefix + "ksp_rtol " + boost::lexical_cast(getRelative())).c_str()); - PetscOptionsInsertString(("-" + kspPrefix + "ksp_atol " + boost::lexical_cast(getTolerance())).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_max_it " + boost::lexical_cast(getMaxIterations())).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_rtol " + boost::lexical_cast(getRelative())).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_atol " + boost::lexical_cast(getTolerance())).c_str()); if (getInfo() >= 20) - PetscOptionsInsertString(("-" + kspPrefix + "ksp_monitor_true_residual").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_monitor_true_residual").c_str()); else if (getInfo() >= 10) - PetscOptionsInsertString(("-" + kspPrefix + "ksp_monitor").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_monitor").c_str()); } if (!matSolverPackage) { Parameters::get(name + "->use zero start vector", zeroStartVector); diff --git a/AMDiS/src/solver/PetscSolver.h b/AMDiS/src/solver/PetscSolver.h index eca54fcb..2df75926 100644 --- a/AMDiS/src/solver/PetscSolver.h +++ b/AMDiS/src/solver/PetscSolver.h @@ -58,7 +58,7 @@ namespace AMDiS { virtual void init(PC pc, const SolverMatrix >& A, const MatrixType& fullMatrix) { - PetscOptionsInsertString(("-" + prefix + "pc_type " + name).c_str()); + petsc_options_insert_string(("-" + prefix + "pc_type " + name).c_str()); PCSetFromOptions(pc); } diff --git a/AMDiS/src/solver/PetscSolver.hh b/AMDiS/src/solver/PetscSolver.hh index a2514411..51a057c9 100644 --- a/AMDiS/src/solver/PetscSolver.hh +++ b/AMDiS/src/solver/PetscSolver.hh @@ -47,30 +47,30 @@ namespace AMDiS { if (params.matSolverPackage[kspSolver]) { // direct solvers - PetscOptionsInsertString(("-" + kspPrefix + "ksp_type preonly").c_str()); - PetscOptionsInsertString(("-" + kspPrefix + "pc_type lu").c_str()); - PetscOptionsInsertString(("-" + kspPrefix + "pc_factor_mat_solver_package " + (kspSolver != "direct" ? kspSolver : "umfpack")).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_type preonly").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "pc_type lu").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "pc_factor_mat_solver_package " + (kspSolver != "direct" ? kspSolver : "umfpack")).c_str()); oem.setMaxIterations(1); zeroStartVector = true; matSolverPackage = true; } else if (!params.emptyParam[kspSolver]) { // other solvers - PetscOptionsInsertString(("-" + kspPrefix + "ksp_type " + kspSolver).c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_type " + kspSolver).c_str()); } // set the preconditioner setPrecon(); if (oem.getInfo() >= 20) - PetscOptionsInsertString(("-" + kspPrefix + "ksp_monitor_true_residual").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_monitor_true_residual").c_str()); else if (oem.getInfo() >= 10) - PetscOptionsInsertString(("-" + kspPrefix + "ksp_monitor").c_str()); + petsc_options_insert_string(("-" + kspPrefix + "ksp_monitor").c_str()); // command line string std::string kspString = ""; Parameters::get(oem.getName() + "->ksp", kspString); if (kspString != "") - PetscOptionsInsertString(kspString.c_str()); + petsc_options_insert_string(kspString.c_str()); } diff --git a/AMDiS/src/solver/PetscTypes.h b/AMDiS/src/solver/PetscTypes.h index eb976e65..bfc5f05c 100644 --- a/AMDiS/src/solver/PetscTypes.h +++ b/AMDiS/src/solver/PetscTypes.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace AMDiS { @@ -143,6 +144,17 @@ namespace AMDiS { template< typename Mapper > void operator>>(const PetscVectorNested& dest, VecMap& rhs); + + PetscErrorCode petsc_options_insert_string(const char in_str[]) + { +#if (PETSC_VERSION_MINOR >= 7) + return PetscOptionsInsertString(NULL, in_str); +#else + return PetscOptionsInsertString(in_str); +#endif + } + + } // end namespace AMDiS #include "solver/PetscTypes.hh" -- GitLab From e92707e7adf3632a31d50fbcaeec3392eda3b673 Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Mon, 24 Oct 2016 10:22:25 +0200 Subject: [PATCH 2/2] corrected some interface changes in petsc 3.7 --- AMDiS/src/parallel/PetscHelper.cc | 5 ++--- AMDiS/src/parallel/PetscHelper.h | 7 +++++++ AMDiS/src/parallel/PetscSolver.h | 1 + AMDiS/src/parallel/PetscSolverCahnHilliard.cc | 4 ++-- AMDiS/src/parallel/PetscSolverCahnHilliard2.cc | 4 ++-- AMDiS/src/parallel/PetscSolverFeti.cc | 4 ++-- AMDiS/src/parallel/PetscSolverNSCH.cc | 2 +- AMDiS/src/parallel/PetscSolverNavierStokes.cc | 4 ++-- AMDiS/src/solver/PetscTypes.h | 3 +-- 9 files changed, 20 insertions(+), 14 deletions(-) diff --git a/AMDiS/src/parallel/PetscHelper.cc b/AMDiS/src/parallel/PetscHelper.cc index 16e7baf1..1dd591fc 100644 --- a/AMDiS/src/parallel/PetscHelper.cc +++ b/AMDiS/src/parallel/PetscHelper.cc @@ -327,7 +327,6 @@ namespace AMDiS rtol, atol, maxIt); } - void createSolver(MPI::Intracomm comm, KSP &ksp, Mat m, std::string kspPrefix, int info) { KSPCreate(comm, &ksp); @@ -341,9 +340,9 @@ namespace AMDiS KSPSetOptionsPrefix(ksp, kspPrefix.c_str()); if (info >= 10) - KSPMonitorSet(ksp, KSPMonitorDefault, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorDefault), PETSC_NULL, PETSC_NULL); else if (info >= 20) - KSPMonitorSet(ksp, KSPMonitorTrueResidualNorm, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorTrueResidualNorm), PETSC_NULL, PETSC_NULL); } } // end namespace petsc_helper diff --git a/AMDiS/src/parallel/PetscHelper.h b/AMDiS/src/parallel/PetscHelper.h index 01618558..41da017d 100644 --- a/AMDiS/src/parallel/PetscHelper.h +++ b/AMDiS/src/parallel/PetscHelper.h @@ -31,6 +31,13 @@ #include #include "AMDiS_fwd.h" +#if (PETSC_VERSION_MINOR >= 7) + #define PETSC_MONITOR_CAST(...) \ + (PetscErrorCode (*)(KSP,PetscInt,PetscReal,void*))(__VA_ARGS__) +#else + #define PETSC_MONITOR_CAST(...) __VA_ARGS__ +#endif + namespace AMDiS { namespace Parallel diff --git a/AMDiS/src/parallel/PetscSolver.h b/AMDiS/src/parallel/PetscSolver.h index 774acf5b..2ad445f7 100644 --- a/AMDiS/src/parallel/PetscSolver.h +++ b/AMDiS/src/parallel/PetscSolver.h @@ -33,6 +33,7 @@ #include "AMDiS_fwd.h" #include "parallel/ParallelCoarseSpaceSolver.h" +#include "solver/PetscTypes.h" namespace AMDiS { diff --git a/AMDiS/src/parallel/PetscSolverCahnHilliard.cc b/AMDiS/src/parallel/PetscSolverCahnHilliard.cc index d98d161d..ec8e1edf 100644 --- a/AMDiS/src/parallel/PetscSolverCahnHilliard.cc +++ b/AMDiS/src/parallel/PetscSolverCahnHilliard.cc @@ -91,9 +91,9 @@ namespace AMDiS { namespace Parallel { KSPSetOperators(ksp, getMatInterior(), getMatInterior(), SAME_NONZERO_PATTERN); #endif if (getInfo() >= 10) - KSPMonitorSet(ksp, KSPMonitorDefault, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorDefault), PETSC_NULL, PETSC_NULL); else if (getInfo() >= 20) - KSPMonitorSet(ksp, KSPMonitorTrueResidualNorm, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorTrueResidualNorm), PETSC_NULL, PETSC_NULL); petsc_helper::setSolver(ksp, "ch_", KSPFGMRES, PCNONE, getRelative(), getTolerance(), getMaxIterations()); KSPSetFromOptions(ksp); diff --git a/AMDiS/src/parallel/PetscSolverCahnHilliard2.cc b/AMDiS/src/parallel/PetscSolverCahnHilliard2.cc index 237a98ab..29b67b81 100644 --- a/AMDiS/src/parallel/PetscSolverCahnHilliard2.cc +++ b/AMDiS/src/parallel/PetscSolverCahnHilliard2.cc @@ -123,9 +123,9 @@ namespace AMDiS { namespace Parallel { KSPSetOperators(ksp, getMatInterior(), getMatInterior(), SAME_NONZERO_PATTERN); #endif if (getInfo() >= 10) - KSPMonitorSet(ksp, KSPMonitorDefault, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorDefault), PETSC_NULL, PETSC_NULL); else if (getInfo() >= 20) - KSPMonitorSet(ksp, KSPMonitorTrueResidualNorm, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorTrueResidualNorm), PETSC_NULL, PETSC_NULL); petsc_helper::setSolver(ksp, "ch_", KSPFGMRES, PCNONE, getRelative(), getTolerance(), getMaxIterations()); if (useOldInitialGuess) diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index 626441b1..e1b47761 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -1382,9 +1382,9 @@ namespace AMDiS { namespace Parallel { Parameters::get(name + "->feti->monitor", monitor); if (monitor) { if (stokesMode) - KSPMonitorSet(ksp_feti, KSPMonitorFetiStokes, &fetiKspData, PETSC_NULL); + KSPMonitorSet(ksp_feti, PETSC_MONITOR_CAST(KSPMonitorFetiStokes), &fetiKspData, PETSC_NULL); else - KSPMonitorSet(ksp_feti, KSPMonitorTrueResidualNorm, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp_feti, PETSC_MONITOR_CAST(KSPMonitorTrueResidualNorm), PETSC_NULL, PETSC_NULL); } diff --git a/AMDiS/src/parallel/PetscSolverNSCH.cc b/AMDiS/src/parallel/PetscSolverNSCH.cc index a708f57f..0a065a65 100644 --- a/AMDiS/src/parallel/PetscSolverNSCH.cc +++ b/AMDiS/src/parallel/PetscSolverNSCH.cc @@ -189,7 +189,7 @@ namespace AMDiS { namespace Parallel { #else KSPSetOperators(ksp, getMatInterior(), getMatInterior(), SAME_NONZERO_PATTERN); #endif - KSPMonitorSet(ksp, KSPMonitorTrueResidualNorm, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorTrueResidualNorm), PETSC_NULL, PETSC_NULL); petsc_helper::setSolver(ksp, "ch_", KSPFGMRES, PCSHELL, getRelative(), getTolerance(), getMaxIterations()); setConstantNullSpace(ksp, componentSpaces[0]->getMesh()->getDim() , true); } diff --git a/AMDiS/src/parallel/PetscSolverNavierStokes.cc b/AMDiS/src/parallel/PetscSolverNavierStokes.cc index b83dd84d..4098b347 100644 --- a/AMDiS/src/parallel/PetscSolverNavierStokes.cc +++ b/AMDiS/src/parallel/PetscSolverNavierStokes.cc @@ -123,9 +123,9 @@ namespace AMDiS { namespace Parallel { KSPSetOperators(ksp, getMatInterior(), getMatInterior(), SAME_NONZERO_PATTERN); #endif if (getInfo() >= 10) - KSPMonitorSet(ksp, KSPMonitorDefault, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorDefault), PETSC_NULL, PETSC_NULL); else if (getInfo() >= 20) - KSPMonitorSet(ksp, KSPMonitorTrueResidualNorm, PETSC_NULL, PETSC_NULL); + KSPMonitorSet(ksp, PETSC_MONITOR_CAST(KSPMonitorTrueResidualNorm), PETSC_NULL, PETSC_NULL); petsc_helper::setSolver(ksp, "ns_", KSPFGMRES, PCNONE, getRelative(), getTolerance(), getMaxIterations()); // Create null space information. diff --git a/AMDiS/src/solver/PetscTypes.h b/AMDiS/src/solver/PetscTypes.h index bfc5f05c..805a6cbd 100644 --- a/AMDiS/src/solver/PetscTypes.h +++ b/AMDiS/src/solver/PetscTypes.h @@ -31,7 +31,6 @@ #include #include #include -#include namespace AMDiS { @@ -145,7 +144,7 @@ namespace AMDiS { void operator>>(const PetscVectorNested& dest, VecMap& rhs); - PetscErrorCode petsc_options_insert_string(const char in_str[]) + inline PetscErrorCode petsc_options_insert_string(const char in_str[]) { #if (PETSC_VERSION_MINOR >= 7) return PetscOptionsInsertString(NULL, in_str); -- GitLab