53 #ifndef MUELU_BLOCKEDDIRECTSOLVER_DEF_HPP_ 
   54 #define MUELU_BLOCKEDDIRECTSOLVER_DEF_HPP_ 
   56 #include "Teuchos_ArrayViewDecl.hpp" 
   61 #include <Xpetra_Matrix.hpp> 
   62 #include <Xpetra_BlockedCrsMatrix.hpp> 
   63 #include <Xpetra_MultiVectorFactory.hpp> 
   65 #include "MueLu_BlockedDirectSolver.hpp" 
   66 #include "MueLu_MergedBlockedMatrixFactory.hpp" 
   68 #include "MueLu_Utilities.hpp" 
   70 #include "MueLu_HierarchyUtils.hpp" 
   72 #include "MueLu_DirectSolver.hpp" 
   76   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   78     : type_(
"blocked direct solver")
 
   86   template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   92     return validParamList;
 
   95   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  100     currentLevel.
DeclareInput(
"A",this->GetFactory(
"A").
get());
 
  103     MergedAFact_->SetFactory(
"A", this->GetFactory(
"A"));
 
  106     s_->SetFactory(
"A",MergedAFact_);
 
  107     s_->DeclareInput(currentLevel);
 
  110   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  114     FactoryMonitor m(*
this, 
"Setup BlockedDirectSolver", currentLevel);
 
  115     if (this->IsSetup() == 
true)
 
  116       this->GetOStream(
Warnings0) << 
"MueLu::BlockedDirectSolver::Setup(): Setup() has already been called";
 
  119     A_ = Factory::Get< RCP<Matrix> >(currentLevel, 
"A"); 
 
  122                                "MueLu::BlockedDirectSolver::Build: input matrix A is not of type BlockedCrsMatrix.");
 
  124     s_->Setup(currentLevel);
 
  129   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  132                                "MueLu::BlockedDirectSolver::Apply(): Setup() has not been called");
 
  139 #ifdef HAVE_MUELU_DEBUG 
  141     if(bB.is_null() == 
false) {
 
  144       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.");
 
  149       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.");
 
  153     if (bB.is_null() == 
true && bX.
is_null() == 
true) {
 
  155       s_->Apply(X, B, InitialGuessIsZero);
 
  156     } 
else if(bB.is_null() == 
false && bX.
is_null() == 
false) {
 
  160       s_->Apply(*mergedX, *mergedB, InitialGuessIsZero);
 
  163       X.update(one,*xx,zero);
 
  164     } 
else if (bB.is_null() == 
true && bX.
is_null() == 
false) {
 
  167       s_->Apply(*mergedX, B, InitialGuessIsZero);
 
  170       X.update(one,*xx,zero);
 
  171     } 
else if (bB.is_null() == 
false && bX.
is_null() == 
true) {
 
  174       s_->Apply(X, *mergedB, InitialGuessIsZero);
 
  178   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  184   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  186     std::ostringstream out;
 
  188     out << 
"{type = " << type_ << 
"}";
 
  192   template <
class Scalar,
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  197       out0 << 
"Prec. type: " << type_ << std::endl;
 
  199     if (verbLevel & 
Debug)
 
  203   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...
 
void DeclareInput(Level ¤tLevel) const 
Input. 
 
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
 
BlockedDirectSolver()
Constructor. 
 
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. 
 
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 ...
 
RCP< MergedBlockedMatrixFactory > MergedAFact_
Factory to generate merged block matrix. 
 
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. 
 
RCP< DirectSolver > s_
Direct solver. 
 
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)