10#ifndef MUELU_TRILINOSSMOOTHER_DEF_HPP
11#define MUELU_TRILINOSSMOOTHER_DEF_HPP
13#include <Xpetra_Map.hpp>
14#include <Xpetra_Matrix.hpp>
20#include "MueLu_Ifpack2Smoother.hpp"
21#include "MueLu_BelosSmoother.hpp"
22#include "MueLu_StratimikosSmoother.hpp"
27template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
46 ParameterList paramList = paramListIn;
55 else if (!
sTpetra_->constructionSuccessful()) {
63 }
catch (Teuchos::Exceptions::InvalidParameterName& e) {
67#if defined(HAVE_MUELU_BELOS)
72 else if (!
sBelos_->constructionSuccessful()) {
83#if defined(HAVE_MUELU_STRATIMIKOS) && defined(HAVE_MUELU_THYRA)
101 "Unable to construct any smoother."
102 "Please enable (TPETRA and IFPACK2) or (EPETRA and IFPACK) or (BELOS) or (STRATIMIKOS)");
105 "Could not construct any smoother:\n"
106 << (
triedEpetra_ ?
"=> Failed to build an Epetra smoother due to the following exception:\n" :
"=> Epetra and/or Ifpack are not enabled.\n")
108 << (
triedTpetra_ ?
"=> Failed to build a Tpetra smoother due to the following exception:\n" :
"=> Tpetra and/or Ifpack2 are not enabled.\n")
110 << (
triedBelos_ ?
"=> Failed to build a Belos smoother due to the following exception:\n" :
"=> Belos not enabled.\n")
112 << (
triedStratimikos_ ?
"=> Failed to build a Stratimikos smoother due to the following exception:\n" :
"=> Stratimikos not enabled.\n")
118template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
121 if (!sEpetra_.is_null()) sEpetra_->SetFactory(varName, factory);
122 if (!sTpetra_.is_null()) sTpetra_->SetFactory(varName, factory);
123 if (!sBelos_.is_null()) sBelos_->SetFactory(varName, factory);
124 if (!sStratimikos_.is_null()) sStratimikos_->SetFactory(varName, factory);
127template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
129 if (!sBelos_.is_null())
131 else if (!sStratimikos_.is_null())
140 bool useTpetra = (currentLevel.
lib() == Xpetra::UseTpetra);
141 s_ = (useTpetra ? sTpetra_ : sEpetra_);
144#if not defined(HAVE_MUELU_IFPACK2)
146 "Error: running in Tpetra mode, but MueLu with Ifpack2 was disabled during the configure stage.\n"
147 "Please make sure that:\n"
148 " - Ifpack2 is enabled (Trilinos_ENABLE_Ifpack2=ON),\n"
149 " - Ifpack2 is available for MueLu to use (MueLu_ENABLE_Ifpack2=ON)\n");
152 this->GetOStream(
Errors) <<
"Tpetra mode was disabled due to an error:\n"
153 << errorTpetra_ << std::endl;
157#if not defined(HAVE_MUELU_IFPACK)
159 "Error: running in Epetra mode, but MueLu with Ifpack was disabled during the configure stage.\n"
160 "Please make sure that:\n"
161 " - Ifpack is enabled (you can do that with Trilinos_ENABLE_Ifpack=ON),\n"
162 " - Ifpack is available for MueLu to use (MueLu_ENABLE_Ifpack=ON)\n");
165 this->GetOStream(
Errors) <<
"Epetra mode was disabled due to an error:\n"
166 << errorEpetra_ << std::endl;
170 "Smoother for " << (useTpetra ?
"Tpetra" :
"Epetra") <<
" was not constructed");
174 s_->DeclareInput(currentLevel);
177template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
180 this->GetOStream(
Warnings0) <<
"MueLu::TrilinosSmoother::Setup(): Setup() has already been called" << std::endl;
182 int oldRank = s_->SetProcRankVerbose(this->GetProcRankVerbose());
184 s_->Setup(currentLevel);
186 s_->SetProcRankVerbose(oldRank);
190 this->SetParameterList(s_->GetParameterList());
193template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
197 s_->Apply(X, B, InitialGuessIsZero);
200template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
201RCP<MueLu::SmootherPrototype<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
203 RCP<TrilinosSmoother> newSmoo = rcp(
new TrilinosSmoother(type_, this->GetParameterList(), overlap_));
207 if (!sEpetra_.is_null())
208 newSmoo->sEpetra_ = sEpetra_->Copy();
209 if (!sTpetra_.is_null())
210 newSmoo->sTpetra_ = sTpetra_->Copy();
211 if (!sBelos_.is_null())
212 newSmoo->sBelos_ = sBelos_->Copy();
213 if (!sStratimikos_.is_null())
214 newSmoo->sStratimikos_ = sStratimikos_->Copy();
217 if (s_.get() == sBelos_.get())
218 newSmoo->s_ = newSmoo->sBelos_;
219 else if (s_.get() == sStratimikos_.get())
220 newSmoo->s_ = newSmoo->sStratimikos_;
221 else if (s_.get() == sTpetra_.get())
222 newSmoo->s_ = newSmoo->sTpetra_;
224 newSmoo->s_ = newSmoo->sEpetra_;
225 newSmoo->SetParameterList(this->GetParameterList());
230template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
232 if (type ==
"RELAXATION") {
233 return "point relaxation stand-alone";
235 if (type ==
"CHEBYSHEV") {
238 if (type ==
"ILUT") {
241 if (type ==
"RILUK") {
247 if (type ==
"Amesos") {
255 if (type ==
"LINESMOOTHING_BLOCKRELAXATION") {
256 return "LINESMOOTHING_BLOCKRELAXATION";
258 if (type ==
"LINESMOOTHING_BLOCK RELAXATION") {
259 return "LINESMOOTHING_BLOCKRELAXATION";
261 if (type ==
"LINESMOOTHING_BLOCK_RELAXATION") {
262 return "LINESMOOTHING_BLOCKRELAXATION";
264 if (type ==
"LINESMOOTHING_BANDEDRELAXATION") {
265 return "LINESMOOTHING_BLOCKRELAXATION";
267 if (type ==
"LINESMOOTHING_BANDED RELAXATION") {
268 return "LINESMOOTHING_BLOCKRELAXATION";
270 if (type ==
"LINESMOOTHING_BANDED_RELAXATION") {
271 return "LINESMOOTHING_BLOCKRELAXATION";
273 if (type ==
"LINESMOOTHING_TRIDIRELAXATION") {
274 return "LINESMOOTHING_BLOCKRELAXATION";
276 if (type ==
"LINESMOOTHING_TRIDI RELAXATION") {
277 return "LINESMOOTHING_BLOCKRELAXATION";
279 if (type ==
"LINESMOOTHING_TRIDI_RELAXATION") {
280 return "LINESMOOTHING_BLOCKRELAXATION";
282 if (type ==
"LINESMOOTHING_TRIDIAGONALRELAXATION") {
283 return "LINESMOOTHING_BLOCKRELAXATION";
285 if (type ==
"LINESMOOTHING_TRIDIAGONAL RELAXATION") {
286 return "LINESMOOTHING_BLOCKRELAXATION";
288 if (type ==
"LINESMOOTHING_TRIDIAGONAL_RELAXATION") {
289 return "LINESMOOTHING_BLOCKRELAXATION";
291 if (type ==
"AGGREGATE") {
294 if (type ==
"BLOCK_RELAXATION" ||
295 type ==
"BLOCK RELAXATION" ||
296 type ==
"BLOCKRELAXATION" ||
298 type ==
"BANDED_RELAXATION" ||
299 type ==
"BANDED RELAXATION" ||
300 type ==
"BANDEDRELAXATION" ||
302 type ==
"TRIDI_RELAXATION" ||
303 type ==
"TRIDI RELAXATION" ||
304 type ==
"TRIDIRELAXATION" ||
305 type ==
"TRIDIAGONAL_RELAXATION" ||
306 type ==
"TRIDIAGONAL RELAXATION" ||
307 type ==
"TRIDIAGONALRELAXATION") {
308 return "block relaxation stand-alone";
311 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"Cannot convert Ifpack2 preconditioner name to Ifpack: unknown type: \"" + type +
"\"");
314template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
316 Teuchos::ParameterList ifpack1List = ifpack2List;
318 if (ifpack2List.isParameter(
"relaxation: type") && ifpack2List.get<std::string>(
"relaxation: type") ==
"Symmetric Gauss-Seidel")
319 ifpack1List.set(
"relaxation: type",
"symmetric Gauss-Seidel");
321 if (ifpack2List.isParameter(
"fact: iluk level-of-fill")) {
322 ifpack1List.remove(
"fact: iluk level-of-fill");
323 ifpack1List.set(
"fact: level-of-fill", ifpack2List.get<
int>(
"fact: iluk level-of-fill"));
329template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
331 std::ostringstream out;
332 if (s_ != Teuchos::null) {
333 out << s_->description();
336 out <<
"{type = " << type_ <<
"}";
341template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
346 out0 <<
"Prec. type: " << type_ << std::endl;
349 out0 <<
"PrecType: " << type_ << std::endl;
350 out0 <<
"Parameter list: " << std::endl;
351 Teuchos::OSTab tab2(out);
352 out << this->GetParameterList();
353 out0 <<
"Overlap: " << overlap_ << std::endl;
356 if (verbLevel &
Debug) {
359 <<
"Epetra PrecType: " << Ifpack2ToIfpack1Type(type_) << std::endl
360 <<
"Epetra Parameter list: " << std::endl;
361 Teuchos::OSTab tab2(out);
362 out << Ifpack2ToIfpack1Param(this->GetParameterList());
#define MUELU_DESCRIBE
Helper macro for implementing Describable::describe() for BaseClass objects.
Class that encapsulates Belos smoothers.
virtual std::string description() const
Return a simple one-line description of this object.
Exception indicating invalid cast attempted.
Exception throws to report errors in the internal logical of the program.
Class that encapsulates Ifpack2 smoothers.
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.
bool IsSetup() const
Get the state of a smoother prototype.
Class that encapsulates external library smoothers.
RCP< SmootherPrototype > Copy() const
When this prototype is cloned using Copy(), the clone is an Ifpack or an Ifpack2 smoother.
void Setup(Level ¤tLevel)
TrilinosSmoother cannot be turned into a smoother using Setup(). Setup() always returns a RuntimeErro...
LO overlap_
overlap when using the smoother in additive Schwarz mode
static Teuchos::ParameterList Ifpack2ToIfpack1Param(const Teuchos::ParameterList &ifpack2List)
Convert an Ifpack2 parameter list to Ifpack.
static std::string Ifpack2ToIfpack1Type(const std::string &type)
Convert an Ifpack2 preconditioner name to Ifpack.
std::string type_
ifpack1/2-specific key phrase that denote smoother type
RCP< SmootherPrototype > sBelos_
friend class TrilinosSmoother
Friend declaration required for clone() functionality.
std::string errorStratimikos_
void DeclareInput(Level ¤tLevel) const
Input.
RCP< SmootherPrototype > sEpetra_
Smoother.
void SetFactory(const std::string &varName, const RCP< const FactoryBase > &factory)
Custom SetFactory.
RCP< SmootherPrototype > sStratimikos_
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const
TrilinosSmoother cannot be applied. Apply() always returns a RuntimeError exception.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Print the object with some verbosity level to an FancyOStream object.
std::string description() const
Return a simple one-line description of this object.
RCP< SmootherPrototype > sTpetra_
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)