10#ifndef MUELU_DIRECTSOLVER_DEF_HPP
11#define MUELU_DIRECTSOLVER_DEF_HPP
13#include <Xpetra_Utils.hpp>
14#include <Xpetra_Matrix.hpp>
21#include "MueLu_Amesos2Smoother.hpp"
23#include "MueLu_BelosSmoother.hpp"
24#include "MueLu_StratimikosSmoother.hpp"
25#include "MueLu_RefMaxwellSmoother.hpp"
29template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
43 ParameterList paramList = paramListIn;
48#if defined(HAVE_MUELU_AMESOS2)
52 errorTpetra_ =
"Unable to construct Amesos2 direct solver";
53 else if (!
sTpetra_->constructionSuccessful()) {
61 }
catch (Teuchos::Exceptions::InvalidParameterName& e) {
66#if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_AMESOS)
71 errorEpetra_ =
"Unable to construct Amesos direct solver";
72 else if (!
sEpetra_->constructionSuccessful()) {
82#if defined(HAVE_MUELU_BELOS)
87 else if (!
sBelos_->constructionSuccessful()) {
98#if defined(HAVE_MUELU_STRATIMIKOS) && defined(HAVE_MUELU_THYRA)
128 "Unable to construct any direct solver."
129 "Plase enable (TPETRA and AMESOS2) or (EPETRA and AMESOS) or (BELOS) or (STRATIMIKOS)");
132 "Could not enable any direct solver:\n"
133 << (
triedEpetra_ ?
"Epetra mode was disabled due to an error:\n" :
"")
135 << (
triedTpetra_ ?
"Tpetra mode was disabled due to an error:\n" :
"")
137 << (
triedBelos_ ?
"Belos was disabled due to an error:\n" :
"")
148template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
158template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
172 bool useTpetra = (currentLevel.
lib() == Xpetra::UseTpetra);
176#if not defined(HAVE_MUELU_AMESOS2)
178 "Error: running in Tpetra mode, but MueLu with Amesos2 was disabled during the configure stage.\n"
179 "Please make sure that:\n"
180 " - Amesos2 is enabled (Trilinos_ENABLE_Amesos2=ON),\n"
181 " - Amesos2 is available for MueLu to use (MueLu_ENABLE_Amesos2=ON)\n");
189#if not defined(HAVE_MUELU_AMESOS)
191 "Error: running in Epetra mode, but MueLu with Amesos was disabled during the configure stage.\n"
192 "Please make sure that:\n"
193 " - Amesos is enabled (you can do that with Trilinos_ENABLE_Amesos=ON),\n"
194 " - Amesos is available for MueLu to use (MueLu_ENABLE_Amesos=ON)\n");
202 "Direct solver for " << (useTpetra ?
"Tpetra" :
"Epetra") <<
" was not constructed");
206 s_->DeclareInput(currentLevel);
209template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
212 this->
GetOStream(
Warnings0) <<
"MueLu::DirectSolver::Setup(): Setup() has already been called" << std::endl;
216 s_->Setup(currentLevel);
218 s_->SetProcRankVerbose(oldRank);
225template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
229 s_->Apply(X, B, InitialGuessIsZero);
232template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
234 RCP<DirectSolver> newSmoo = rcp(
new DirectSolver(*
this));
239 newSmoo->sEpetra_ =
sEpetra_->Copy();
241 newSmoo->sTpetra_ =
sTpetra_->Copy();
243 newSmoo->sBelos_ =
sBelos_->Copy();
251 newSmoo->s_ = newSmoo->sBelos_;
253 newSmoo->s_ = newSmoo->sStratimikos_;
255 newSmoo->s_ = newSmoo->sRefMaxwell_;
257 newSmoo->s_ = newSmoo->sTpetra_;
259 newSmoo->s_ = newSmoo->sEpetra_;
265template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
267 std::ostringstream out;
268 if (
s_ != Teuchos::null) {
269 out <<
s_->description();
272 out <<
"{type = " <<
type_ <<
"}";
277template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
282 out0 <<
"Prec. type: " <<
type_ << std::endl;
285 out0 <<
"Parameter list: " << std::endl;
286 Teuchos::OSTab tab3(out);
290 if (verbLevel &
Debug)
#define MUELU_DESCRIBE
Helper macro for implementing Describable::describe() for BaseClass objects.
Class that encapsulates Amesos2 direct solvers.
Class that encapsulates Belos smoothers.
virtual std::string description() const
Return a simple one-line description of this object.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const
DirectSolver cannot be applied. Apply() always returns a RuntimeError exception.
std::string errorRefMaxwell_
std::string description() const
Return a simple one-line description of this object.
void Setup(Level ¤tLevel)
DirectSolver cannot be turned into a smoother using Setup(). Setup() always returns a RuntimeError ex...
void SetFactory(const std::string &varName, const RCP< const FactoryBase > &factory)
Custom SetFactory.
RCP< SmootherPrototype > sBelos_
RCP< SmootherPrototype > sStratimikos_
RCP< SmootherPrototype > s_
RCP< SmootherPrototype > sEpetra_
Smoother.
std::string errorStratimikos_
RCP< SmootherPrototype > sRefMaxwell_
void DeclareInput(Level ¤tLevel) const
Input.
RCP< SmootherPrototype > Copy() const
When this prototype is cloned using Copy(), the clone is an Amesos or an Amesos2 smoother.
std::string type_
amesos1/2-specific key phrase that denote smoother type
DirectSolver(const std::string &type="", const Teuchos::ParameterList ¶mList=Teuchos::ParameterList())
Constructor Note: only parameters shared by Amesos and Amesos2 should be used for type and paramList ...
RCP< SmootherPrototype > sTpetra_
Exception indicating invalid cast attempted.
Exception throws to report errors in the internal logical of the program.
Class that holds all level-specific information.
Xpetra::UnderlyingLib lib()
virtual void SetParameterList(const Teuchos::ParameterList ¶mList)
Set parameters from a parameter list and return with default values.
virtual const Teuchos::ParameterList & GetParameterList() const
Class that encapsulates Operator smoothers.
bool IsSetup() const
Get the state of a smoother prototype.
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
int GetProcRankVerbose() const
Get proc rank used for printing. Do not use this information for any other purpose....
Namespace for MueLu classes and methods.
@ Warnings0
Important warning messages (one line).
@ Debug
Print additional debugging information.
@ Parameters0
Print class parameters.
@ Parameters1
Print class parameters (more parameters, more verbose).
RCP< MueLu::SmootherPrototype< Scalar, LocalOrdinal, GlobalOrdinal, Node > > GetAmesosSmoother(const std::string &="", const Teuchos::ParameterList &=Teuchos::ParameterList())
Non-member templated function GetAmesosSmoother() returns a new AmesosSmoother object.