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)
69 sEpetra_ = GetAmesosSmoother<SC, LO, GO, NO>(
type_, paramList);
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>
151 if (!sEpetra_.is_null()) sEpetra_->SetFactory(varName, factory);
152 if (!sTpetra_.is_null()) sTpetra_->SetFactory(varName, factory);
153 if (!sBelos_.is_null()) sBelos_->SetFactory(varName, factory);
154 if (!sStratimikos_.is_null()) sStratimikos_->SetFactory(varName, factory);
155 if (!sRefMaxwell_.is_null()) sRefMaxwell_->SetFactory(varName, factory);
158template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
160 if (!sBelos_.is_null())
162 else if (!sStratimikos_.is_null())
164 else if (!sRefMaxwell_.is_null())
172 bool useTpetra = (currentLevel.
lib() == Xpetra::UseTpetra);
173 s_ = (useTpetra ? sTpetra_ : sEpetra_);
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");
184 this->GetOStream(
Errors) <<
"Tpetra mode was disabled due to an error:\n"
185 << errorTpetra_ << std::endl;
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");
197 this->GetOStream(
Errors) <<
"Epetra mode was disabled due to an error:\n"
198 << errorEpetra_ << std::endl;
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;
214 int oldRank = s_->SetProcRankVerbose(this->GetProcRankVerbose());
216 s_->Setup(currentLevel);
218 s_->SetProcRankVerbose(oldRank);
222 this->SetParameterList(s_->GetParameterList());
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));
238 if (!sEpetra_.is_null())
239 newSmoo->sEpetra_ = sEpetra_->Copy();
240 if (!sTpetra_.is_null())
241 newSmoo->sTpetra_ = sTpetra_->Copy();
242 if (!sBelos_.is_null())
243 newSmoo->sBelos_ = sBelos_->Copy();
244 if (!sStratimikos_.is_null())
245 newSmoo->sStratimikos_ = sStratimikos_->Copy();
246 if (!sRefMaxwell_.is_null())
247 newSmoo->sRefMaxwell_ = sRefMaxwell_->Copy();
250 if (s_.get() == sBelos_.get())
251 newSmoo->s_ = newSmoo->sBelos_;
252 else if (s_.get() == sStratimikos_.get())
253 newSmoo->s_ = newSmoo->sStratimikos_;
254 else if (s_.get() == sRefMaxwell_.get())
255 newSmoo->s_ = newSmoo->sRefMaxwell_;
256 else if (s_.get() == sTpetra_.get())
257 newSmoo->s_ = newSmoo->sTpetra_;
259 newSmoo->s_ = newSmoo->sEpetra_;
260 newSmoo->SetParameterList(this->GetParameterList());
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);
287 out << this->GetParameterList();
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.
Class that encapsulates direct solvers. Autoselection of AmesosSmoother or Amesos2Smoother according ...
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 > 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.
Class that encapsulates Operator smoothers.
bool IsSetup() const
Get the state of a smoother prototype.
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)