68 typedef typename Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
70 realvaluedmultivector_type;
72 for (ParameterList::ConstIterator nonSerialEntry = nonSerialList.begin(); nonSerialEntry != nonSerialList.end(); nonSerialEntry++) {
73 const std::string& levelName = nonSerialEntry->first;
75 if (nonSerialList.isSublist(levelName) && levelName.find(
"level ") == 0 && levelName.size() > 6) {
76 int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
82 RCP<Level> level = H.
GetLevel(levelID);
84 RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.
GetFactoryManager(levelID));
85 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
88 const ParameterList& levelList = nonSerialList.sublist(levelName);
89 for (ParameterList::ConstIterator levelListEntry = levelList.begin(); levelListEntry != levelList.end(); levelListEntry++) {
90 const std::string& name = levelListEntry->first;
91 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"A" && name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
92 name !=
"D0" && name !=
"Dk_1" && name !=
"Dk_2" &&
93 name !=
"Mk_one" && name !=
"Mk_1_one" && name !=
"M1_beta" && name !=
"M1_alpha" &&
94 name !=
"invMk_1_invBeta" && name !=
"invMk_2_invAlpha" &&
95 name !=
"M1" && name !=
"Ms" && name !=
"M0inv" &&
96 name !=
"Pnodal" && name !=
"NodeMatrix" && name !=
"NodeAggMatrix" &&
97 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"pcoarsen: element to node map" &&
98 name !=
"Node Comm" && name !=
"DualNodeID2PrimalNodeID" && name !=
"Primal interface DOF map" &&
99 name !=
"dropMap1" && name !=
"dropMap2" &&
102 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: parameter list contains unknown data type(") + name +
")");
105 RCP<const Teuchos::Comm<int>> comm;
106 if (!level->GetComm().is_null())
107 comm = level->GetComm();
108 else if (level->IsAvailable(
"A")) {
110 level->Get(
"A", mat);
111 comm = mat->getMap()->getComm();
114 if (!level0->GetComm().is_null())
115 comm = level0->GetComm();
118 level0->Get(
"A", mat);
119 comm = mat->getMap()->getComm();
122 Xpetra::UnderlyingLib lib = level->lib();
126 if (levelListEntry->second.isType<std::string>())
128 mat = Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Read(Teuchos::getValue<std::string>(levelListEntry->second), lib, comm);
130 mat = Teuchos::getValue<RCP<Matrix>>(levelListEntry->second);
135 }
else if (name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M") {
136 if (levelListEntry->second.isType<RCP<Operator>>()) {
138 mat = Teuchos::getValue<RCP<Operator>>(levelListEntry->second);
140 RCP<const FactoryBase> fact = M->GetFactory(name);
142 level->Set(name, mat, fact.get());
148 if (levelListEntry->second.isType<std::string>())
150 mat = Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Read(Teuchos::getValue<std::string>(levelListEntry->second), lib, comm);
152 mat = Teuchos::getValue<RCP<Matrix>>(levelListEntry->second);
154 RCP<const FactoryBase> fact = M->GetFactory(name);
156 level->Set(name, mat, fact.get());
161 }
else if (name ==
"D0" || name ==
"Dk_1" || name ==
"Dk_2" ||
162 name ==
"Mk_one" || name ==
"Mk_1_one" || name ==
"M1_beta" || name ==
"M1_alpha" ||
163 name ==
"invMk_1_invBeta" || name ==
"invMk_2_invAlpha" ||
164 name ==
"M1" || name ==
"Ms" || name ==
"M0inv" ||
165 name ==
"Pnodal" || name ==
"NodeMatrix" || name ==
"NodeAggMatrix") {
167 if (levelListEntry->second.isType<RCP<Operator>>())
168 level->Set(name, Teuchos::getValue<RCP<Operator>>(levelListEntry->second),
NoFactory::get());
170 level->Set(name, Teuchos::getValue<RCP<Matrix>>(levelListEntry->second),
NoFactory::get());
171 }
else if (name ==
"Mdiag") {
173 level->Set(name, Teuchos::getValue<RCP<Vector>>(levelListEntry->second),
NoFactory::get());
174 }
else if (name ==
"Nullspace") {
175 RCP<MultiVector> vec;
176 if (levelListEntry->second.isType<std::string>()) {
177 TEUCHOS_ASSERT(level->IsAvailable(
"A"));
179 level->Get(
"A", mat);
180 auto map = mat->getMap();
181 vec = Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::ReadMultiVector(Teuchos::getValue<std::string>(levelListEntry->second), map);
183 vec = Teuchos::getValue<RCP<MultiVector>>(levelListEntry->second);
188 }
else if (name ==
"Material") {
190 level->Set(name, Teuchos::getValue<RCP<MultiVector>>(levelListEntry->second),
NoFactory::get());
191 }
else if (name ==
"Coordinates")
193 RCP<realvaluedmultivector_type> vec;
194 if (levelListEntry->second.isType<std::string>()) {
195 TEUCHOS_ASSERT(level->IsAvailable(
"A"));
197 level->Get(
"A", mat);
198 size_t blkSize = mat->GetFixedBlockSize();
199 RCP<const Map> nodeMap = mat->getRowMap();
202 RCP<const Map> dofMap = mat->getRowMap();
203 GO indexBase = dofMap->getIndexBase();
204 size_t numLocalDOFs = dofMap->getLocalNumElements();
206 "HierarchyUtils: block size (" << blkSize <<
") is incompatible with the number of local dofs in a row map (" << numLocalDOFs);
207 ArrayView<const GO> GIDs = dofMap->getLocalElementList();
209 Array<GO> nodeGIDs(numLocalDOFs / blkSize);
210 for (
size_t i = 0; i < numLocalDOFs; i += blkSize)
211 nodeGIDs[i / blkSize] = (GIDs[i] - indexBase) / blkSize + indexBase;
213 Xpetra::global_size_t INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
214 nodeMap = MapFactory::Build(dofMap->lib(), INVALID, nodeGIDs(), indexBase, dofMap->getComm());
216 vec = Xpetra::IO<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node>::ReadMultiVector(Teuchos::getValue<std::string>(levelListEntry->second), nodeMap);
218 vec = Teuchos::getValue<RCP<realvaluedmultivector_type>>(levelListEntry->second);
222 }
else if (name ==
"Node Comm") {
225 }
else if (name ==
"DualNodeID2PrimalNodeID") {
227 level->Set(name, Teuchos::getValue<RCP<std::map<LO, LO>>>(levelListEntry->second),
NoFactory::get());
228 }
else if (name ==
"Primal interface DOF map") {
230 level->Set(name, Teuchos::getValue<RCP<const Map>>(levelListEntry->second),
NoFactory::get());
231 }
else if (name ==
"dropMap1") {
233 level->Set(name, Teuchos::getValue<RCP<const Map>>(levelListEntry->second),
NoFactory::get());
234 }
else if (name ==
"dropMap2") {
236 level->Set(name, Teuchos::getValue<RCP<const Map>>(levelListEntry->second),
NoFactory::get());
238#ifdef HAVE_MUELU_INTREPID2
239 else if (name ==
"pcoarsen: element to node map") {
241 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal, typename Node::device_type>>>(levelListEntry->second),
NoFactory::get());
245#ifdef HAVE_MUELU_MATLAB
248 size_t typeNameStart = name.find_first_not_of(
' ');
249 size_t typeNameEnd = name.find(
' ', typeNameStart);
250 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
251 std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::tolower);
253 if (typeName ==
"matrix")
254 level->Set(name, Teuchos::getValue<RCP<Matrix>>(levelListEntry->second),
NoFactory::get());
255 else if (typeName ==
"multivector")
256 level->Set(name, Teuchos::getValue<RCP<MultiVector>>(levelListEntry->second),
NoFactory::get());
257 else if (typeName ==
"map")
258 level->Set(name, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>>(levelListEntry->second),
NoFactory::get());
259 else if (typeName ==
"ordinalvector")
260 level->Set(name, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>>>(levelListEntry->second),
NoFactory::get());
261 else if (typeName ==
"scalar")
262 level->Set(name, Teuchos::getValue<Scalar>(levelListEntry->second),
NoFactory::get());
263 else if (typeName ==
"double")
264 level->Set(name, Teuchos::getValue<double>(levelListEntry->second),
NoFactory::get());
265 else if (typeName ==
"complex")
266 level->Set(name, Teuchos::getValue<std::complex<double>>(levelListEntry->second),
NoFactory::get());
267 else if (typeName ==
"int")
268 level->Set(name, Teuchos::getValue<int>(levelListEntry->second),
NoFactory::get());
269 else if (typeName ==
"string")
270 level->Set(name, Teuchos::getValue<std::string>(levelListEntry->second),
NoFactory::get());
274 throw std::runtime_error(
"Invalid non-serializable data on list");
278 }
else if (nonSerialList.isSublist(levelName) && levelName.find(
"user data") != std::string::npos) {
281 RCP<Level> level = H.
GetLevel(levelID);
283 RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.
GetFactoryManager(levelID));
284 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
287 const ParameterList& userList = nonSerialList.sublist(levelName);
288 for (ParameterList::ConstIterator userListEntry = userList.begin(); userListEntry != userList.end(); userListEntry++) {
289 const std::string& name = userListEntry->first;
290 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
291 name !=
"D0" && name !=
"Dk_1" && name !=
"Dk_2" &&
292 name !=
"Mk_one" && name !=
"Mk_1_one" && name !=
"M1_beta" && name !=
"M1_alpha" &&
293 name !=
"invMk_1_invBeta" && name !=
"invMk_2_invAlpha" &&
294 name !=
"M1" && name !=
"Ms" && name !=
"M0inv" &&
295 name !=
"NodeMatrix" &&
296 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"Material" &&
297 name !=
"pcoarsen: element to node map" &&
298 name !=
"Node Comm" && name !=
"DualNodeID2PrimalNodeID" && name !=
"Primal interface DOF map" &&
299 name !=
"dropMap1" && name !=
"dropMap2" &&
300 name !=
"output stream" &&
303 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: user data parameter list contains unknown data type (") + name +
")");
304 if (name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M" ||
305 name ==
"D0" || name ==
"Dk_1" || name ==
"Dk_2" ||
306 name ==
"Mk_one" || name ==
"Mk_1_one" || name ==
"M1_beta" || name ==
"M1_alpha" ||
307 name ==
"invMk_1_invBeta" || name ==
"invMk_2_invAlpha" ||
308 name ==
"M1" || name ==
"Ms" || name ==
"M0inv" ||
309 name ==
"NodeMatrix") {
311 level->Set(name, Teuchos::getValue<RCP<Matrix>>(userListEntry->second),
NoFactory::get());
312 }
else if (name ==
"Mdiag") {
314 level->Set(name, Teuchos::getValue<RCP<Vector>>(userListEntry->second),
NoFactory::get());
315 }
else if (name ==
"Nullspace") {
317 level->Set(name, Teuchos::getValue<RCP<MultiVector>>(userListEntry->second),
NoFactory::get());
320 }
else if (name ==
"Material") {
322 level->Set(name, Teuchos::getValue<RCP<MultiVector>>(userListEntry->second),
NoFactory::get());
323 }
else if (name ==
"Coordinates") {
325 level->Set(name, Teuchos::getValue<RCP<realvaluedmultivector_type>>(userListEntry->second),
NoFactory::get());
326 }
else if (name ==
"Node Comm") {
329 }
else if (name ==
"DualNodeID2PrimalNodeID") {
331 level->Set(name, Teuchos::getValue<RCP<std::map<LO, LO>>>(userListEntry->second),
NoFactory::get());
332 }
else if (name ==
"Primal interface DOF map") {
334 level->Set(name, Teuchos::getValue<RCP<const Map>>(userListEntry->second),
NoFactory::get());
335 }
else if (name ==
"dropMap1") {
337 level->Set(name, Teuchos::getValue<RCP<const Map>>(userListEntry->second),
NoFactory::get());
338 }
else if (name ==
"dropMap2") {
340 level->Set(name, Teuchos::getValue<RCP<const Map>>(userListEntry->second),
NoFactory::get());
342#ifdef HAVE_MUELU_INTREPID2
343 else if (name ==
"pcoarsen: element to node map") {
345 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal, typename Node::device_type>>>(userListEntry->second),
NoFactory::get());
348 else if (name ==
"output stream") {
349 H.
SetMueLuOStream(Teuchos::getValue<RCP<Teuchos::FancyOStream>>(userListEntry->second));
352 size_t typeNameStart = name.find_first_not_of(
' ');
353 size_t typeNameEnd = name.find(
' ', typeNameStart);
354 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
355 size_t varNameStart = name.find_first_not_of(
' ', typeNameEnd);
356 std::string varName = name.substr(varNameStart, name.size());
357 std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::tolower);
359 if (typeName ==
"matrix")
360 level->Set(varName, Teuchos::getValue<RCP<Matrix>>(userListEntry->second),
NoFactory::get());
361 else if (typeName ==
"multivector")
362 level->Set(varName, Teuchos::getValue<RCP<MultiVector>>(userListEntry->second),
NoFactory::get());
363 else if (typeName ==
"vector")
364 level->Set(varName, Teuchos::getValue<RCP<Vector>>(userListEntry->second),
NoFactory::get());
365 else if (typeName ==
"map")
366 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>>(userListEntry->second),
NoFactory::get());
367 else if (typeName ==
"ordinalvector")
368 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>>>(userListEntry->second),
NoFactory::get());
369 else if (typeName ==
"scalar")
370 level->Set(varName, Teuchos::getValue<Scalar>(userListEntry->second),
NoFactory::get());
371 else if (typeName ==
"double")
372 level->Set(varName, Teuchos::getValue<double>(userListEntry->second),
NoFactory::get());
373 else if (typeName ==
"complex")
374 level->Set(varName, Teuchos::getValue<std::complex<double>>(userListEntry->second),
NoFactory::get());
375 else if (typeName ==
"int")
376 level->Set(varName, Teuchos::getValue<int>(userListEntry->second),
NoFactory::get());
377 else if (typeName ==
"string")
378 level->Set(varName, Teuchos::getValue<std::string>(userListEntry->second),
NoFactory::get());
379 else if (typeName ==
"array<go>")
380 level->Set(varName, Teuchos::getValue<Array<GlobalOrdinal>>(userListEntry->second),
NoFactory::get());
381 else if (typeName ==
"array<lo>")
382 level->Set(varName, Teuchos::getValue<Array<LocalOrdinal>>(userListEntry->second),
NoFactory::get());
383 else if (typeName ==
"arrayrcp<lo>")
384 level->Set(varName, Teuchos::getValue<ArrayRCP<LocalOrdinal>>(userListEntry->second),
NoFactory::get());
385 else if (typeName ==
"arrayrcp<go>")
386 level->Set(varName, Teuchos::getValue<ArrayRCP<GlobalOrdinal>>(userListEntry->second),
NoFactory::get());
388 throw std::runtime_error(
"Invalid non-serializable data on list");