50 #ifndef _ZOLTAN2_TPETRAROWMATRIXADAPTER_HPP_ 
   51 #define _ZOLTAN2_TPETRAROWMATRIXADAPTER_HPP_ 
   57 #include <Tpetra_RowMatrix.hpp> 
   75 template <
typename User, 
typename UserCoord=User>
 
   79 #ifndef DOXYGEN_SHOULD_SKIP_THIS 
   87   typedef UserCoord userCoord_t;
 
  100                          int nWeightsPerRow=0);
 
  152     return matrix_->getNodeNumRows();
 
  156     return matrix_->getNodeNumCols();
 
  160     return matrix_->getNodeNumEntries();
 
  167     ArrayView<const gno_t> rowView = rowMap_->getNodeElementList();
 
  168     rowIds = rowView.getRawPtr();
 
  173     offsets = offset_.getRawPtr();
 
  174     colIds = columnIds_.getRawPtr();
 
  180     offsets = offset_.getRawPtr();
 
  181     colIds = columnIds_.getRawPtr();
 
  182     values = values_.getRawPtr();
 
  191     if(idx<0 || idx >= nWeightsPerRow_)
 
  193       std::ostringstream emsg;
 
  194       emsg << __FILE__ << 
":" << __LINE__
 
  195            << 
"  Invalid row weight index " << idx << std::endl;
 
  196       throw std::runtime_error(emsg.str());
 
  201     rowWeights_[idx].getStridedList(length, weights, stride);
 
  206   template <
typename Adapter>
 
  210   template <
typename Adapter>
 
  216   RCP<const User> matrix_;
 
  217   RCP<const Tpetra::Map<lno_t, gno_t, node_t> > rowMap_;
 
  218   RCP<const Tpetra::Map<lno_t, gno_t, node_t> > colMap_;
 
  219   ArrayRCP<offset_t> offset_;
 
  220   ArrayRCP<gno_t> columnIds_;  
 
  221   ArrayRCP<scalar_t> values_;  
 
  224   ArrayRCP<StridedData<lno_t, scalar_t> > rowWeights_;
 
  225   ArrayRCP<bool> numNzWeight_;
 
  227   bool mayHaveDiagonalEntries;
 
  229   RCP<User> doMigration(
const User &from, 
size_t numLocalRows,
 
  230                         const gno_t *myNewRows) 
const;
 
  237 template <
typename User, 
typename UserCoord>
 
  239     const RCP<const User> &inmatrix, 
int nWeightsPerRow):
 
  240       matrix_(inmatrix), rowMap_(), colMap_(),
 
  241       offset_(), columnIds_(),
 
  242       nWeightsPerRow_(nWeightsPerRow), rowWeights_(), numNzWeight_(),
 
  243       mayHaveDiagonalEntries(true)
 
  247   rowMap_ = matrix_->getRowMap();
 
  248   colMap_ = matrix_->getColMap();
 
  250   size_t nrows = matrix_->getNodeNumRows();
 
  251   size_t nnz = matrix_->getNodeNumEntries();
 
  252   size_t maxnumentries =
 
  253          matrix_->getNodeMaxNumRowEntries(); 
 
  255   offset_.resize(nrows+1, 0);
 
  256   columnIds_.resize(nnz);
 
  258   ArrayRCP<lno_t> indices(maxnumentries); 
 
  259   ArrayRCP<scalar_t> nzs(maxnumentries);  
 
  261   for (
size_t i=0; i < nrows; i++){
 
  263     matrix_->getLocalRowCopy(row, indices(), nzs(), nnz); 
 
  264     for (
size_t j=0; j < nnz; j++){
 
  265       values_[next] = nzs[j];
 
  268       columnIds_[next++] = colMap_->getGlobalElement(indices[j]);
 
  270     offset_[i+1] = offset_[i] + nnz;
 
  273   if (nWeightsPerRow_ > 0){
 
  274     rowWeights_ = arcp(
new input_t [nWeightsPerRow_], 0, nWeightsPerRow_, 
true);
 
  275     numNzWeight_ = arcp(
new bool [nWeightsPerRow_], 0, nWeightsPerRow_, 
true);
 
  276     for (
int i=0; i < nWeightsPerRow_; i++)
 
  277       numNzWeight_[i] = 
false;
 
  282 template <
typename User, 
typename UserCoord>
 
  284     const scalar_t *weightVal, 
int stride, 
int idx)
 
  286   if (this->getPrimaryEntityType() == 
MATRIX_ROW)
 
  287     setRowWeights(weightVal, stride, idx);
 
  290     std::ostringstream emsg;
 
  291     emsg << __FILE__ << 
"," << __LINE__
 
  292          << 
" error:  setWeights not yet supported for" 
  293          << 
" columns or nonzeros." 
  295     throw std::runtime_error(emsg.str());
 
  300 template <
typename User, 
typename UserCoord>
 
  302     const scalar_t *weightVal, 
int stride, 
int idx)
 
  305   if(idx<0 || idx >= nWeightsPerRow_)
 
  307       std::ostringstream emsg;
 
  308       emsg << __FILE__ << 
":" << __LINE__
 
  309            << 
"  Invalid row weight index " << idx << std::endl;
 
  310       throw std::runtime_error(emsg.str());
 
  313   size_t nvtx = getLocalNumRows();
 
  314   ArrayRCP<const scalar_t> weightV(weightVal, 0, nvtx*stride, 
false);
 
  315   rowWeights_[idx] = input_t(weightV, stride);
 
  319 template <
typename User, 
typename UserCoord>
 
  323   if (this->getPrimaryEntityType() == 
MATRIX_ROW)
 
  324     setRowWeightIsNumberOfNonZeros(idx);
 
  327     std::ostringstream emsg;
 
  328     emsg << __FILE__ << 
"," << __LINE__
 
  329          << 
" error:  setWeightIsNumberOfNonZeros not yet supported for" 
  330          << 
" columns" << std::endl;
 
  331     throw std::runtime_error(emsg.str());
 
  336 template <
typename User, 
typename UserCoord>
 
  340   if(idx<0 || idx >= nWeightsPerRow_)
 
  342       std::ostringstream emsg;
 
  343       emsg << __FILE__ << 
":" << __LINE__
 
  344            << 
"  Invalid row weight index " << idx << std::endl;
 
  345       throw std::runtime_error(emsg.str());
 
  349   numNzWeight_[idx] = 
true;
 
  353 template <
typename User, 
typename UserCoord>
 
  354   template <
typename Adapter>
 
  356       const User &in, User *&out,
 
  361   ArrayRCP<gno_t> importList;
 
  365                                        (solution, 
this, importList);
 
  370   RCP<User> outPtr = doMigration(in, numNewRows, importList.getRawPtr());
 
  376 template <
typename User, 
typename UserCoord>
 
  377   template <
typename Adapter>
 
  379       const User &in, RCP<User> &out,
 
  384   ArrayRCP<gno_t> importList;
 
  388                                        (solution, 
this, importList);
 
  393   out = doMigration(in, numNewRows, importList.getRawPtr());
 
  398 template < 
typename User, 
typename UserCoord>
 
  402   const gno_t *myNewRows
 
  405   typedef Tpetra::Map<lno_t, gno_t, node_t> map_t;
 
  406   typedef Tpetra::CrsMatrix<scalar_t, lno_t, gno_t, node_t> tcrsmatrix_t;
 
  417   const tcrsmatrix_t *pCrsMatrix = 
dynamic_cast<const tcrsmatrix_t *
>(&from);
 
  420     throw std::logic_error(
"TpetraRowMatrixAdapter cannot migrate data for " 
  421                            "your RowMatrix; it can migrate data only for " 
  422                            "Tpetra::CrsMatrix.  " 
  423                            "You can inherit from TpetraRowMatrixAdapter and " 
  424                            "implement migration for your RowMatrix.");
 
  428   const RCP<const map_t> &smap = from.getRowMap();
 
  429   gno_t numGlobalRows = smap->getGlobalNumElements();
 
  430   gno_t base = smap->getMinAllGlobalIndex();
 
  433   ArrayView<const gno_t> rowList(myNewRows, numLocalRows);
 
  434   const RCP<const Teuchos::Comm<int> > &comm = from.getComm();
 
  435   RCP<const map_t> tmap = rcp(
new map_t(numGlobalRows, rowList, base, comm));
 
  438   Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
 
  458   int oldNumElts = smap->getNodeNumElements();
 
  459   int newNumElts = numLocalRows;
 
  462   typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> vector_t;
 
  463   vector_t numOld(smap);  
 
  464   vector_t numNew(tmap);  
 
  465   for (
int lid=0; lid < oldNumElts; lid++){
 
  466     numOld.replaceGlobalValue(smap->getGlobalElement(lid),
 
  467       scalar_t(from.getNumEntriesInLocalRow(lid)));
 
  469   numNew.doImport(numOld, importer, Tpetra::INSERT);
 
  472   ArrayRCP<size_t> nnz(newNumElts);
 
  474     ArrayRCP<scalar_t> ptr = numNew.getDataNonConst(0);
 
  475     for (
int lid=0; lid < newNumElts; lid++){
 
  476       nnz[lid] = 
static_cast<size_t>(ptr[lid]);
 
  480   RCP<tcrsmatrix_t> M =
 
  481     rcp(
new tcrsmatrix_t(tmap, nnz(), Tpetra::StaticProfile));
 
  483   M->doImport(from, importer, Tpetra::INSERT);
 
  487   return Teuchos::rcp_dynamic_cast<User>(M);
 
bool CRSViewAvailable() const 
Indicates whether the MatrixAdapter implements a view of the matrix in compressed sparse row (CRS) fo...
InputTraits< User >::scalar_t scalar_t
Helper functions for Partitioning Problems. 
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack. 
MatrixAdapter defines the adapter interface for matrices. 
InputTraits< User >::gno_t gno_t
InputTraits< User >::lno_t lno_t
bool useNumNonzerosAsRowWeight(int idx) const 
Indicate whether row weight with index idx should be the global number of nonzeros in the row...
size_t getImportList(const PartitioningSolution< SolutionAdapter > &solution, const DataAdapter *const data, ArrayRCP< typename DataAdapter::gno_t > &imports)
From a PartitioningSolution, get a list of IDs to be imported. Assumes part numbers in PartitioningSo...
~TpetraRowMatrixAdapter()
Destructor. 
Provides access for Zoltan2 to Tpetra::RowMatrix data. 
void getRowWeightsView(const scalar_t *&weights, int &stride, int idx=0) const 
size_t getLocalNumEntries() const 
Returns the number of nonzeros on this process. 
A PartitioningSolution is a solution to a partitioning problem. 
void getRowIDsView(const gno_t *&rowIds) const 
Sets pointer to this process' rows' global IDs. 
int getNumWeightsPerRow() const 
Returns the number of weights per row (0 or greater). Row weights may be used when partitioning matri...
size_t getLocalNumColumns() const 
Returns the number of columns on this process. 
The StridedData class manages lists of weights or coordinates. 
InputTraits< User >::part_t part_t
void getCRSView(const offset_t *&offsets, const gno_t *&colIds) const 
void applyPartitioningSolution(const User &in, User *&out, const PartitioningSolution< Adapter > &solution) const 
void setRowWeights(const scalar_t *weightVal, int stride, int idx=0)
Specify a weight for each row. 
void setWeightIsDegree(int idx)
Specify an index for which the weight should be the degree of the entity. 
Defines the MatrixAdapter interface. 
void setWeights(const scalar_t *weightVal, int stride, int idx=0)
Specify a weight for each entity of the primaryEntityType. 
size_t getLocalNumRows() const 
Returns the number of rows on this process. 
InputTraits< User >::offset_t offset_t
void setRowWeightIsNumberOfNonZeros(int idx)
Specify an index for which the row weight should be the global number of nonzeros in the row...
void getCRSView(const offset_t *&offsets, const gno_t *&colIds, const scalar_t *&values) const 
TpetraRowMatrixAdapter(const RCP< const User > &inmatrix, int nWeightsPerRow=0)
Constructor. 
This file defines the StridedData class. 
Zoltan2::BasicUserTypes< zscalar_t, zlno_t, zgno_t > user_t