46 #ifndef MUELU_TOGGLEPFACTORY_DEF_HPP 47 #define MUELU_TOGGLEPFACTORY_DEF_HPP 49 #include <Xpetra_Matrix.hpp> 61 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
63 RCP<ParameterList> validParamList = rcp(
new ParameterList());
65 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name)) 68 #undef SET_VALID_ENTRY 70 return validParamList;
73 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
76 for (std::vector<RCP<const FactoryBase> >::const_iterator it = prolongatorFacts_.begin(); it != prolongatorFacts_.end(); ++it) {
78 (*it)->CallDeclareInput(coarseLevel);
80 for (std::vector<RCP<const FactoryBase> >::const_iterator it = ptentFacts_.begin(); it != ptentFacts_.end(); ++it) {
82 (*it)->CallDeclareInput(coarseLevel);
84 for (std::vector<RCP<const FactoryBase> >::const_iterator it = nspFacts_.begin(); it != nspFacts_.end(); ++it) {
85 coarseLevel.
DeclareInput(
"Nullspace", (*it).get(),
this);
86 (*it)->CallDeclareInput(coarseLevel);
99 hasDeclaredInput_ =
true;
102 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
105 std::ostringstream levelstr;
108 TEUCHOS_TEST_FOR_EXCEPTION(nspFacts_.size() != prolongatorFacts_.size(),
Exceptions::RuntimeError,
"MueLu::TogglePFactory::Build: The number of provided prolongator factories and coarse nullspace factories must be identical.");
109 TEUCHOS_TEST_FOR_EXCEPTION(nspFacts_.size() != 2,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::Build: TogglePFactory needs two different transfer operator strategies for toggling.");
112 int nProlongatorFactory = 0;
115 const Teuchos::ParameterList & pL = GetParameterList();
116 std::string mode = Teuchos::as<std::string>(pL.get<std::string>(
"toggle: mode"));
117 int semicoarsen_levels = Teuchos::as<int>(pL.get<
int>(
"semicoarsen: number of levels"));
119 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.");
124 GetOStream(
Runtime1) <<
"Number of layers for semicoarsening: " << NumZDir << std::endl;
128 if(fineLevel.
GetLevelID() >= semicoarsen_levels || NumZDir == 1) {
129 nProlongatorFactory = 1;
131 nProlongatorFactory = 0;
134 RCP<Matrix> P = Teuchos::null;
135 RCP<Matrix> Ptent = Teuchos::null;
136 RCP<MultiVector> coarseNullspace = Teuchos::null;
139 GetOStream(
Runtime0) <<
"TogglePFactory: call transfer factory: " << (prolongatorFacts_[nProlongatorFactory])->description() << std::endl;
140 prolongatorFacts_[nProlongatorFactory]->CallBuild(coarseLevel);
141 P = coarseLevel.
Get< RCP<Matrix> >(
"P", (prolongatorFacts_[nProlongatorFactory]).
get());
144 Ptent = coarseLevel.
Get< RCP<Matrix> >(
"P", (ptentFacts_[nProlongatorFactory]).
get());
145 coarseNullspace = coarseLevel.
Get< RCP<MultiVector> >(
"Nullspace", (nspFacts_[nProlongatorFactory]).
get());
148 for(
size_t t=0; t<nspFacts_.size(); ++t) {
149 coarseLevel.
Release(*(prolongatorFacts_[t]));
150 coarseLevel.
Release(*(ptentFacts_[t]));
151 coarseLevel.
Release(*(nspFacts_[t]));
155 Set(coarseLevel,
"P", P);
156 Set(coarseLevel,
"Nullspace", coarseNullspace);
157 Set(coarseLevel,
"Ptent", Ptent);
158 Set(coarseLevel,
"Chosen P", nProlongatorFactory);
161 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
164 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
165 "MueLu::TogglePFactory::AddProlongatorFactory: Transfer factory is not derived from TwoLevelFactoryBase. " 166 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
167 TEUCHOS_TEST_FOR_EXCEPTION(hasDeclaredInput_,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::AddProlongatorFactory: Factory is being added after we have already declared input");
168 prolongatorFacts_.push_back(factory);
171 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
174 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
175 "MueLu::TogglePFactory::AddPtentFactory: Transfer factory is not derived from TwoLevelFactoryBase. " 176 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
177 TEUCHOS_TEST_FOR_EXCEPTION(hasDeclaredInput_,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::AddPtentFactory: Factory is being added after we have already declared input");
178 ptentFacts_.push_back(factory);
181 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
184 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
185 "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." 186 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
187 TEUCHOS_TEST_FOR_EXCEPTION(hasDeclaredInput_,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::AddCoarseNullspaceFactory: Factory is being added after we have already declared input");
188 nspFacts_.push_back(factory);
194 #endif // MUELU_TOGGLEPFACTORY_DEF_HPP Exception indicating invalid cast attempted.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
void Build(Level &fineLevel, Level &coarseLevel) const
Build method.
void Release(const FactoryBase &factory)
Decrement the storage counter for all the inputs of a factory.
void AddProlongatorFactory(const RCP< const FactoryBase > &factory)
Add a prolongator factory in the end of list of prolongator factories.
Timer to be used in factories. Similar to Monitor but with additional timers.
User data are always kept. This flag is set automatically when Level::Set("data", data) is used...
One-liner description of what is happening.
Namespace for MueLu classes and methods.
static const NoFactory * get()
Class that holds all level-specific information.
void RemoveKeepFlag(const std::string &ename, const FactoryBase *factory, KeepType keep=MueLu::All)
int GetLevelID() const
Return level number.
Exception throws to report errors in the internal logical of the program.
Description of what is happening (more verbose)
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
void AddPtentFactory(const RCP< const FactoryBase > &factory)
Add a tentative prolongator factory in the end of list of prolongator factories.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
#define SET_VALID_ENTRY(name)
void AddCoarseNullspaceFactory(const RCP< const FactoryBase > &factory)
Add a coarse nullspace factory in the end of list of coarse nullspace factories.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.