10#ifndef MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_
11#define MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_
13#include <Xpetra_MapFactory.hpp>
14#include <Teuchos_OrdinalTraits.hpp>
19template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
22 const int NumDimensions,
const int interpolationOrder,
23 const int MyRank,
const int NumRanks,
24 const Array<GO> GFineNodesPerDir,
const Array<LO> LFineNodesPerDir,
25 const Array<LO> CoarseRate,
const bool singleCoarsePoint)
26 :
IndexManager(comm, coupled, singleCoarsePoint, NumDimensions, interpolationOrder,
27 Array<GO>(3, -1), LFineNodesPerDir)
29 , numRanks(NumRanks) {
31 for (
int dim = 0; dim < 3; ++dim) {
33 if (CoarseRate.size() == 1) {
35 }
else if (CoarseRate.size() == this->numDimensions) {
48template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
51 GO input[1] = {as<GO>(this->lNumCoarseNodes)}, output[1] = {0};
52 Teuchos::reduceAll(*(this->comm_), Teuchos::REDUCE_SUM, 1, input, output);
53 this->gNumCoarseNodes = output[0];
56template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
59 Array<LO>& ghostedNodeCoarseLIDs,
60 Array<int>& ghostedNodeCoarsePIDs,
63 ghostedNodeCoarseLIDs.resize(this->getNumLocalGhostedNodes());
64 ghostedNodeCoarsePIDs.resize(this->getNumLocalGhostedNodes());
66 for (LO idx = 0; idx < this->getNumLocalGhostedNodes(); ++idx) {
67 ghostedNodeCoarseLIDs[idx] = idx;
68 ghostedNodeCoarsePIDs[idx] = myRank;
72template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
75 Array<GO>& coarseNodeCoarseGIDs,
76 Array<GO>& coarseNodeFineGIDs)
const {
78 coarseNodeCoarseGIDs.resize(this->getNumLocalCoarseNodes());
79 coarseNodeFineGIDs.resize(this->getNumLocalCoarseNodes());
82 ArrayView<const GO> fineNodeGIDs = fineCoordinatesMap->getLocalElementList();
86 for (LO coarseLID = 0; coarseLID < this->getNumLocalCoarseNodes(); ++coarseLID) {
87 Array<LO> coarseIndices(3), fineIndices(3);
88 this->getCoarseNodeLocalTuple(coarseLID,
92 for (
int dim = 0; dim < 3; ++dim) {
93 if (coarseIndices[dim] == this->lCoarseNodesPerDir[dim] - 1) {
94 if (this->lCoarseNodesPerDir[dim] == 1) {
97 fineIndices[dim] = this->lFineNodesPerDir[dim] - 1;
100 fineIndices[dim] = coarseIndices[dim] * this->coarseRate[dim];
104 fineLID = fineIndices[2] * this->lNumFineNodes10 + fineIndices[1] * this->lFineNodesPerDir[0] + fineIndices[0];
105 coarseNodeFineGIDs[coarseLID] = fineNodeGIDs[fineLID];
109template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
112 std::vector<std::vector<GO> > coarseMeshData;
113 return coarseMeshData;
116template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
121template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
125 k = myLID / this->lNumFineNodes10;
126 tmp = myLID % this->lNumFineNodes10;
127 j = tmp / this->lFineNodesPerDir[0];
128 i = tmp % this->lFineNodesPerDir[0];
131template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
135 k = myLID / this->lNumFineNodes10;
136 tmp = myLID % this->lNumFineNodes10;
137 j = tmp / this->lFineNodesPerDir[0];
138 i = tmp % this->lFineNodesPerDir[0];
140 k += this->offsets[2];
141 j += this->offsets[1];
142 i += this->offsets[0];
145template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
150template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
155template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
160template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
164 k = myLID / this->lNumCoarseNodes10;
165 tmp = myLID % this->lNumCoarseNodes10;
166 j = tmp / this->lCoarseNodesPerDir[0];
167 i = tmp % this->lCoarseNodesPerDir[0];
170template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
175template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
180template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
183 myLID = k * this->numGhostedNodes10 + j * this->ghostedNodesPerDir[0] + i;
186template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
191template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
196template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
Container class for mesh layout and indices calculation.
GO gNumCoarseNodes
global number of nodes remaining after coarsening.
void computeMeshParameters()
Array< int > coarseRate
coarsening rate in each direction
const int numDimensions
Number of spacial dimensions in the problem.
GO gNumCoarseNodes10
global number of nodes per 0-1 slice remaining after coarsening.
void getCoarseNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
void getFineNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
void getCoarseNodesData(const RCP< const Map > fineCoordinatesMap, Array< GO > &coarseNodeCoarseGIDs, Array< GO > &coarseNodeFineGIDs) const
void getGhostedNodeFineLID(const LO i, const LO j, const LO k, LO &myLID) const
void getCoarseNodeFineLID(const LO i, const LO j, const LO k, LO &myLID) const
void getGhostedNodesData(const RCP< const Map > fineMap, Array< LO > &ghostedNodeCoarseLIDs, Array< int > &ghostedNodeCoarsePIDs, Array< GO > &ghostedNodeCoarseGIDs) const
void getGhostedNodeCoarseLID(const LO i, const LO j, const LO k, LO &myLID) const
void getCoarseNodeLID(const LO i, const LO j, const LO k, LO &myLID) const
void getFineNodeLID(const LO i, const LO j, const LO k, LO &myLID) const
UncoupledIndexManager()=default
void getCoarseNodeGhostedLID(const LO i, const LO j, const LO k, LO &myLID) const
std::vector< std::vector< GO > > getCoarseMeshData() const
void getFineNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
void getCoarseNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
void getCoarseNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
void getFineNodeGhostedTuple(const LO myLID, LO &i, LO &j, LO &k) const
void computeGlobalCoarseParameters()
void getFineNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
Namespace for MueLu classes and methods.