14 #ifndef MUELU_DETAILS_LINEARSOLVERFACTORY_DEF_HPP
15 #define MUELU_DETAILS_LINEARSOLVERFACTORY_DEF_HPP
17 #include "MueLu_config.hpp"
20 #include <type_traits>
22 #ifdef HAVE_MUELU_EPETRA
23 #include "Epetra_CrsMatrix.h"
25 #endif // HAVE_MUELU_EPETRA
27 #include "Tpetra_Operator.hpp"
33 template <
class MV,
class OP,
class NormType>
55 void solve(MV& X,
const MV& B);
83 #if defined(HAVE_MUELU_SERIAL) and defined(HAVE_MUELU_EPETRA)
91 , changedParams_(
false) {}
101 const char prefix[] =
"MueLu::Details::LinearSolver::setMatrix: ";
104 if (solver_ != Teuchos::null)
109 "an Epetra_CrsMatrix, but the matrix you provided is of a "
110 "different type. Please provide an Epetra_CrsMatrix instead.");
122 const char prefix[] =
"MueLu::Details::LinearSolver::solve: ";
124 "exist yet. You must call numeric() before you may call this method.");
126 "since the last call to numeric(). Please call numeric() again.");
128 "since the last call to numeric(). Please call numeric() again.");
130 int err = solver_->ApplyInverse(B, X);
133 "nonzero error code "
139 if (solver_ != Teuchos::null && params !=
params_)
140 changedParams_ =
true;
152 const char prefix[] =
"MueLu::Details::LinearSolver::numeric: ";
155 if (solver_ == Teuchos::null || changedA_ || changedParams_) {
157 changedParams_ =
false;
160 "set yet. You must call setMatrix() with a nonnull matrix before you may "
161 "call this method.");
174 if (solver_.is_null()) {
175 return "\"MueLu::Details::LinearSolver\": {MV: Epetra_MultiVector, OP: Epetra_Operator, NormType: double}";
177 return solver_->GetHierarchy()->description();
187 if (solver_.is_null()) {
190 out <<
"\"MueLu::Details::LinearSolver\":" << endl;
192 out <<
"MV: Epetra_MultiVector" << endl
193 <<
"OP: Epetra_Operator" << endl
194 <<
"NormType: double" << endl;
197 solver_->GetHierarchy()->describe(out, verbLevel);
208 #endif // HAVE_MUELU_EPETRA
210 template <
class Scalar,
class LO,
class GO,
class Node>
214 Tpetra::Operator<Scalar, LO, GO, Node>,
215 typename Teuchos::ScalarTraits<Scalar>::magnitudeType>,
221 , changedParams_(false) {}
232 if (solver_ != Teuchos::null)
247 const char prefix[] =
"MueLu::Details::LinearSolver::solve: ";
249 "exist yet. You must call numeric() before you may call this method.");
251 "since the last call to numeric(). Please call numeric() again.");
252 TEUCHOS_TEST_FOR_EXCEPTION(changedParams_, std::runtime_error, prefix <<
"The parameters have been reset "
253 "since the last call to numeric(). Please call numeric() again.");
255 solver_->apply(B, X);
260 if (solver_ != Teuchos::null && params !=
params_)
261 changedParams_ =
true;
273 const char prefix[] =
"MueLu::Details::LinearSolver::numeric: ";
276 if (solver_ == Teuchos::null || changedParams_) {
278 "set yet. You must call setMatrix() with a nonnull matrix before you may "
279 "call this method.");
287 }
else if (changedA_) {
289 "set yet. You must call setMatrix() with a nonnull matrix before you may "
290 "call this method.");
297 "a Tpetra::CrsMatrix, but the matrix you provided is of a "
298 "different type. Please provide a Tpetra::CrsMatrix instead.");
303 changedParams_ =
false;
309 if (solver_.is_null()) {
310 std::ostringstream os;
311 os <<
"\"MueLu::Details::LinearSolver\": {"
312 <<
"MV: " << TypeNameTraits<Tpetra::MultiVector<Scalar, LO, GO, Node> >::name()
313 <<
"OP: " << TypeNameTraits<Tpetra::Operator<Scalar, LO, GO, Node> >::name()
314 <<
"NormType: " << TypeNameTraits<typename Teuchos::ScalarTraits<Scalar>::magnitudeType>::name()
318 return solver_->GetHierarchy()->description();
329 if (solver_.is_null()) {
332 out <<
"\"MueLu::Details::LinearSolver\":" << endl;
334 out <<
"MV: " << TypeNameTraits<Tpetra::MultiVector<Scalar, LO, GO, Node> >::name() << endl
335 <<
"OP: " << TypeNameTraits<Tpetra::Operator<Scalar, LO, GO, Node> >::name() << endl
336 <<
"NormType: " << TypeNameTraits<typename Teuchos::ScalarTraits<Scalar>::magnitudeType>::name() << endl;
339 solver_->GetHierarchy()->describe(out, verbLevel);
351 template <
class MV,
class OP,
class NormType>
359 template <
class MV,
class OP,
class NormType>
362 #ifdef HAVE_TEUCHOSCORE_CXX11
363 typedef std::shared_ptr<MueLu::Details::LinearSolverFactory<MV, OP, NormType> > ptr_type;
368 #endif // HAVE_TEUCHOSCORE_CXX11
371 Trilinos::Details::registerLinearSolverFactory<MV, OP, NormType>(
"MueLu", factory);
384 #define MUELU_DETAILS_LINEARSOLVERFACTORY_INSTANT(SC, LO, GO, NT) \
385 template class MueLu::Details::LinearSolverFactory<Tpetra::MultiVector<SC, LO, GO, NT>, \
386 Tpetra::Operator<SC, LO, GO, NT>, \
387 typename Tpetra::MultiVector<SC, LO, GO, NT>::mag_type>;
389 #endif // MUELU_DETAILS_LINEARSOLVERFACTORY_DEF_HPP
Interface for a "factory" that creates MueLu solvers.
Teuchos::RCP< const OP > getMatrix() const
Get a pointer to this Solver's matrix.
std::string description() const
Implementation of Teuchos::Describable::description.
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.Given a Tpetra::Operator, this function returns a constructed MueLu preconditioner.
void symbolic()
Set up any part of the solve that depends on the structure of the input matrix, but not its numerical...
Teuchos::RCP< Teuchos::ParameterList > params_
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Set this solver's parameters.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::string description() const
Implementation of Teuchos::Describable::description.
virtual Teuchos::RCP< Trilinos::Details::LinearSolver< MV, OP, NormType > > getLinearSolver(const std::string &solverName)
Get an instance of a MueLu solver.
void numeric()
Set up any part of the solve that depends on both the structure and the numerical values of the input...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
LinearSolver()
Constructor.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Set this solver's parameters.
virtual ~LinearSolver()
Destructor (virtual for memory safety).
Teuchos::RCP< TpetraOperator< Scalar, LO, GO, Node > > solver_
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Implementation of Teuchos::Describable::describe.
Various adapters that will create a MueLu preconditioner that is a Tpetra::Operator.
static const EVerbosityLevel verbLevel_default
LinearSolver()
Constructor.
Teuchos::RCP< const OP > A_
Teuchos::RCP< MueLu::EpetraOperator > CreateEpetraPreconditioner(const Teuchos::RCP< Epetra_CrsMatrix > &inA, Teuchos::ParameterList ¶mListIn)
Helper function to create a MueLu preconditioner that can be used by Epetra.Given a EpetraCrs_Matrix...
void setMatrix(const Teuchos::RCP< const Tpetra::Operator< Scalar, LO, GO, Node > > &A)
Set the Solver's matrix.
static void registerLinearSolverFactory()
Register this LinearSolverFactory with the central registry.
Teuchos::RCP< const Tpetra::Operator< Scalar, LO, GO, Node > > A_
Teuchos::RCP< const Tpetra::Operator< Scalar, LO, GO, Node > > getMatrix() const
Get a pointer to this Solver's matrix.
Various adapters that will create a MueLu preconditioner that is an Epetra_Operator.
virtual ~LinearSolver()
Destructor (virtual for memory safety).
void symbolic()
Set up any part of the solve that depends on the structure of the input matrix, but not its numerical...
Teuchos::RCP< Teuchos::ParameterList > params_
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...
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.
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 OP > &A)
Set the 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.