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 @@
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);
KSPSetOperators(_solver, A.getRawMatrix(), A.getRawMatrix(), DIFFERENT_NONZERO_PATTERN);
KSPGetPC(_solver, &_pc);
//
KSPSetOptionsPrefix(_solver, prefix.c_str());
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)
......@@ -41,6 +37,8 @@ void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x)
PetscMemoryGetCurrentUsage(&mem1);
#endif
KSPSetOperators(_solver, _A.getRawMatrix(), _A.getRawMatrix(), DIFFERENT_NONZERO_PATTERN);
KSPSolve(_solver, b.getData(), x.getData());
KSPConvergedReason reason;
......
......@@ -43,7 +43,7 @@ class PETScLinearSolver
line for this solver. It can be the name of the PDE
that owns an instance of this class.
*/
PETScLinearSolver(PETScMatrix &A, const std::string prefix);
PETScLinearSolver(PETScMatrix &A, const std::string &prefix="");
~PETScLinearSolver()
{
......@@ -58,8 +58,12 @@ class PETScLinearSolver
void solve(const PETScVector &b, PETScVector &x);
private:
/// Matrix, kept as a member only for solving successive linear equation
/// that preconditioner matrix may vary.
PETScMatrix &_A;
KSP _solver; ///< Slover type.
PC _pc; ///< Preconditioner type.
PC _pc; ///< Preconditioner type.
};
} // end namespace
......
......@@ -127,7 +127,7 @@ void checkLinearSolverInterface(T_MATRIX &A, boost::property_tree::ptree &ls_opt
#ifdef USE_PETSC
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;
MPI_Comm_rank(PETSC_COMM_WORLD, &mrank);
......@@ -292,29 +292,6 @@ TEST(Math, CheckInterface_PETSc_Linear_Solver_gmres_amg)
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
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