10 #ifndef TPETRA_MMHELPERS_DEF_HPP
11 #define TPETRA_MMHELPERS_DEF_HPP
14 #include "Teuchos_VerboseObject.hpp"
22 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
23 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::CrsMatrixStruct() {
26 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
27 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsMatrixStruct() {
31 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
32 void CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
35 origMatrix = Teuchos::null;
38 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
39 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockCrsMatrixStruct(
const LocalOrdinal blocksize_)
40 : blocksize(blocksize_) {
43 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
44 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~BlockCrsMatrixStruct() {
48 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
49 void BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
52 origMatrix = Teuchos::null;
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;
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) {
75 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
76 CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsWrapper_CrsMatrix() {
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();
85 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
86 bool CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
88 return crsmat_.isFillComplete();
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);
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);
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)
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>;
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) {
132 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
133 bool CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::isFillComplete() {
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>& ) {
142 typename std::map<GlobalOrdinal, std::set<GlobalOrdinal>*>::iterator
143 iter = graph_.find(globalRow);
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.");
150 std::set<GlobalOrdinal>& cols = *(iter->second);
152 for (
typename Teuchos::ArrayView<const GlobalOrdinal>::size_type i = 0;
153 i < indices.size(); ++i) {
154 cols.insert(indices[i]);
158 if (row_length > max_row_length_) {
159 max_row_length_ = row_length;
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);
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() {
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;
183 Teuchos::Array<GlobalOrdinal> indices(max_row_length);
184 Teuchos::Array<Scalar> zeros(max_row_length, Teuchos::ScalarTraits<Scalar>::zero());
186 typedef std::map<GlobalOrdinal, std::set<GlobalOrdinal>*> Graph;
187 typedef typename Graph::iterator GraphIter;
188 Graph& graph = graphbuilder.get_graph();
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);
195 const size_t num_entries = std::copy(cols.begin(), cols.end(), indices.begin()) - indices.begin();
197 C.insertGlobalValues(row, indices(0, num_entries), zeros(0, num_entries));
209 #define TPETRA_CRSMATRIXSTRUCT_INSTANT(SCALAR, LO, GO, NODE) \
211 template class CrsMatrixStruct<SCALAR, LO, GO, NODE>;
213 #define TPETRA_BLOCKCRSMATRIXSTRUCT_INSTANT(SCALAR, LO, GO, NODE) \
215 template class BlockCrsMatrixStruct<SCALAR, LO, GO, NODE>;
217 #define TPETRA_CRSWRAPPER_INSTANT(SCALAR, LO, GO, NODE) \
219 template class CrsWrapper<SCALAR, LO, GO, NODE>;
221 #define TPETRA_CRSWRAPPER_CRSMATRIX_INSTANT(SCALAR, LO, GO, NODE) \
223 template class CrsWrapper_CrsMatrix<SCALAR, LO, GO, NODE>;
225 #define TPETRA_CRSWRAPPER_GRAPHBUILDER_INSTANT(SCALAR, LO, GO, NODE) \
227 template class CrsWrapper_GraphBuilder<SCALAR, LO, GO, NODE>;
229 #endif // TPETRA_MMHELPERS_DEF_HPP
size_t global_size_t
Global size_t object.
Declaration of Tpetra::MMMultiMultiply and nonmember constructors.