46 #ifndef MUELU_INDEXMANAGER_DEF_KOKKOS_HPP 47 #define MUELU_INDEXMANAGER_DEF_KOKKOS_HPP 49 #ifdef HAVE_MUELU_KOKKOS_REFACTOR 53 #include "Teuchos_OrdinalTraits.hpp" 55 #include <Xpetra_MapFactory.hpp> 69 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
70 IndexManager_kokkos<LocalOrdinal, GlobalOrdinal, Node>::
71 IndexManager_kokkos(
const int NumDimensions,
72 const int interpolationOrder,
74 const ArrayView<const LO> LFineNodesPerDir,
75 const ArrayView<const int> CoarseRate) :
76 myRank(MyRank), coarseRate(
"coarsening rate"), endRate(
"endRate"),
77 lFineNodesPerDir(
"lFineNodesPerDir"), coarseNodesPerDir(
"lFineNodesPerDir") {
79 RCP<Teuchos::FancyOStream> out;
80 if(
const char* dbg = std::getenv(
"MUELU_INDEXMANAGER_DEBUG")) {
81 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
82 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
84 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
87 setupIM(NumDimensions, interpolationOrder, CoarseRate, LFineNodesPerDir);
89 *out <<
"Done setting up the IndexManager" << std::endl;
91 computeMeshParameters();
93 *out <<
"Computed Mesh Parameters" << std::endl;
97 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
98 void IndexManager_kokkos<LocalOrdinal, GlobalOrdinal, Node>::
99 setupIM(
const int NumDimensions,
const int interpolationOrder,
100 const ArrayView<const int> CoarseRate,
const ArrayView<const LO> LFineNodesPerDir) {
102 numDimensions = NumDimensions;
103 interpolationOrder_ = interpolationOrder;
105 TEUCHOS_TEST_FOR_EXCEPTION((LFineNodesPerDir.size() != 3)
106 && (LFineNodesPerDir.size() != numDimensions),
107 Exceptions::RuntimeError,
108 "LFineNodesPerDir has to be of size 3 or of size numDimensions!");
111 Kokkos::deep_copy(lFineNodesPerDir_h, lFineNodesPerDir);
113 Kokkos::deep_copy(coarseRate_h, coarseRate);
117 for(
int dim = 0; dim < 3; ++dim) {
118 if(dim < getNumDimensions()) {
119 lFineNodesPerDir_h(dim) = LFineNodesPerDir[dim];
120 if(CoarseRate.size() == 1) {
121 coarseRate_h(dim) = CoarseRate[0];
122 }
else if(CoarseRate.size() == getNumDimensions()) {
123 coarseRate_h(dim) = CoarseRate[dim];
126 lFineNodesPerDir_h(dim) = 1;
127 coarseRate_h(dim) = 1;
131 Kokkos::deep_copy(lFineNodesPerDir, lFineNodesPerDir_h);
132 Kokkos::deep_copy(coarseRate, coarseRate_h);
136 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
137 void IndexManager_kokkos<LocalOrdinal, GlobalOrdinal, Node>::computeMeshParameters() {
139 RCP<Teuchos::FancyOStream> out;
140 if(
const char* dbg = std::getenv(
"MUELU_INDEXMANAGER_DEBUG")) {
141 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
142 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
144 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
153 Kokkos::deep_copy(lFineNodesPerDir_h, lFineNodesPerDir);
154 Kokkos::deep_copy(coarseRate_h, coarseRate);
156 lNumFineNodes10 = lFineNodesPerDir_h(1)*lFineNodesPerDir_h(0);
157 lNumFineNodes = lFineNodesPerDir_h(2)*lNumFineNodes10;
158 for(
int dim = 0; dim < 3; ++dim) {
159 if(dim < numDimensions) {
160 endRate_h(dim) = (lFineNodesPerDir_h(dim) - 1) % coarseRate_h(dim);
161 if(endRate_h(dim) == 0) {endRate_h(dim) = coarseRate_h(dim);}
168 *out <<
"lFineNodesPerDir: {" << lFineNodesPerDir_h(0) <<
", " << lFineNodesPerDir_h(1) <<
", " 169 << lFineNodesPerDir_h(2) <<
"}" << std::endl;
170 *out <<
"endRate: {" << endRate_h(0) <<
", " << endRate_h(1) <<
", " 171 << endRate_h(2) <<
"}" << std::endl;
186 for(
int dim = 0; dim < 3; ++dim) {
187 if(dim < numDimensions) {
191 coarseNodesPerDir_h(dim) = (lFineNodesPerDir_h(dim) - endRate_h(dim) - 1)
192 / coarseRate_h(dim) + 2;
196 coarseNodesPerDir_h(dim) = 1;
201 if(lFineNodesPerDir_h(dim) < 1) {coarseNodesPerDir_h(dim) = 0;}
205 numCoarseNodes10 = coarseNodesPerDir_h(0)*coarseNodesPerDir_h(1);
206 numCoarseNodes = numCoarseNodes10*coarseNodesPerDir_h(2);
208 *out <<
"coarseNodesPerDir: {" << coarseNodesPerDir_h(0) <<
", " 209 << coarseNodesPerDir_h(1) <<
", " << coarseNodesPerDir_h(2) <<
"}" << std::endl;
210 *out <<
"numCoarseNodes=" << numCoarseNodes << std::endl;
213 Kokkos::deep_copy(coarseRate, coarseRate_h);
214 Kokkos::deep_copy(endRate, endRate_h);
215 Kokkos::deep_copy(lFineNodesPerDir, lFineNodesPerDir_h);
216 Kokkos::deep_copy(coarseNodesPerDir, coarseNodesPerDir_h);
219 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
220 Array<LocalOrdinal> IndexManager_kokkos<LocalOrdinal, GlobalOrdinal, Node>::
221 getCoarseNodesPerDirArray()
const {
222 typename LOTupleView::HostMirror coarseNodesPerDir_h = Kokkos::create_mirror_view(coarseNodesPerDir);
223 Kokkos::deep_copy(coarseNodesPerDir_h, coarseNodesPerDir);
224 Array<LO> coarseNodesPerDirArray(3);
226 for(
int dim = 0; dim < 3; ++dim) {
227 coarseNodesPerDirArray[dim] = coarseNodesPerDir_h(dim);
230 return coarseNodesPerDirArray;
235 #endif // HAVE_MUELU_KOKKOS_REFACTOR 236 #define MUELU_INDEXMANAGER_KOKKOS_SHORT 237 #endif // MUELU_INDEXMANAGER_DEF_KOKKOS_HPP
Namespace for MueLu classes and methods.