70 GetOStream(
Runtime0) <<
"Transferring " << TransferVecName_ << std::endl;
71 LO LO_INVALID = Teuchos::OrdinalTraits<LO>::invalid();
73 if (coarseLevel.
IsAvailable(TransferVecName_,
this)) {
74 GetOStream(
Runtime0) <<
"Reusing " << TransferVecName_ << std::endl;
79 RCP<const CrsGraph> P = Get<RCP<const CrsGraph> >(coarseLevel,
"P Graph");
80 RCP<LocalOrdinalVector> fineTV = Get<RCP<LocalOrdinalVector> >(fineLevel, TransferVecName_);
81 RCP<const Map> coarseMap = Get<RCP<const Map> >(fineLevel,
"CoarseMap");
82 RCP<const Map> uniqueMap = fineTV->getMap();
83 ArrayRCP<const LO> fineData = fineTV->getData(0);
86 RCP<LocalOrdinalVector> coarseTV = LocalOrdinalVectorFactory::Build(coarseMap, 1);
87 ArrayRCP<LO> coarseData = coarseTV->getDataNonConst(0);
90 for (LO i = 0; i < coarseData.size(); i++)
91 coarseData[i] = LO_INVALID;
94 LO domMapNumElements = P->getDomainMap()->getLocalNumElements();
95 for (LO row = 0; row < (LO)P->getLocalNumRows(); row++) {
96 LO fineNumber = fineData[row];
97 ArrayView<const LO> indices;
98 P->getLocalRowView(row, indices);
100 for (LO j = 0; j < (LO)indices.size(); j++) {
102 if (col >= domMapNumElements) {
105 coarseData[col] = fineNumber;
110#ifdef HAVE_MUELU_DEBUG
111 size_t error_count = 0;
113 RCP<LocalOrdinalVector> coarseTVghosted;
114 RCP<const Import> importer = P->getImporter();
115 if (!importer.is_null()) {
116 coarseTVghosted = LocalOrdinalVectorFactory::Build(P->getColMap(), 1);
117 coarseTVghosted->doImport(*coarseTV, *importer, Xpetra::INSERT);
119 coarseTVghosted = coarseTV;
121 ArrayRCP<LO> coarseDataGhosted = coarseTVghosted->getDataNonConst(0);
122 for (LO col = 0; col < (LO)P->getColMap()->getLocalNumElements(); col++) {
123 if (coarseDataGhosted[col] == LO_INVALID)
126 for (LO row = 0; row < (LO)P->getLocalNumRows(); row++) {
127 LO fineNumber = fineData[row];
128 ArrayView<const LO> indices;
129 P->getLocalRowView(row, indices);
130 for (LO j = 0; j < (LO)indices.size(); j++) {
131 if (coarseDataGhosted[indices[j]] != fineNumber)
138 if (error_count > 0) {
139 std::ostringstream ofs;
140 ofs <<
"LocalOrdinalTransferFactory(" << TransferVecName_ <<
"): ERROR: Each coarse dof must have a unique LO value. We had " << std::to_string(error_count) <<
" unknowns that did not match.";
141 throw std::runtime_error(ofs.str());
145 Set<RCP<LocalOrdinalVector> >(coarseLevel, TransferVecName_, coarseTV);
152 GetOStream(
Runtime0) <<
"Transferring " << TransferVecName_ << std::endl;
153 RCP<LocalOrdinalVector> coarseTV;
154 RCP<LocalOrdinalVector> fineTV;
155 LO LO_INVALID = Teuchos::OrdinalTraits<LO>::invalid();
157 if (coarseLevel.
IsAvailable(TransferVecName_,
this)) {
158 GetOStream(
Runtime0) <<
"Reusing " << TransferVecName_ << std::endl;
162 RCP<Aggregates> aggregates = Get<RCP<Aggregates> >(fineLevel,
"Aggregates");
163 fineTV = Get<RCP<LocalOrdinalVector> >(fineLevel, TransferVecName_);
164 RCP<const Map> coarseMap = Get<RCP<const Map> >(fineLevel,
"CoarseMap");
165 RCP<const Map> uniqueMap = fineTV->getMap();
167 ArrayView<const GO> elementAList = coarseMap->getLocalElementList();
169 coarseTV = LocalOrdinalVectorFactory::Build(coarseMap, 1);
172 RCP<LocalOrdinalVector> ghostedTV = fineTV;
173 if (aggregates->AggregatesCrossProcessors()) {
174 RCP<const Map> nonUniqueMap = aggregates->GetMap();
175 RCP<const Import> importer = ImportFactory::Build(uniqueMap, nonUniqueMap);
177 ghostedTV = LocalOrdinalVectorFactory::Build(nonUniqueMap, 1);
178 ghostedTV->doImport(*fineTV, *importer, Xpetra::INSERT);
182 int myPID = uniqueMap->getComm()->getRank();
183 ArrayRCP<LO> aggSizes = aggregates->ComputeAggregateSizesArrayRCP();
184 const ArrayRCP<const LO> vertex2AggID = aggregates->GetVertex2AggId()->getData(0);
185 const ArrayRCP<const LO> procWinner = aggregates->GetProcWinner()->getData(0);
187 ArrayRCP<const LO> fineData = ghostedTV->getData(0);
188 ArrayRCP<LO> coarseData = coarseTV->getDataNonConst(0);
191 for (LO i = 0; i < coarseData.size(); i++)
192 coarseData[i] = LO_INVALID;
195 size_t error_count = 0;
196 for (LO lnode = 0; lnode < vertex2AggID.size(); lnode++) {
197 if (procWinner[lnode] == myPID &&
199 lnode < fineData.size() &&
200 vertex2AggID[lnode] < coarseData.size()) {
201 if (coarseData[vertex2AggID[lnode]] == LO_INVALID)
202 coarseData[vertex2AggID[lnode]] = fineData[lnode];
203 if (coarseData[vertex2AggID[lnode]] != fineData[lnode])
209 if (error_count > 0) {
210 std::ostringstream ofs;
211 ofs <<
"LocalOrdinalTransferFactory: ERROR: Each aggregate must have a unique LO value. We had " << std::to_string(error_count) <<
" unknowns that did not match.";
212 throw std::runtime_error(ofs.str());
215 Set<RCP<LocalOrdinalVector> >(coarseLevel, TransferVecName_, coarseTV);