46 #ifndef MUELU_TRILINOSSMOOTHER_DEF_HPP
47 #define MUELU_TRILINOSSMOOTHER_DEF_HPP
49 #include <Xpetra_Map.hpp>
50 #include <Xpetra_Matrix.hpp>
56 #include "MueLu_Ifpack2Smoother.hpp"
61 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
63 : type_(type), overlap_(overlap)
78 ParameterList paramList = paramListIn;
84 #if defined(HAVE_MUELU_TPETRA) && defined(HAVE_MUELU_IFPACK2)
95 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_IFPACK)
110 "Please enable (TPETRA and IFPACK2) or (EPETRA and IFPACK)");
113 "Could not construct any smoother:\n"
114 << (
triedEpetra_ ?
"=> Failed to build an Epetra smoother due to the following exception:\n" :
"=> Epetra and/or Ifpack are not enabled.\n")
116 << (
triedTpetra_ ?
"=> Failed to build a Tpetra smoother due to the following exception:\n" :
"=> Tpetra and/or Ifpack2 are not enabled.\n")
122 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
125 if (!sEpetra_.is_null()) sEpetra_->SetFactory(varName, factory);
126 if (!sTpetra_.is_null()) sTpetra_->SetFactory(varName, factory);
129 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
136 bool useTpetra = (currentLevel.
lib() == Xpetra::UseTpetra);
137 s_ = (useTpetra ? sTpetra_ : sEpetra_);
140 #if not defined(HAVE_MUELU_IFPACK22)
142 "Error: running in Tpetra mode, but MueLu with Ifpack2 was disabled during the configure stage.\n"
143 "Please make sure that:\n"
144 " - Ifpack2 is enabled (Trilinos_ENABLE_Ifpack2=ON),\n"
145 " - Ifpack2 is available for MueLu to use (MueLu_ENABLE_Ifpack2=ON)\n");
148 this->GetOStream(
Errors) <<
"Tpetra mode was disabled due to an error:\n" << errorTpetra_ << std::endl;
152 #if not defined(HAVE_MUELU_IFPACK)
154 "Error: running in Epetra mode, but MueLu with Ifpack was disabled during the configure stage.\n"
155 "Please make sure that:\n"
156 " - Ifpack is enabled (you can do that with Trilinos_ENABLE_Ifpack=ON),\n"
157 " - Ifpack is available for MueLu to use (MueLu_ENABLE_Ifpack=ON)\n");
160 this->GetOStream(
Errors) <<
"Epetra mode was disabled due to an error:\n" << errorEpetra_ << std::endl;
164 "Smoother for " << (useTpetra ?
"Tpetra" :
"Epetra") <<
" was not constructed");
167 s_->DeclareInput(currentLevel);
170 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
173 this->GetOStream(
Warnings0) <<
"MueLu::TrilinosSmoother::Setup(): Setup() has already been called" << std::endl;
175 int oldRank = s_->SetProcRankVerbose(this->GetProcRankVerbose());
177 s_->Setup(currentLevel);
179 s_->SetProcRankVerbose(oldRank);
183 this->SetParameterList(s_->GetParameterList());
186 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
190 s_->Apply(X, B, InitialGuessIsZero);
193 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
194 RCP<MueLu::SmootherPrototype<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
196 RCP<TrilinosSmoother> newSmoo = rcp(
new TrilinosSmoother(type_, this->GetParameterList(), overlap_));
200 if (!sEpetra_.is_null())
201 newSmoo->sEpetra_ = sEpetra_->Copy();
202 if (!sTpetra_.is_null())
203 newSmoo->sTpetra_ = sTpetra_->Copy();
206 newSmoo->s_ = (s_.get() == sTpetra_.get() ? newSmoo->sTpetra_ : newSmoo->sEpetra_);
207 newSmoo->SetParameterList(this->GetParameterList());
212 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
214 if (type ==
"RELAXATION") {
return "point relaxation stand-alone"; }
215 if (type ==
"CHEBYSHEV") {
return "Chebyshev"; }
216 if (type ==
"ILUT") {
return "ILUT"; }
217 if (type ==
"RILUK") {
return "ILU"; }
218 if (type ==
"ILU") {
return "ILU"; }
219 if (type ==
"Amesos") {
return "Amesos"; }
225 if (type ==
"LINESMOOTHING_BLOCKRELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
226 if (type ==
"LINESMOOTHING_BLOCK RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
227 if (type ==
"LINESMOOTHING_BLOCK_RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
228 if (type ==
"LINESMOOTHING_BANDEDRELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
229 if (type ==
"LINESMOOTHING_BANDED RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
230 if (type ==
"LINESMOOTHING_BANDED_RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
231 if (type ==
"LINESMOOTHING_TRIDIRELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
232 if (type ==
"LINESMOOTHING_TRIDI RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
233 if (type ==
"LINESMOOTHING_TRIDI_RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
234 if (type ==
"LINESMOOTHING_TRIDIAGONALRELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
235 if (type ==
"LINESMOOTHING_TRIDIAGONAL RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
236 if (type ==
"LINESMOOTHING_TRIDIAGONAL_RELAXATION") {
return "LINESMOOTHING_BLOCKRELAXATION"; }
238 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"Cannot convert Ifpack2 preconditioner name to Ifpack: unknown type: \"" + type +
"\"");
241 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
243 Teuchos::ParameterList ifpack1List = ifpack2List;
245 if (ifpack2List.isParameter(
"relaxation: type") && ifpack2List.get<std::string>(
"relaxation: type") ==
"Symmetric Gauss-Seidel")
246 ifpack1List.set(
"relaxation: type",
"symmetric Gauss-Seidel");
248 if (ifpack2List.isParameter(
"fact: iluk level-of-fill")) {
249 ifpack1List.remove(
"fact: iluk level-of-fill");
250 ifpack1List.set(
"fact: level-of-fill", ifpack2List.get<
int>(
"fact: iluk level-of-fill"));
256 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
258 std::ostringstream out;
259 if (s_ != Teuchos::null) {
260 out << s_->description();
263 out <<
"{type = " << type_ <<
"}";
268 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
273 out0 <<
"Prec. type: " << type_ << std::endl;
276 out0 <<
"PrecType: " << type_ << std::endl;
277 out0 <<
"Parameter list: " << std::endl;
278 Teuchos::OSTab tab2(out);
279 out << this->GetParameterList();
280 out0 <<
"Overlap: " << overlap_ << std::endl;
283 if (verbLevel &
Debug) {
286 <<
"Epetra PrecType: " << Ifpack2ToIfpack1Type(type_) << std::endl
287 <<
"Epetra Parameter list: " << std::endl;
288 Teuchos::OSTab tab2(out);
289 out << Ifpack2ToIfpack1Param(this->GetParameterList());;
295 #endif // MUELU_TRILINOSSMOOTHER_DEF_HPP