48 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_IFPACK)
50 #include <Ifpack_Chebyshev.h>
56 #include "MueLu_Utilities.hpp"
63 : type_(type), overlap_(overlap)
75 prec_->SetParameters(const_cast<ParameterList&>(this->GetParameterList()));
86 prec_->SetParameters(*precList);
112 template <
class Node>
114 this->Input(currentLevel,
"A");
116 if (type_ ==
"LINESMOOTHING_BANDED_RELAXATION" ||
117 type_ ==
"LINESMOOTHING_BANDED RELAXATION" ||
118 type_ ==
"LINESMOOTHING_BANDEDRELAXATION" ||
119 type_ ==
"LINESMOOTHING_BLOCK_RELAXATION" ||
120 type_ ==
"LINESMOOTHING_BLOCK RELAXATION" ||
121 type_ ==
"LINESMOOTHING_BLOCKRELAXATION") {
122 this->Input(currentLevel,
"CoarseNumZLayers");
123 this->Input(currentLevel,
"LineDetection_VertLineIds");
127 template <
class Node>
131 this->GetOStream(
Warnings0) <<
"MueLu::IfpackSmoother::Setup(): Setup() has already been called" << std::endl;
133 A_ = Factory::Get< RCP<Matrix> >(currentLevel,
"A");
135 double lambdaMax = -1.0;
136 if (type_ ==
"Chebyshev") {
137 std::string maxEigString =
"chebyshev: max eigenvalue";
138 std::string eigRatioString =
"chebyshev: ratio eigenvalue";
141 lambdaMax = Teuchos::getValue<Scalar>(this->GetParameter(maxEigString));
142 this->GetOStream(
Statistics1) << maxEigString <<
" (cached with smoother parameter list) = " << lambdaMax << std::endl;
145 lambdaMax = A_->GetMaxEigenvalueEstimate();
147 if (lambdaMax != -1.0) {
148 this->GetOStream(
Statistics1) << maxEigString <<
" (cached with matrix) = " << lambdaMax << std::endl;
154 const Scalar defaultEigRatio = 20;
156 Scalar ratio = defaultEigRatio;
158 ratio = Teuchos::getValue<Scalar>(this->GetParameter(eigRatioString));
164 if (currentLevel.GetLevelID()) {
170 size_t nRowsFine = fineA->getGlobalNumRows();
171 size_t nRowsCoarse = A_->getGlobalNumRows();
173 ratio = std::max(ratio, as<Scalar>(nRowsFine)/nRowsCoarse);
175 this->GetOStream(
Statistics1) << eigRatioString <<
" (computed) = " << ratio << std::endl;
180 if (type_ ==
"LINESMOOTHING_BANDED_RELAXATION" ||
181 type_ ==
"LINESMOOTHING_BANDED RELAXATION" ||
182 type_ ==
"LINESMOOTHING_BANDEDRELAXATION" ||
183 type_ ==
"LINESMOOTHING_BLOCK_RELAXATION" ||
184 type_ ==
"LINESMOOTHING_BLOCK RELAXATION" ||
185 type_ ==
"LINESMOOTHING_BLOCKRELAXATION" ) {
189 if (CoarseNumZLayers > 0) {
194 for(
size_t k = 0; k < Teuchos::as<size_t>(TVertLineIdSmoo.
size()); k++) {
195 if(maxPart < TVertLineIdSmoo[k]) maxPart = TVertLineIdSmoo[k];
198 size_t numLocalRows = A_->getNodeNumRows();
201 if (numLocalRows == Teuchos::as<size_t>(TVertLineIdSmoo.
size())) {
202 myparamList.
set(
"partitioner: type",
"user");
203 myparamList.
set(
"partitioner: map",&(TVertLineIdSmoo[0]));
204 myparamList.
set(
"partitioner: local parts",maxPart+1);
207 size_t numDofsPerNode = numLocalRows / TVertLineIdSmoo.
size();
211 for (
size_t blockRow = 0; blockRow < Teuchos::as<size_t>(TVertLineIdSmoo.
size()); ++blockRow)
212 for (
size_t dof = 0; dof < numDofsPerNode; dof++)
213 partitionerMap[blockRow * numDofsPerNode + dof] = TVertLineIdSmoo[blockRow];
214 myparamList.
set(
"partitioner: type",
"user");
215 myparamList.
set(
"partitioner: map",&(partitionerMap[0]));
216 myparamList.
set(
"partitioner: local parts",maxPart + 1);
219 if (type_ ==
"LINESMOOTHING_BANDED_RELAXATION" ||
220 type_ ==
"LINESMOOTHING_BANDED RELAXATION" ||
221 type_ ==
"LINESMOOTHING_BANDEDRELAXATION")
222 type_ =
"block relaxation";
224 type_ =
"block relaxation";
227 this->GetOStream(
Runtime0) <<
"Line detection failed: fall back to point-wise relaxation" << std::endl;
228 myparamList.
remove(
"partitioner: type",
false);
229 myparamList.
remove(
"partitioner: map",
false);
230 myparamList.
remove(
"partitioner: local parts",
false);
231 type_ =
"point relaxation stand-alone";
239 prec_ =
rcp(factory.
Create(type_, &(*epA), overlap_));
246 if (type_ ==
"Chebyshev" && lambdaMax == -1.0) {
248 if (chebyPrec != Teuchos::null) {
250 A_->SetMaxEigenvalueEstimate(lambdaMax);
251 this->GetOStream(
Statistics1) <<
"chebyshev: max eigenvalue (calculated by Ifpack)" <<
" = " << lambdaMax << std::endl;
256 this->GetOStream(
Statistics1) << description() << std::endl;
259 template <
class Node>
265 bool supportInitialGuess =
false;
266 if (type_ ==
"Chebyshev") {
267 paramList.
set(
"chebyshev: zero starting solution", InitialGuessIsZero);
268 supportInitialGuess =
true;
270 }
else if (type_ ==
"point relaxation stand-alone") {
271 paramList.
set(
"relaxation: zero starting solution", InitialGuessIsZero);
272 supportInitialGuess =
true;
275 SetPrecParameters(paramList);
278 if (InitialGuessIsZero || supportInitialGuess) {
282 prec_->ApplyInverse(epB, epX);
286 RCP<MultiVector> Correction = MultiVectorFactory::Build(A_->getDomainMap(), X.getNumVectors());
291 prec_->ApplyInverse(epB, epX);
293 X.update(1.0, *Correction, 1.0);
297 template <
class Node>
300 smoother->SetParameterList(this->GetParameterList());
304 template <
class Node>
306 std::ostringstream out;
309 if (prec_ == Teuchos::null || this->GetVerbLevel() ==
Test) {
311 out <<
"{type = " << type_ <<
"}";
313 out << prec_->Label();
318 template <
class Node>
323 out0 <<
"Prec. type: " << type_ << std::endl;
326 out0 <<
"Parameter list: " << std::endl;
328 out << this->GetParameterList();
329 out0 <<
"Overlap: " << overlap_ << std::endl;
333 if (prec_ != Teuchos::null) {
335 out << *prec_ << std::endl;
338 if (verbLevel &
Debug) {
341 <<
"RCP<A_>: " << A_ << std::endl
342 <<
"RCP<prec_>: " << prec_ << std::endl;
346 template <
class Node>
358 #if defined(HAVE_MUELU_EPETRA)
void Setup(Level ¤tLevel)
Set up the smoother.
Important warning messages (one line)
RCP< SmootherPrototype > Copy() const
void SetPrecParameters(const Teuchos::ParameterList &list=Teuchos::ParameterList()) const
static RCP< Epetra_CrsMatrix > Op2NonConstEpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
Print external lib objects.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
static RCP< const Epetra_MultiVector > MV2EpetraMV(RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > const vec)
Helper utility to pull out the underlying Epetra objects from an Xpetra object.
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.
One-liner description of what is happening.
Ifpack_Preconditioner * Create(const std::string PrecType, Epetra_RowMatrix *Matrix, const int overlap=0, bool overrideSerialDefault=false)
IfpackSmoother(std::string const &type, Teuchos::ParameterList const ¶mList=Teuchos::ParameterList(), LO const &overlap=0)
Constructor.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Print the object with some verbosity level to an FancyOStream object.
bool remove(std::string const &name, bool throwIfNotExists=true)
static RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Residual(const Xpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &RHS)
virtual void SetParameterList(const Teuchos::ParameterList ¶mList)
Set parameters from a parameter list and return with default values.
void DeclareInput(Level ¤tLevel) const
Input.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static RCP< Epetra_MultiVector > MV2NonConstEpetraMV(RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > vec)
Class that holds all level-specific information.
bool IsSetup() const
Get the state of a smoother prototype.
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
virtual double GetLambdaMax()
#define MUELU_DESCRIBE
Helper macro for implementing Describable::describe() for BaseClass objects.
ParameterList & setParameters(const ParameterList &source)
void SetParameterList(const Teuchos::ParameterList ¶mList)
Set parameters from a parameter list and return with default values.
std::string description() const
Return a simple one-line description of this object.
virtual const RCP< const FactoryBase > GetFactory(const std::string &varName) const =0
Print class parameters (more parameters, more verbose)
Exception throws to report errors in the internal logical of the program.
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const
Apply the preconditioner.
virtual std::string description() const
Return a simple one-line description of this object.
Class that encapsulates Ifpack smoothers.
std::string toString(const T &t)