10#ifndef TPETRA_MMHELPERS_DEF_HPP
11#define TPETRA_MMHELPERS_DEF_HPP
14#include "Teuchos_VerboseObject.hpp"
22template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
23CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::CrsMatrixStruct() {
26template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
27CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsMatrixStruct() {
31template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
32void CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
38template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
39BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockCrsMatrixStruct(
const LocalOrdinal blocksize_)
40 : blocksize(blocksize_) {
43template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
44BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~BlockCrsMatrixStruct() {
48template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
49void BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
52 origMatrix = Teuchos::null;
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;
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) {
75template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
76CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsWrapper_CrsMatrix() {
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();
85template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
86bool CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
88 return crsmat_.isFillComplete();
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);
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);
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)
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>;
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) {
132template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
133bool CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::isFillComplete() {
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>& ) {
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;
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);
171template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
172std::map<GlobalOrdinal, std::set<GlobalOrdinal>*>&
173CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::get_graph() {
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;
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>;
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.