17 #ifndef MUELU_BLOCKEDDIRECTSOLVER_DEF_HPP_ 
   18 #define MUELU_BLOCKEDDIRECTSOLVER_DEF_HPP_ 
   20 #include "Teuchos_ArrayViewDecl.hpp" 
   27 #include <Xpetra_MultiVectorFactory.hpp> 
   30 #include "MueLu_MergedBlockedMatrixFactory.hpp" 
   33 #include "MueLu_DirectSolver.hpp" 
   37 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   41   type_        = 
"blocked direct solver (" + type + 
")";
 
   44 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   50   return validParamList;
 
   53 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   58   currentLevel.
DeclareInput(
"A", this->GetFactory(
"A").
get());
 
   61   MergedAFact_->SetFactory(
"A", this->GetFactory(
"A"));
 
   64   s_->SetFactory(
"A", MergedAFact_);
 
   65   s_->DeclareInput(currentLevel);
 
   68 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   72   FactoryMonitor m(*
this, 
"Setup BlockedDirectSolver", currentLevel);
 
   73   if (this->IsSetup() == 
true)
 
   74     this->GetOStream(
Warnings0) << 
"MueLu::BlockedDirectSolver::Setup(): Setup() has already been called";
 
   77   A_                       = Factory::Get<RCP<Matrix> >(currentLevel, 
"A");  
 
   80                              "MueLu::BlockedDirectSolver::Build: input matrix A is not of type BlockedCrsMatrix.");
 
   82   s_->Setup(currentLevel);
 
   87 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   90                              "MueLu::BlockedDirectSolver::Apply(): Setup() has not been called");
 
   97 #ifdef HAVE_MUELU_DEBUG 
   99   if (bB.is_null() == 
false) {
 
  102     TEUCHOS_TEST_FOR_EXCEPTION(bA->getFullRangeMap()->isSameAs(*(B.getMap())) == 
false, 
Exceptions::RuntimeError, 
"MueLu::BlockedDirectSolver::Apply(): The map of RHS vector B is not the same as range map of the blocked operator A. Please check the map of B and A.");
 
  107     TEUCHOS_TEST_FOR_EXCEPTION(bA->getFullDomainMap()->isSameAs(*(X.getMap())) == 
false, 
Exceptions::RuntimeError, 
"MueLu::BlockedDirectSolver::Apply(): The map of the solution vector X is not the same as domain map of the blocked operator A. Please check the map of X and A.");
 
  111   if (bB.is_null() == 
true && bX.
is_null() == 
true) {
 
  113     s_->Apply(X, B, InitialGuessIsZero);
 
  114   } 
else if (bB.is_null() == 
false && bX.
is_null() == 
false) {
 
  118     s_->Apply(*mergedX, *mergedB, InitialGuessIsZero);
 
  121     X.update(one, *xx, zero);
 
  122   } 
else if (bB.is_null() == 
true && bX.
is_null() == 
false) {
 
  125     s_->Apply(*mergedX, B, InitialGuessIsZero);
 
  128     X.update(one, *xx, zero);
 
  129   } 
else if (bB.is_null() == 
false && bX.
is_null() == 
true) {
 
  132     s_->Apply(X, *mergedB, InitialGuessIsZero);
 
  136 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  142 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  144   std::ostringstream out;
 
  146   out << 
"{type = " << type_ << 
"}";
 
  150 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  155     out0 << 
"Prec. type: " << type_ << std::endl;
 
  157   if (verbLevel & 
Debug)
 
  161 template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
Important warning messages (one line) 
 
Exception indicating invalid cast attempted. 
 
void Setup(Level ¤tLevel)
Setup routine Call the underlaying Setup routine of the nested direct solver once the input block mat...
 
BlockedDirectSolver(const std::string &type="", const Teuchos::ParameterList ¶mList=Teuchos::ParameterList())
Constructor. 
 
void DeclareInput(Level ¤tLevel) const 
Input. 
 
Timer to be used in factories. Similar to Monitor but with additional timers. 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
Print additional debugging information. 
 
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
 
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const 
Apply the direct solver. Solves the linear system AX=B using the constructed solver. 
 
RCP< const ParameterList > GetValidParameterList() const 
Input. 
 
std::string description() const 
Return a simple one-line description of this object. 
 
Class that encapsulates direct solvers. Autoselection of AmesosSmoother or Amesos2Smoother according ...
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
Class that holds all level-specific information. 
 
RCP< SmootherPrototype > Copy() const 
 
bool IsSetup() const 
Get the state of a smoother prototype. 
 
direct solver for nxn blocked matrices 
 
#define MUELU_DESCRIBE
Helper macro for implementing Describable::describe() for BaseClass objects. 
 
size_t getNodeSmootherComplexity() const 
Get a rough estimate of cost per iteration. 
 
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const 
Print the object with some verbosity level to an FancyOStream object. 
 
Exception throws to report errors in the internal logical of the program. 
 
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput() 
 
virtual std::string description() const 
Return a simple one-line description of this object. 
 
std::string toString(const T &t)