98 Level& coarseLevel)
const {
102 const LO nBlks = as<LO>(pL.get<
int> (
"combine: numBlks"));
110 Teuchos::ArrayRCP<RCP<Matrix>> arrayOfMatrices(nBlks);
111 size_t nComboRowMap = 0, nnzCombo = 0, nComboColMap = 0, nComboDomMap = 0;
113 LO nTotalNumberLocalColMapEntries = 0;
114 Teuchos::ArrayRCP<size_t> DomMapSizePerBlk(nBlks);
115 Teuchos::ArrayRCP<size_t> ColMapSizePerBlk(nBlks);
116 Teuchos::ArrayRCP<size_t> ColMapLocalSizePerBlk(nBlks);
117 Teuchos::ArrayRCP<size_t> ColMapRemoteSizePerBlk(nBlks);
118 Teuchos::ArrayRCP<size_t> ColMapLocalCumulativePerBlk(nBlks+1);
119 Teuchos::ArrayRCP<size_t> ColMapRemoteCumulativePerBlk(nBlks+1);
120 for(
int j = 0; j < nBlks; j++) {
121 std::string blockName =
"Psubblock" + Teuchos::toString(j);
123 arrayOfMatrices[j] = coarseLevel.
Get< RCP<Matrix> >(blockName,
NoFactory::get());
124 nComboRowMap += Teuchos::as<size_t>((arrayOfMatrices[j])->getRowMap()->getLocalNumElements());
125 DomMapSizePerBlk[j] = Teuchos::as<size_t>((arrayOfMatrices[j])->getDomainMap()->getLocalNumElements());
126 ColMapSizePerBlk[j] = Teuchos::as<size_t>((arrayOfMatrices[j])->getColMap()->getLocalNumElements());
127 nComboDomMap += DomMapSizePerBlk[j];
128 nComboColMap += ColMapSizePerBlk[j];
129 nnzCombo += Teuchos::as<size_t>((arrayOfMatrices[j])->getLocalNumEntries());
130 TEUCHOS_TEST_FOR_EXCEPTION((arrayOfMatrices[j])->getDomainMap()->getIndexBase() != 0,
Exceptions::RuntimeError,
"interpolation subblocks must use 0 indexbase");
135 for (
int i = 0; i < (int) DomMapSizePerBlk[j]; i++ ) {
137 if ( (arrayOfMatrices[j])->getDomainMap()->getGlobalElement(i) == (arrayOfMatrices[j])->getColMap()->getGlobalElement(tempii) ) tempii++;
139 nTotalNumberLocalColMapEntries += tempii;
140 ColMapLocalSizePerBlk[j] = tempii;
141 ColMapRemoteSizePerBlk[j] = ColMapSizePerBlk[j] - ColMapLocalSizePerBlk[j];
144 arrayOfMatrices[j] = Teuchos::null;
145 ColMapLocalSizePerBlk[j] = 0;
146 ColMapRemoteSizePerBlk[j] = 0;
148 ColMapLocalCumulativePerBlk[j+1] = ColMapLocalSizePerBlk[j] + ColMapLocalCumulativePerBlk[j];
149 ColMapRemoteCumulativePerBlk[j+1]= ColMapRemoteSizePerBlk[j] + ColMapRemoteCumulativePerBlk[j];
151 TEUCHOS_TEST_FOR_EXCEPTION(nComboRowMap != A->getRowMap()->getLocalNumElements(),
Exceptions::RuntimeError,
"sum of subblock rows != #row's Afine");
154 Teuchos::ArrayRCP<size_t> comboPRowPtr(nComboRowMap+1);
155 Teuchos::ArrayRCP<LocalOrdinal> comboPCols(nnzCombo);
156 Teuchos::ArrayRCP<Scalar> comboPVals(nnzCombo);
158 size_t nnzCnt = 0, nrowCntFromPrevBlks = 0,ncolCntFromPrevBlks = 0;
160 for(
int j = 0; j < nBlks; j++) {
162 if (arrayOfMatrices[j] != Teuchos::null) {
163 Teuchos::ArrayRCP<const size_t> subblockRowPtr((arrayOfMatrices[j])->getLocalNumRows());
164 Teuchos::ArrayRCP<const LocalOrdinal> subblockCols((arrayOfMatrices[j])->getLocalNumEntries());
165 Teuchos::ArrayRCP<const Scalar> subblockVals((arrayOfMatrices[j])->getLocalNumEntries());
166 if ( (
int) (arrayOfMatrices[j])->getLocalMaxNumRowEntries() > maxNzPerRow) maxNzPerRow = (int) (arrayOfMatrices[j])->getLocalMaxNumRowEntries();
167 Teuchos::RCP<CrsMatrixWrap> subblockwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>((arrayOfMatrices[j]));
168 Teuchos::RCP<CrsMatrix> subblockcrs = subblockwrap->getCrsMatrix();
169 subblockcrs->getAllValues(subblockRowPtr, subblockCols, subblockVals);
173 for (
decltype(subblockRowPtr.size()) i = 0; i < subblockRowPtr.size() - 1; i++) {
174 size_t rowLength = subblockRowPtr[i+1] - subblockRowPtr[i];
175 comboPRowPtr[ nrowCntFromPrevBlks+i ] = nnzCnt;
176 for (
size_t k = 0; k < rowLength; k++) {
177 if ( (
int) subblockCols[k+subblockRowPtr[i]] < (
int) ColMapLocalSizePerBlk[j]) {
178 comboPCols[nnzCnt ] = subblockCols[k+subblockRowPtr[i]] + ColMapLocalCumulativePerBlk[j];
179 if ( (
int) comboPCols[nnzCnt] >= (
int) ColMapLocalCumulativePerBlk[nBlks]) { printf(
"ERROR1\n"); exit(1); }
185 comboPCols[nnzCnt ] = subblockCols[k+subblockRowPtr[i]] - ColMapLocalSizePerBlk[j] + ColMapLocalCumulativePerBlk[nBlks] + ColMapRemoteCumulativePerBlk[j];
186 if ( (
int) comboPCols[nnzCnt] >= (
int) (ColMapLocalCumulativePerBlk[nBlks]+ ColMapRemoteCumulativePerBlk[nBlks])) { printf(
"ERROR2\n"); exit(1); }
188 comboPVals[nnzCnt++] = subblockVals[k+subblockRowPtr[i]];
192 nrowCntFromPrevBlks += Teuchos::as<size_t>((arrayOfMatrices[j])->getRowMap()->getLocalNumElements());
193 ncolCntFromPrevBlks += DomMapSizePerBlk[j];
196 comboPRowPtr[nComboRowMap] = nnzCnt;
204 Teuchos::Array<GlobalOrdinal> comboDomainMapGIDs(nComboDomMap);
205 Teuchos::Array<GlobalOrdinal> comboColMapGIDs(nComboColMap);
207 LO nTotalNumberRemoteColMapEntries = 0;
209 size_t domainMapIndex = 0;
210 int nComboColIndex = 0;
211 for(
int j = 0; j < nBlks; j++) {
212 int nThisBlkColIndex = 0;
215 if (arrayOfMatrices[j] != Teuchos::null) tempMax = (arrayOfMatrices[j])->getDomainMap()->getMaxGlobalIndex();
216 Teuchos::reduceAll( *(A->getDomainMap()->getComm()), Teuchos::REDUCE_MAX, tempMax, Teuchos::ptr(&maxGID));
218 if (arrayOfMatrices[j] != Teuchos::null) {
219 TEUCHOS_TEST_FOR_EXCEPTION(arrayOfMatrices[j]->getDomainMap()->getMinAllGlobalIndex() < 0,
Exceptions::RuntimeError,
"Global ID assumption for domainMap not met within subblock");
222 for(
size_t c = 0; c < DomMapSizePerBlk[j]; ++c) {
225 priorDomGID = (arrayOfMatrices[j])->getDomainMap()->getGlobalElement(c);
226 comboDomainMapGIDs[domainMapIndex++] = offset + priorDomGID;
227 if ( priorDomGID == (arrayOfMatrices[j])->getColMap()->getGlobalElement(nThisBlkColIndex) ) {
228 comboColMapGIDs[ nComboColIndex++ ] = offset + priorDomGID;
233 for(
size_t cc = nThisBlkColIndex; cc < ColMapSizePerBlk[j]; ++cc) {
234 comboColMapGIDs[nTotalNumberLocalColMapEntries + nTotalNumberRemoteColMapEntries++ ] = offset + (arrayOfMatrices[j])->getColMap()->getGlobalElement(cc);
240 RCP<const Map> coarseDomainMap = Xpetra::MapFactory<LO,GO,NO>::Build(A->getDomainMap()->lib(),Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),comboDomainMapGIDs, 0, A->getDomainMap()->getComm());
241 RCP<const Map> coarseColMap = Xpetra::MapFactory<LO,GO,NO>::Build(A->getDomainMap()->lib(),Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),comboColMapGIDs, 0, A->getDomainMap()->getComm());
244 RCP<const Map> coarseDomainMap = Xpetra::MapFactory<LO,GO,NO>::Build(A->getDomainMap()->lib(),Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),comboDomainMapGIDs, 0, A->getRowMap()->getComm());
245 RCP<const Map> coarseColMap = Xpetra::MapFactory<LO,GO,NO>::Build(A->getDomainMap()->lib(),Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),comboColMapGIDs, 0, A->getRowMap()->getComm());
248 Teuchos::RCP<CrsMatrix> comboPCrs = CrsMatrixFactory::Build(A->getRowMap(), coarseColMap,maxNzPerRow);
256 for (
size_t i = 0; i < nComboRowMap; i++) {
257 comboPCrs->insertLocalValues(i, comboPCols.view(comboPRowPtr[i], comboPRowPtr[i+1] - comboPRowPtr[i]),
258 comboPVals.view(comboPRowPtr[i], comboPRowPtr[i+1] - comboPRowPtr[i]));
260 comboPCrs->fillComplete(coarseDomainMap, A->getRowMap());
262 Teuchos::RCP<Matrix> comboP = Teuchos::rcp(
new CrsMatrixWrap(comboPCrs));
264 Set(coarseLevel,
"P", comboP);