97 Level& coarseLevel)
const {
100 RCP<Matrix> Psubblock = coarseLevel.
Get< RCP<Matrix> >(
"Psubblock",
NoFactory::get());
101 const ParameterList& pL = GetParameterList();
102 const LO dofPerNode = as<LO>(pL.get<
int> (
"replicate: npdes"));
104 Teuchos::ArrayRCP<const size_t> amalgRowPtr(Psubblock->getLocalNumRows());
105 Teuchos::ArrayRCP<const LocalOrdinal> amalgCols(Psubblock->getLocalNumEntries());
106 Teuchos::ArrayRCP<const Scalar> amalgVals(Psubblock->getLocalNumEntries());
107 Teuchos::RCP<CrsMatrixWrap> Psubblockwrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(Psubblock);
108 Teuchos::RCP<CrsMatrix> Psubblockcrs = Psubblockwrap->getCrsMatrix();
109 Psubblockcrs->getAllValues(amalgRowPtr, amalgCols, amalgVals);
111 size_t paddedNrows = Psubblock->getRowMap()->getLocalNumElements() * Teuchos::as<size_t>(dofPerNode);
112 Teuchos::ArrayRCP<size_t> newPRowPtr(paddedNrows+1);
113 Teuchos::ArrayRCP<LocalOrdinal> newPCols(Psubblock->getLocalNumEntries() * dofPerNode);
114 Teuchos::ArrayRCP<Scalar> newPVals(Psubblock->getLocalNumEntries() * dofPerNode);
116 for (
decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size() - 1; i++) {
117 size_t rowLength = amalgRowPtr[i+1] - amalgRowPtr[i];
118 for(
int j = 0; j < dofPerNode; j++) {
119 newPRowPtr[i*dofPerNode+j] = cnt;
120 for (
size_t k = 0; k < rowLength; k++) {
121 newPCols[cnt ] = amalgCols[k+amalgRowPtr[i]] * dofPerNode + j;
122 newPVals[cnt++] = amalgVals[k+amalgRowPtr[i]];
127 newPRowPtr[paddedNrows] = cnt;
128 std::vector<size_t> stridingInfo(1, dofPerNode);
130 GlobalOrdinal nCoarseDofs = Psubblock->getDomainMap()->getLocalNumElements() * dofPerNode;
131 GlobalOrdinal indexBase = Psubblock->getDomainMap()->getIndexBase();
132 RCP<const Map> coarseDomainMap = StridedMapFactory::Build(Psubblock->getDomainMap()->lib(),
133 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
137 Psubblock->getDomainMap()->getComm(),
141 size_t nColCoarseDofs = Teuchos::as<size_t>(Psubblock->getColMap()->getLocalNumElements() * dofPerNode);
142 Teuchos::Array<GlobalOrdinal> unsmooshColMapGIDs(nColCoarseDofs);
143 for(
size_t c = 0; c < Psubblock->getColMap()->getLocalNumElements(); ++c) {
144 GlobalOrdinal gid = (Psubblock->getColMap()->getGlobalElement(c)-indexBase) * dofPerNode + indexBase;
146 for(
int i = 0; i < dofPerNode; ++i) {
147 unsmooshColMapGIDs[c * dofPerNode + i] = gid + i;
150 Teuchos::RCP<Map> coarseColMap = MapFactory::Build(Psubblock->getDomainMap()->lib(),
151 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
152 unsmooshColMapGIDs(),
154 Psubblock->getDomainMap()->getComm());
156 Teuchos::Array<GlobalOrdinal> unsmooshRowMapGIDs(paddedNrows);
157 for(
size_t c = 0; c < Psubblock->getRowMap()->getLocalNumElements(); ++c) {
158 GlobalOrdinal gid = (Psubblock->getRowMap()->getGlobalElement(c)-indexBase) * dofPerNode + indexBase;
160 for(
int i = 0; i < dofPerNode; ++i) {
161 unsmooshRowMapGIDs[c * dofPerNode + i] = gid + i;
164 Teuchos::RCP<Map> fineRowMap = MapFactory::Build(Psubblock->getDomainMap()->lib(),
165 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
166 unsmooshRowMapGIDs(),
168 Psubblock->getDomainMap()->getComm());
170 Teuchos::RCP<CrsMatrix> bigPCrs = CrsMatrixFactory::Build(fineRowMap, coarseColMap,
171 dofPerNode*Psubblock->getLocalMaxNumRowEntries());
172 for (
size_t i = 0; i < paddedNrows; i++) {
173 bigPCrs->insertLocalValues(i,
174 newPCols.view(newPRowPtr[i], newPRowPtr[i+1] - newPRowPtr[i]),
175 newPVals.view(newPRowPtr[i], newPRowPtr[i+1] - newPRowPtr[i]));
177 bigPCrs->fillComplete(coarseDomainMap, fineRowMap);
179 Teuchos::RCP<Matrix> bigP = Teuchos::rcp(
new CrsMatrixWrap(bigPCrs));
181 Set(coarseLevel,
"P", bigP);