46 #ifndef MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_ 47 #define MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_ 49 #include <Xpetra_MapFactory.hpp> 50 #include <Teuchos_OrdinalTraits.hpp> 55 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
58 const int NumDimensions,
const int interpolationOrder,
59 const int MyRank,
const int NumRanks,
60 const Array<GO> GFineNodesPerDir,
const Array<LO> LFineNodesPerDir,
61 const Array<LO> CoarseRate) :
62 IndexManager(comm, coupled, NumDimensions, interpolationOrder, GFineNodesPerDir, LFineNodesPerDir),
63 myRank(MyRank), numRanks(NumRanks) {
66 for(
int dim = 0; dim < 3; ++dim) {
68 if(CoarseRate.size() == 1) {
83 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
87 Teuchos::reduceAll(*(this->
comm_), Teuchos::REDUCE_SUM, 1, input, output);
91 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
94 Array<LO>& ghostedNodeCoarseLIDs,
95 Array<int>& ghostedNodeCoarsePIDs,
96 Array<GO>& ghostedNodeCoarseGIDs)
const {
103 ghostedNodeCoarseLIDs[idx] = idx;
104 ghostedNodeCoarsePIDs[idx] =
myRank;
108 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
111 Array<GO>& coarseNodeCoarseGIDs,
112 Array<GO>& coarseNodeFineGIDs)
const {
119 ArrayView<const GO> fineNodeGIDs = fineCoordinatesMap->getNodeElementList();
124 Array<LO> coarseIndices(3), fineIndices(3);
129 for(
int dim = 0; dim < 3; ++dim) {
133 fineIndices[dim] = coarseIndices[dim]*this->
coarseRate[dim];
140 coarseNodeFineGIDs[coarseLID] = fineNodeGIDs[fineLID];
145 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
148 std::vector<std::vector<GO> > coarseMeshData;
149 return coarseMeshData;
152 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
157 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
167 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
181 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
186 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
191 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
196 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
206 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
211 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
216 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
222 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
227 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
232 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
void getCoarseNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
void getGhostedNodeCoarseLID(const LO i, const LO j, const LO k, LO &myLID) const
LO getNumLocalGhostedNodes() const
LO getNumLocalCoarseNodes() const
Namespace for MueLu classes and methods.
Array< LO > offsets
distance between lowest (resp. highest) index to the lowest (resp. highest) ghostedNodeIndex in that ...
void getFineNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
const Array< LO > lFineNodesPerDir
local number of nodes per direction.
Array< LO > ghostedNodesPerDir
local number of ghosted nodes (i.e. ghost + coarse nodes) per direction
LO lNumCoarseNodes
local number of nodes remaining after coarsening.
LO numGhostedNodes10
local number of ghosted nodes (i.e. ghost + coarse nodes) per 0-1 slice.
Array< int > coarseRate
coarsening rate in each direction
void getCoarseNodeFineLID(const LO i, const LO j, const LO k, LO &myLID) const
void getCoarseNodeGhostedLID(const LO i, const LO j, const LO k, LO &myLID) const
const int numDimensions
Number of spacial dimensions in the problem.
Array< LO > lCoarseNodesPerDir
local number of nodes per direction remaing after coarsening.
const int myRank
Local rank ID.
void getFineNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
void getFineNodeLID(const LO i, const LO j, const LO k, LO &myLID) const
const RCP< const Teuchos::Comm< int > > comm_
Communicator used by uncoupled aggregation.
void getCoarseNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
UncoupledIndexManager()=default
LO lNumCoarseNodes10
local number of nodes per 0-1 slice remaining after coarsening.
void getCoarseNodeLID(const LO i, const LO j, const LO k, LO &myLID) const
void getCoarseNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
GO gNumCoarseNodes10
global number of nodes per 0-1 slice remaining after coarsening.
LO lNumFineNodes10
local number of nodes per 0-1 slice.
void getFineNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
void computeMeshParameters()
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
GO gNumCoarseNodes
global number of nodes remaining after coarsening.
Container class for mesh layout and indices calculation.
void getGhostedNodesData(const RCP< const Map > fineMap, Array< LO > &ghostedNodeCoarseLIDs, Array< int > &ghostedNodeCoarsePIDs, Array< GO > &ghostedNodeCoarseGIDs) const
void getFineNodeGhostedTuple(const LO myLID, LO &i, LO &j, LO &k) const
std::vector< std::vector< GO > > getCoarseMeshData() const
void computeGlobalCoarseParameters()