10 #ifndef MUELU_HIERARCHYUTILS_DEF_HPP
11 #define MUELU_HIERARCHYUTILS_DEF_HPP
20 #include "MueLu_FactoryManager.hpp"
23 #ifdef HAVE_MUELU_INTREPID2
24 #include "Kokkos_DynRankView.hpp"
30 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
41 std::string(
"MueLu::Utils::CopyBetweenHierarchies: unknown data type(") + dataType +
")");
43 if (dataType ==
"RCP<Matrix>") {
51 auto tempMatrix = rcp_dynamic_cast<Matrix>(tempOp);
53 toLevel->
Set(toLabel, tempMatrix);
55 toLevel->
Set(toLabel, tempOp);
57 if (dataType ==
"RCP<const Import>") {
66 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
70 realvaluedmultivector_type;
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);
90 const std::string& name = levelListEntry->first;
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 +
")");
110 level->
Get(
"A", mat);
111 comm = mat->getMap()->getComm();
118 level0->
Get(
"A", mat);
119 comm = mat->getMap()->getComm();
126 if (levelListEntry->second.isType<std::string>())
130 mat = Teuchos::getValue<RCP<Matrix>>(levelListEntry->second);
135 }
else if (name ==
"P" || name ==
"R" || name ==
"K" || name ==
"M") {
138 mat = Teuchos::getValue<RCP<Operator>>(levelListEntry->second);
142 level->
Set(name, mat, fact.
get());
148 if (levelListEntry->second.isType<std::string>())
152 mat = Teuchos::getValue<RCP<Matrix>>(levelListEntry->second);
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") {
171 }
else if (name ==
"Mdiag") {
174 }
else if (name ==
"Nullspace") {
176 if (levelListEntry->second.isType<std::string>()) {
179 level->
Get(
"A", mat);
180 auto map = mat->getMap();
183 vec = Teuchos::getValue<RCP<MultiVector>>(levelListEntry->second);
188 }
else if (name ==
"Material") {
191 }
else if (name ==
"Coordinates")
194 if (levelListEntry->second.isType<std::string>()) {
197 level->
Get(
"A", mat);
198 size_t blkSize = mat->GetFixedBlockSize();
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);
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;
214 nodeMap = MapFactory::Build(dofMap->lib(), INVALID, nodeGIDs(), indexBase, dofMap->getComm());
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") {
231 }
else if (name ==
"dropMap1") {
234 }
else if (name ==
"dropMap2") {
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")
255 else if (typeName ==
"multivector")
257 else if (typeName ==
"map")
259 else if (typeName ==
"ordinalvector")
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) {
289 const std::string& name = userListEntry->first;
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") {
312 }
else if (name ==
"Mdiag") {
315 }
else if (name ==
"Nullspace") {
320 }
else if (name ==
"Material") {
323 }
else if (name ==
"Coordinates") {
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") {
335 }
else if (name ==
"dropMap1") {
338 }
else if (name ==
"dropMap2") {
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") {
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")
361 else if (typeName ==
"multivector")
363 else if (typeName ==
"vector")
365 else if (typeName ==
"map")
367 else if (typeName ==
"ordinalvector")
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>")
381 else if (typeName ==
"array<lo>")
383 else if (typeName ==
"arrayrcp<lo>")
385 else if (typeName ==
"arrayrcp<go>")
388 throw std::runtime_error(
"Invalid non-serializable data on list");
397 #define MUELU_HIERARCHY_UTILS_SHORT
398 #endif // MUELU_HIERARCHYHELPERS_DEF_HPP
This class specifies the default factory that should generate some data on a Level if the data does n...
ConstIterator end() const
MueLu::DefaultLocalOrdinal LocalOrdinal
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.
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.
RCP< FactoryManagerBase > GetFactoryManager(int levelID) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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)
bool IsParamMuemexVariable(const std::string &name)
const RCP< const FactoryBase > GetFactory(const std::string &varName) const
Get factory associated with a particular data name.
static const NoFactory * get()
MueLu::DefaultGlobalOrdinal GlobalOrdinal
bool isSublist(const std::string &name) const
static RCP< MultiVector > ReadMultiVector(const std::string &fileName, const RCP< const Map > &map)
params_t::ConstIterator ConstIterator
Xpetra::UnderlyingLib lib()
static const RCP< const NoFactory > getRCP()
Static Get() functions.
void AddKeepFlag(const std::string &ename, const FactoryBase *factory=NoFactory::get(), KeepType keep=MueLu::Keep)
ConstIterator begin() const
bool IsParamValidVariable(const std::string &name)
void Set(const std::string &ename, const T &entry, const FactoryBase *factory=NoFactory::get())
void SetFactory(const std::string &varName, const RCP< const FactoryBase > &factory)
Set Factory.
static Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Read(const std::string &fileName, Xpetra::UnderlyingLib lib, const RCP< const Teuchos::Comm< int > > &comm, bool binary=false)
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Exception throws to report errors in the internal logical of the program.
#define TEUCHOS_ASSERT(assertion_test)
static void SetMueLuOStream(const Teuchos::RCP< Teuchos::FancyOStream > &mueluOStream)
RCP< const Teuchos::Comm< int > > GetComm() const
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
std::string typeName(const T &t)
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
Exception throws to report invalid user entry.
static void CopyBetweenHierarchies(Hierarchy &fromHierarchy, Hierarchy &toHierarchy, const std::string fromLabel, const std::string toLabel, const std::string dataType)