MueLu Version of the Day
Loading...
Searching...
No Matches
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>
14#include <Teuchos_OrdinalTraits.hpp>
16
17namespace MueLu {
18
19template <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
44 this->gNumCoarseNodes10 = Teuchos::OrdinalTraits<GO>::invalid();
45 this->gNumCoarseNodes = Teuchos::OrdinalTraits<GO>::invalid();
46} // Constructor
47
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];
54} // computeGlobalCoarseParameters
55
56template <class LocalOrdinal, class GlobalOrdinal, class Node>
58 getGhostedNodesData(const RCP<const Map> /* fineMap */,
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
72template <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
109template <class LocalOrdinal, class GlobalOrdinal, class Node>
111 getCoarseMeshData() const {
112 std::vector<std::vector<GO> > coarseMeshData;
113 return coarseMeshData;
114}
115
116template <class LocalOrdinal, class GlobalOrdinal, class Node>
118 getFineNodeGlobalTuple(const GO /* myGID */, GO& /* i */, GO& /* j */, GO& /* k */) const {
119}
120
121template <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
131template <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
145template <class LocalOrdinal, class GlobalOrdinal, class Node>
147 getFineNodeGID(const GO /* i */, const GO /* j */, const GO /* k */, GO& /* myGID */) const {
148}
149
150template <class LocalOrdinal, class GlobalOrdinal, class Node>
152 getFineNodeLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
153}
154
155template <class LocalOrdinal, class GlobalOrdinal, class Node>
157 getCoarseNodeGlobalTuple(const GO /* myGID */, GO& /* i */, GO& /* j */, GO& /* k */) const {
158}
159
160template <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
170template <class LocalOrdinal, class GlobalOrdinal, class Node>
172 getCoarseNodeGID(const GO /* i */, const GO /* j */, const GO /* k */, GO& /* myGID */) const {
173}
174
175template <class LocalOrdinal, class GlobalOrdinal, class Node>
177 getCoarseNodeLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
178}
179
180template <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
186template <class LocalOrdinal, class GlobalOrdinal, class Node>
188 getCoarseNodeFineLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
189}
190
191template <class LocalOrdinal, class GlobalOrdinal, class Node>
193 getGhostedNodeFineLID(const LO /* i */, const LO /* j */, const LO /* k */, LO& /* myLID */) const {
194}
195
196template <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_ */
Container class for mesh layout and indices calculation.
GO gNumCoarseNodes
global number of nodes remaining after coarsening.
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
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 getFineNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
Namespace for MueLu classes and methods.