106 LO LO_INVALID = Teuchos::OrdinalTraits<LO>::invalid();
117 RCP<const Map> uniqueMap = fineTV->getMap();
118 ArrayRCP<const LO> fineData = fineTV->getData(0);
121 RCP<LocalOrdinalVector> coarseTV = LocalOrdinalVectorFactory::Build(coarseMap,1);
122 ArrayRCP<LO> coarseData = coarseTV->getDataNonConst(0);
125 for(LO i=0; i<coarseData.size(); i++)
126 coarseData[i] = LO_INVALID;
129 LO domMapNumElements = P->getDomainMap()->getLocalNumElements();
130 for (LO row=0; row<(LO)P->getLocalNumRows(); row++) {
131 LO fineNumber = fineData[row];
132 ArrayView<const LO> indices;
133 P->getLocalRowView(row,indices);
135 for(LO j=0; j<(LO)indices.size(); j++) {
137 if (col >= domMapNumElements) {
140 coarseData[col] = fineNumber;
145#ifdef HAVE_MUELU_DEBUG
146 size_t error_count = 0;
148 RCP<LocalOrdinalVector> coarseTVghosted;
149 RCP<const Import> importer = P->getImporter();
150 if (!importer.is_null()) {
151 coarseTVghosted = LocalOrdinalVectorFactory::Build(P->getColMap(),1);
152 coarseTVghosted->doImport(*coarseTV, *importer, Xpetra::INSERT);
154 coarseTVghosted = coarseTV;
156 ArrayRCP<LO> coarseDataGhosted = coarseTVghosted->getDataNonConst(0);
157 for (LO col=0; col<(LO)P->getColMap()->getLocalNumElements(); col++) {
158 if (coarseDataGhosted[col] == LO_INVALID)
161 for (LO row=0; row<(LO)P->getLocalNumRows(); row++) {
162 LO fineNumber = fineData[row];
163 ArrayView<const LO> indices;
164 P->getLocalRowView(row,indices);
165 for(LO j=0; j<(LO)indices.size(); j++) {
166 if (coarseDataGhosted[indices[j]] != fineNumber)
173 if(error_count > 0) {
174 std::ostringstream ofs;
175 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.";
176 throw std::runtime_error(ofs.str());
191 RCP<LocalOrdinalVector> coarseTV;
192 RCP<LocalOrdinalVector> fineTV;
193 LO LO_INVALID = Teuchos::OrdinalTraits<LO>::invalid();
203 RCP<const Map> uniqueMap = fineTV->getMap();
205 ArrayView<const GO> elementAList = coarseMap->getLocalElementList();
207 coarseTV = LocalOrdinalVectorFactory::Build(coarseMap,1);
210 RCP<LocalOrdinalVector> ghostedTV = fineTV;
211 if (aggregates->AggregatesCrossProcessors()) {
213 RCP<const Map> nonUniqueMap = aggregates->GetMap();
214 RCP<const Import> importer = ImportFactory::Build(uniqueMap, nonUniqueMap);
216 ghostedTV = LocalOrdinalVectorFactory::Build(nonUniqueMap, 1);
217 ghostedTV->doImport(*fineTV, *importer, Xpetra::INSERT);
221 int myPID = uniqueMap->getComm()->getRank();
222 ArrayRCP<LO> aggSizes = aggregates->ComputeAggregateSizesArrayRCP();
223 const ArrayRCP<const LO> vertex2AggID = aggregates->GetVertex2AggId()->getData(0);
224 const ArrayRCP<const LO> procWinner = aggregates->GetProcWinner()->getData(0);
227 ArrayRCP<const LO> fineData = ghostedTV->getData(0);
228 ArrayRCP<LO> coarseData = coarseTV->getDataNonConst(0);
231 for(LO i=0; i<coarseData.size(); i++)
232 coarseData[i] = LO_INVALID;
235 size_t error_count = 0;
236 for (LO lnode = 0; lnode < vertex2AggID.size(); lnode++) {
237 if (procWinner[lnode] == myPID &&
239 lnode < fineData.size() &&
240 vertex2AggID[lnode] < coarseData.size()) {
241 if(coarseData[vertex2AggID[lnode]] == LO_INVALID)
242 coarseData[vertex2AggID[lnode]] = fineData[lnode];
243 if(coarseData[vertex2AggID[lnode]] != fineData[lnode])
249 if(error_count > 0) {
250 std::ostringstream ofs;
251 ofs <<
"LocalOrdinalTransferFactory: ERROR: Each aggregate must have a unique LO value. We had "<<std::to_string(error_count)<<
" unknowns that did not match.";
252 throw std::runtime_error(ofs.str());