48 #ifndef IFPACK2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP 
   49 #define IFPACK2_DETAILS_LINEARSOLVERFACTORY_DEF_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>
 
   68   using Teuchos::rcp_dynamic_cast;
 
   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) {
 
   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 ());
 
   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;
 
  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;
 
  124 #endif // HAVE_TEUCHOSCORE_CXX11 
  126   impl_ptr_type factory (
new factory_impl_type ());
 
  127   base_ptr_type factoryBase = factory; 
 
  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 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
static void registerLinearSolverFactory()
Register this LinearSolverFactory with the central registry. 
Definition: Ifpack2_Details_LinearSolverFactory_def.hpp:110
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
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.