Belos Package Browser (Single Doxygen Collection)  Development
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Belos_Details_LinearSolver.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Belos: Block Linear Solvers Package
4 //
5 // Copyright 2004-2016 NTESS and the Belos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef BELOS_DETAILS_LINEARSOLVER_HPP
11 #define BELOS_DETAILS_LINEARSOLVER_HPP
12 
15 
16 #include "BelosSolverFactory.hpp"
18 
19 namespace Belos {
20 namespace Details {
21 
43 template<class MV, class OP, class ScalarType, class NormType>
44 class LinearSolver :
45  public Trilinos::Details::LinearSolver<MV, OP, NormType>
46 {
47 private:
52 
53 public:
54 
59  LinearSolver (const std::string& solverName) :
60  solverName_ (solverName)
61  {
62  // In alignment with Belos philosophy, we delay initialization
63  // (which in this case means creation of the solver) until needed.
64  }
65 
66 
68  virtual ~LinearSolver () {}
69 
75  if (problem_.is_null ()) {
77  } else if (A != problem_->getOperator ()) {
78  problem_->setOperator (A);
79  }
80  }
81 
84  if (problem_.is_null ()) {
85  return Teuchos::null;
86  } else {
87  return problem_->getOperator ();
88  }
89  }
90 
92  void solve (MV& X, const MV& B) {
94  (problem_.is_null () || problem_->getOperator ().is_null (),
95  std::runtime_error, "Belos::Details::LinearSolver::solve: "
96  "The matrix A in the linear system to solve has not yet been set. "
97  "Please call setMatrix() with a nonnull input before calling solve().");
98  Teuchos::RCP<MV> X_ptr = Teuchos::rcpFromRef (X);
99  Teuchos::RCP<const MV> B_ptr = Teuchos::rcpFromRef (B);
100 
101  problem_->setLHS (X_ptr);
102  problem_->setRHS (B_ptr);
103  problem_->setProblem ();
104 
105  // We can delay creating the Belos solver until the moment when we
106  // actually need it. This aligns with Belos' preference for lazy
107  // initialization.
108  if (solver_.is_null ()) {
110  solver_ = factory.create (solverName_, params_);
111  solver_->setProblem (problem_);
112  }
113 
114  //Belos::ReturnType ret = solver_->solve ();
115  (void) solver_->solve ();
116  }
117 
120  if (! solver_.is_null () && ! params.is_null ()) {
121  solver_->setParameters (params);
122  }
123  params_ = params;
124  }
125 
127  void symbolic () {
129  (problem_.is_null () || problem_->getOperator ().is_null (),
130  std::runtime_error, "Belos::Details::LinearSolver::symbolic: "
131  "The matrix A in the linear system to solve has not yet been set. "
132  "Please call setMatrix() with a nonnull input before calling this method.");
133 
134  // Belos solvers can't handle changes to the matrix's domain or
135  // range Maps. It's best in this case to destroy the solver and
136  // start over.
138  }
139 
141  void numeric () {
143  (problem_.is_null () || problem_->getOperator ().is_null (),
144  std::runtime_error, "Belos::Details::LinearSolver::numeric: "
145  "The matrix A in the linear system to solve has not yet been set. "
146  "Please call setMatrix() with a nonnull input before calling this method.");
147  // NOTE (mfh 23 Aug 2015) For the seed or recycling solvers, it
148  // would make sense to do something special here. However, the
149  // line below is always correct. It recomputes the initial
150  // residual vector, which is what Belos expects before a solve if
151  // the matrix or right-hand side may have changed.
152  problem_->setProblem ();
153  }
154 
155 private:
157  std::string solverName_;
164 };
165 
166 } // namespace Details
167 } // namespace Belos
168 
169 #endif /* BELOS_DETAILS_LINEARSOLVER_HPP */
void solve(MV &X, const MV &B)
Solve the linear system AX=B for X.
std::string solverName_
The name of the Belos solver to create.
Teuchos::RCP< Teuchos::ParameterList > params_
The Belos solver&#39;s list of parameters.
Belos&#39; implementation of Trilinos::Details::LinearSolver.
virtual ~LinearSolver()
Destructor (virtual for memory safety).
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void setMatrix(const Teuchos::RCP< const OP > &A)
Set the solver&#39;s matrix.
void symbolic()
Precompute for matrix structure changes.
void numeric()
Precompute for matrix values&#39; changes.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
bool is_null(const RCP< T > &p)
Belos::LinearProblem< ScalarType, MV, OP > problem_type
Belos::LinearProblem specialization used by this class.
Teuchos::RCP< const OP > getMatrix() const
Get the solver&#39;s matrix.
A linear system to solve, and its associated information.
LinearSolver(const std::string &solverName)
Constructor.
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > &params)
Set the solver&#39;s parameters.
Teuchos::RCP< solver_type > solver_
The Belos solver (SolverManager instance).
Teuchos::RCP< problem_type > problem_
The LinearProblem instance to give to the Belos solver.
typename::Belos::Impl::SolverFactorySelector< SC, MV, OP >::type SolverFactory
Belos::SolverManager< ScalarType, MV, OP > solver_type
Belos&#39; own solver type.