10#ifndef MUELU_TOGGLEPFACTORY_DEF_HPP
11#define MUELU_TOGGLEPFACTORY_DEF_HPP
13#include <Xpetra_Matrix.hpp>
23template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
25 RCP<ParameterList> validParamList = rcp(
new ParameterList());
27#define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name))
32 return validParamList;
35template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
40 coarseLevel.
DeclareInput(
"RfromPfactory", (*it).get(),
this);
41 (*it)->CallDeclareInput(coarseLevel);
43 for (std::vector<RCP<const FactoryBase> >::const_iterator it =
ptentFacts_.begin(); it !=
ptentFacts_.end(); ++it) {
45 (*it)->CallDeclareInput(coarseLevel);
47 for (std::vector<RCP<const FactoryBase> >::const_iterator it =
nspFacts_.begin(); it !=
nspFacts_.end(); ++it) {
48 coarseLevel.
DeclareInput(
"Nullspace", (*it).get(),
this);
49 (*it)->CallDeclareInput(coarseLevel);
65template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
68 std::ostringstream levelstr;
72 TEUCHOS_TEST_FOR_EXCEPTION(
nspFacts_.size() != 2,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::Build: TogglePFactory needs two different transfer operator strategies for toggling.");
75 int nProlongatorFactory = 0;
79 std::string mode = Teuchos::as<std::string>(pL.get<std::string>(
"toggle: mode"));
80 int semicoarsen_levels = Teuchos::as<int>(pL.get<
int>(
"semicoarsen: number of levels"));
82 TEUCHOS_TEST_FOR_EXCEPTION(mode !=
"semicoarsen",
Exceptions::RuntimeError,
"MueLu::TogglePFactory::Build: The 'toggle: mode' parameter must be set to 'semicoarsen'. No other mode supported, yet.");
87 GetOStream(
Runtime1) <<
"Number of layers for semicoarsening: " << NumZDir << std::endl;
91 if (fineLevel.
GetLevelID() >= semicoarsen_levels || NumZDir == 1) {
92 nProlongatorFactory = 1;
94 nProlongatorFactory = 0;
97 RCP<Matrix> P = Teuchos::null;
98 RCP<Matrix> Ptent = Teuchos::null;
99 RCP<MultiVector> coarseNullspace = Teuchos::null;
105 RCP<Matrix> R = Teuchos::null;
106 int Rplaceholder = -1;
112 if (strType ==
"int")
113 Rplaceholder = nProlongatorFactory;
115 R = coarseLevel.
Get<RCP<Matrix> >(
"RfromPfactory", (
prolongatorFacts_[nProlongatorFactory]).get());
120 Ptent = coarseLevel.
Get<RCP<Matrix> >(
"P", (
ptentFacts_[nProlongatorFactory]).get());
121 coarseNullspace = coarseLevel.
Get<RCP<MultiVector> >(
"Nullspace", (
nspFacts_[nProlongatorFactory]).get());
124 for (
size_t t = 0; t <
nspFacts_.size(); ++t) {
131 Set(coarseLevel,
"P", P);
136 if (R != Teuchos::null)
137 Set(coarseLevel,
"RfromPfactory", R);
138 else if (Rplaceholder != -1)
139 Set(coarseLevel,
"RfromPfactory", Teuchos::as<int>(Rplaceholder));
140 Set(coarseLevel,
"Nullspace", coarseNullspace);
141 Set(coarseLevel,
"Ptent", Ptent);
142 Set(coarseLevel,
"Chosen P", nProlongatorFactory);
145template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
148 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
149 "MueLu::TogglePFactory::AddProlongatorFactory: Transfer factory is not derived from TwoLevelFactoryBase. "
150 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
155template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
158 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
159 "MueLu::TogglePFactory::AddPtentFactory: Transfer factory is not derived from TwoLevelFactoryBase. "
160 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
165template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
168 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
169 "MueLu::TogglePFactory::AddCoarseNullspaceFactory: Transfer factory is not derived from TwoLevelFactoryBase. Make sure you provide the factory which generates the coarse level nullspace information. Usually this is a prolongator factory."
170 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
#define SET_VALID_ENTRY(name)
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.
void Set(Level &level, const std::string &varName, const T &data) const
Timer to be used in factories. Similar to Monitor but with additional timers.
Class that holds all level-specific information.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput().
void Release(const FactoryBase &factory)
Decrement the storage counter for all the inputs of a factory.
void RemoveKeepFlag(const std::string &ename, const FactoryBase *factory, KeepType keep=MueLu::All)
int GetLevelID() const
Return level number.
std::string GetTypeName(const std::string &ename, const FactoryBase *factory=NoFactory::get())
GetTypeName returns type string of variable stored using ename and factory.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
static const NoFactory * get()
virtual const Teuchos::ParameterList & GetParameterList() const
std::vector< RCP< const FactoryBase > > ptentFacts_
list of user-defined tentative prolongation operator factories
void AddCoarseNullspaceFactory(const RCP< const FactoryBase > &factory)
Add a coarse nullspace factory in the end of list of coarse nullspace factories.
void AddProlongatorFactory(const RCP< const FactoryBase > &factory)
Add a prolongator factory in the end of list of prolongator factories.
void AddPtentFactory(const RCP< const FactoryBase > &factory)
Add a tentative prolongator factory in the end of list of prolongator factories.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
std::vector< RCP< const FactoryBase > > prolongatorFacts_
list of user-defined prolongation operator factories
std::vector< RCP< const FactoryBase > > nspFacts_
list of user-defined nullspace factories (i.e. the prolongator factories which also generate the coar...
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void Build(Level &fineLevel, Level &coarseLevel) const
Build method.
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.
@ UserData
User data are always kept. This flag is set automatically when Level::Set("data", data) is used....
@ Runtime0
One-liner description of what is happening.
@ Runtime1
Description of what is happening (more verbose).