45 #ifndef AMESOS2_MATRIXADAPTER_DEF_HPP 46 #define AMESOS2_MATRIXADAPTER_DEF_HPP 47 #include <Tpetra_Util.hpp> 48 #include "Amesos2_MatrixAdapter_decl.hpp" 49 #include "Amesos2_ConcreteMatrixAdapter_def.hpp" 56 template <
class Matrix >
57 MatrixAdapter<Matrix>::MatrixAdapter(
const Teuchos::RCP<Matrix> m)
60 comm_ =
static_cast<const adapter_t*
>(
this)->getComm_impl();
61 col_map_ =
static_cast<const adapter_t*
>(
this)->getColMap_impl();
62 row_map_ =
static_cast<const adapter_t*
>(
this)->getRowMap_impl();
65 template <
class Matrix >
67 MatrixAdapter<Matrix>::getCrs(
const Teuchos::ArrayView<scalar_t> nzval,
68 const Teuchos::ArrayView<global_ordinal_t> colind,
69 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> rowptr,
70 typename MatrixAdapter<Matrix>::global_size_t& nnz,
71 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t, global_ordinal_t, node_t> > rowmap,
74 help_getCrs(nzval, colind, rowptr,
75 nnz, rowmap, ordering,
76 typename adapter_t::get_crs_spec());
79 template <
class Matrix >
81 MatrixAdapter<Matrix>::getCrs(
const Teuchos::ArrayView<scalar_t> nzval,
82 const Teuchos::ArrayView<global_ordinal_t> colind,
83 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> rowptr,
84 typename MatrixAdapter<Matrix>::global_size_t& nnz,
88 const Teuchos::RCP<const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap
89 = Util::getDistributionMap<local_ordinal_t,global_ordinal_t,global_size_t,node_t>(distribution,
90 this->getGlobalNumRows(),
92 this->getCrs(nzval, colind, rowptr, nnz, Teuchos::ptrInArg(*rowmap), ordering);
95 template <
class Matrix >
97 MatrixAdapter<Matrix>::getCcs(
const Teuchos::ArrayView<scalar_t> nzval,
98 const Teuchos::ArrayView<global_ordinal_t> rowind,
99 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> colptr,
100 typename MatrixAdapter<Matrix>::global_size_t& nnz,
101 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t, global_ordinal_t, node_t> > colmap,
104 help_getCcs(nzval, rowind, colptr,
105 nnz, colmap, ordering,
106 typename adapter_t::get_ccs_spec());
109 template <
class Matrix >
111 MatrixAdapter<Matrix>::getCcs(
const Teuchos::ArrayView<scalar_t> nzval,
112 const Teuchos::ArrayView<global_ordinal_t> rowind,
113 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> colptr,
114 typename MatrixAdapter<Matrix>::global_size_t& nnz,
118 const Teuchos::RCP<const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap
119 = Util::getDistributionMap<local_ordinal_t,global_ordinal_t,global_size_t,node_t>(distribution,
120 this->getGlobalNumCols(),
122 this->getCcs(nzval, rowind, colptr, nnz, Teuchos::ptrInArg(*colmap), ordering);
125 template <
class Matrix >
126 typename MatrixAdapter<Matrix>::global_size_t
129 return static_cast<const adapter_t*
>(
this)->getGlobalNumRows_impl();
132 template <
class Matrix >
133 typename MatrixAdapter<Matrix>::global_size_t
136 return static_cast<const adapter_t*
>(
this)->getGlobalNumCols_impl();
139 template <
class Matrix >
140 typename MatrixAdapter<Matrix>::global_size_t
143 return row_map_->getIndexBase();
146 template <
class Matrix >
147 typename MatrixAdapter<Matrix>::global_size_t
150 return col_map_->getIndexBase();
153 template <
class Matrix >
154 typename MatrixAdapter<Matrix>::global_size_t
157 return static_cast<const adapter_t*
>(
this)->getGlobalNNZ_impl();
160 template <
class Matrix >
164 return row_map_->getNodeNumElements();
167 template <
class Matrix >
171 return col_map_->getNodeNumElements();
174 template <
class Matrix >
178 return static_cast<const adapter_t*
>(
this)->getLocalNNZ_impl();
181 template <
class Matrix >
185 std::ostringstream oss;
186 oss <<
"Amesos2::MatrixAdapter wrapping: ";
191 template <
class Matrix >
194 const Teuchos::EVerbosityLevel verbLevel)
const 203 template <
class Matrix >
206 const Teuchos::ArrayView<global_ordinal_t> colind,
207 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> rowptr,
208 typename MatrixAdapter<Matrix>::global_size_t& nnz,
209 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap,
214 static_cast<const adapter_t*
>(
this)->getCrs_spec(nzval, colind, rowptr,
215 nnz, rowmap, ordering);
218 template <
class Matrix >
220 MatrixAdapter<Matrix>::help_getCrs(
const Teuchos::ArrayView<scalar_t> nzval,
221 const Teuchos::ArrayView<global_ordinal_t> colind,
222 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> rowptr,
223 typename MatrixAdapter<Matrix>::global_size_t& nnz,
224 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap,
226 no_special_impl nsi)
const 231 do_getCrs(nzval, colind, rowptr,
232 nnz, rowmap, ordering,
233 typename adapter_t::major_access());
236 template <
class Matrix >
238 MatrixAdapter<Matrix>::do_getCrs(
const Teuchos::ArrayView<scalar_t> nzval,
239 const Teuchos::ArrayView<global_ordinal_t> colind,
240 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> rowptr,
241 typename MatrixAdapter<Matrix>::global_size_t& nnz,
242 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap,
248 using Teuchos::ArrayView;
249 using Teuchos::OrdinalTraits;
254 RCP<const type> get_mat;
255 if( *rowmap == *this->row_map_ ){
257 get_mat = rcp(
this,
false);
259 get_mat =
get(rowmap);
269 RCP<const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rmap = get_mat->getRowMap();
271 ArrayView<const global_ordinal_t> node_elements = rmap->getNodeElementList();
272 if( node_elements.size() == 0 )
return;
274 typename ArrayView<const global_ordinal_t>::iterator row_it, row_end;
275 row_end = node_elements.end();
277 size_t rowptr_ind = OrdinalTraits<size_t>::zero();
278 global_ordinal_t rowInd = OrdinalTraits<global_ordinal_t>::zero();
279 for( row_it = node_elements.begin(); row_it != row_end; ++row_it ){
280 rowptr[rowptr_ind++] = rowInd;
281 size_t rowNNZ = get_mat->getGlobalRowNNZ(*row_it);
282 size_t nnzRet = OrdinalTraits<size_t>::zero();
283 ArrayView<global_ordinal_t> colind_view = colind.view(rowInd,rowNNZ);
284 ArrayView<scalar_t> nzval_view = nzval.view(rowInd,rowNNZ);
286 get_mat->getGlobalRowCopy(*row_it, colind_view, nzval_view, nnzRet);
287 for (
size_t rr = 0; rr < nnzRet ; rr++)
289 colind_view[rr] = colind_view[rr] - rmap->getIndexBase();
295 if( ordering == SORTED_INDICES ){
296 Tpetra::sort2(colind_view.begin(), colind_view.end(), nzval_view.begin());
299 TEUCHOS_TEST_FOR_EXCEPTION( rowNNZ != nnzRet,
301 "Number of values returned different from " 302 "number of values reported");
305 rowptr[rowptr_ind] = nnz = rowInd;
309 template <
class Matrix >
311 MatrixAdapter<Matrix>::do_getCrs(
const Teuchos::ArrayView<scalar_t> nzval,
312 const Teuchos::ArrayView<global_ordinal_t> colind,
313 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> rowptr,
314 typename MatrixAdapter<Matrix>::global_size_t& nnz,
315 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap,
319 using Teuchos::Array;
322 Array<scalar_t> nzval_tmp(nzval.size(), 0);
323 Array<global_ordinal_t> rowind(colind.size(), 0);
324 Array<global_size_t> colptr(this->getGlobalNumCols() + 1);
325 this->getCcs(nzval_tmp(), rowind(), colptr(), nnz, rowmap, ordering);
327 if( !nzval.is_null() && !colind.is_null() && !rowptr.is_null() )
328 Util::transpose(nzval_tmp(), rowind(), colptr(), nzval, colind, rowptr);
331 template <
class Matrix >
333 MatrixAdapter<Matrix>::help_getCcs(
const Teuchos::ArrayView<scalar_t> nzval,
334 const Teuchos::ArrayView<global_ordinal_t> rowind,
335 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> colptr,
336 typename MatrixAdapter<Matrix>::global_size_t& nnz,
337 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap,
339 has_special_impl hsi)
const 341 static_cast<const adapter_t*
>(
this)->getCcs_spec(nzval, rowind, colptr,
342 nnz, colmap, ordering);
345 template <
class Matrix >
347 MatrixAdapter<Matrix>::help_getCcs(
const Teuchos::ArrayView<scalar_t> nzval,
348 const Teuchos::ArrayView<global_ordinal_t> rowind,
349 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> colptr,
350 typename MatrixAdapter<Matrix>::global_size_t& nnz,
351 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap,
353 no_special_impl nsi)
const 357 do_getCcs(nzval, rowind, colptr,
358 nnz, colmap, ordering,
359 typename adapter_t::major_access());
362 template <
class Matrix >
364 MatrixAdapter<Matrix>::do_getCcs(
const Teuchos::ArrayView<scalar_t> nzval,
365 const Teuchos::ArrayView<global_ordinal_t> rowind,
366 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> colptr,
367 typename MatrixAdapter<Matrix>::global_size_t& nnz,
368 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap,
372 using Teuchos::Array;
377 Array<scalar_t> nzval_tmp(nzval.size(), 0);
378 Array<global_ordinal_t> colind(rowind.size(), 0);
379 Array<global_size_t> rowptr(this->getGlobalNumRows() + 1);
380 this->getCrs(nzval_tmp(), colind(), rowptr(), nnz, colmap, ordering);
382 if( !nzval.is_null() && !rowind.is_null() && !colptr.is_null() )
383 Util::transpose(nzval_tmp(), colind(), rowptr(), nzval, rowind, colptr);
386 template <
class Matrix >
388 MatrixAdapter<Matrix>::do_getCcs(
const Teuchos::ArrayView<scalar_t> nzval,
389 const Teuchos::ArrayView<global_ordinal_t> rowind,
390 const Teuchos::ArrayView<
typename MatrixAdapter<Matrix>::global_size_t> colptr,
391 typename MatrixAdapter<Matrix>::global_size_t& nnz,
392 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap,
397 using Teuchos::ArrayView;
398 using Teuchos::OrdinalTraits;
400 RCP<const type> get_mat;
401 if( *colmap == *this->col_map_ ){
403 get_mat = rcp(
this,
false);
405 get_mat =
get(colmap);
409 RCP<const Tpetra::Map<scalar_t,local_ordinal_t,global_ordinal_t> > cmap = get_mat->getColMap();
410 TEUCHOS_ASSERT( *colmap == *cmap );
412 ArrayView<global_ordinal_t> node_elements = cmap->getNodeElementList();
413 if( node_elements.size() == 0 )
return;
415 typename ArrayView<global_ordinal_t>::iterator col_it, col_end;
416 col_end = node_elements.end();
418 size_t colptr_ind = OrdinalTraits<size_t>::zero();
419 global_ordinal_t colInd = OrdinalTraits<global_ordinal_t>::zero();
420 for( col_it = node_elements.begin(); col_it != col_end; ++col_it ){
421 colptr[colptr_ind++] = colInd;
422 size_t colNNZ = getGlobalColNNZ(*col_it);
424 ArrayView<global_ordinal_t> rowind_view = rowind.view(colInd,colNNZ);
425 ArrayView<scalar_t> nzval_view = nzval.view(colInd,colNNZ);
426 getGlobalColCopy(*col_it, rowind_view, nzval_view, nnzRet);
431 if( ordering == SORTED_INDICES ){
432 Tpetra::sort2(rowind_view.begin(), rowind_view.end(), nzval_view.begin());
435 TEUCHOS_TEST_FOR_EXCEPTION( colNNZ != nnzRet,
437 "Number of values returned different from " 438 "number of values reported");
441 colptr[colptr_ind] = nnz = colInd;
446 template <
class Matrix >
449 const Teuchos::ArrayView<global_ordinal_t>& indices,
450 const Teuchos::ArrayView<scalar_t>& vals,
453 static_cast<const adapter_t*
>(
this)->getGlobalRowCopy_impl(row, indices, vals, nnz);
456 template <
class Matrix >
459 const Teuchos::ArrayView<global_ordinal_t>& indices,
460 const Teuchos::ArrayView<scalar_t>& vals,
463 static_cast<const adapter_t*
>(
this)->getGlobalColCopy_impl(col, indices, vals, nnz);
466 template <
class Matrix >
470 return static_cast<const adapter_t*
>(
this)->getMaxRowNNZ_impl();
473 template <
class Matrix >
475 MatrixAdapter<Matrix>::getMaxColNNZ()
const 477 return static_cast<const adapter_t*
>(
this)->getMaxColNNZ_impl();
480 template <
class Matrix >
482 MatrixAdapter<Matrix>::getGlobalRowNNZ(global_ordinal_t row)
const 484 return static_cast<const adapter_t*
>(
this)->getGlobalRowNNZ_impl(row);
487 template <
class Matrix >
489 MatrixAdapter<Matrix>::getLocalRowNNZ(local_ordinal_t row)
const 491 return static_cast<const adapter_t*
>(
this)->getLocalRowNNZ_impl(row);
494 template <
class Matrix >
496 MatrixAdapter<Matrix>::getGlobalColNNZ(global_ordinal_t col)
const 498 return static_cast<const adapter_t*
>(
this)->getGlobalColNNZ_impl(col);
501 template <
class Matrix >
503 MatrixAdapter<Matrix>::getLocalColNNZ(local_ordinal_t col)
const 505 return static_cast<const adapter_t*
>(
this)->getLocalColNNZ_impl(col);
508 template <
class Matrix >
510 MatrixAdapter<Matrix>::isLocallyIndexed()
const 512 return static_cast<const adapter_t*
>(
this)->isLocallyIndexed_impl();
515 template <
class Matrix >
517 MatrixAdapter<Matrix>::isGloballyIndexed()
const 519 return static_cast<const adapter_t*
>(
this)->isGloballyIndexed_impl();
522 template <
class Matrix >
523 Teuchos::RCP<const MatrixAdapter<Matrix> >
524 MatrixAdapter<Matrix>::get(
const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > map)
const 526 return static_cast<const adapter_t*
>(
this)->get_impl(map);
530 template <
class Matrix>
531 Teuchos::RCP<MatrixAdapter<Matrix> >
532 createMatrixAdapter(Teuchos::RCP<Matrix> m){
534 using Teuchos::rcp_const_cast;
536 if(m.is_null())
return Teuchos::null;
537 return( rcp(
new ConcreteMatrixAdapter<Matrix>(m)) );
540 template <
class Matrix>
541 Teuchos::RCP<const MatrixAdapter<Matrix> >
542 createConstMatrixAdapter(Teuchos::RCP<const Matrix> m){
544 using Teuchos::rcp_const_cast;
546 if(m.is_null())
return Teuchos::null;
547 return( rcp(
new ConcreteMatrixAdapter<Matrix>(rcp_const_cast<Matrix,const Matrix>(m))).getConst() );
552 #endif // AMESOS2_MATRIXADAPTER_DEF_HPP EStorage_Ordering
Definition: Amesos2_TypeDecl.hpp:140
Indicates that the concrete class has a special implementation that should be called.
Definition: Amesos2_TypeDecl.hpp:82
void transpose(ArrayView< Scalar > vals, ArrayView< GlobalOrdinal > indices, ArrayView< GlobalSizeT > ptr, ArrayView< Scalar > trans_vals, ArrayView< GlobalOrdinal > trans_indices, ArrayView< GlobalSizeT > trans_ptr)
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:76
std::string description() const
Returns a short description of this Solver.
Definition: Amesos2_MatrixAdapter_def.hpp:183
EDistribution
Definition: Amesos2_TypeDecl.hpp:123