46 #ifndef MUELU_INDEXMANAGER_DEF_KOKKOS_HPP
47 #define MUELU_INDEXMANAGER_DEF_KOKKOS_HPP
53 #include <Xpetra_MapFactory.hpp>
66 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69 const int interpolationOrder,
74 , coarseRate(
"coarsening rate")
76 , lFineNodesPerDir(
"lFineNodesPerDir")
77 , coarseNodesPerDir(
"lFineNodesPerDir") {
79 if (
const char* dbg = std::getenv(
"MUELU_INDEXMANAGER_DEBUG")) {
80 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
86 setupIM(NumDimensions, interpolationOrder, CoarseRate, LFineNodesPerDir);
88 *out <<
"Done setting up the IndexManager" << std::endl;
92 *out <<
"Computed Mesh Parameters" << std::endl;
96 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
98 setupIM(
const int NumDimensions,
const int interpolationOrder,
100 numDimensions = NumDimensions;
101 interpolationOrder_ = interpolationOrder;
105 "LFineNodesPerDir has to be of size 3 or of size numDimensions!");
107 typename Kokkos::View<LO[3], device_type>::HostMirror lFineNodesPerDir_h = Kokkos::create_mirror_view(lFineNodesPerDir);
108 Kokkos::deep_copy(lFineNodesPerDir_h, lFineNodesPerDir);
109 typename Kokkos::View<LO[3], device_type>::HostMirror coarseRate_h = Kokkos::create_mirror_view(coarseRate);
110 Kokkos::deep_copy(coarseRate_h, coarseRate);
114 for (
int dim = 0; dim < 3; ++dim) {
115 if (dim < getNumDimensions()) {
116 lFineNodesPerDir_h(dim) = LFineNodesPerDir[dim];
117 if (CoarseRate.
size() == 1) {
118 coarseRate_h(dim) = CoarseRate[0];
119 }
else if (CoarseRate.
size() == getNumDimensions()) {
120 coarseRate_h(dim) = CoarseRate[dim];
123 lFineNodesPerDir_h(dim) = 1;
124 coarseRate_h(dim) = 1;
128 Kokkos::deep_copy(lFineNodesPerDir, lFineNodesPerDir_h);
129 Kokkos::deep_copy(coarseRate, coarseRate_h);
133 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
136 if (
const char* dbg = std::getenv(
"MUELU_INDEXMANAGER_DEBUG")) {
137 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
143 typename Kokkos::View<int[3], device_type>::HostMirror coarseRate_h = Kokkos::create_mirror_view(coarseRate);
144 typename Kokkos::View<int[3], device_type>::HostMirror endRate_h = Kokkos::create_mirror_view(endRate);
146 typename Kokkos::View<LO[3], device_type>::HostMirror lFineNodesPerDir_h = Kokkos::create_mirror_view(lFineNodesPerDir);
147 typename Kokkos::View<LO[3], device_type>::HostMirror coarseNodesPerDir_h = Kokkos::create_mirror_view(coarseNodesPerDir);
148 Kokkos::deep_copy(lFineNodesPerDir_h, lFineNodesPerDir);
149 Kokkos::deep_copy(coarseRate_h, coarseRate);
151 lNumFineNodes10 = lFineNodesPerDir_h(1) * lFineNodesPerDir_h(0);
152 lNumFineNodes = lFineNodesPerDir_h(2) * lNumFineNodes10;
153 for (
int dim = 0; dim < 3; ++dim) {
154 if (dim < numDimensions) {
155 endRate_h(dim) = (lFineNodesPerDir_h(dim) - 1) % coarseRate_h(dim);
156 if (endRate_h(dim) == 0) {
157 endRate_h(dim) = coarseRate_h(dim);
165 *out <<
"lFineNodesPerDir: {" << lFineNodesPerDir_h(0) <<
", " << lFineNodesPerDir_h(1) <<
", "
166 << lFineNodesPerDir_h(2) <<
"}" << std::endl;
167 *out <<
"endRate: {" << endRate_h(0) <<
", " << endRate_h(1) <<
", "
168 << endRate_h(2) <<
"}" << std::endl;
183 for (
int dim = 0; dim < 3; ++dim) {
184 if (dim < numDimensions) {
188 coarseNodesPerDir_h(dim) = (lFineNodesPerDir_h(dim) - endRate_h(dim) - 1) / coarseRate_h(dim) + 2;
192 coarseNodesPerDir_h(dim) = 1;
197 if (lFineNodesPerDir_h(dim) < 1) {
198 coarseNodesPerDir_h(dim) = 0;
203 numCoarseNodes10 = coarseNodesPerDir_h(0) * coarseNodesPerDir_h(1);
204 numCoarseNodes = numCoarseNodes10 * coarseNodesPerDir_h(2);
206 *out <<
"coarseNodesPerDir: {" << coarseNodesPerDir_h(0) <<
", "
207 << coarseNodesPerDir_h(1) <<
", " << coarseNodesPerDir_h(2) <<
"}" << std::endl;
208 *out <<
"numCoarseNodes=" << numCoarseNodes << std::endl;
211 Kokkos::deep_copy(coarseRate, coarseRate_h);
212 Kokkos::deep_copy(endRate, endRate_h);
213 Kokkos::deep_copy(lFineNodesPerDir, lFineNodesPerDir_h);
214 Kokkos::deep_copy(coarseNodesPerDir, coarseNodesPerDir_h);
217 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
220 typename LOTupleView::HostMirror coarseNodesPerDir_h = Kokkos::create_mirror_view(coarseNodesPerDir);
221 Kokkos::deep_copy(coarseNodesPerDir_h, coarseNodesPerDir);
224 for (
int dim = 0; dim < 3; ++dim) {
225 coarseNodesPerDirArray[dim] = coarseNodesPerDir_h(dim);
228 return coarseNodesPerDirArray;
233 #define MUELU_INDEXMANAGER_KOKKOS_SHORT
234 #endif // MUELU_INDEXMANAGER_DEF_KOKKOS_HPP
void setupIM(const int NumDimensions, const int interpolationOrder, const ArrayView< const int > coarseRate, const ArrayView< const LO > LFineNodesPerDir)
Common setup pattern used for all the different types of undelying mesh.
basic_FancyOStream & setShowProcRank(const bool showProcRank)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void computeMeshParameters()
Array< LO > getCoarseNodesPerDirArray() const
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
Exception throws to report errors in the internal logical of the program.
IndexManager_kokkos()=default
Default constructor, return empty object.