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.