46 #ifndef MUELU_HIERARCHYUTILS_DEF_HPP
47 #define MUELU_HIERARCHYUTILS_DEF_HPP
49 #include "Teuchos_ScalarTraits.hpp"
51 #include <Xpetra_Matrix.hpp>
52 #include <Xpetra_Operator.hpp>
57 #include "MueLu_SmootherFactory.hpp"
58 #include "MueLu_FactoryManager.hpp"
61 #ifdef HAVE_MUELU_INTREPID2
70 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
72 typedef typename Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
75 for (ParameterList::ConstIterator it = paramList.begin(); it != paramList.end(); it++) {
76 const std::string& levelName = it->first;
78 if (paramList.isSublist(levelName) && levelName.find(
"level ") == 0 && levelName.size() > 6) {
79 int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
86 RCP<Level> level = H.
GetLevel(levelID);
88 RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.
GetFactoryManager(levelID));
89 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
92 const ParameterList& levelList = paramList.sublist(levelName);
93 for (ParameterList::ConstIterator it2 = levelList.begin(); it2 != levelList.end(); it2++) {
94 const std::string& name = it2->first;
95 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"A" && name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
96 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"pcoarsen: element to node map" &&
97 name !=
"Node Comm" &&
99 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: parameter list contains unknown data type(") + name +
")");
102 level->Set(name, Teuchos::getValue<RCP<Matrix > > (it2->second),
NoFactory::get());
107 else if(name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M") {
109 level->Set(name, Teuchos::getValue<RCP<Matrix > > (it2->second),
NoFactory::get());
111 else if (name ==
"Mdiag")
114 level->Set(name, Teuchos::getValue<RCP<Vector > > (it2->second),
NoFactory::get());
116 else if (name ==
"Nullspace")
119 level->Set(name, Teuchos::getValue<RCP<MultiVector > >(it2->second),
NoFactory::get());
123 else if(name ==
"Coordinates")
126 level->Set(name, Teuchos::getValue<RCP<realvaluedmultivector_type> >(it2->second),
NoFactory::get());
129 else if(name ==
"Node Comm")
135 #ifdef HAVE_MUELU_INTREPID2
136 else if (name ==
"pcoarsen: element to node map")
139 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> > >(it2->second),
NoFactory::get());
143 #ifdef HAVE_MUELU_MATLAB
146 size_t typeNameStart = name.find_first_not_of(
' ');
147 size_t typeNameEnd = name.find(
' ', typeNameStart);
148 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
149 std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::
tolower);
151 if(typeName ==
"matrix")
152 level->Set(name, Teuchos::getValue<RCP<Matrix> >(it2->second),
NoFactory::get());
153 else if(typeName ==
"multivector")
154 level->Set(name, Teuchos::getValue<RCP<MultiVector> >(it2->second),
NoFactory::get());
155 else if(typeName ==
"map")
156 level->Set(name, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(it2->second),
NoFactory::get());
157 else if(typeName ==
"ordinalvector")
158 level->Set(name, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(it2->second),
NoFactory::get());
159 else if(typeName ==
"scalar")
160 level->Set(name, Teuchos::getValue<Scalar>(it2->second),
NoFactory::get());
161 else if(typeName ==
"double")
162 level->Set(name, Teuchos::getValue<double>(it2->second),
NoFactory::get());
163 else if(typeName ==
"complex")
164 level->Set(name, Teuchos::getValue<std::complex<double> >(it2->second),
NoFactory::get());
165 else if(typeName ==
"int")
166 level->Set(name, Teuchos::getValue<int>(it2->second),
NoFactory::get());
167 else if(typeName ==
"string")
168 level->Set(name, Teuchos::getValue<std::string>(it2->second),
NoFactory::get());
172 throw std::runtime_error(
"Invalid non-serializable data on list");
176 }
else if (paramList.isSublist(levelName) && levelName.find(
"user data") != std::string::npos) {
179 RCP<Level> level = H.
GetLevel(levelID);
181 RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.
GetFactoryManager(levelID));
182 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
185 const ParameterList& userList = paramList.sublist(levelName);
186 for (ParameterList::ConstIterator it2 = userList.begin(); it2 != userList.end(); it2++) {
187 const std::string& name = it2->first;
188 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
189 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"pcoarsen: element to node map" &&
190 name !=
"Node Comm" &&
192 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: user data parameter list contains unknown data type (") + name +
")");
193 if( name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M") {
195 level->Set(name, Teuchos::getValue<RCP<Matrix > > (it2->second),
NoFactory::get());
196 }
else if (name ==
"Mdiag") {
198 level->Set(name, Teuchos::getValue<RCP<Vector > >(it2->second),
NoFactory::get());
199 }
else if (name ==
"Nullspace") {
201 level->Set(name, Teuchos::getValue<RCP<MultiVector > >(it2->second),
NoFactory::get());
204 }
else if(name ==
"Coordinates") {
206 level->Set(name, Teuchos::getValue<RCP<realvaluedmultivector_type> >(it2->second),
NoFactory::get());
207 level->print(std::cout, MueLu::VERB_EXTREME);
209 else if(name ==
"Node Comm") {
213 #ifdef HAVE_MUELU_INTREPID2
214 else if (name ==
"pcoarsen: element to node map")
217 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> > >(it2->second),
NoFactory::get());
222 size_t typeNameStart = name.find_first_not_of(
' ');
223 size_t typeNameEnd = name.find(
' ', typeNameStart);
224 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
225 size_t varNameStart = name.find_first_not_of(
' ', typeNameEnd);
226 std::string varName = name.substr(varNameStart, name.size());
227 std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::
tolower);
229 if(typeName ==
"matrix")
230 level->Set(varName, Teuchos::getValue<RCP<Matrix> >(it2->second),
NoFactory::get());
231 else if(typeName ==
"multivector")
232 level->Set(varName, Teuchos::getValue<RCP<MultiVector> >(it2->second),
NoFactory::get());
233 else if(typeName ==
"vector")
234 level->Set(varName, Teuchos::getValue<RCP<Vector> >(it2->second),
NoFactory::get());
235 else if(typeName ==
"map")
236 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(it2->second),
NoFactory::get());
237 else if(typeName ==
"ordinalvector")
238 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(it2->second),
NoFactory::get());
239 else if(typeName ==
"scalar")
240 level->Set(varName, Teuchos::getValue<Scalar>(it2->second),
NoFactory::get());
241 else if(typeName ==
"double")
242 level->Set(varName, Teuchos::getValue<double>(it2->second),
NoFactory::get());
243 else if(typeName ==
"complex")
244 level->Set(varName, Teuchos::getValue<std::complex<double> >(it2->second),
NoFactory::get());
245 else if(typeName ==
"int")
246 level->Set(varName, Teuchos::getValue<int>(it2->second),
NoFactory::get());
247 else if(typeName ==
"string")
248 level->Set(varName, Teuchos::getValue<std::string>(it2->second),
NoFactory::get());
249 else if(typeName ==
"array<go>")
250 level->Set(varName, Teuchos::getValue<Array<GlobalOrdinal> > (it2->second),
NoFactory::get());
251 else if(typeName ==
"array<lo>")
252 level->Set(varName, Teuchos::getValue<Array<LocalOrdinal> >(it2->second),
NoFactory::get());
253 else if(typeName ==
"arrayrcp<lo>")
254 level->Set(varName, Teuchos::getValue<ArrayRCP<LocalOrdinal> >(it2->second),
NoFactory::get());
255 else if(typeName ==
"arrayrcp<go>")
256 level->Set(varName, Teuchos::getValue<ArrayRCP<GlobalOrdinal> >(it2->second),
NoFactory::get());
258 throw std::runtime_error(
"Invalid non-serializable data on list");
266 #define MUELU_HIERARCHY_UTILS_SHORT
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Exception throws to report invalid user entry.
RCP< FactoryManagerBase > GetFactoryManager(int levelID) const
static void AddNonSerializableDataToHierarchy(HierarchyManager &HM, Hierarchy &H, const ParameterList &nonSerialList)
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
RCP< Level > & GetLevel(const int levelID=0)
Retrieve a certain level from hierarchy.
void AddNewLevel()
Add a new level at the end of the hierarchy.
static const NoFactory * get()
static const RCP< const NoFactory > getRCP()
Static Get() functions.
std::string tolower(const std::string &str)
Namespace for MueLu classes and methods.
bool IsParamMuemexVariable(const std::string &name)
@ UserData
User data are always kept. This flag is set automatically when Level::Set("data", data) is used....
bool IsParamValidVariable(const std::string &name)