14#ifndef MUELU_DETAILS_LINEARSOLVERFACTORY_DEF_HPP
15#define MUELU_DETAILS_LINEARSOLVERFACTORY_DEF_HPP
17#include "MueLu_config.hpp"
18#include "Trilinos_Details_LinearSolver.hpp"
19#include "Trilinos_Details_LinearSolverFactory.hpp"
22#include "Tpetra_Operator.hpp"
28template <
class MV,
class OP,
class NormType>
29class LinearSolver :
public Trilinos::Details::LinearSolver<MV, OP, NormType>,
30 virtual public Teuchos::Describable {
69 const Teuchos::EVerbosityLevel verbLevel =
70 Teuchos::Describable::verbLevel_default)
const;
73 Teuchos::RCP<const OP>
A_;
74 Teuchos::RCP<Teuchos::ParameterList>
params_;
77template <
class Scalar,
class LO,
class GO,
class Node>
79 Tpetra::Operator<Scalar, LO, GO, Node>,
80 typename Teuchos::ScalarTraits<Scalar>::magnitudeType> :
public Trilinos::Details::LinearSolver<Tpetra::MultiVector<Scalar, LO, GO, Node>,
81 Tpetra::Operator<Scalar, LO, GO, Node>,
82 typename Teuchos::ScalarTraits<Scalar>::magnitudeType>,
83 virtual public Teuchos::Describable {
88 , changedParams_(false) {}
97 void setMatrix(
const Teuchos::RCP<
const Tpetra::Operator<Scalar, LO, GO, Node> >& A) {
99 if (solver_ != Teuchos::null)
107 Teuchos::RCP<const Tpetra::Operator<Scalar, LO, GO, Node> >
getMatrix()
const {
112 void solve(Tpetra::MultiVector<Scalar, LO, GO, Node>& X,
const Tpetra::MultiVector<Scalar, LO, GO, Node>& B) {
114 const char prefix[] =
"MueLu::Details::LinearSolver::solve: ";
115 TEUCHOS_TEST_FOR_EXCEPTION(solver_.is_null(), std::runtime_error, prefix <<
"The solver does not "
116 "exist yet. You must call numeric() before you may call this method.");
117 TEUCHOS_TEST_FOR_EXCEPTION(changedA_, std::runtime_error, prefix <<
"The matrix A has been reset "
118 "since the last call to numeric(). Please call numeric() again.");
119 TEUCHOS_TEST_FOR_EXCEPTION(changedParams_, std::runtime_error, prefix <<
"The parameters have been reset "
120 "since the last call to numeric(). Please call numeric() again.");
122 solver_->apply(B, X);
127 if (solver_ != Teuchos::null && params !=
params_)
128 changedParams_ =
true;
140 const char prefix[] =
"MueLu::Details::LinearSolver::numeric: ";
143 if (solver_ == Teuchos::null || changedParams_) {
144 TEUCHOS_TEST_FOR_EXCEPTION(
A_ == Teuchos::null, std::runtime_error, prefix <<
"The matrix has not been "
145 "set yet. You must call setMatrix() with a nonnull matrix before you may "
146 "call this method.");
152 }
else if (changedA_) {
153 TEUCHOS_TEST_FOR_EXCEPTION(
A_ == Teuchos::null, std::runtime_error, prefix <<
"The matrix has not been "
154 "set yet. You must call setMatrix() with a nonnull matrix before you may "
155 "call this method.");
157 RCP<const Tpetra::CrsMatrix<Scalar, LO, GO, Node> > helperMat;
158 helperMat = rcp_dynamic_cast<const Tpetra::CrsMatrix<Scalar, LO, GO, Node> >(
A_);
159 TEUCHOS_TEST_FOR_EXCEPTION(helperMat.is_null(), std::runtime_error, prefix <<
"MueLu requires "
160 "a Tpetra::CrsMatrix, but the matrix you provided is of a "
161 "different type. Please provide a Tpetra::CrsMatrix instead.");
166 changedParams_ =
false;
171 using Teuchos::TypeNameTraits;
172 if (solver_.is_null()) {
173 std::ostringstream os;
174 os <<
"\"MueLu::Details::LinearSolver\": {"
175 <<
"MV: " << TypeNameTraits<Tpetra::MultiVector<Scalar, LO, GO, Node> >::name()
176 <<
"OP: " << TypeNameTraits<Tpetra::Operator<Scalar, LO, GO, Node> >::name()
177 <<
"NormType: " << TypeNameTraits<typename Teuchos::ScalarTraits<Scalar>::magnitudeType>::name()
181 return solver_->GetHierarchy()->description();
188 const Teuchos::EVerbosityLevel verbLevel =
189 Teuchos::Describable::verbLevel_default)
const {
191 using Teuchos::TypeNameTraits;
192 if (solver_.is_null()) {
193 if (verbLevel > Teuchos::VERB_NONE) {
194 Teuchos::OSTab tab0(out);
195 out <<
"\"MueLu::Details::LinearSolver\":" << endl;
196 Teuchos::OSTab tab1(out);
197 out <<
"MV: " << TypeNameTraits<Tpetra::MultiVector<Scalar, LO, GO, Node> >::name() << endl
198 <<
"OP: " << TypeNameTraits<Tpetra::Operator<Scalar, LO, GO, Node> >::name() << endl
199 <<
"NormType: " << TypeNameTraits<typename Teuchos::ScalarTraits<Scalar>::magnitudeType>::name() << endl;
202 solver_->GetHierarchy()->describe(out, verbLevel);
207 Teuchos::RCP<const Tpetra::Operator<Scalar, LO, GO, Node> >
A_;
209 Teuchos::RCP<TpetraOperator<Scalar, LO, GO, Node> >
solver_;
214template <
class MV,
class OP,
class NormType>
215Teuchos::RCP<Trilinos::Details::LinearSolver<MV, OP, NormType> >
222template <
class MV,
class OP,
class NormType>
225#ifdef HAVE_TEUCHOSCORE_CXX11
226 typedef std::shared_ptr<MueLu::Details::LinearSolverFactory<MV, OP, NormType> > ptr_type;
229 typedef Teuchos::RCP<MueLu::Details::LinearSolverFactory<MV, OP, NormType> > ptr_type;
234 Trilinos::Details::registerLinearSolverFactory<MV, OP, NormType>(
"MueLu", factory);
247#define MUELU_DETAILS_LINEARSOLVERFACTORY_INSTANT(SC, LO, GO, NT) \
248 template class MueLu::Details::LinearSolverFactory<Tpetra::MultiVector<SC, LO, GO, NT>, \
249 Tpetra::Operator<SC, LO, GO, NT>, \
250 typename Tpetra::MultiVector<SC, LO, GO, NT>::mag_type>;
Various adapters that will create a MueLu preconditioner that is a Tpetra::Operator.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Implementation of Teuchos::Describable::describe.
void setMatrix(const Teuchos::RCP< const Tpetra::Operator< Scalar, LO, GO, Node > > &A)
Set the Solver's matrix.
Teuchos::RCP< TpetraOperator< Scalar, LO, GO, Node > > solver_
void symbolic()
Set up any part of the solve that depends on the structure of the input matrix, but not its numerical...
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Set this solver's parameters.
Teuchos::RCP< const Tpetra::Operator< Scalar, LO, GO, Node > > getMatrix() const
Get a pointer to this Solver's matrix.
void solve(Tpetra::MultiVector< Scalar, LO, GO, Node > &X, const Tpetra::MultiVector< Scalar, LO, GO, Node > &B)
Solve the linear system(s) AX=B.
virtual ~LinearSolver()
Destructor (virtual for memory safety).
Teuchos::RCP< Teuchos::ParameterList > params_
void numeric()
Set up any part of the solve that depends on both the structure and the numerical values of the input...
std::string description() const
Implementation of Teuchos::Describable::description.
LinearSolver()
Constructor.
Teuchos::RCP< const Tpetra::Operator< Scalar, LO, GO, Node > > A_
Interface for a "factory" that creates MueLu solvers.
static void registerLinearSolverFactory()
Register this LinearSolverFactory with the central registry.
virtual Teuchos::RCP< Trilinos::Details::LinearSolver< MV, OP, NormType > > getLinearSolver(const std::string &solverName)
Get an instance of a MueLu solver.
Teuchos::RCP< Teuchos::ParameterList > params_
std::string description() const
Implementation of Teuchos::Describable::description.
void symbolic()
Set up any part of the solve that depends on the structure of the input matrix, but not its numerical...
virtual ~LinearSolver()
Destructor (virtual for memory safety).
Teuchos::RCP< const OP > A_
Teuchos::RCP< const OP > getMatrix() const
Get a pointer to this Solver's matrix.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Set this solver's parameters.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Implementation of Teuchos::Describable::describe.
void solve(MV &X, const MV &B)
Solve the linear system(s) AX=B.
void numeric()
Set up any part of the solve that depends on both the structure and the numerical values of the input...
LinearSolver()
Constructor.
void setMatrix(const Teuchos::RCP< const OP > &A)
Set the Solver's matrix.
Namespace for MueLu classes and methods.
Teuchos::RCP< MueLu::TpetraOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateTpetraPreconditioner(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &inA, Teuchos::ParameterList &inParamList)
Helper function to create a MueLu or AMGX preconditioner that can be used by Tpetra....
void ReuseTpetraPreconditioner(const Teuchos::RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &inA, MueLu::TpetraOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op)
Helper function to reuse an existing MueLu preconditioner.