17#ifndef PACKAGES_MUELU_SRC_MUECENTRAL_MUELU_TOPSMOOTHERFACTORY_DEF_HPP_
18#define PACKAGES_MUELU_SRC_MUECENTRAL_MUELU_TOPSMOOTHERFACTORY_DEF_HPP_
27#include "MueLu_SmootherFactory.hpp"
28#include "MueLu_SmootherPrototype.hpp"
33template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
35 TEUCHOS_TEST_FOR_EXCEPTION(varName !=
"CoarseSolver" && varName !=
"Smoother",
Exceptions::RuntimeError,
"varName should be either \"CoarseSolver\" or \"Smoother\"");
37 if (varName ==
"CoarseSolver") {
41 RCP<const FactoryBase> coarseSolverFactory = parentFactoryManager->GetFactory(
"CoarseSolver");
42 RCP<const SmootherFactory> coarseSmootherFactory = Teuchos::rcp_dynamic_cast<const SmootherFactory>(coarseSolverFactory);
43 if (coarseSmootherFactory != Teuchos::null) {
44 RCP<SmootherPrototype> preProto;
45 RCP<SmootherPrototype> postProto;
46 coarseSmootherFactory->GetSmootherPrototypes(preProto, postProto);
48 if (preProto == postProto)
49 preSmootherFact_ = parentFactoryManager->GetFactory(
"CoarseSolver");
52 if (preProto != Teuchos::null)
53 preSmootherFact_ = parentFactoryManager->GetFactory(
"CoarseSolver");
54 if (postProto != Teuchos::null)
55 postSmootherFact_ = parentFactoryManager->GetFactory(
"CoarseSolver");
58 preSmootherFact_ = parentFactoryManager->GetFactory(
"CoarseSolver");
61 preSmootherFact_ = parentFactoryManager->GetFactory(
"PreSmoother");
62 postSmootherFact_ = parentFactoryManager->GetFactory(
"PostSmoother");
66template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
71 if (preSmootherFact_ != Teuchos::null)
72 level.
DeclareInput(
"PreSmoother", preSmootherFact_.get());
73 if (postSmootherFact_ != Teuchos::null)
74 level.
DeclareInput(
"PostSmoother", postSmootherFact_.get());
77template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
79 if (preSmootherFact_.is_null() && postSmootherFact_.is_null())
90 if (!preSmootherFact_.is_null()) {
93 RCP<const SmootherFactory> s = rcp_dynamic_cast<const SmootherFactory>(preSmootherFact_);
95 RCP<SmootherPrototype> pre, post;
96 s->GetSmootherPrototypes(pre, post);
104 RCP<SmootherBase> Pre = level.
Get<RCP<SmootherBase> >(
"PreSmoother", preSmootherFact_.get());
113 if (!postSmootherFact_.is_null()) {
116 RCP<const SmootherFactory> s = rcp_dynamic_cast<const SmootherFactory>(postSmootherFact_);
118 RCP<SmootherPrototype> pre, post;
119 s->GetSmootherPrototypes(pre, post);
127 RCP<SmootherBase> Post = level.
Get<RCP<SmootherBase> >(
"PostSmoother", postSmootherFact_.get());
Exception throws to report errors in the internal logical of the program.
Class that holds all level-specific information.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
void RemoveKeepFlag(const std::string &ename, const FactoryBase *factory, KeepType keep=MueLu::All)
void AddKeepFlag(const std::string &ename, const FactoryBase *factory=NoFactory::get(), KeepType keep=MueLu::Keep)
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
void Set(const std::string &ename, const T &entry, const FactoryBase *factory=NoFactory::get())
static const NoFactory * get()
TopSmootherFactory(RCP< const FactoryManagerBase > parentFactoryManager, const std::string &varName)
void Build(Level &level) const
Build an object with this factory.
virtual ~TopSmootherFactory()
void DeclareInput(Level &level) const
Specifies the data that this class needs, and the factories that generate that data.
Namespace for MueLu classes and methods.
@ Final
Keep data only for this run. Used to keep data useful for Hierarchy::Iterate(). Data will be deleted ...
@ UserData
User data are always kept. This flag is set automatically when Level::Set("data", data) is used....