diff --git a/AMDiS/src/parallel/PetscHelper.cc b/AMDiS/src/parallel/PetscHelper.cc index 16e7baf161ac2f342b4a6304e090fd7cc72ce687..1dd591fc3a1c547efdc88b7e8de18b522c6d625e 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 0161855821b6f1ca3cc54719f16fe1d33b613290..41da017d58509e844ddfa2bccdf8df34ed43ca60 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.cc b/AMDiS/src/parallel/PetscSolver.cc index bf85a99ef38f86b03d4b8495e6dd57477a0a502e..0393acba8820d5df4463df41527c9ecaf2a4511e 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/PetscSolver.h b/AMDiS/src/parallel/PetscSolver.h index 774acf5b9f2cdacee4781361b34070302d57df87..2ad445f7f21f4eb01502c042ffe505da90963c7c 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 d98d161d39ddf49dab9874d38ba328e893bfdf52..ec8e1edf67444543bfde33ec33ac1bba4fe6cd50 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 237a98ab0a8b4a532ca0f5bd8169c9052fbf393c..29b67b812202d7caa09017731832f9cbcc6bc46b 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 626441b1b63446ebee1a5e6018add133ec2a1144..e1b47761edbf842c58a4d763948240eb3e11f71f 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/PetscSolverGlobalMatrix.cc b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc index a8e5982e1ffdda95f31ebaf76fa9e52cc5580a1e..aa8e5a3fba2f12455472f4230563e09d7d7140bb 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/parallel/PetscSolverNSCH.cc b/AMDiS/src/parallel/PetscSolverNSCH.cc index a708f57ff29542ce0a9bbea4510b7dcb7b902538..0a065a65ea3eb9383009fd8f9e22c0199ceb182b 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 b83dd84da9a38eb46b2cd4dd1e97d8a5143434d9..4098b347afec7dfe3dc1cd8b0b89adc2e13f825e 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/PetscSolver.h b/AMDiS/src/solver/PetscSolver.h index eca54fcb69d5ae131545453eb4b3482352a36a9a..2df75926b28902dc34e4f8461707a45aa0c6af35 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 a251441143a87228df78af495932f83f983dc6b6..51a057c91803c3a3b65f484e6ca679f1424c70a9 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 eb976e650bf2669a55d6c18d0433f77218d21bbd..805a6cbde7643fd6755acd959a9a814f8184c5da 100644 --- a/AMDiS/src/solver/PetscTypes.h +++ b/AMDiS/src/solver/PetscTypes.h @@ -143,6 +143,17 @@ namespace AMDiS { template< typename Mapper > void operator>>(const PetscVectorNested& dest, VecMap& rhs); + + inline 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"