Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TpetraExt_MMHelpers_def.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Tpetra: Templated Linear Algebra Services Package
4 //
5 // Copyright 2008 NTESS and the Tpetra contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef TPETRA_MMHELPERS_DEF_HPP
11 #define TPETRA_MMHELPERS_DEF_HPP
12 
14 #include "Teuchos_VerboseObject.hpp"
15 
20 namespace Tpetra {
21 
22 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
23 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::CrsMatrixStruct() {
24 }
25 
26 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
27 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsMatrixStruct() {
28  deleteContents();
29 }
30 
31 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
32 void CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
33  deleteContents() {
34  importMatrix.reset();
35  origMatrix = Teuchos::null;
36 }
37 
38 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
39 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockCrsMatrixStruct(const LocalOrdinal blocksize_)
40  : blocksize(blocksize_) {
41 }
42 
43 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
44 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~BlockCrsMatrixStruct() {
45  deleteContents();
46 }
47 
48 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
49 void BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
50  deleteContents() {
51  importMatrix.reset();
52  origMatrix = Teuchos::null;
53 }
54 
55 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
56 int dumpCrsMatrixStruct(const CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M) {
57  std::cout << "proc " << M.rowMap->Comm().MyPID() << std::endl;
58  std::cout << "numRows: " << M.numRows << std::endl;
59  for (LocalOrdinal i = 0; i < M.numRows; ++i) {
60  for (LocalOrdinal j = 0; j < M.numEntriesPerRow[i]; ++j) {
61  std::cout << " " << M.rowMap->GID(i) << " "
62  << M.colMap->GID(M.indices[i][j]) << " " << M.values[i][j] << std::endl;
63  }
64  }
65 
66  return 0;
67 }
68 
69 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
70 CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
71  CrsWrapper_CrsMatrix(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& crsmatrix)
72  : crsmat_(crsmatrix) {
73 }
74 
75 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
76 CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsWrapper_CrsMatrix() {
77 }
78 
79 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
80 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
81 CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getRowMap() const {
82  return crsmat_.getRowMap();
83 }
84 
85 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
86 bool CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
87  isFillComplete() {
88  return crsmat_.isFillComplete();
89 }
90 
91 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
92 void CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
93  insertGlobalValues(GlobalOrdinal globalRow,
94  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
95  const Teuchos::ArrayView<const Scalar>& values) {
96  crsmat_.insertGlobalValues(globalRow, indices, values);
97 }
98 
99 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
100 void CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
101  sumIntoGlobalValues(GlobalOrdinal globalRow,
102  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
103  const Teuchos::ArrayView<const Scalar>& values) {
104  crsmat_.sumIntoGlobalValues(globalRow, indices, values);
105 }
106 
107 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
108 CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
109  CrsWrapper_GraphBuilder(const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& map)
110  : graph_()
111  , rowmap_(map)
112  , max_row_length_(0) {
113  Teuchos::ArrayView<const GlobalOrdinal> rows = map->getLocalElementList();
114  const LocalOrdinal numRows = static_cast<LocalOrdinal>(rows.size());
115  for (LocalOrdinal i = 0; i < numRows; ++i) {
116  graph_[rows[i]] = new std::set<GlobalOrdinal>;
117  }
118 }
119 
120 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
121 CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
122  ~CrsWrapper_GraphBuilder() {
123  typename std::map<GlobalOrdinal, std::set<GlobalOrdinal>*>::iterator
124  iter = graph_.begin(),
125  iter_end = graph_.end();
126  for (; iter != iter_end; ++iter) {
127  delete iter->second;
128  }
129  graph_.clear();
130 }
131 
132 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
133 bool CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::isFillComplete() {
134  return false;
135 }
136 
137 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
138 void CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
139  insertGlobalValues(GlobalOrdinal globalRow,
140  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
141  const Teuchos::ArrayView<const Scalar>& /* values */) {
142  typename std::map<GlobalOrdinal, std::set<GlobalOrdinal>*>::iterator
143  iter = graph_.find(globalRow);
144 
145  TEUCHOS_TEST_FOR_EXCEPTION(
146  iter == graph_.end(), std::runtime_error,
147  "Tpetra::CrsWrapper_GraphBuilder::insertGlobalValues could not find row "
148  << globalRow << " in the graph. Super bummer man. Hope you figure it out.");
149 
150  std::set<GlobalOrdinal>& cols = *(iter->second);
151 
152  for (typename Teuchos::ArrayView<const GlobalOrdinal>::size_type i = 0;
153  i < indices.size(); ++i) {
154  cols.insert(indices[i]);
155  }
156 
157  const global_size_t row_length = static_cast<global_size_t>(cols.size());
158  if (row_length > max_row_length_) {
159  max_row_length_ = row_length;
160  }
161 }
162 
163 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
164 void CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
165  sumIntoGlobalValues(GlobalOrdinal globalRow,
166  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
167  const Teuchos::ArrayView<const Scalar>& values) {
168  insertGlobalValues(globalRow, indices, values);
169 }
170 
171 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
172 std::map<GlobalOrdinal, std::set<GlobalOrdinal>*>&
173 CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::get_graph() {
174  return graph_;
175 }
176 
177 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
178 void insert_matrix_locations(CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>& graphbuilder,
179  CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C) {
180  global_size_t max_row_length = graphbuilder.get_max_row_length();
181  if (max_row_length < 1) return;
182 
183  Teuchos::Array<GlobalOrdinal> indices(max_row_length);
184  Teuchos::Array<Scalar> zeros(max_row_length, Teuchos::ScalarTraits<Scalar>::zero());
185 
186  typedef std::map<GlobalOrdinal, std::set<GlobalOrdinal>*> Graph;
187  typedef typename Graph::iterator GraphIter;
188  Graph& graph = graphbuilder.get_graph();
189 
190  const GraphIter iter_end = graph.end();
191  for (GraphIter iter = graph.begin(); iter != iter_end; ++iter) {
192  const GlobalOrdinal row = iter->first;
193  const std::set<GlobalOrdinal>& cols = *(iter->second);
194  // "copy" entries out of set into contiguous array storage
195  const size_t num_entries = std::copy(cols.begin(), cols.end(), indices.begin()) - indices.begin();
196  // insert zeros into the result matrix at the appropriate locations
197  C.insertGlobalValues(row, indices(0, num_entries), zeros(0, num_entries));
198  }
199 }
200 
201 } // namespace Tpetra
202 
203 //
204 // Explicit instantiation macro
205 //
206 // Must be expanded from within the Tpetra namespace!
207 //
208 
209 #define TPETRA_CRSMATRIXSTRUCT_INSTANT(SCALAR, LO, GO, NODE) \
210  \
211  template class CrsMatrixStruct<SCALAR, LO, GO, NODE>;
212 
213 #define TPETRA_BLOCKCRSMATRIXSTRUCT_INSTANT(SCALAR, LO, GO, NODE) \
214  \
215  template class BlockCrsMatrixStruct<SCALAR, LO, GO, NODE>;
216 
217 #define TPETRA_CRSWRAPPER_INSTANT(SCALAR, LO, GO, NODE) \
218  \
219  template class CrsWrapper<SCALAR, LO, GO, NODE>;
220 
221 #define TPETRA_CRSWRAPPER_CRSMATRIX_INSTANT(SCALAR, LO, GO, NODE) \
222  \
223  template class CrsWrapper_CrsMatrix<SCALAR, LO, GO, NODE>;
224 
225 #define TPETRA_CRSWRAPPER_GRAPHBUILDER_INSTANT(SCALAR, LO, GO, NODE) \
226  \
227  template class CrsWrapper_GraphBuilder<SCALAR, LO, GO, NODE>;
228 
229 #endif // TPETRA_MMHELPERS_DEF_HPP
size_t global_size_t
Global size_t object.
Declaration of Tpetra::MMMultiMultiply and nonmember constructors.