10#ifndef MUELU_TEKOSMOOTHER_DECL_HPP_
11#define MUELU_TEKOSMOOTHER_DECL_HPP_
15#include "Teko_Utilities.hpp"
17#include "Teko_InverseLibrary.hpp"
18#include "Teko_InverseFactory.hpp"
22#include <Teuchos_ParameterList.hpp>
24#include <Xpetra_MapExtractor_fwd.hpp>
27#include "MueLu_SmootherPrototype.hpp"
42template <class Scalar = SmootherPrototype<>::scalar_type,
49#undef MUELU_TEKOSMOOTHER_SHORT
59 :
type_(
"Teko smoother") {
60 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::TekoSmoother: Teko can only be used with SC=double. For more information refer to the doxygen documentation of TekoSmoother.");
70 RCP<ParameterList> validParamList = rcp(
new ParameterList());
71 return validParamList;
92 void Apply(MultiVector &X,
const MultiVector &B,
bool InitialGuessIsZero =
false)
const {}
95 RCP<SmootherPrototype>
Copy()
const {
return Teuchos::null; }
102 std::ostringstream out;
104 out <<
"{type = " <<
type_ <<
"}";
114 out0 <<
"Prec. type: " <<
type_ << std::endl;
116 if (verbLevel &
Debug)
151#undef MUELU_TEKOSMOOTHER_SHORT
161 :
type_(
"Teko smoother")
175 RCP<ParameterList> validParamList = rcp(
new ParameterList());
177 validParamList->set<RCP<const FactoryBase> >(
"A", null,
"Generating factory of the matrix A");
178 validParamList->set<std::string>(
"Inverse Type",
"",
"Name of parameter list within 'Teko parameters' containing the Teko smoother parameters.");
180 return validParamList;
184 this->
Input(currentLevel,
"A");
196 RCP<Teuchos::FancyOStream> out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
200 this->
GetOStream(
Warnings0) <<
"MueLu::TekoSmoother::Setup(): Setup() has already been called";
203 A_ = Factory::Get<RCP<Matrix> >(currentLevel,
"A");
204 bA_ = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(A_);
206 "MueLu::TekoSmoother::Build: input matrix A is not of type BlockedCrsMatrix.");
208 bThyOp_ = bA_->getThyraOperator();
210 "MueLu::TekoSmoother::Build: Could not extract thyra operator from BlockedCrsMatrix.");
212 Teuchos::RCP<const Thyra::LinearOpBase<Scalar> > thyOp = Teuchos::rcp_dynamic_cast<const Thyra::LinearOpBase<Scalar> >(bThyOp_);
214 "MueLu::TekoSmoother::Build: Downcast of Thyra::BlockedLinearOpBase to Teko::LinearOp failed.");
218 std::string smootherType = pL.get<std::string>(
"Inverse Type");
220 "MueLu::TekoSmoother::Build: You must provide a 'Smoother Type' name that is defined in the 'Teko parameters' sublist.");
221 type_ = smootherType;
224 "MueLu::TekoSmoother::Build: No Teko parameters have been set.");
226 Teuchos::RCP<Teko::InverseLibrary> invLib = Teko::InverseLibrary::buildFromParameterList(*tekoParams_);
227 Teuchos::RCP<Teko::InverseFactory> inverse = invLib->getInverseFactory(smootherType);
229 inverseOp_ = Teko::buildInverse(*inverse, thyOp);
231 "MueLu::TekoSmoother::Build: Failed to build Teko inverse operator. Probably a problem with the Teko parameters.");
242 void Apply(MultiVector &X,
const MultiVector &B,
bool =
false)
const {
244 "MueLu::TekoSmoother::Apply(): Setup() has not been called");
246 Teuchos::RCP<const Teuchos::Comm<int> > comm = X.getMap()->getComm();
248 Teuchos::RCP<const MapExtractor> rgMapExtractor = bA_->getRangeMapExtractor();
249 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgMapExtractor));
254 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > thyB = Thyra::createMembers(Teuchos::rcp_dynamic_cast<
const Thyra::VectorSpaceBase<Scalar> >(bThyOp_->productRange()), Teuchos::as<int>(B.getNumVectors()));
255 Teuchos::RCP<Thyra::ProductMultiVectorBase<Scalar> > thyProdB =
256 Teuchos::rcp_dynamic_cast<Thyra::ProductMultiVectorBase<Scalar> >(thyB);
258 "MueLu::TekoSmoother::Apply: Failed to cast range space to product range space.");
261 Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::updateThyra(Teuchos::rcpFromRef(B), rgMapExtractor, thyProdB);
264 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > thyX = Thyra::createMembers(Teuchos::rcp_dynamic_cast<
const Thyra::VectorSpaceBase<Scalar> >(bThyOp_->productDomain()), Teuchos::as<int>(X.getNumVectors()));
265 Teuchos::RCP<Thyra::ProductMultiVectorBase<Scalar> > thyProdX =
266 Teuchos::rcp_dynamic_cast<Thyra::ProductMultiVectorBase<Scalar> >(thyX);
268 "MueLu::TekoSmoother::Apply: Failed to cast domain space to product domain space.");
271 Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::updateThyra(Teuchos::rcpFromRef(X), rgMapExtractor, thyProdX);
281 Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > XX =
282 Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(thyX, comm);
284 X.update(Teuchos::ScalarTraits<Scalar>::one(), *XX, Teuchos::ScalarTraits<Scalar>::zero());
295 std::ostringstream out;
297 out <<
"{type = " <<
type_ <<
"}";
307 out0 <<
"Prec. type: " <<
type_ << std::endl;
309 if (verbLevel &
Debug)
327 RCP<BlockedCrsMatrix>
bA_;
328 RCP<const Thyra::BlockedLinearOpBase<Scalar> >
bThyOp_;
337#define MUELU_TEKOSMOOTHER_SHORT
#define MUELU_DESCRIBE
Helper macro for implementing Describable::describe() for BaseClass objects.
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
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.
Timer to be used in factories. Similar to Monitor but with additional timers.
void Input(Level &level, const std::string &varName) const
Class that holds all level-specific information.
virtual const Teuchos::ParameterList & GetParameterList() const =0
Base class for smoother prototypes.
bool IsSetup() const
Get the state of a smoother prototype.
GlobalOrdinal global_ordinal_type
LocalOrdinal local_ordinal_type
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
RCP< const Thyra::BlockedLinearOpBase< Scalar > > bThyOp_
RCP< SmootherPrototype > Copy() const
std::string description() const
Return a simple one-line description of this object.
std::string type_
smoother type
RCP< Matrix > A_
block operator
RCP< const ParameterList > GetValidParameterList() const
Input.
void Setup(Level ¤tLevel)
Setup routine.
virtual ~TekoSmoother()
Destructor.
Teko::LinearOp inverseOp_
RCP< BlockedCrsMatrix > bA_
void Apply(MultiVector &X, const MultiVector &B, bool=false) const
Apply the Teko smoother.
RCP< ParameterList > tekoParams_
Teko parameters.
TekoSmoother()
Constructor.
Xpetra::MapExtractor< Scalar, LocalOrdinal, GlobalOrdinal, Node > MapExtractorClass
void SetTekoParameters(RCP< ParameterList > tekoParams)
void DeclareInput(Level ¤tLevel) const
Input.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Print the object with some verbosity level to an FancyOStream object.
Interface to block smoothers in Teko package.
Xpetra::MapExtractor< Scalar, LocalOrdinal, GlobalOrdinal, Node > MapExtractorClass
std::string description() const
Return a simple one-line description of this object.
virtual ~TekoSmoother()
Destructor.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Print the object with some verbosity level to an FancyOStream object.
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
RCP< const ParameterList > GetValidParameterList() const
Input.
std::string type_
smoother type
void Setup(Level ¤tLevel)
Setup routine.
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const
Apply the Teko smoother.
void SetTekoParameters(RCP< ParameterList > tekoParams)
RCP< SmootherPrototype > Copy() const
TekoSmoother()
Constructor.
void DeclareInput(Level ¤tLevel) const
Input.
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
Namespace for MueLu classes and methods.
@ Warnings0
Important warning messages (one line)
@ Debug
Print additional debugging information.
@ Parameters0
Print class parameters.