Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
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
20namespace Tpetra {
21
22template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
23CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::CrsMatrixStruct() {
24}
25
26template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
27CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsMatrixStruct() {
28 deleteContents();
29}
30
31template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
32void CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
33 deleteContents() {
34 importMatrix.reset();
35 origMatrix = Teuchos::null;
36}
37
38template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
39BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockCrsMatrixStruct(const LocalOrdinal blocksize_)
40 : blocksize(blocksize_) {
41}
42
43template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
44BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~BlockCrsMatrixStruct() {
45 deleteContents();
46}
47
48template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
49void BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
50 deleteContents() {
51 importMatrix.reset();
52 origMatrix = Teuchos::null;
53}
54
55template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
56int 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
69template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
70CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
71 CrsWrapper_CrsMatrix(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& crsmatrix)
72 : crsmat_(crsmatrix) {
73}
74
75template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
76CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsWrapper_CrsMatrix() {
77}
78
79template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
80Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
81CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getRowMap() const {
82 return crsmat_.getRowMap();
83}
84
85template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
86bool CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
87 isFillComplete() {
88 return crsmat_.isFillComplete();
89}
90
91template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
92void 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
99template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
100void 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
107template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
108CrsWrapper_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
120template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
121CrsWrapper_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
132template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
133bool CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::isFillComplete() {
134 return false;
135}
136
137template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
138void 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
163template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
164void 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
171template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
172std::map<GlobalOrdinal, std::set<GlobalOrdinal>*>&
173CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::get_graph() {
174 return graph_;
175}
176
177template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
178void 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
Declaration of Tpetra::MMMultiMultiply and nonmember constructors.
Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > origMatrix
The original matrix.
Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > importMatrix
The imported matrix.
Teuchos::RCP< const map_type > rowMap
Desired row map for "imported" version of the matrix.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
size_t global_size_t
Global size_t object.