Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Tpetra_BlockMap_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Tpetra: Templated Linear Algebra Services Package
5 // Copyright (2008) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ************************************************************************
40 // @HEADER
41 
42 #ifndef TPETRA_BLOCKMAP_DECL_HPP
43 #define TPETRA_BLOCKMAP_DECL_HPP
44 
47 
48 #include <Tpetra_ConfigDefs.hpp>
49 #include <map>
50 #include <Tpetra_Map.hpp>
51 
52 namespace Tpetra {
53 
74 template <class LocalOrdinal = Details::DefaultTypes::local_ordinal_type,
75  class GlobalOrdinal = Details::DefaultTypes::global_ordinal_type,
77 class TPETRA_DEPRECATED BlockMap : public Teuchos::Describable {
78 public:
79  typedef LocalOrdinal local_ordinal_type;
80  typedef GlobalOrdinal global_ordinal_type;
81  typedef Node node_type;
83 
85 
86 
89  BlockMap (global_size_t numGlobalBlocks,
90  LocalOrdinal blockSize,
91  GlobalOrdinal indexBase,
92  const Teuchos::RCP<const Teuchos::Comm<int> > &comm,
93  const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ());
94 
96  BlockMap (global_size_t numGlobalBlocks,
97  size_t numLocalBlocks,
98  LocalOrdinal blockSize,
99  GlobalOrdinal indexBase,
100  const Teuchos::RCP<const Teuchos::Comm<int> > &comm,
101  const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ());
102 
105  BlockMap (const global_size_t numGlobalBlocks,
106  const Teuchos::ArrayView<const GlobalOrdinal>& myGlobalBlockIDs,
107  const Teuchos::ArrayView<const GlobalOrdinal>& myFirstGlobalPointInBlocks,
108  const Teuchos::ArrayView<const LocalOrdinal>& myBlockSizes,
109  const GlobalOrdinal indexBase,
110  const Teuchos::RCP<const Teuchos::Comm<int> > &comm,
111  const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ());
112 
118  BlockMap (const Teuchos::RCP<const point_map_type>& pointMap,
119  const Teuchos::ArrayView<const GlobalOrdinal>& myGlobalBlockIDs,
120  const Teuchos::ArrayView<const LocalOrdinal>& myBlockSizes);
121 
131  TPETRA_DEPRECATED
132  BlockMap (const Teuchos::RCP<const point_map_type>& pointMap,
133  const Teuchos::ArrayView<const GlobalOrdinal>& myGlobalBlockIDs,
134  const Teuchos::ArrayView<const LocalOrdinal>& myBlockSizes,
135  const Teuchos::RCP<Node>& node);
136 
138  ~BlockMap () {}
139 
141 
143 
145  Teuchos::RCP<const point_map_type> getPointMap () const {
146  return pointMap_;
147  }
148 
150  global_size_t getGlobalNumBlocks() const;
151 
153  size_t getNodeNumBlocks() const;
154 
156  Teuchos::ArrayView<const GlobalOrdinal> getNodeBlockIDs() const;
157 
159  bool isBlockSizeConstant() const;
160 
162  Teuchos::ArrayRCP<const LocalOrdinal> getNodeFirstPointInBlocks() const;
163 
165 
168  Teuchos::ArrayRCP<const LocalOrdinal> getNodeFirstPointInBlocks_Device() const;
169 
171 
173  GlobalOrdinal getGlobalBlockID(LocalOrdinal localBlockID) const;
174 
176 
178  LocalOrdinal getLocalBlockID(GlobalOrdinal globalBlockID) const;
179 
181 
184  LocalOrdinal getLocalBlockSize(LocalOrdinal localBlockID) const;
185 
187 
190  LocalOrdinal getFirstLocalPointInLocalBlock(LocalOrdinal localBlockID) const;
191 
193 
196  GlobalOrdinal getFirstGlobalPointInLocalBlock(LocalOrdinal localBlockID) const;
197 
199  void
200  getRemoteBlockInfo (const Teuchos::ArrayView<const GlobalOrdinal>& GBIDs,
201  const Teuchos::ArrayView<GlobalOrdinal>& firstGlobalPointInBlocks,
202  const Teuchos::ArrayView<LocalOrdinal>& blockSizes) const;
204 
205 private:
206  void
207  initWithPointMap (const Teuchos::RCP<const point_map_type>& pointMap,
208  const Teuchos::ArrayView<const GlobalOrdinal>& myGlobalBlockIDs,
209  const Teuchos::ArrayView<const LocalOrdinal>& blockSizes,
210  const Teuchos::RCP<Node>& node);
211 
212  void setup_noncontig_mapping();
213 
214  Teuchos::RCP<const point_map_type> pointMap_;
215  global_size_t globalNumBlocks_;
216  Teuchos::Array<GlobalOrdinal> myGlobalBlockIDs_;
217  Teuchos::ArrayRCP<LocalOrdinal> pbuf_firstPointInBlock_;
218  Teuchos::ArrayRCP<const LocalOrdinal> view_firstPointInBlock_;
219  bool blockIDsAreContiguous_;
220  LocalOrdinal constantBlockSize_;
224  std::map<GlobalOrdinal,LocalOrdinal> map_global_to_local_;
225 };
226 
227 
228 template<class LocalOrdinal,class GlobalOrdinal,class Node>
229 Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
230 convertBlockMapToPointMap (const Tpetra::BlockMap<LocalOrdinal,GlobalOrdinal,Node>& blockMap)
231 {
232  using Teuchos::RCP;
233  using Teuchos::rcp;
234  typedef Map<LocalOrdinal, GlobalOrdinal, Node> point_map_type;
235  typedef global_size_t GST;
236 
237  const GST numGlobalElems = Teuchos::OrdinalTraits<GST>::invalid ();
238  const GlobalOrdinal indexBase = blockMap.getPointMap ()->getIndexBase ();
239  RCP<const Teuchos::Comm<int> > comm = blockMap.getPointMap ()->getComm ();
240  RCP<Node> node = blockMap.getPointMap ()->getNode ();
241 
242  // Create a point-entry map where each point
243  // corresponds to a block in the block map.
244  return rcp (new point_map_type (numGlobalElems, blockMap.getNodeBlockIDs (),
245  indexBase, comm, node));
246 }
247 
248 } // namespace Tpetra
249 
250 #endif // ! TPETRA_BLOCKMAP_DECL_HPP
251 
Block-entry counterpart to Tpetra::Map.
KokkosClassic::DefaultNode::DefaultNodeType node_type
Default value of Node template parameter.
int global_ordinal_type
Default value of GlobalOrdinal template parameter.
int local_ordinal_type
Default value of LocalOrdinal template parameter.
size_t global_size_t
Global size_t object.
Teuchos::RCP< const point_map_type > getPointMap() const
Return this block Map's point-entry Map.
Describes a parallel distribution of objects over processes.
Teuchos::ArrayView< const GlobalOrdinal > getNodeBlockIDs() const
Return array-view of block-ids for this local processor.