Skip to content
Snippets Groups Projects
Commit 20a18de8 authored by wenqing's avatar wenqing
Browse files

Added a matrix member for PETScLinearSolver

parent 8c7baf0b
No related branches found
No related tags found
No related merge requests found
...@@ -18,19 +18,15 @@ ...@@ -18,19 +18,15 @@
namespace MathLib namespace MathLib
{ {
PETScLinearSolver::PETScLinearSolver(PETScMatrix &A, const std::string prefix) PETScLinearSolver::PETScLinearSolver(PETScMatrix &A, const std::string &prefix) : _A(A)
{ {
KSPCreate(PETSC_COMM_WORLD, &_solver); KSPCreate(PETSC_COMM_WORLD, &_solver);
KSPSetOperators(_solver, A.getRawMatrix(), A.getRawMatrix(), DIFFERENT_NONZERO_PATTERN);
KSPGetPC(_solver, &_pc);
// //
KSPSetOptionsPrefix(_solver, prefix.c_str()); KSPSetOptionsPrefix(_solver, prefix.c_str());
KSPSetFromOptions(_solver); // set running time option KSPSetFromOptions(_solver); // set running time option
KSPGetPC(_solver, &_pc);
PCSetOptionsPrefix(_pc, prefix.c_str());
PCSetFromOptions(_pc); // set running time option
} }
void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x) void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x)
...@@ -41,6 +37,8 @@ void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x) ...@@ -41,6 +37,8 @@ void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x)
PetscMemoryGetCurrentUsage(&mem1); PetscMemoryGetCurrentUsage(&mem1);
#endif #endif
KSPSetOperators(_solver, _A.getRawMatrix(), _A.getRawMatrix(), DIFFERENT_NONZERO_PATTERN);
KSPSolve(_solver, b.getData(), x.getData()); KSPSolve(_solver, b.getData(), x.getData());
KSPConvergedReason reason; KSPConvergedReason reason;
......
...@@ -43,7 +43,7 @@ class PETScLinearSolver ...@@ -43,7 +43,7 @@ class PETScLinearSolver
line for this solver. It can be the name of the PDE line for this solver. It can be the name of the PDE
that owns an instance of this class. that owns an instance of this class.
*/ */
PETScLinearSolver(PETScMatrix &A, const std::string prefix); PETScLinearSolver(PETScMatrix &A, const std::string &prefix="");
~PETScLinearSolver() ~PETScLinearSolver()
{ {
...@@ -58,8 +58,12 @@ class PETScLinearSolver ...@@ -58,8 +58,12 @@ class PETScLinearSolver
void solve(const PETScVector &b, PETScVector &x); void solve(const PETScVector &b, PETScVector &x);
private: private:
/// Matrix, kept as a member only for solving successive linear equation
/// that preconditioner matrix may vary.
PETScMatrix &_A;
KSP _solver; ///< Slover type. KSP _solver; ///< Slover type.
PC _pc; ///< Preconditioner type. PC _pc; ///< Preconditioner type.
}; };
} // end namespace } // end namespace
......
...@@ -127,7 +127,7 @@ void checkLinearSolverInterface(T_MATRIX &A, boost::property_tree::ptree &ls_opt ...@@ -127,7 +127,7 @@ void checkLinearSolverInterface(T_MATRIX &A, boost::property_tree::ptree &ls_opt
#ifdef USE_PETSC #ifdef USE_PETSC
template <class T_MATRIX, class T_VECTOR, class T_LINEAR_SOVLER> template <class T_MATRIX, class T_VECTOR, class T_LINEAR_SOVLER>
void checkLinearSolverInterface(T_MATRIX &A, T_VECTOR &b, const std::string prefix_name) void checkLinearSolverInterface(T_MATRIX &A, T_VECTOR &b, const std::string &prefix_name)
{ {
int mrank; int mrank;
MPI_Comm_rank(PETSC_COMM_WORLD, &mrank); MPI_Comm_rank(PETSC_COMM_WORLD, &mrank);
...@@ -292,29 +292,6 @@ TEST(Math, CheckInterface_PETSc_Linear_Solver_gmres_amg) ...@@ -292,29 +292,6 @@ TEST(Math, CheckInterface_PETSc_Linear_Solver_gmres_amg)
MathLib::PETScLinearSolver>(A, b, "ptest3_"); MathLib::PETScLinearSolver>(A, b, "ptest3_");
} }
TEST(Math, CheckInterface_PETSc_Linear_Solver_cg_asm)
{
MathLib::PETScMatrixOption opt;
opt.d_nz = 2;
opt.o_nz = 0;
opt.is_global_size = false;
opt.n_local_cols = 2;
MathLib::PETScMatrix A(2, opt);
const bool is_gloabal_size = false;
MathLib::PETScVector b(2, is_gloabal_size);
PetscOptionsSetValue("-ptest4_ksp_type", "cg");
PetscOptionsSetValue("-ptest4_ksp_rtol", "1.e-8");
PetscOptionsSetValue("-ptest4_pc_type", "gasm");
PetscOptionsSetValue("-ptest4_pc_gasm_type", "interpolate");
checkLinearSolverInterface<MathLib::PETScMatrix, MathLib::PETScVector,
MathLib::PETScLinearSolver>(A, b, "ptest4_");
}
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment