27 RCP<ParameterList> validParamList = rcp(
new ParameterList());
29 validParamList->setEntry(
"map: name", Teuchos::ParameterEntry(std::string(
"")));
30 validParamList->setEntry(
"map: factory", Teuchos::ParameterEntry(std::string(
"null")));
32 validParamList->set<RCP<const FactoryBase>>(
"P", Teuchos::null,
"Tentative prolongator factory");
33 validParamList->set<std::string>(
"nullspace vectors: limit to",
"all",
"Limit the number of nullspace vectors to be used for the map transfer (especially to exclude rotational vectors).");
35 return validParamList;
40 const ParameterList& pL = GetParameterList();
41 const std::string mapFactName = pL.get<std::string>(
"map: factory");
42 const std::string mapName = pL.get<std::string>(
"map: name");
49 if (mapFactName ==
"" || mapFactName ==
"NoFactory")
51 else if (mapFactName !=
"null")
60 Teuchos::RCP<const FactoryBase> tentPFact = GetFactory(
"P");
61 if (tentPFact == Teuchos::null)
68 Monitor m(*
this,
"MapTransferFactory");
70 const ParameterList& pL = GetParameterList();
71 const std::string mapName = pL.get<std::string>(
"map: name");
72 const int maxNumProlongCols = GetLimitOfProlongatorColumns(pL);
75 RCP<const Map> transferMap = Teuchos::null;
79 if (fineLevel.
IsAvailable(mapName, mapFact_.get()) ==
false)
80 GetOStream(
Runtime0) <<
"MapTransferFactory::Build: User provided map \"" << mapName <<
"\" not found in Level class on level " << fineLevel.
GetLevelID() <<
"." << std::endl;
81 transferMap = fineLevel.
Get<RCP<const Map>>(mapName, mapFact_.get());
86 RCP<const FactoryBase> tentPFact = GetFactory(
"P");
87 if (tentPFact == Teuchos::null)
90 "MueLu::MapTransferFactory::Build(): P (generated by TentativePFactory) not available.");
91 RCP<Matrix> Ptent = coarseLevel.
Get<RCP<Matrix>>(
"P", tentPFact.get());
94 Array<GO> coarseMapGids;
95 RCP<const Map> prolongColMap = Ptent->getColMap();
97 int numColEntries = 0;
98 for (
size_t row = 0; row < Ptent->getLocalNumRows(); ++row) {
99 gRowID = Ptent->getRowMap()->getGlobalElement(row);
101 if (transferMap->isNodeGlobalElement(gRowID)) {
102 Teuchos::ArrayView<const LO> indices;
103 Teuchos::ArrayView<const SC> vals;
104 Ptent->getLocalRowView(row, indices, vals);
106 numColEntries = as<int>(indices.size());
107 if (maxNumProlongCols > 0)
108 numColEntries = std::min(numColEntries, maxNumProlongCols);
110 for (
size_t col = 0; col < as<size_t>(numColEntries); ++col) {
112 GO gcid = prolongColMap->getGlobalElement(indices[col]);
113 coarseMapGids.push_back(gcid);
119 const GO INVALID = Teuchos::OrdinalTraits<GlobalOrdinal>::invalid();
120 std::sort(coarseMapGids.begin(), coarseMapGids.end());
121 coarseMapGids.erase(std::unique(coarseMapGids.begin(), coarseMapGids.end()), coarseMapGids.end());
122 RCP<const Map> coarseTransferMap = MapFactory::Build(prolongColMap->lib(), INVALID, coarseMapGids(),
123 prolongColMap->getIndexBase(), prolongColMap->getComm());
127 const std::string mapFactName = pL.get<std::string>(
"map: factory");
128 RCP<const FactoryBase> mapFact = coarseLevel.
GetFactoryManager()->GetFactory(mapFactName);
129 coarseLevel.
Set(mapName, coarseTransferMap, mapFact.get());
131 coarseLevel.
Set(mapName, coarseTransferMap, mapFact_.get());
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....