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
77 template <
class Scalar =
double,
class LocalOrdinal =
int,
class GlobalOrdinal = LocalOrdinal,
class Node = KokkosClassic::DefaultNode::DefaultNodeType>
79 #undef MUELU_HIERARCHYMANAGER_SHORT
81 typedef std::pair<std::string, const FactoryBase*>
keep_pair;
98 void AddFactoryManager(
int startLevel,
int numDesiredLevel, RCP<FactoryManagerBase> manager) {
99 const int lastLevel = startLevel + numDesiredLevel - 1;
103 for (
int iLevel = startLevel; iLevel <= lastLevel; iLevel++)
138 #ifdef HAVE_MUELU_DEBUG
148 RCP<Operator> Op = l0->Get<RCP<Operator> >(
"A");
150 Xpetra::UnderlyingLib lib = Op->getDomainMap()->lib();
163 RCP<Matrix> Amat = rcp_dynamic_cast<Matrix>(Op);
165 if (!Amat.is_null()) {
166 RCP<ParameterList> params = rcp(
new ParameterList());
167 params->set(
"printLoadBalancingInfo",
true);
168 params->set(
"printCommInfo",
true);
199 std::map<int, std::vector<keep_pair> >::const_iterator it =
keep_.find(i);
200 if (it !=
keep_.end()) {
202 const std::vector<keep_pair>& keeps = it->second;
203 for (
size_t j = 0; j < keeps.size(); j++)
204 l->Keep(keeps[j].first, keeps[j].second);
207 RCP<Level> newLevel = rcp(
new Level());
216 #ifdef HAVE_MUELU_INTREPID2
222 bool isLastLevel =
false;
224 while (!isLastLevel) {
225 bool r = H.
Setup(levelID,
226 LvlMngr(levelID-1, lastLevelID),
228 LvlMngr(levelID+1, lastLevelID));
230 isLastLevel = r || (levelID == lastLevelID);
236 RCP<Teuchos::FancyOStream> fos = this->getOStream();
237 fos->setOutputToRootOnly(0);
256 #ifdef HAVE_MUELU_INTREPID2
257 typedef Kokkos::DynRankView<LocalOrdinal,typename Node::device_type> FCi;
266 typedef std::map<std::string, RCP<const FactoryBase> >
FactoryMap;
280 Teuchos::RCP<FactoryManagerBase>
LvlMngr(
int levelID,
int lastLevelID)
const {
283 return Teuchos::null;
285 if (levelID == lastLevelID+1)
286 return Teuchos::null;
290 static RCP<FactoryManagerBase> defaultMngr = rcp(
new FactoryManager());
311 std::map<int, std::vector<keep_pair> >
keep_;
316 for (
int i = 0; i < data.size(); ++i) {
320 L->AddKeepFlag(name, &*
levelManagers_[data[i]]->GetFactory(name));
328 for (
int i = 0; i < data.size(); ++i) {
335 RCP<T> M = L->template Get< RCP<T> >(name,&*
levelManagers_[i]->GetFactory(name));
337 Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Write(fileName,* M);
340 else if (L->IsAvailable(name)) {
342 RCP<T> M = L->template Get< RCP<T> >(name);
344 Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Write(fileName,* M);
354 void WriteDataFC(
Hierarchy& H,
const Teuchos::Array<int>& data,
const std::string& name,
const std::string & ofname)
const {
355 for (
int i = 0; i < data.size(); ++i) {
361 if (L->IsAvailable(name)) {
362 RCP<T> M = L->template Get< RCP<T> >(name);
364 RCP<Matrix> A = L->template Get<RCP<Matrix> >(
"A");
365 RCP<const CrsGraph> AG = A->getCrsGraph();
366 WriteFieldContainer<T>(fileName,*M,*AG->getColMap());
376 typedef LocalOrdinal LO;
377 typedef GlobalOrdinal GO;
379 typedef Xpetra::MultiVector<GO,LO,GO,NO> GOMultiVector;
381 size_t num_els = (size_t) fcont.extent(0);
382 size_t num_vecs =(size_t) fcont.extent(1);
385 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());
388 RCP<GOMultiVector> vec = Xpetra::MultiVectorFactory<GO, LO, GO, NO>::Build(rowMap,num_vecs);
390 for(
size_t j=0; j<num_vecs; j++) {
391 Teuchos::ArrayRCP<GO> v = vec->getDataNonConst(j);
392 for(
size_t i=0; i<num_els; i++)
393 v[i] = colMap.getGlobalElement(fcont(i,j));
396 Xpetra::IO<GO,LO,GO,NO>::Write(fileName,*vec);
408 #define MUELU_HIERARCHYMANAGER_SHORT
409 #endif // MUELU_HIERARCHYMANAGER_HPP