48 #ifndef IFPACK2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP 49 #define IFPACK2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP 51 #include "Trilinos_Details_LinearSolverFactory.hpp" 53 #include "Ifpack2_Details_LinearSolver.hpp" 54 #include "Ifpack2_Factory.hpp" 55 #include "Tpetra_RowMatrix.hpp" 56 #include <type_traits> 61 template<
class SC,
class LO,
class GO,
class NT>
62 Teuchos::RCP<typename LinearSolverFactory<SC, LO, GO, NT>::solver_type>
68 using Teuchos::rcp_dynamic_cast;
69 using Teuchos::TypeNameTraits;
71 typedef Tpetra::RowMatrix<SC, LO, GO, NT> ROW;
72 const char prefix[] =
"Ifpack2::Details::LinearSolverFactory::getLinearSolver: ";
74 RCP<prec_type> solver;
80 solver = Ifpack2::Factory::template create<ROW> (solverName, null);
82 catch (std::exception& e) {
83 TEUCHOS_TEST_FOR_EXCEPTION
84 (
true, std::invalid_argument, prefix <<
"Failed to create Ifpack2 " 85 "preconditioner named \"" << solverName <<
"\", for the following " 86 "template parameters: " 87 <<
"SC = " << TypeNameTraits<SC>::name ()
88 <<
", LO = " << TypeNameTraits<LO>::name ()
89 <<
", GO = " << TypeNameTraits<GO>::name ()
90 <<
", NT = " << TypeNameTraits<NT>::name ()
91 <<
". Ifpack2::Factory::create threw an exception: " << e.what ());
93 TEUCHOS_TEST_FOR_EXCEPTION
94 (solver.is_null (), std::invalid_argument, prefix <<
"Failed to create " 95 "Ifpack2 preconditioner named \"" << solverName <<
"\", for the " 96 "following template parameters: " 97 <<
"SC = " << TypeNameTraits<SC>::name ()
98 <<
", LO = " << TypeNameTraits<LO>::name ()
99 <<
", GO = " << TypeNameTraits<GO>::name ()
100 <<
", NT = " << TypeNameTraits<NT>::name ()
101 <<
". Ifpack2::Factory::create returned null.");
104 return Teuchos::rcp (
new impl_type (solver, solverName));
107 template<
class SC,
class LO,
class GO,
class NT>
112 typedef Tpetra::MultiVector<SC, LO, GO, NT> MV;
113 typedef Tpetra::Operator<SC, LO, GO, NT> OP;
114 typedef typename MV::mag_type mag_type;
115 typedef Trilinos::Details::LinearSolverFactory<MV, OP, mag_type> factory_base_type;
118 #ifdef HAVE_TEUCHOSCORE_CXX11 119 typedef std::shared_ptr<factory_base_type> base_ptr_type;
120 typedef std::shared_ptr<factory_impl_type> impl_ptr_type;
122 typedef Teuchos::RCP<factory_base_type> base_ptr_type;
123 typedef Teuchos::RCP<factory_impl_type> impl_ptr_type;
124 #endif // HAVE_TEUCHOSCORE_CXX11 126 impl_ptr_type factory (
new factory_impl_type ());
127 base_ptr_type factoryBase = factory;
129 TEUCHOS_TEST_FOR_EXCEPTION
130 (factoryBase.get () == NULL, std::logic_error,
"Factory is null! This " 131 "should never happen! Please report this bug to the Ifpack2 developers.");
147 Trilinos::Details::registerLinearSolverFactory<MV, OP, mag_type> (
"Ifpack2", factoryBase);
155 #define IFPACK2_DETAILS_LINEARSOLVERFACTORY_INSTANT( SC, LO, GO, NT ) \ 156 template class Ifpack2::Details::LinearSolverFactory<SC, LO, GO, NT>; 158 #endif // IFPACK2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP static void registerLinearSolverFactory()
Register this LinearSolverFactory with the central registry.
Definition: Ifpack2_Details_LinearSolverFactory_def.hpp:110
Ifpack2 implementation details.
Interface for a "factory" that creates Ifpack2 solvers.
Definition: Ifpack2_Details_LinearSolverFactory_decl.hpp:65
Ifpack2's implementation of Trilinos::Details::LinearSolver interface.
Definition: Ifpack2_Details_LinearSolver_decl.hpp:105
virtual Teuchos::RCP< solver_type > getLinearSolver(const std::string &solverName)
Get an instance of a Ifpack2 solver.
Definition: Ifpack2_Details_LinearSolverFactory_def.hpp:64
Interface for all Ifpack2 preconditioners.
Definition: Ifpack2_Preconditioner.hpp:107
Declaration of interface for preconditioners that can change their matrix after construction.
Preconditioners and smoothers for Tpetra sparse matrices.
Definition: Ifpack2_AdditiveSchwarz_decl.hpp:73