104 typedef typename Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
107 for (ParameterList::ConstIterator nonSerialEntry = nonSerialList.begin(); nonSerialEntry != nonSerialList.end(); nonSerialEntry++) {
108 const std::string& levelName = nonSerialEntry->first;
110 if (nonSerialList.isSublist(levelName) && levelName.find(
"level ") == 0 && levelName.size() > 6) {
111 int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
118 RCP<Level> level = H.
GetLevel(levelID);
120 RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.
GetFactoryManager(levelID));
121 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
124 const ParameterList& levelList = nonSerialList.sublist(levelName);
125 for (ParameterList::ConstIterator levelListEntry = levelList.begin(); levelListEntry != levelList.end(); levelListEntry++) {
126 const std::string& name = levelListEntry->first;
127 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"A" && name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
128 name !=
"D0" && name !=
"M1" && name !=
"Ms" && name !=
"M0inv" &&
129 name !=
"Pnodal" && name !=
"NodeMatrix" && name !=
"NodeAggMatrix" &&
130 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"pcoarsen: element to node map" &&
131 name !=
"Node Comm" && name !=
"DualNodeID2PrimalNodeID" && name !=
"Primal interface DOF map" &&
133 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: parameter list contains unknown data type(") + name +
")");
136 RCP<const Teuchos::Comm<int> > comm;
137 if (!level->GetComm().is_null())
138 comm = level->GetComm();
139 else if (level->IsAvailable(
"A")) {
141 level->Get(
"A", mat);
142 comm = mat->getMap()->getComm();
145 if (!level0->GetComm().is_null())
146 comm = level0->GetComm();
149 level0->Get(
"A", mat);
150 comm = mat->getMap()->getComm();
153 Xpetra::UnderlyingLib lib = level->lib();
157 if (levelListEntry->second.isType<std::string>())
159 mat = Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Read(Teuchos::getValue<std::string>(levelListEntry->second), lib, comm);
161 mat = Teuchos::getValue<RCP<Matrix > > (levelListEntry->second);
167 else if(name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M" ) {
168 if (levelListEntry->second.isType<RCP<Operator> >()) {
170 mat = Teuchos::getValue<RCP<Operator> > (levelListEntry->second);
172 RCP<const FactoryBase> fact = M->GetFactory(name);
174 level->Set(name, mat, fact.get());
180 if (levelListEntry->second.isType<std::string>())
182 mat = Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Read(Teuchos::getValue<std::string>(levelListEntry->second), lib, comm);
184 mat = Teuchos::getValue<RCP<Matrix > > (levelListEntry->second);
186 RCP<const FactoryBase> fact = M->GetFactory(name);
188 level->Set(name, mat, fact.get());
194 else if (name ==
"D0" || name ==
"M1" || name ==
"Ms" || name ==
"M0inv" || name ==
"Pnodal" || name ==
"NodeMatrix" || name ==
"NodeAggMatrix") {
196 if (levelListEntry->second.isType<RCP<Operator> >())
197 level->Set(name, Teuchos::getValue<RCP<Operator> > (levelListEntry->second),
NoFactory::get());
199 level->Set(name, Teuchos::getValue<RCP<Matrix> > (levelListEntry->second),
NoFactory::get());
201 else if (name ==
"Mdiag")
204 level->Set(name, Teuchos::getValue<RCP<Vector > > (levelListEntry->second),
NoFactory::get());
206 else if (name ==
"Nullspace")
208 RCP<MultiVector> vec;
209 if (levelListEntry->second.isType<std::string>()) {
210 TEUCHOS_ASSERT(level->IsAvailable(
"A"));
212 level->Get(
"A", mat);
213 auto map = mat->getMap();
214 vec = Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::ReadMultiVector(Teuchos::getValue<std::string>(levelListEntry->second), map);
216 vec = Teuchos::getValue<RCP<MultiVector> > (levelListEntry->second);
222 else if(name ==
"Coordinates")
224 RCP<realvaluedmultivector_type> vec;
225 if (levelListEntry->second.isType<std::string>()) {
226 TEUCHOS_ASSERT(level->IsAvailable(
"A"));
228 level->Get(
"A", mat);
229 size_t blkSize = mat->GetFixedBlockSize();
230 RCP<const Map> nodeMap = mat->getRowMap();
233 RCP<const Map> dofMap = mat->getRowMap();
234 GO indexBase = dofMap->getIndexBase();
235 size_t numLocalDOFs = dofMap->getLocalNumElements();
237 "HierarchyUtils: block size (" << blkSize <<
") is incompatible with the number of local dofs in a row map (" << numLocalDOFs);
238 ArrayView<const GO> GIDs = dofMap->getLocalElementList();
240 Array<GO> nodeGIDs(numLocalDOFs/blkSize);
241 for (
size_t i = 0; i < numLocalDOFs; i += blkSize)
242 nodeGIDs[i/blkSize] = (GIDs[i] - indexBase)/blkSize + indexBase;
244 Xpetra::global_size_t INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
245 nodeMap = MapFactory::Build(dofMap->lib(), INVALID, nodeGIDs(), indexBase, dofMap->getComm());
247 vec = Xpetra::IO<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node>::ReadMultiVector(Teuchos::getValue<std::string>(levelListEntry->second), nodeMap);
249 vec = Teuchos::getValue<RCP<realvaluedmultivector_type > > (levelListEntry->second);
254 else if(name ==
"Node Comm")
259 else if(name ==
"DualNodeID2PrimalNodeID")
262 level->Set(name, Teuchos::getValue<RCP<std::map<LO, LO>>>(levelListEntry->second),
NoFactory::get());
264 else if(name ==
"Primal interface DOF map")
267 level->Set(name, Teuchos::getValue<RCP<const Map>>(levelListEntry->second),
NoFactory::get());
269#ifdef HAVE_MUELU_INTREPID2
270 else if (name ==
"pcoarsen: element to node map")
273 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> > >(levelListEntry->second),
NoFactory::get());
277#ifdef HAVE_MUELU_MATLAB
280 size_t typeNameStart = name.find_first_not_of(
' ');
281 size_t typeNameEnd = name.find(
' ', typeNameStart);
282 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
283 std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::tolower);
285 if(typeName ==
"matrix")
286 level->Set(name, Teuchos::getValue<RCP<Matrix> >(levelListEntry->second),
NoFactory::get());
287 else if(typeName ==
"multivector")
288 level->Set(name, Teuchos::getValue<RCP<MultiVector> >(levelListEntry->second),
NoFactory::get());
289 else if(typeName ==
"map")
290 level->Set(name, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(levelListEntry->second),
NoFactory::get());
291 else if(typeName ==
"ordinalvector")
292 level->Set(name, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(levelListEntry->second),
NoFactory::get());
293 else if(typeName ==
"scalar")
294 level->Set(name, Teuchos::getValue<Scalar>(levelListEntry->second),
NoFactory::get());
295 else if(typeName ==
"double")
296 level->Set(name, Teuchos::getValue<double>(levelListEntry->second),
NoFactory::get());
297 else if(typeName ==
"complex")
298 level->Set(name, Teuchos::getValue<std::complex<double> >(levelListEntry->second),
NoFactory::get());
299 else if(typeName ==
"int")
300 level->Set(name, Teuchos::getValue<int>(levelListEntry->second),
NoFactory::get());
301 else if(typeName ==
"string")
302 level->Set(name, Teuchos::getValue<std::string>(levelListEntry->second),
NoFactory::get());
306 throw std::runtime_error(
"Invalid non-serializable data on list");
310 }
else if (nonSerialList.isSublist(levelName) && levelName.find(
"user data") != std::string::npos) {
313 RCP<Level> level = H.
GetLevel(levelID);
315 RCP<FactoryManager> M = Teuchos::rcp_dynamic_cast<FactoryManager>(HM.
GetFactoryManager(levelID));
316 TEUCHOS_TEST_FOR_EXCEPTION(M.is_null(),
Exceptions::InvalidArgument,
"MueLu::Utils::AddNonSerializableDataToHierarchy: cannot get FactoryManager");
319 const ParameterList& userList = nonSerialList.sublist(levelName);
320 for (ParameterList::ConstIterator userListEntry = userList.begin(); userListEntry != userList.end(); userListEntry++) {
321 const std::string& name = userListEntry->first;
322 TEUCHOS_TEST_FOR_EXCEPTION(name !=
"P" && name !=
"R" && name !=
"K" && name !=
"M" && name !=
"Mdiag" &&
323 name !=
"D0" && name !=
"M1" && name !=
"Ms" && name !=
"M0inv" &&
324 name !=
"Nullspace" && name !=
"Coordinates" && name !=
"pcoarsen: element to node map" &&
325 name !=
"Node Comm" && name !=
"DualNodeID2PrimalNodeID" && name !=
"Primal interface DOF map" &&
326 name !=
"output stream" &&
328 std::string(
"MueLu::Utils::AddNonSerializableDataToHierarchy: user data parameter list contains unknown data type (") + name +
")");
329 if( name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M" || name ==
"D0" || name ==
"M1" || name ==
"Ms" || name ==
"M0inv" ) {
331 level->Set(name, Teuchos::getValue<RCP<Matrix > > (userListEntry->second),
NoFactory::get());
332 }
else if (name ==
"Mdiag") {
334 level->Set(name, Teuchos::getValue<RCP<Vector > >(userListEntry->second),
NoFactory::get());
335 }
else if (name ==
"Nullspace") {
337 level->Set(name, Teuchos::getValue<RCP<MultiVector > >(userListEntry->second),
NoFactory::get());
340 }
else if(name ==
"Coordinates") {
342 level->Set(name, Teuchos::getValue<RCP<realvaluedmultivector_type> >(userListEntry->second),
NoFactory::get());
344 else if(name ==
"Node Comm") {
348 else if(name ==
"DualNodeID2PrimalNodeID")
351 level->Set(name, Teuchos::getValue<RCP<std::map<LO, LO>>>(userListEntry->second),
NoFactory::get());
353 else if(name ==
"Primal interface DOF map")
356 level->Set(name, Teuchos::getValue<RCP<const Map>>(userListEntry->second),
NoFactory::get());
358#ifdef HAVE_MUELU_INTREPID2
359 else if (name ==
"pcoarsen: element to node map")
362 level->Set(name, Teuchos::getValue<RCP<Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> > >(userListEntry->second),
NoFactory::get());
365 else if (name ==
"output stream")
367 H.
SetMueLuOStream(Teuchos::getValue<RCP<Teuchos::FancyOStream> >(userListEntry->second));
371 size_t typeNameStart = name.find_first_not_of(
' ');
372 size_t typeNameEnd = name.find(
' ', typeNameStart);
373 std::string typeName = name.substr(typeNameStart, typeNameEnd - typeNameStart);
374 size_t varNameStart = name.find_first_not_of(
' ', typeNameEnd);
375 std::string varName = name.substr(varNameStart, name.size());
376 std::transform(typeName.begin(), typeName.end(), typeName.begin(), ::tolower);
378 if(typeName ==
"matrix")
379 level->Set(varName, Teuchos::getValue<RCP<Matrix> >(userListEntry->second),
NoFactory::get());
380 else if(typeName ==
"multivector")
381 level->Set(varName, Teuchos::getValue<RCP<MultiVector> >(userListEntry->second),
NoFactory::get());
382 else if(typeName ==
"vector")
383 level->Set(varName, Teuchos::getValue<RCP<Vector> >(userListEntry->second),
NoFactory::get());
384 else if(typeName ==
"map")
385 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >(userListEntry->second),
NoFactory::get());
386 else if(typeName ==
"ordinalvector")
387 level->Set(varName, Teuchos::getValue<RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node> > >(userListEntry->second),
NoFactory::get());
388 else if(typeName ==
"scalar")
389 level->Set(varName, Teuchos::getValue<Scalar>(userListEntry->second),
NoFactory::get());
390 else if(typeName ==
"double")
391 level->Set(varName, Teuchos::getValue<double>(userListEntry->second),
NoFactory::get());
392 else if(typeName ==
"complex")
393 level->Set(varName, Teuchos::getValue<std::complex<double> >(userListEntry->second),
NoFactory::get());
394 else if(typeName ==
"int")
395 level->Set(varName, Teuchos::getValue<int>(userListEntry->second),
NoFactory::get());
396 else if(typeName ==
"string")
397 level->Set(varName, Teuchos::getValue<std::string>(userListEntry->second),
NoFactory::get());
398 else if(typeName ==
"array<go>")
399 level->Set(varName, Teuchos::getValue<Array<GlobalOrdinal> > (userListEntry->second),
NoFactory::get());
400 else if(typeName ==
"array<lo>")
401 level->Set(varName, Teuchos::getValue<Array<LocalOrdinal> >(userListEntry->second),
NoFactory::get());
402 else if(typeName ==
"arrayrcp<lo>")
403 level->Set(varName, Teuchos::getValue<ArrayRCP<LocalOrdinal> >(userListEntry->second),
NoFactory::get());
404 else if(typeName ==
"arrayrcp<go>")
405 level->Set(varName, Teuchos::getValue<ArrayRCP<GlobalOrdinal> >(userListEntry->second),
NoFactory::get());
407 throw std::runtime_error(
"Invalid non-serializable data on list");