46 #ifndef MUELU_MERGEDSMOOTHER_DEF_HPP 47 #define MUELU_MERGEDSMOOTHER_DEF_HPP 54 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
56 : smootherList_(smootherList), reverseOrder_(false), verbose_(verbose) {
62 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
64 : reverseOrder_(src.reverseOrder_), verbose_(src.verbose_) {
69 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
72 for (
typename ArrayView<RCP<SmootherPrototype> >::iterator it = smootherList_.begin(); it != smootherList_.end(); it++)
73 (*it)->SetFactory(varName, factory);
77 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
79 for (
typename ArrayView<RCP<SmootherPrototype> >::iterator it = smootherList_.begin(); it != smootherList_.end(); ++it)
80 (*it)->DeclareInput(currentLevel);
83 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
86 this->GetOStream(
Warnings0) <<
"MueLu::MergedSmoother::Setup(): Setup() has already been called";
88 for (
typename ArrayView<RCP<SmootherPrototype> >::iterator it = smootherList_.begin(); it != smootherList_.end(); ++it) {
93 std::string msg =
"MueLu::MergedSmoother<>::Setup(): Runtime Error.\n One of the underlying smoother throwed the following exception: \n";
102 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
106 typedef typename ArrayRCP<RCP<SmootherPrototype> >::size_type sz_t;
107 sz_t n = smootherList_.size(), c = (reverseOrder_ ? n-1 : 0);
108 char d = (reverseOrder_ ? -1 : 1);
110 for (sz_t i = 0; i < n; i++)
113 smootherList_[c + d*Teuchos::as<char>(i)]->Apply(X, B, InitialGuessIsZero);
116 InitialGuessIsZero =
false;
119 std::string msg =
"MueLu::MergedSmoother<>::Apply(): Runtime Error. One of the underlying smoothers throws the following exception: \n";
125 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
130 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
132 RCP<MergedSmoother> srcMergedSmoother = rcp_dynamic_cast<
MergedSmoother>(src);
137 const ArrayRCP<const RCP<SmootherPrototype> >& srcSmootherList = srcMergedSmoother->GetSmootherList();
138 const ArrayRCP<const RCP<SmootherPrototype> >& thisSmootherList = smootherList_;
140 "MueLu::MergedSmoother<>:CopyParameters(): thisSmootherList == Teuchos::null");
151 reuse = reuse && (thisSmootherList.size() == srcSmootherList.size());
155 for (
typename ArrayRCP<RCP<SmootherPrototype> >::size_type i = 0; i < srcSmootherList.size(); i++) {
159 "MueLu::MergedSmoother<>:CopyParameters(): internal logic error");
173 for (
typename ArrayRCP<RCP<SmootherPrototype> >::size_type i = 0; i < srcSmootherList.size(); i++) {
174 if (srcSmootherList[i] != Teuchos::null) {
175 TEUCHOS_TEST_FOR_EXCEPTION(srcSmootherList[i] == Teuchos::null,
MueLu::Exceptions::RuntimeError,
"MueLu::MergedSmoother<>:CopyParameters(): internal logic error");
178 isSetup = isSetup && thisSmootherList[i]->IsSetup();
185 smootherList_ = Teuchos::null;
186 smootherList_ = SmootherListDeepCopy(srcSmootherList);
193 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
194 RCP<MueLu::SmootherPrototype<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
201 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
202 ArrayRCP<RCP<MueLu::SmootherPrototype<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >
206 ArrayRCP<RCP<SmootherPrototype> > newSmootherList(srcSmootherList.size());
208 for (
typename ArrayRCP<RCP<SmootherPrototype> >::size_type i = 0; i < srcSmootherList.size(); i++)
209 newSmootherList[i] = srcSmootherList[i]->Copy();
211 return newSmootherList;
215 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
220 return Teuchos::OrdinalTraits<size_t>::invalid();
225 #endif // MUELU_MERGEDSMOOTHER_DEF_HPP Important warning messages (one line)
ArrayRCP< RCP< SmootherPrototype > > smootherList_
RCP< SmootherPrototype > Copy() const
Copy method (performs a deep copy of input object)
bool IsSetup() const
Get the state of a smoother prototype.
Namespace for MueLu classes and methods.
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
void CopyParameters(RCP< SmootherPrototype > src)
void DeclareInput(Level ¤tLevel) const
Input.
Class that holds all level-specific information.
Exception throws when you call an unimplemented method of MueLu.
ArrayRCP< RCP< SmootherPrototype > > SmootherListDeepCopy(const ArrayRCP< const RCP< SmootherPrototype > > &srcSmootherList)
bool GetReverseOrder() const
void SetFactory(const std::string &varName, const RCP< const FactoryBase > &factory)
Custom SetFactory.
MergedSmoother(ArrayRCP< RCP< SmootherPrototype > > &smootherList, bool verbose=false)
Constructor.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Exception throws to report errors in the internal logical of the program.
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const
Apply.
const ArrayRCP< const RCP< SmootherPrototype > > GetSmootherList() const
void Setup(Level &level)
Set up.