MueLu  Version of the Day
MueLu_LocalLexicographicIndexManager_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // MueLu: A package for multigrid based preconditioning
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact
39 // Jonathan Hu (jhu@sandia.gov)
40 // Ray Tuminaro (rstumin@sandia.gov)
41 // Luc Berger-Vergiat (lberge@sandia.gov)
42 //
43 // ***********************************************************************
44 //
45 // @HEADER
46 #ifndef MUELU_LOCALLEXICOGRAPHICINDEXMANAGER_DECL_HPP
47 #define MUELU_LOCALLEXICOGRAPHICINDEXMANAGER_DECL_HPP
48 
49 // use for Teuchos:Comm<T>
50 #include "Teuchos_CommHelpers.hpp"
51 
52 #include <Xpetra_Map_fwd.hpp>
53 #include <Xpetra_Vector_fwd.hpp>
54 #include <Xpetra_VectorFactory_fwd.hpp>
55 
56 #include "MueLu_ConfigDefs.hpp"
57 #include "MueLu_IndexManager.hpp"
59 
60 /*****************************************************************************
61 
62 ****************************************************************************/
63 
64 namespace MueLu {
65 
82  template <class LocalOrdinal, class GlobalOrdinal, class Node>
83  class LocalLexicographicIndexManager : public IndexManager<LocalOrdinal, GlobalOrdinal, Node> {
84 #undef MUELU_LOCALLEXICOGRAPHICINDEXMANAGER_SHORT
86 
87  public:
88 
90 
91  LocalLexicographicIndexManager(const RCP<const Teuchos::Comm<int> > comm, const bool coupled,
92  const int NumDimensions, const int interpolationOrder,
93  const int MyRank, const int NumRanks,
94  const Array<GO> GFineNodesPerDir,
95  const Array<LO> LFineNodesPerDir,
96  const Array<LO> CoarseRate, const Array<GO> MeshData);
97 
99 
101 
102  void getGhostedNodesData(const RCP<const Map> fineMap,
103  Array<LO>& ghostedNodeCoarseLIDs,
104  Array<int>& ghostedNodeCoarsePIDs,
105  Array<GO>& ghostedNodeCoarseGIDs) const;
106 
107  void getCoarseNodesData(const RCP<const Map> fineCoordinatesMap,
108  Array<GO>& coarseNodeCoarseGIDs,
109  Array<GO>& coarseNodeFineGIDs) const;
110 
111  std::vector<std::vector<GO> > getCoarseMeshData() const;
112 
113  void getFineNodeGlobalTuple(const GO myGID, GO& i, GO& j, GO& k) const;
114 
115  void getFineNodeLocalTuple(const LO myLID, LO& i, LO& j, LO& k) const;
116 
117  void getFineNodeGhostedTuple(const LO myLID, LO& i, LO& j, LO& k) const;
118 
119  void getFineNodeGID(const GO i, const GO j, const GO k, GO& myGID) const;
120 
121  void getFineNodeLID(const LO i, const LO j, const LO k, LO& myLID) const;
122 
123  void getCoarseNodeGlobalTuple(const GO myGID, GO& i, GO& j, GO& k) const;
124 
125  void getCoarseNodeLocalTuple(const LO myLID, LO& i, LO& j, LO& k) const;
126 
127  void getCoarseNodeGID(const GO i, const GO j, const GO k, GO& myGID) const;
128 
129  void getCoarseNodeLID(const LO i, const LO j, const LO k, LO& myLID) const;
130 
131  void getCoarseNodeGhostedLID(const LO i, const LO j, const LO k, LO& myLID) const;
132 
133  void getCoarseNodeFineLID(const LO i, const LO j, const LO k, LO& myLID) const;
134 
135  void getGhostedNodeFineLID(const LO i, const LO j, const LO k, LO& myLID) const;
136 
137  void getGhostedNodeCoarseLID(const LO i, const LO j, const LO k, LO& myLID) const;
138 
139  private:
140 
141  const int myRank;
142  const int numRanks;
143 
144  // Iterator delimiting the entries in meshData that correspond to the block that owns the local
145  // part of the mesh.
146  typename std::vector<std::vector<GO> >::iterator myBlockStart, myBlockEnd;
147 
148  int pi, pj, pk;
149 
150  int numBlocks;
151  int myBlock;
152 
155  std::vector<std::vector<GO> > meshData;
156  std::vector<std::vector<GO> > coarseMeshData;
157 
159 
161 
162  void getGIDLocalLexicographic(const LO iGhosted, const LO jGhosted, const LO kGhosted,
163  const Array<LO> coarseNodeFineIndices, GO& myGID, LO& myPID,
164  LO& myLID) const;
165 
166  };
167 
168 } //namespace MueLu
169 
170 #define MUELU_LOCALLEXICOGRAPHICINDEXMANAGER_SHORT
171 #endif // MUELU_LOCALLEXICOGRAPHICINDEXMANAGER_DECL_HPP
void getGhostedNodeFineLID(const LO i, const LO j, const LO k, LO &myLID) const
std::vector< std::vector< GO > > getCoarseMeshData() const
void getFineNodeLID(const LO i, const LO j, const LO k, LO &myLID) const
int myRankIndex
local process index for record in meshData after sorting.
void getCoarseNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
void getCoarseNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
std::vector< std::vector< GO > > meshData
layout of indices accross all processes.
void getCoarseNodesData(const RCP< const Map > fineCoordinatesMap, Array< GO > &coarseNodeCoarseGIDs, Array< GO > &coarseNodeFineGIDs) const
void getCoarseNodeLID(const LO i, const LO j, const LO k, LO &myLID) const
void getFineNodeGhostedTuple(const LO myLID, LO &i, LO &j, LO &k) const
Namespace for MueLu classes and methods.
void getFineNodeLocalTuple(const LO myLID, LO &i, LO &j, LO &k) const
void getGhostedNodesData(const RCP< const Map > fineMap, Array< LO > &ghostedNodeCoarseLIDs, Array< int > &ghostedNodeCoarsePIDs, Array< GO > &ghostedNodeCoarseGIDs) const
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
void getFineNodeGlobalTuple(const GO myGID, GO &i, GO &j, GO &k) const
std::vector< std::vector< GO > >::iterator myBlockStart
Array< int > rankIndices
mapping between rank ID and reordered rank ID.
const int numRanks
Number of ranks used to decompose the problem.
void getCoarseNodeFineLID(const LO i, const LO j, const LO k, LO &myLID) const
void getFineNodeGID(const GO i, const GO j, const GO k, GO &myGID) const
void getCoarseNodeGhostedLID(const LO i, const LO j, const LO k, LO &myLID) const
void getGIDLocalLexicographic(const LO iGhosted, const LO jGhosted, const LO kGhosted, const Array< LO > coarseNodeFineIndices, GO &myGID, LO &myPID, LO &myLID) const
Container class for mesh layout and indices calculation.
std::vector< std::vector< GO > > coarseMeshData
layout of indices accross all processes after coarsening.