46 #ifndef MUELU_HIERARCHYMANAGER_DECL_HPP
47 #define MUELU_HIERARCHYMANAGER_DECL_HPP
52 #include <Teuchos_Array.hpp>
54 #include <Xpetra_Operator.hpp>
55 #include <Xpetra_IO.hpp>
60 #include "MueLu_Hierarchy.hpp"
64 #include "MueLu_PerfUtils.hpp"
66 #ifdef HAVE_MUELU_INTREPID2
82 #undef MUELU_HIERARCHYMANAGER_SHORT
84 typedef std::pair<std::string, const FactoryBase*>
keep_pair;
103 const int lastLevel = startLevel + numDesiredLevel - 1;
107 for (
int iLevel = startLevel; iLevel <= lastLevel; iLevel++)
143 RCP<Operator> Op = l0->Get<RCP<Operator> >(
"A");
145 if (l0->IsAvailable(
"Nullspace")) {
146 RCP<Matrix> A = Teuchos::rcp_dynamic_cast<Matrix>(Op);
147 if (A != Teuchos::null) {
148 Teuchos::RCP<MultiVector> nullspace = l0->Get<RCP<MultiVector> >(
"Nullspace");
149 TEUCHOS_TEST_FOR_EXCEPTION(
static_cast<size_t>(A->GetFixedBlockSize()) > nullspace->getNumVectors(),
Exceptions::RuntimeError,
"user-provided nullspace has fewer vectors (" << nullspace->getNumVectors() <<
") than number of PDE equations (" << A->GetFixedBlockSize() <<
")");
151 this->
GetOStream(
Warnings0) <<
"Skipping dimension check of user-supplied nullspace because user-supplied operator is not a matrix" << std::endl;
155 #ifdef HAVE_MUELU_DEBUG
165 Xpetra::UnderlyingLib lib = Op->getDomainMap()->lib();
178 RCP<Matrix> Amat = rcp_dynamic_cast<Matrix>(Op);
180 if (!Amat.is_null()) {
181 RCP<ParameterList> params = rcp(
new ParameterList());
182 params->set(
"printLoadBalancingInfo",
true);
183 params->set(
"printCommInfo",
true);
215 std::map<int, std::vector<keep_pair> >::const_iterator it =
keep_.find(i);
216 if (it !=
keep_.end()) {
218 const std::vector<keep_pair>& keeps = it->second;
219 for (
size_t j = 0; j < keeps.size(); j++)
220 l->Keep(keeps[j].first, keeps[j].second);
223 RCP<Level> newLevel = rcp(
new Level());
232 #ifdef HAVE_MUELU_INTREPID2
238 bool isLastLevel =
false;
240 while (!isLastLevel) {
241 bool r = H.
Setup(levelID,
242 LvlMngr(levelID-1, lastLevelID),
244 LvlMngr(levelID+1, lastLevelID));
246 isLastLevel = r || (levelID == lastLevelID);
271 #ifdef HAVE_MUELU_INTREPID2
272 typedef Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> FCi;
281 typedef std::map<std::string, RCP<const FactoryBase> >
FactoryMap;
295 Teuchos::RCP<FactoryManagerBase>
LvlMngr(
int levelID,
int lastLevelID)
const {
298 return Teuchos::null;
300 if (levelID == lastLevelID+1)
301 return Teuchos::null;
305 static RCP<FactoryManagerBase> defaultMngr = rcp(
new FactoryManager());
328 std::map<int, std::vector<keep_pair> >
keep_;
333 for (
int i = 0; i < data.size(); ++i) {
337 L->AddKeepFlag(name, &*
levelManagers_[data[i]]->GetFactory(name));
345 for (
int i = 0; i < data.size(); ++i) {
352 RCP<T> M = L->template Get< RCP<T> >(name,&*
levelManagers_[data[i]]->GetFactory(name));
354 Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Write(fileName,* M);
357 else if (L->IsAvailable(name)) {
359 RCP<T> M = L->template Get< RCP<T> >(name);
361 Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Write(fileName,* M);
372 for (
int i = 0; i < data.size(); ++i) {
378 if (L->IsAvailable(name)) {
379 RCP<T> M = L->template Get< RCP<T> >(name);
381 RCP<Matrix> A = L->template Get<RCP<Matrix> >(
"A");
382 RCP<const CrsGraph> AG = A->getCrsGraph();
383 WriteFieldContainer<T>(fileName,*M,*AG->getColMap());
396 typedef Xpetra::MultiVector<GO,LO,GO,NO> GOMultiVector;
398 size_t num_els = (size_t) fcont.extent(0);
399 size_t num_vecs =(size_t) fcont.extent(1);
402 Teuchos::RCP<const Map> rowMap = Xpetra::MapFactory<LO,GO,NO>::Build(colMap.lib(),Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),fcont.extent(0),colMap.getIndexBase(),colMap.getComm());
405 RCP<GOMultiVector> vec = Xpetra::MultiVectorFactory<GO, LO, GO, NO>::Build(rowMap,num_vecs);
407 for(
size_t j=0; j<num_vecs; j++) {
408 Teuchos::ArrayRCP<GO> v = vec->getDataNonConst(j);
409 for(
size_t i=0; i<num_els; i++)
410 v[i] = colMap.getGlobalElement(fcont(i,j));
413 Xpetra::IO<GO,LO,GO,NO>::Write(fileName,*vec);
425 #define MUELU_HIERARCHYMANAGER_SHORT
426 #endif // MUELU_HIERARCHYMANAGER_HPP