46 #ifndef MUELU_Q2Q1Q2COARSEGRIDFACTORY_DEF_HPP
47 #define MUELU_Q2Q1Q2COARSEGRIDFACTORY_DEF_HPP
54 #include <Xpetra_Map.hpp>
55 #include <Xpetra_MapFactory.hpp>
58 #include <Xpetra_MultiVectorFactory.hpp>
60 #include <Xpetra_CrsMatrixWrap.hpp>
67 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69 GetOStream(
Runtime1) <<
"I constructed a Q2Q1Q2CoarseGridFactory object... Nothing else to do here." << std::endl;
72 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
77 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
79 Input(fineLevel,
"VElementList");
80 Input(fineLevel,
"PElementList");
81 Input(fineLevel,
"MElementList");
83 Input(coarseLevel,
"VElementList");
84 Input(coarseLevel,
"PElementList");
85 Input(coarseLevel,
"MElementList");
90 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
92 GetOStream(
Runtime1) <<
"Starting 'build' routine...\n";
100 return BuildCoarseGrid(fineLevel, coarseLevel);
103 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
105 GetOStream(
Runtime1) <<
"starting 'BuildCoarseGrid' routine...\n";
109 GO totalFineElements = fineElementPDOFs->numRows();
112 GO totalCoarseElements = totalFineElements / 4;
113 LO nCoarseElements = (int)sqrt(totalCoarseElements);
116 size_t EdgeCount = (nCoarseElements + 1) * (nCoarseElements + 1);
117 size_t CenterCount = EdgeCount + 2 * nCoarseElements * (nCoarseElements + 1);
124 for (
GO coarseElement = 0; coarseElement < totalCoarseElements; coarseElement++) {
133 if (coarseElement < nCoarseElements) {
135 (*coarseElementMDOFs)(coarseElement, 0) = coarseElement;
136 (*coarseElementMDOFs)(coarseElement, 1) = coarseElement + 1;
139 (*coarseElementMDOFs)(coarseElement, 4) = EdgeCount++;
143 (*coarseElementMDOFs)(coarseElement, 0) = (*coarseElementMDOFs)(coarseElement - nCoarseElements, 3);
144 (*coarseElementMDOFs)(coarseElement, 1) = (*coarseElementMDOFs)(coarseElement - nCoarseElements, 2);
147 (*coarseElementMDOFs)(coarseElement, 4) = (*coarseElementMDOFs)(coarseElement - nCoarseElements, 6);
151 (*coarseElementMDOFs)(coarseElement, 5) = EdgeCount++;
152 (*coarseElementMDOFs)(coarseElement, 6) = EdgeCount++;
155 if (coarseElement % nCoarseElements == 0) {
157 (*coarseElementMDOFs)(coarseElement, 3) = (*coarseElementMDOFs)(coarseElement, 0) + nCoarseElements + 1;
160 (*coarseElementMDOFs)(coarseElement, 7) = EdgeCount++;
164 (*coarseElementMDOFs)(coarseElement, 3) = (*coarseElementMDOFs)(coarseElement - 1, 2);
167 (*coarseElementMDOFs)(coarseElement, 7) = (*coarseElementMDOFs)(coarseElement - 1, 5);
171 (*coarseElementMDOFs)(coarseElement, 2) = (*coarseElementMDOFs)(coarseElement, 3) + 1;
174 (*coarseElementMDOFs)(coarseElement, 8) = CenterCount++;
178 (*coarseElementVDOFs)(coarseElement, 0) = 2 * (*coarseElementMDOFs)(coarseElement, 0);
179 (*coarseElementVDOFs)(coarseElement, 1) = 2 * (*coarseElementMDOFs)(coarseElement, 0) + 1;
180 (*coarseElementVDOFs)(coarseElement, 2) = 2 * (*coarseElementMDOFs)(coarseElement, 1);
181 (*coarseElementVDOFs)(coarseElement, 3) = 2 * (*coarseElementMDOFs)(coarseElement, 1) + 1;
182 (*coarseElementVDOFs)(coarseElement, 4) = 2 * (*coarseElementMDOFs)(coarseElement, 2);
183 (*coarseElementVDOFs)(coarseElement, 5) = 2 * (*coarseElementMDOFs)(coarseElement, 2) + 1;
184 (*coarseElementVDOFs)(coarseElement, 6) = 2 * (*coarseElementMDOFs)(coarseElement, 3);
185 (*coarseElementVDOFs)(coarseElement, 7) = 2 * (*coarseElementMDOFs)(coarseElement, 3) + 1;
186 (*coarseElementVDOFs)(coarseElement, 8) = 2 * (*coarseElementMDOFs)(coarseElement, 4);
187 (*coarseElementVDOFs)(coarseElement, 9) = 2 * (*coarseElementMDOFs)(coarseElement, 4) + 1;
188 (*coarseElementVDOFs)(coarseElement, 10) = 2 * (*coarseElementMDOFs)(coarseElement, 5);
189 (*coarseElementVDOFs)(coarseElement, 11) = 2 * (*coarseElementMDOFs)(coarseElement, 5) + 1;
190 (*coarseElementVDOFs)(coarseElement, 12) = 2 * (*coarseElementMDOFs)(coarseElement, 6);
191 (*coarseElementVDOFs)(coarseElement, 13) = 2 * (*coarseElementMDOFs)(coarseElement, 6) + 1;
192 (*coarseElementVDOFs)(coarseElement, 14) = 2 * (*coarseElementMDOFs)(coarseElement, 7);
193 (*coarseElementVDOFs)(coarseElement, 15) = 2 * (*coarseElementMDOFs)(coarseElement, 7) + 1;
194 (*coarseElementVDOFs)(coarseElement, 16) = 2 * (*coarseElementMDOFs)(coarseElement, 8);
195 (*coarseElementVDOFs)(coarseElement, 17) = 2 * (*coarseElementMDOFs)(coarseElement, 8) + 1;
198 (*coarseElementPDOFs)(coarseElement, 0) = (*coarseElementMDOFs)(coarseElement, 0);
199 (*coarseElementPDOFs)(coarseElement, 1) = (*coarseElementMDOFs)(coarseElement, 1);
200 (*coarseElementPDOFs)(coarseElement, 2) = (*coarseElementMDOFs)(coarseElement, 2);
201 (*coarseElementPDOFs)(coarseElement, 3) = (*coarseElementMDOFs)(coarseElement, 3);
205 Set(coarseLevel,
"VElementList", coarseElementVDOFs);
206 Set(coarseLevel,
"PElementList", coarseElementPDOFs);
207 Set(coarseLevel,
"MElementList", coarseElementMDOFs);
217 #define MUELU_Q2Q1Q2COARSEGRIDFACTORY_SHORT
218 #endif // MUELU_Q2Q1Q2COARSEGRIDFACTORY_DEF_HPP
Q2Q1Q2CoarseGridFactory()
Constructor.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
virtual ~Q2Q1Q2CoarseGridFactory()
Destructor.
Description of what is happening (more verbose)
void BuildCoarseGrid(Level &fineLevel, Level &coarseLevel) const
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Specifies the data that this class needs, and the factories that generate that data.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.