8 const std::shared_ptr<prec_t>& prec_p)
12 , problem_mp( Teuchos::rcp( new
problem_t() ) )
22 template <
class Level>
24 const Teuchos::RCP<mv_t>& b)
33 problem_mp->setProblem(x, b);
35 solver_mp->setProblem(problem_mp);
37 Belos::ReturnType ret = solver_mp->solve();
39 if ( ret != Belos::Converged ) {
40 *gmsg <<
"Warning: Bottom solver not converged. Achieved tolerance"
41 <<
" after " << solver_mp->getNumIters() <<
" iterations is "
42 << solver_mp->achievedTol() <<
"." <<
endl;
50 template <
class Level>
55 A_mp = A->clone(A->getNode());
60 if ( problem_mp == Teuchos::null )
62 "No problem defined.");
64 problem_mp->setOperator(A_mp);
68 if ( prec_mp !=
nullptr ) {
70 prec_mp->create(A_mp, level_p);
72 problem_mp->setLeftPrec(prec_mp->get());
75 this->isInitialized_m =
true;
79 template <
class Level>
81 if ( solver_mp == Teuchos::null )
83 "No solver initialized.");
85 return solver_mp->getNumIters();
89 template <
class Level>
92 Belos::SolverFactory<scalar_t, mv_t, op_t> factory;
94 params_mp = Teuchos::parameterList();
96 params_mp->set(
"Block Size", 1);
97 params_mp->set(
"Convergence Tolerance", reltol_m);
98 params_mp->set(
"Adaptive Block Size",
false);
99 params_mp->set(
"Use Single Reduction",
true);
100 params_mp->set(
"Explicit Residual Scaling",
"Norm of RHS");
101 params_mp->set(
"Maximum Iterations", maxiter_m);
102 params_mp->set(
"Verbosity", Belos::Errors + Belos::Warnings);
103 params_mp->set(
"Output Frequency", 1);
105 solver_mp = factory.create(solvertype, params_mp);
Belos::LinearProblem< scalar_t, mv_t, op_t > problem_t
constexpr double e
The value of .
void setOperator(const Teuchos::RCP< matrix_t > &A, Level *level_p=nullptr)
The base class for all OPAL exceptions.
std::size_t getNumIters()
Abstract base class for all base level solvers.
void solve(const Teuchos::RCP< mv_t > &x, const Teuchos::RCP< mv_t > &b)
void initSolver_m(std::string solvertype)
static void startTimer(TimerRef t)
BelosBottomSolver(std::string solvertype="Pseudoblock CG", const std::shared_ptr< prec_t > &prec_p=nullptr)
Tpetra::MultiVector< scalar_t, local_ordinal_t, global_ordinal_t, node_t > multivector_t
Timing::TimerRef TimerRef
static TimerRef getTimer(const char *nm)
static void stopTimer(TimerRef t)
Inform & endl(Inform &inf)