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()
27template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
28CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsMatrixStruct()
33template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
38 origMatrix = Teuchos::null;
41template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
42BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockCrsMatrixStruct(
const LocalOrdinal blocksize_)
43 : blocksize(blocksize_)
47template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
48BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~BlockCrsMatrixStruct()
53template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
54void BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
58 origMatrix = Teuchos::null;
61template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
62int dumpCrsMatrixStruct (
const CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M)
64 std::cout <<
"proc " << M.rowMap->Comm().MyPID()<<std::endl;
65 std::cout <<
"numRows: " << M.numRows<<std::endl;
66 for(LocalOrdinal i=0; i<M.numRows; ++i) {
67 for(LocalOrdinal j=0; j<M.numEntriesPerRow[i]; ++j) {
68 std::cout <<
" "<<M.rowMap->GID(i)<<
" "
69 <<M.colMap->GID(M.indices[i][j])<<
" "<<M.values[i][j]<<std::endl;
76template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
77CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
78CrsWrapper_CrsMatrix (CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& crsmatrix)
83template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
84CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~CrsWrapper_CrsMatrix()
88template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
89Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
90CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getRowMap()
const
92 return crsmat_.getRowMap();
95template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
96bool CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
99 return crsmat_.isFillComplete ();
102template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
104CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
105insertGlobalValues (GlobalOrdinal globalRow,
106 const Teuchos::ArrayView<const GlobalOrdinal> &indices,
107 const Teuchos::ArrayView<const Scalar> &values)
109 crsmat_.insertGlobalValues (globalRow, indices, values);
112template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
114CrsWrapper_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
115sumIntoGlobalValues (GlobalOrdinal globalRow,
116 const Teuchos::ArrayView<const GlobalOrdinal> &indices,
117 const Teuchos::ArrayView<const Scalar> &values)
119 crsmat_.sumIntoGlobalValues (globalRow, indices, values);
124template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
125CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
126CrsWrapper_GraphBuilder (
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& map)
131 Teuchos::ArrayView<const GlobalOrdinal> rows = map->getLocalElementList ();
132 const LocalOrdinal numRows =
static_cast<LocalOrdinal
> (rows.size ());
133 for (LocalOrdinal i = 0; i < numRows; ++i) {
134 graph_[rows[i]] =
new std::set<GlobalOrdinal>;
138template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
139CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
140~CrsWrapper_GraphBuilder ()
142 typename std::map<GlobalOrdinal,std::set<GlobalOrdinal>*>::iterator
143 iter = graph_.begin(), iter_end = graph_.end();
144 for (; iter != iter_end; ++iter) {
150template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
151bool CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::isFillComplete()
156template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
158CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
159insertGlobalValues (GlobalOrdinal globalRow,
160 const Teuchos::ArrayView<const GlobalOrdinal> &indices,
161 const Teuchos::ArrayView<const Scalar> &)
163 typename std::map<GlobalOrdinal,std::set<GlobalOrdinal>*>::iterator
164 iter = graph_.find (globalRow);
166 TEUCHOS_TEST_FOR_EXCEPTION(
167 iter == graph_.end(), std::runtime_error,
168 "Tpetra::CrsWrapper_GraphBuilder::insertGlobalValues could not find row "
169 << globalRow <<
" in the graph. Super bummer man. Hope you figure it out.");
171 std::set<GlobalOrdinal>& cols = * (iter->second);
173 for (
typename Teuchos::ArrayView<const GlobalOrdinal>::size_type i = 0;
174 i < indices.size (); ++i) {
175 cols.insert (indices[i]);
179 if (row_length > max_row_length_) {
180 max_row_length_ = row_length;
184template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
186CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
187sumIntoGlobalValues (GlobalOrdinal globalRow,
188 const Teuchos::ArrayView<const GlobalOrdinal> &indices,
189 const Teuchos::ArrayView<const Scalar> &values)
191 insertGlobalValues (globalRow, indices, values);
194template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
195std::map<GlobalOrdinal,std::set<GlobalOrdinal>*>&
196CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>::get_graph ()
201template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
203insert_matrix_locations (CrsWrapper_GraphBuilder<Scalar, LocalOrdinal, GlobalOrdinal, Node>& graphbuilder,
204 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C)
206 global_size_t max_row_length = graphbuilder.get_max_row_length();
207 if (max_row_length < 1)
return;
209 Teuchos::Array<GlobalOrdinal> indices(max_row_length);
210 Teuchos::Array<Scalar> zeros(max_row_length, Teuchos::ScalarTraits<Scalar>::zero());
212 typedef std::map<GlobalOrdinal,std::set<GlobalOrdinal>*> Graph;
213 typedef typename Graph::iterator GraphIter;
214 Graph& graph = graphbuilder.get_graph ();
216 const GraphIter iter_end = graph.end ();
217 for (GraphIter iter = graph.begin (); iter != iter_end; ++iter) {
218 const GlobalOrdinal row = iter->first;
219 const std::set<GlobalOrdinal>& cols = * (iter->second);
221 const size_t num_entries = std::copy (cols.begin (), cols.end (), indices.begin ()) - indices.begin ();
223 C.insertGlobalValues (row, indices (0, num_entries), zeros (0, num_entries));
235#define TPETRA_CRSMATRIXSTRUCT_INSTANT(SCALAR,LO,GO,NODE) \
237 template class CrsMatrixStruct< SCALAR , LO , GO , NODE >;
239#define TPETRA_BLOCKCRSMATRIXSTRUCT_INSTANT(SCALAR,LO,GO,NODE) \
241 template class BlockCrsMatrixStruct< SCALAR , LO , GO , NODE >;
243#define TPETRA_CRSWRAPPER_INSTANT(SCALAR,LO,GO,NODE) \
245 template class CrsWrapper< SCALAR , LO , GO , NODE >;
247#define TPETRA_CRSWRAPPER_CRSMATRIX_INSTANT(SCALAR,LO,GO,NODE) \
249 template class CrsWrapper_CrsMatrix< SCALAR , LO , GO , NODE >;
251#define TPETRA_CRSWRAPPER_GRAPHBUILDER_INSTANT(SCALAR,LO,GO,NODE) \
253 template class CrsWrapper_GraphBuilder< SCALAR , LO , GO , NODE >;
Declaration of Tpetra::MMMultiMultiply and nonmember constructors.
Struct that holds views of the contents of a CrsMatrix.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
size_t global_size_t
Global size_t object.