46 #ifndef MUELU_REPLICATEPFACTORY_DEF_HPP
47 #define MUELU_REPLICATEPFACTORY_DEF_HPP
57 #include <Xpetra_CrsMatrixWrap.hpp>
60 #include <Xpetra_MapFactory.hpp>
61 #include <Xpetra_MultiVectorFactory.hpp>
72 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
77 return validParamList;
80 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
86 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
88 Level& coarseLevel)
const {
89 return BuildP(fineLevel, coarseLevel);
92 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
94 Level& coarseLevel)
const {
99 const LO dofPerNode = as<LO>(pL.
get<
int>(
"replicate: npdes"));
106 Psubblockcrs->getAllValues(amalgRowPtr, amalgCols, amalgVals);
108 size_t paddedNrows = Psubblock->getRowMap()->getLocalNumElements() * Teuchos::as<size_t>(dofPerNode);
113 for (decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size() - 1; i++) {
114 size_t rowLength = amalgRowPtr[i + 1] - amalgRowPtr[i];
115 for (
int j = 0; j < dofPerNode; j++) {
116 newPRowPtr[i * dofPerNode + j] = cnt;
117 for (
size_t k = 0; k < rowLength; k++) {
118 newPCols[cnt] = amalgCols[k + amalgRowPtr[i]] * dofPerNode + j;
119 newPVals[cnt++] = amalgVals[k + amalgRowPtr[i]];
124 newPRowPtr[paddedNrows] = cnt;
125 std::vector<size_t> stridingInfo(1, dofPerNode);
127 GlobalOrdinal nCoarseDofs = Psubblock->getDomainMap()->getLocalNumElements() * dofPerNode;
128 GlobalOrdinal indexBase = Psubblock->getDomainMap()->getIndexBase();
129 RCP<const Map> coarseDomainMap = StridedMapFactory::Build(Psubblock->getDomainMap()->lib(),
134 Psubblock->getDomainMap()->getComm(),
138 size_t nColCoarseDofs = Teuchos::as<size_t>(Psubblock->getColMap()->getLocalNumElements() * dofPerNode);
140 for (
size_t c = 0; c < Psubblock->getColMap()->getLocalNumElements(); ++c) {
141 GlobalOrdinal gid = (Psubblock->getColMap()->getGlobalElement(c) - indexBase) * dofPerNode + indexBase;
143 for (
int i = 0; i < dofPerNode; ++i) {
144 unsmooshColMapGIDs[c * dofPerNode + i] = gid + i;
147 Teuchos::RCP<Map> coarseColMap = MapFactory::Build(Psubblock->getDomainMap()->lib(),
149 unsmooshColMapGIDs(),
151 Psubblock->getDomainMap()->getComm());
154 for (
size_t c = 0; c < Psubblock->getRowMap()->getLocalNumElements(); ++c) {
155 GlobalOrdinal gid = (Psubblock->getRowMap()->getGlobalElement(c) - indexBase) * dofPerNode + indexBase;
157 for (
int i = 0; i < dofPerNode; ++i) {
158 unsmooshRowMapGIDs[c * dofPerNode + i] = gid + i;
161 Teuchos::RCP<Map> fineRowMap = MapFactory::Build(Psubblock->getDomainMap()->lib(),
163 unsmooshRowMapGIDs(),
165 Psubblock->getDomainMap()->getComm());
168 dofPerNode * Psubblock->getLocalMaxNumRowEntries());
169 for (
size_t i = 0; i < paddedNrows; i++) {
170 bigPCrs->insertLocalValues(i,
171 newPCols.view(newPRowPtr[i], newPRowPtr[i + 1] - newPRowPtr[i]),
172 newPVals.view(newPRowPtr[i], newPRowPtr[i + 1] - newPRowPtr[i]));
174 bigPCrs->fillComplete(coarseDomainMap, fineRowMap);
178 Set(coarseLevel,
"P", bigP);
183 #define MUELU_REPLICATEPFACTORY_SHORT
184 #endif // MUELU_REPLICATEPFACTORY_DEF_HPP
ParameterList & setEntry(const std::string &name, U &&entry)
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
void BuildP(Level &fineLevel, Level &coarseLevel) const
Abstract Build method.
Timer to be used in factories. Similar to Monitor but with additional timers.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
static const NoFactory * get()
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Class that holds all level-specific information.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.