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 nonSerialEntry = nonSerialList.begin(); nonSerialEntry != nonSerialList.end(); nonSerialEntry++) {
76 const std::string& levelName = nonSerialEntry->first;
78 if (nonSerialList.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);
89 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
92 const ParameterList& levelList = nonSerialList.sublist(levelName);
93 for (ParameterList::ConstIterator levelListEntry = levelList.begin(); levelListEntry != levelList.end(); levelListEntry++) {
94 const std::string& name = levelListEntry->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" && name !=
"DualNodeID2PrimalNodeID" && name !=
"Primal interface DOF map" &&
99 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: parameter list contains unknown data type(") + name +
")");
102 level->Set(name, Teuchos::getValue<RCP<Matrix > > (levelListEntry->second),
NoFactory::get());
107 else if(name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M") {
109 level->Set(name, Teuchos::getValue<RCP<Matrix > > (levelListEntry->second),
NoFactory::get());
111 else if (name ==
"Mdiag")
114 level->Set(name, Teuchos::getValue<RCP<Vector > > (levelListEntry->second),
NoFactory::get());
116 else if (name ==
"Nullspace")
119 level->Set(name, Teuchos::getValue<RCP<MultiVector > >(levelListEntry->second),
NoFactory::get());
123 else if(name ==
"Coordinates")
126 level->Set(name, Teuchos::getValue<RCP<realvaluedmultivector_type> >(levelListEntry->second),
NoFactory::get());
129 else if(name ==
"Node Comm")
134 else if(name ==
"DualNodeID2PrimalNodeID")
137 level->Set(name, Teuchos::getValue<RCP<std::map<LO, LO>>>(levelListEntry->second),
NoFactory::get());
139 else if(name ==
"Primal interface DOF map")
142 level->Set(name, Teuchos::getValue<RCP<const Map>>(levelListEntry->second),
NoFactory::get());
144 #ifdef HAVE_MUELU_INTREPID2 145 else if (name ==
"pcoarsen: element to node map")
148 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> > >(levelListEntry->second),
NoFactory::get());
152 #ifdef HAVE_MUELU_MATLAB 155 size_t typeNameStart = name.find_first_not_of(
' ');
156 size_t typeNameEnd = name.find(
' ', typeNameStart);
157 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
158 std::transform(typeName.begin(), typeName.end(), typeName.begin(),
::tolower);
160 if(typeName ==
"matrix")
161 level->Set(name, Teuchos::getValue<RCP<Matrix> >(levelListEntry->second),
NoFactory::get());
162 else if(typeName ==
"multivector")
163 level->Set(name, Teuchos::getValue<RCP<MultiVector> >(levelListEntry->second),
NoFactory::get());
164 else if(typeName ==
"map")
165 level->Set(name, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(levelListEntry->second),
NoFactory::get());
166 else if(typeName ==
"ordinalvector")
167 level->Set(name, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(levelListEntry->second),
NoFactory::get());
168 else if(typeName ==
"scalar")
169 level->Set(name, Teuchos::getValue<Scalar>(levelListEntry->second),
NoFactory::get());
170 else if(typeName ==
"double")
171 level->Set(name, Teuchos::getValue<double>(levelListEntry->second),
NoFactory::get());
172 else if(typeName ==
"complex")
173 level->Set(name, Teuchos::getValue<std::complex<double> >(levelListEntry->second),
NoFactory::get());
174 else if(typeName ==
"int")
175 level->Set(name, Teuchos::getValue<int>(levelListEntry->second),
NoFactory::get());
176 else if(typeName ==
"string")
177 level->Set(name, Teuchos::getValue<std::string>(levelListEntry->second),
NoFactory::get());
181 throw std::runtime_error(
"Invalid non-serializable data on list");
185 }
else if (nonSerialList.isSublist(levelName) && levelName.find(
"user data") != std::string::npos) {
188 RCP<Level> level = H.
GetLevel(levelID);
191 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
194 const ParameterList& userList = nonSerialList.sublist(levelName);
195 for (ParameterList::ConstIterator userListEntry = userList.begin(); userListEntry != userList.end(); userListEntry++) {
196 const std::string& name = userListEntry->first;
197 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
198 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"pcoarsen: element to node map" &&
199 name !=
"Node Comm" && name !=
"DualNodeID2PrimalNodeID" && name !=
"Primal interface DOF map" &&
200 name !=
"output stream" &&
202 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: user data parameter list contains unknown data type (") + name +
")");
203 if( name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M") {
205 level->Set(name, Teuchos::getValue<RCP<Matrix > > (userListEntry->second),
NoFactory::get());
206 }
else if (name ==
"Mdiag") {
208 level->Set(name, Teuchos::getValue<RCP<Vector > >(userListEntry->second),
NoFactory::get());
209 }
else if (name ==
"Nullspace") {
211 level->Set(name, Teuchos::getValue<RCP<MultiVector > >(userListEntry->second),
NoFactory::get());
214 }
else if(name ==
"Coordinates") {
216 level->Set(name, Teuchos::getValue<RCP<realvaluedmultivector_type> >(userListEntry->second),
NoFactory::get());
217 level->print(std::cout, MueLu::VERB_EXTREME);
219 else if(name ==
"Node Comm") {
223 else if(name ==
"DualNodeID2PrimalNodeID")
226 level->Set(name, Teuchos::getValue<RCP<std::map<LO, LO>>>(userListEntry->second),
NoFactory::get());
228 else if(name ==
"Primal interface DOF map")
231 level->Set(name, Teuchos::getValue<RCP<const Map>>(userListEntry->second),
NoFactory::get());
233 #ifdef HAVE_MUELU_INTREPID2 234 else if (name ==
"pcoarsen: element to node map")
237 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> > >(userListEntry->second),
NoFactory::get());
240 else if (name ==
"output stream")
242 H.
SetMueLuOStream(Teuchos::getValue<RCP<Teuchos::FancyOStream> >(userListEntry->second));
246 size_t typeNameStart = name.find_first_not_of(
' ');
247 size_t typeNameEnd = name.find(
' ', typeNameStart);
248 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
249 size_t varNameStart = name.find_first_not_of(
' ', typeNameEnd);
250 std::string varName = name.substr(varNameStart, name.size());
251 std::transform(typeName.begin(), typeName.end(), typeName.begin(),
::tolower);
253 if(typeName ==
"matrix")
254 level->Set(varName, Teuchos::getValue<RCP<Matrix> >(userListEntry->second),
NoFactory::get());
255 else if(typeName ==
"multivector")
256 level->Set(varName, Teuchos::getValue<RCP<MultiVector> >(userListEntry->second),
NoFactory::get());
257 else if(typeName ==
"vector")
258 level->Set(varName, Teuchos::getValue<RCP<Vector> >(userListEntry->second),
NoFactory::get());
259 else if(typeName ==
"map")
260 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(userListEntry->second),
NoFactory::get());
261 else if(typeName ==
"ordinalvector")
262 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(userListEntry->second),
NoFactory::get());
263 else if(typeName ==
"scalar")
264 level->Set(varName, Teuchos::getValue<Scalar>(userListEntry->second),
NoFactory::get());
265 else if(typeName ==
"double")
266 level->Set(varName, Teuchos::getValue<double>(userListEntry->second),
NoFactory::get());
267 else if(typeName ==
"complex")
268 level->Set(varName, Teuchos::getValue<std::complex<double> >(userListEntry->second),
NoFactory::get());
269 else if(typeName ==
"int")
270 level->Set(varName, Teuchos::getValue<int>(userListEntry->second),
NoFactory::get());
271 else if(typeName ==
"string")
272 level->Set(varName, Teuchos::getValue<std::string>(userListEntry->second),
NoFactory::get());
273 else if(typeName ==
"array<go>")
274 level->Set(varName, Teuchos::getValue<Array<GlobalOrdinal> > (userListEntry->second),
NoFactory::get());
275 else if(typeName ==
"array<lo>")
276 level->Set(varName, Teuchos::getValue<Array<LocalOrdinal> >(userListEntry->second),
NoFactory::get());
277 else if(typeName ==
"arrayrcp<lo>")
278 level->Set(varName, Teuchos::getValue<ArrayRCP<LocalOrdinal> >(userListEntry->second),
NoFactory::get());
279 else if(typeName ==
"arrayrcp<go>")
280 level->Set(varName, Teuchos::getValue<ArrayRCP<GlobalOrdinal> >(userListEntry->second),
NoFactory::get());
282 throw std::runtime_error(
"Invalid non-serializable data on list");
290 #define MUELU_HIERARCHY_UTILS_SHORT 291 #endif // MUELU_HIERARCHYHELPERS_DEF_HPP This class specifies the default factory that should generate some data on a Level if the data does n...
MueLu::DefaultLocalOrdinal LocalOrdinal
RCP< Level > & GetLevel(const int levelID=0)
Retrieve a certain level from hierarchy.
static void AddNonSerializableDataToHierarchy(HierarchyManager &HM, Hierarchy &H, const ParameterList &nonSerialList)
Add non-serializable data to Hierarchy.
void AddNewLevel()
Add a new level at the end of the hierarchy.
User data are always kept. This flag is set automatically when Level::Set("data", data) is used...
std::string tolower(const std::string &str)
Namespace for MueLu classes and methods.
bool IsParamMuemexVariable(const std::string &name)
RCP< FactoryManagerBase > GetFactoryManager(int levelID) const
static const NoFactory * get()
MueLu::DefaultGlobalOrdinal GlobalOrdinal
static void SetMueLuOStream(const Teuchos::RCP< Teuchos::FancyOStream > &mueluOStream)
bool IsParamValidVariable(const std::string &name)
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Exception throws to report invalid user entry.
static const RCP< const NoFactory > getRCP()
Static Get() functions.