MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_UncoupledIndexManager_def.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // MueLu: A package for multigrid based preconditioning
4 //
5 // Copyright 2012 NTESS and the MueLu contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_
11 #define MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_
12 
13 #include <Xpetra_MapFactory.hpp>
16 
17 namespace MueLu {
18 
19 template <class LocalOrdinal, class GlobalOrdinal, class Node>
21  UncoupledIndexManager(const RCP<const Teuchos::Comm<int> > comm, const bool coupled,
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)
28  , myRank(MyRank)
29  , numRanks(NumRanks) {
30  // Load coarse rate, being careful about formating
31  for (int dim = 0; dim < 3; ++dim) {
32  if (dim < this->numDimensions) {
33  if (CoarseRate.size() == 1) {
34  this->coarseRate[dim] = CoarseRate[0];
35  } else if (CoarseRate.size() == this->numDimensions) {
36  this->coarseRate[dim] = CoarseRate[dim];
37  }
38  } else {
39  this->coarseRate[dim] = 1;
40  }
41  }
42 
43  this->computeMeshParameters();
46 } // Constructor
47 
48 template <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];
54 } // computeGlobalCoarseParameters
55 
56 template <class LocalOrdinal, class GlobalOrdinal, class Node>
59  Array<LO>& ghostedNodeCoarseLIDs,
60  Array<int>& ghostedNodeCoarsePIDs,
61  Array<GO>& /* ghostedNodeCoarseGIDs */) const {
62  // First we allocate memory for the outputs
63  ghostedNodeCoarseLIDs.resize(this->getNumLocalGhostedNodes());
64  ghostedNodeCoarsePIDs.resize(this->getNumLocalGhostedNodes());
65  // In the uncoupled case the data required is trivial to provide!
66  for (LO idx = 0; idx < this->getNumLocalGhostedNodes(); ++idx) {
67  ghostedNodeCoarseLIDs[idx] = idx;
68  ghostedNodeCoarsePIDs[idx] = myRank;
69  }
70 } // getGhostedNodesData
71 
72 template <class LocalOrdinal, class GlobalOrdinal, class Node>
74  getCoarseNodesData(const RCP<const Map> fineCoordinatesMap,
75  Array<GO>& coarseNodeCoarseGIDs,
76  Array<GO>& coarseNodeFineGIDs) const {
77  // Allocate sufficient amount of storage in output arrays
78  coarseNodeCoarseGIDs.resize(this->getNumLocalCoarseNodes());
79  coarseNodeFineGIDs.resize(this->getNumLocalCoarseNodes());
80 
81  // Load all the GIDs on the fine mesh
82  ArrayView<const GO> fineNodeGIDs = fineCoordinatesMap->getLocalElementList();
83 
84  // Extract the fine LIDs of the coarse nodes and store the corresponding GIDs
85  LO fineLID;
86  for (LO coarseLID = 0; coarseLID < this->getNumLocalCoarseNodes(); ++coarseLID) {
87  Array<LO> coarseIndices(3), fineIndices(3);
88  this->getCoarseNodeLocalTuple(coarseLID,
89  coarseIndices[0],
90  coarseIndices[1],
91  coarseIndices[2]);
92  for (int dim = 0; dim < 3; ++dim) {
93  if (coarseIndices[dim] == this->lCoarseNodesPerDir[dim] - 1) {
94  if (this->lCoarseNodesPerDir[dim] == 1) {
95  fineIndices[dim] = 0;
96  } else {
97  fineIndices[dim] = this->lFineNodesPerDir[dim] - 1;
98  }
99  } else {
100  fineIndices[dim] = coarseIndices[dim] * this->coarseRate[dim];
101  }
102  }
103 
104  fineLID = fineIndices[2] * this->lNumFineNodes10 + fineIndices[1] * this->lFineNodesPerDir[0] + fineIndices[0];
105  coarseNodeFineGIDs[coarseLID] = fineNodeGIDs[fineLID];
106  }
107 } // getCoarseNodesData
108 
109 template <class LocalOrdinal, class GlobalOrdinal, class Node>
110 std::vector<std::vector<GlobalOrdinal> > UncoupledIndexManager<LocalOrdinal, GlobalOrdinal, Node>::
112  std::vector<std::vector<GO> > coarseMeshData;
113  return coarseMeshData;
114 }
115 
116 template <class LocalOrdinal, class GlobalOrdinal, class Node>
118  getFineNodeGlobalTuple(const GO /* myGID */, GO& /* i */, GO& /* j */, GO& /* k */) const {
119 }
120 
121 template <class LocalOrdinal, class GlobalOrdinal, class Node>
123  getFineNodeLocalTuple(const LO myLID, LO& i, LO& j, LO& k) const {
124  LO tmp;
125  k = myLID / this->lNumFineNodes10;
126  tmp = myLID % this->lNumFineNodes10;
127  j = tmp / this->lFineNodesPerDir[0];
128  i = tmp % this->lFineNodesPerDir[0];
129 } // getFineNodeLocalTuple
130 
131 template <class LocalOrdinal, class GlobalOrdinal, class Node>
133  getFineNodeGhostedTuple(const LO myLID, LO& i, LO& j, LO& k) const {
134  LO tmp;
135  k = myLID / this->lNumFineNodes10;
136  tmp = myLID % this->lNumFineNodes10;
137  j = tmp / this->lFineNodesPerDir[0];
138  i = tmp % this->lFineNodesPerDir[0];
139 
140  k += this->offsets[2];
141  j += this->offsets[1];
142  i += this->offsets[0];
143 } // getFineNodeGhostedTuple
144 
145 template <class LocalOrdinal, class GlobalOrdinal, class Node>
147  getFineNodeGID(const GO /* i */, const GO /* j */, const GO /* k */, GO& /* myGID */) const {
148 }
149 
150 template <class LocalOrdinal, class GlobalOrdinal, class Node>
152  getFineNodeLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
153 }
154 
155 template <class LocalOrdinal, class GlobalOrdinal, class Node>
157  getCoarseNodeGlobalTuple(const GO /* myGID */, GO& /* i */, GO& /* j */, GO& /* k */) const {
158 }
159 
160 template <class LocalOrdinal, class GlobalOrdinal, class Node>
162  getCoarseNodeLocalTuple(const LO myLID, LO& i, LO& j, LO& k) const {
163  LO tmp;
164  k = myLID / this->lNumCoarseNodes10;
165  tmp = myLID % this->lNumCoarseNodes10;
166  j = tmp / this->lCoarseNodesPerDir[0];
167  i = tmp % this->lCoarseNodesPerDir[0];
168 } // getCoarseNodeLocalTuple
169 
170 template <class LocalOrdinal, class GlobalOrdinal, class Node>
172  getCoarseNodeGID(const GO /* i */, const GO /* j */, const GO /* k */, GO& /* myGID */) const {
173 }
174 
175 template <class LocalOrdinal, class GlobalOrdinal, class Node>
177  getCoarseNodeLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
178 }
179 
180 template <class LocalOrdinal, class GlobalOrdinal, class Node>
182  getCoarseNodeGhostedLID(const LO i, const LO j, const LO k, LO& myLID) const {
183  myLID = k * this->numGhostedNodes10 + j * this->ghostedNodesPerDir[0] + i;
184 } // getCoarseNodeGhostedLID
185 
186 template <class LocalOrdinal, class GlobalOrdinal, class Node>
188  getCoarseNodeFineLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
189 }
190 
191 template <class LocalOrdinal, class GlobalOrdinal, class Node>
193  getGhostedNodeFineLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
194 }
195 
196 template <class LocalOrdinal, class GlobalOrdinal, class Node>
198  getGhostedNodeCoarseLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
199 }
200 
201 } // namespace MueLu
202 
203 #endif /* MUELU_UNCOUPLEDINDEXMANAGER_DEF_HPP_ */
void getGhostedNodeCoarseLID(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
GlobalOrdinal GO
LocalOrdinal LO
void getCoarseNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
Array< int > coarseRate
coarsening rate in each direction
void getFineNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
void getFineNodeGhostedTuple(const LO myLID, LO &i, LO &j, LO &k) const
const int numDimensions
Number of spacial dimensions in the problem.
void resize(size_type new_size, const value_type &x=value_type())
void getFineNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
void getCoarseNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
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
size_type size() const
GO gNumCoarseNodes10
global number of nodes per 0-1 slice remaining after coarsening.
void getCoarseNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
void getFineNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
std::vector< std::vector< GO > > getCoarseMeshData() const
void getGhostedNodeFineLID(const LO i, const LO j, const LO k, LO &myLID) const
GO gNumCoarseNodes
global number of nodes remaining after coarsening.
void getCoarseNodesData(const RCP< const Map > fineCoordinatesMap, Array< GO > &coarseNodeCoarseGIDs, Array< GO > &coarseNodeFineGIDs) const
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 getCoarseNodeLID(const LO i, const LO j, const LO k, LO &myLID) const