11 #ifndef AMESOS2_MATRIXADAPTER_DEF_HPP
12 #define AMESOS2_MATRIXADAPTER_DEF_HPP
13 #include <Tpetra_Util.hpp>
14 #include "Amesos2_MatrixAdapter_decl.hpp"
15 #include "Amesos2_ConcreteMatrixAdapter_def.hpp"
18 #define TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM
19 #if defined(TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM)
20 #include "KokkosSparse_Utils.hpp"
21 #include "KokkosSparse_SortCrs.hpp"
22 #include "KokkosKernels_Sorting.hpp"
28 template <
class Matrix >
29 MatrixAdapter<Matrix>::MatrixAdapter(
const Teuchos::RCP<Matrix> m)
32 comm_ =
static_cast<const adapter_t*
>(
this)->getComm_impl();
33 col_map_ =
static_cast<const adapter_t*
>(
this)->getColMap_impl();
34 row_map_ =
static_cast<const adapter_t*
>(
this)->getRowMap_impl();
37 template <
class Matrix >
38 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
40 MatrixAdapter<Matrix>::getCrs_kokkos_view(KV_S & nzval,
43 typename MatrixAdapter<Matrix>::global_size_t& nnz,
44 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t, global_ordinal_t, node_t> > rowmap,
48 help_getCrs_kokkos_view(nzval, colind, rowptr,
49 nnz, rowmap, distribution, ordering,
50 typename adapter_t::get_crs_spec());
53 template <
class Matrix >
54 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
56 MatrixAdapter<Matrix>::getCrs_kokkos_view(KV_S & nzval,
59 typename MatrixAdapter<Matrix>::global_size_t& nnz,
63 const Teuchos::RCP<const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap
64 = Util::getDistributionMap<local_ordinal_t,global_ordinal_t,global_size_t,node_t>(distribution,
65 this->getGlobalNumRows(),
67 this->getCrs_kokkos_view(nzval, colind, rowptr, nnz, Teuchos::ptrInArg(*rowmap), ordering, distribution);
70 template <
class Matrix >
71 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
73 MatrixAdapter<Matrix>::getCcs_kokkos_view(KV_S & nzval,
76 typename MatrixAdapter<Matrix>::global_size_t& nnz,
77 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t, global_ordinal_t, node_t> > colmap,
81 help_getCcs_kokkos_view(nzval, rowind, colptr,
82 nnz, colmap, distribution, ordering,
83 typename adapter_t::get_ccs_spec());
86 template <
class Matrix >
87 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
89 MatrixAdapter<Matrix>::getCcs_kokkos_view(KV_S & nzval,
92 typename MatrixAdapter<Matrix>::global_size_t& nnz,
96 const Teuchos::RCP<const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap
97 = Util::getDistributionMap<local_ordinal_t,global_ordinal_t,global_size_t,node_t>(distribution,
98 this->getGlobalNumCols(),
100 this->getCcs_kokkos_view(nzval, rowind, colptr, nnz, Teuchos::ptrInArg(*colmap), ordering, distribution);
104 template <
class Matrix >
105 typename MatrixAdapter<Matrix>::global_size_t
108 return static_cast<const adapter_t*
>(
this)->getGlobalNumRows_impl();
111 template <
class Matrix >
112 typename MatrixAdapter<Matrix>::global_size_t
115 return static_cast<const adapter_t*
>(
this)->getGlobalNumCols_impl();
118 template <
class Matrix >
119 typename MatrixAdapter<Matrix>::global_size_t
124 return (row_map_ != Teuchos::null) ? row_map_->getIndexBase() : 0;
127 template <
class Matrix >
128 typename MatrixAdapter<Matrix>::global_size_t
133 return (col_map_ != Teuchos::null) ? col_map_->getIndexBase() : 0;
136 template <
class Matrix >
137 typename MatrixAdapter<Matrix>::global_size_t
140 return static_cast<const adapter_t*
>(
this)->getGlobalNNZ_impl();
143 template <
class Matrix >
147 return row_map_->getLocalNumElements();
150 template <
class Matrix >
154 return col_map_->getLocalNumElements();
157 template <
class Matrix >
161 return static_cast<const adapter_t*
>(
this)->getLocalNNZ_impl();
165 template <
class Matrix >
169 std::ostringstream oss;
170 oss <<
"Amesos2::MatrixAdapter wrapping: ";
175 template <
class Matrix >
178 const Teuchos::EVerbosityLevel verbLevel)
const
181 template <
class Matrix >
182 template <
class KV >
185 return static_cast<const adapter_t*
>(
this)->getSparseRowPtr_kokkos_view(view);
188 template <
class Matrix >
189 template <
class KV >
192 return static_cast<const adapter_t*
>(
this)->getSparseColInd_kokkos_view(view);
195 template <
class Matrix >
196 template <
class KV >
199 return static_cast<const adapter_t*
>(
this)->getSparseValues_kokkos_view(view);
205 template <
class Matrix >
206 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
211 typename MatrixAdapter<Matrix>::global_size_t& nnz,
212 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap,
220 do_getCrs_kokkos_view(nzval, colind, rowptr,
221 nnz, rowmap, distribution, ordering,
222 typename adapter_t::major_access());
225 template <
class Matrix >
226 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
228 MatrixAdapter<Matrix>::do_getCrs_kokkos_view(KV_S & nzval,
231 typename MatrixAdapter<Matrix>::global_size_t& nnz,
232 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rowmap,
242 if(this->row_map_ == Teuchos::null) {
243 this->returnValues_kokkos_view(nzval);
244 this->returnRowPtr_kokkos_view(rowptr);
245 this->returnColInd_kokkos_view(colind);
252 using Teuchos::ArrayView;
253 using Teuchos::OrdinalTraits;
257 RCP<const type> get_mat;
258 if( *rowmap == *this->row_map_ && distribution != CONTIGUOUS_AND_ROOTED ){
260 get_mat = rcp(
this,
false);
262 get_mat =
get(rowmap, distribution);
273 RCP<const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > rmap = get_mat->getRowMap();
274 ArrayView<const global_ordinal_t> node_elements = rmap->getLocalElementList();
276 typename ArrayView<const global_ordinal_t>::iterator row_it, row_end;
277 row_end = node_elements.end();
279 size_t rowptr_ind = OrdinalTraits<size_t>::zero();
280 global_ordinal_t rowInd = OrdinalTraits<global_ordinal_t>::zero();
283 typename KV_GS::HostMirror host_rowptr = Kokkos::create_mirror_view(rowptr);
285 #if !defined(TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM)
289 Kokkos::View<scalar_t*, Kokkos::HostSpace>
290 mat_nzval(Kokkos::ViewAllocateWithoutInitializing(
"mat_nzval"), nzval.size());
292 Kokkos::View<global_ordinal_t*, Kokkos::HostSpace>
293 mat_colind(Kokkos::ViewAllocateWithoutInitializing(
"mat_colind"), colind.size());
295 ArrayView<scalar_t> nzval_arrayview(mat_nzval.data(), nzval.size());
296 ArrayView<global_ordinal_t> colind_arrayview(mat_colind.data(), colind.size());
298 for( row_it = node_elements.begin(); row_it != row_end; ++row_it ){
299 host_rowptr(rowptr_ind++) = rowInd;
300 size_t rowNNZ = get_mat->getGlobalRowNNZ(*row_it);
301 size_t nnzRet = OrdinalTraits<size_t>::zero();
302 ArrayView<global_ordinal_t> colind_view = colind_arrayview.view(rowInd,rowNNZ);
303 ArrayView<scalar_t> nzval_view = nzval_arrayview.view(rowInd,rowNNZ);
305 get_mat->getGlobalRowCopy(*row_it, colind_view, nzval_view, nnzRet);
307 for (
size_t rr = 0; rr < nnzRet ; rr++) {
308 colind_view[rr] -= rmap->getIndexBase();
314 if( ordering == SORTED_INDICES ) {
315 Tpetra::sort2(colind_view.begin(), colind_view.end(), nzval_view.begin());
318 TEUCHOS_TEST_FOR_EXCEPTION( rowNNZ != nnzRet,
320 "Number of values returned different from "
321 "number of values reported");
324 host_rowptr(rowptr_ind) = nnz = rowInd;
326 deep_copy_or_assign_view(nzval, mat_nzval);
327 deep_copy_or_assign_view(colind, mat_colind);
328 deep_copy_or_assign_view(rowptr, host_rowptr);
331 global_host_idx_t mat_colind(Kokkos::ViewAllocateWithoutInitializing(
"mat_colind"), nzval.size());
332 global_host_val_t mat_nzvals(Kokkos::ViewAllocateWithoutInitializing(
"mat_nzvals"), colind.size());
334 auto host_colind = Kokkos::create_mirror_view(colind);
335 auto host_nzval = Kokkos::create_mirror_view(nzval);
338 for( row_it = node_elements.begin(); row_it != row_end; ++row_it ){
339 size_t rowNNZ = get_mat->getGlobalRowNNZ(*row_it);
340 size_t nnzRet = OrdinalTraits<size_t>::zero();
344 global_host_idx_t colind_view (&(mat_colind(rowInd)), rowNNZ);
345 global_host_val_t nzvals_view (&(mat_nzvals(rowInd)), rowNNZ);
347 global_ordinal_t row_id = *row_it;
348 get_mat->getGlobalRowCopy_kokkos_view(row_id, colind_view, nzvals_view, nnzRet);
350 TEUCHOS_TEST_FOR_EXCEPTION( rowNNZ != nnzRet,
352 "Number of values returned different from "
353 "number of values reported");
354 host_rowptr(rowptr_ind++) = rowInd;
357 host_rowptr(rowptr_ind) = nnz = rowInd;
360 if (rmap->getIndexBase() != 0) {
361 for (
size_t k = 0; k < mat_colind.extent(0); k++) {
362 mat_colind(k) -= rmap->getIndexBase();
367 deep_copy_or_assign_view(nzval, mat_nzvals);
368 deep_copy_or_assign_view(colind, mat_colind);
369 deep_copy_or_assign_view(rowptr, host_rowptr);
372 if( ordering == SORTED_INDICES ) {
373 using execution_space =
typename KV_GS::execution_space;
374 KokkosSparse::sort_crs_matrix <execution_space, KV_GS, KV_GO, KV_S>
375 (rowptr, colind, nzval);
380 template <
class Matrix >
381 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
383 MatrixAdapter<Matrix>::help_getCcs_kokkos_view(KV_S & nzval,
386 typename MatrixAdapter<Matrix>::global_size_t& nnz,
387 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap,
390 no_special_impl nsi)
const
395 do_getCcs_kokkos_view(nzval, rowind, colptr,
396 nnz, colmap, distribution, ordering,
397 typename adapter_t::major_access());
400 template <
class Matrix >
401 template<
typename KV_S,
typename KV_GO,
typename KV_GS>
403 MatrixAdapter<Matrix>::do_getCcs_kokkos_view(KV_S & nzval,
406 typename MatrixAdapter<Matrix>::global_size_t& nnz,
407 const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > colmap,
412 using Teuchos::ArrayView;
417 KV_S nzval_tmp(Kokkos::ViewAllocateWithoutInitializing(
"nzval_tmp"), nzval.size());
418 KV_GO colind(Kokkos::ViewAllocateWithoutInitializing(
"colind"), rowind.size());
419 KV_GS rowptr(Kokkos::ViewAllocateWithoutInitializing(
"rowptr"), this->getGlobalNumRows() + 1);
421 this->getCrs_kokkos_view(nzval_tmp, colind, rowptr, nnz, colmap, ordering, distribution);
427 ArrayView<typename KV_S::value_type> av_nzval_tmp(nzval_tmp.data(), nzval_tmp.size());
428 ArrayView<typename KV_GO::value_type> av_colind(colind.data(), colind.size());
429 ArrayView<typename KV_GS::value_type> av_rowptr(rowptr.data(), rowptr.size());
430 ArrayView<typename KV_S::value_type> av_nzval(nzval.data(), nzval.size());
431 ArrayView<typename KV_GO::value_type> av_rowind(rowind.data(), rowind.size());
432 ArrayView<typename KV_GS::value_type> av_colptr(colptr.data(), colptr.size());
433 Util::transpose(av_nzval_tmp, av_colind, av_rowptr, av_nzval, av_rowind, av_colptr);
438 template <
class Matrix >
439 template<
typename KV_GO,
typename KV_S>
446 static_cast<const adapter_t*
>(
this)->getGlobalRowCopy_kokkos_view_impl(row, indices, vals, nnz);
449 template <
class Matrix >
453 return static_cast<const adapter_t*
>(
this)->getMaxRowNNZ_impl();
456 template <
class Matrix >
458 MatrixAdapter<Matrix>::getMaxColNNZ()
const
460 return static_cast<const adapter_t*
>(
this)->getMaxColNNZ_impl();
463 template <
class Matrix >
465 MatrixAdapter<Matrix>::getGlobalRowNNZ(global_ordinal_t row)
const
467 return static_cast<const adapter_t*
>(
this)->getGlobalRowNNZ_impl(row);
470 template <
class Matrix >
472 MatrixAdapter<Matrix>::getLocalRowNNZ(local_ordinal_t row)
const
474 return static_cast<const adapter_t*
>(
this)->getLocalRowNNZ_impl(row);
477 template <
class Matrix >
479 MatrixAdapter<Matrix>::getGlobalColNNZ(global_ordinal_t col)
const
481 return static_cast<const adapter_t*
>(
this)->getGlobalColNNZ_impl(col);
484 template <
class Matrix >
486 MatrixAdapter<Matrix>::getLocalColNNZ(local_ordinal_t col)
const
488 return static_cast<const adapter_t*
>(
this)->getLocalColNNZ_impl(col);
491 template <
class Matrix >
493 MatrixAdapter<Matrix>::isLocallyIndexed()
const
495 return static_cast<const adapter_t*
>(
this)->isLocallyIndexed_impl();
498 template <
class Matrix >
500 MatrixAdapter<Matrix>::isGloballyIndexed()
const
502 return static_cast<const adapter_t*
>(
this)->isGloballyIndexed_impl();
506 template <
class Matrix >
507 Teuchos::RCP<const MatrixAdapter<Matrix> >
508 MatrixAdapter<Matrix>::get(
const Teuchos::Ptr<
const Tpetra::Map<local_ordinal_t,global_ordinal_t,node_t> > map,
EDistribution distribution)
const
510 return static_cast<const adapter_t*
>(
this)->get_impl(map, distribution);
514 template <
class Matrix>
515 Teuchos::RCP<MatrixAdapter<Matrix> >
516 createMatrixAdapter(Teuchos::RCP<Matrix> m){
518 using Teuchos::rcp_const_cast;
520 if(m.is_null())
return Teuchos::null;
521 return( rcp(
new ConcreteMatrixAdapter<Matrix>(m)) );
524 template <
class Matrix>
525 Teuchos::RCP<const MatrixAdapter<Matrix> >
526 createConstMatrixAdapter(Teuchos::RCP<const Matrix> m){
528 using Teuchos::rcp_const_cast;
530 if(m.is_null())
return Teuchos::null;
531 return( rcp(
new ConcreteMatrixAdapter<Matrix>(rcp_const_cast<Matrix,const Matrix>(m))).getConst() );
536 #endif // AMESOS2_MATRIXADAPTER_DEF_HPP
EStorage_Ordering
Definition: Amesos2_TypeDecl.hpp:107
void transpose(ArrayView< Scalar > vals, ArrayView< GlobalOrdinal > indices, ArrayView< GlobalSizeT > ptr, ArrayView< Scalar > trans_vals, ArrayView< GlobalOrdinal > trans_indices, ArrayView< GlobalSizeT > trans_ptr)
std::string description() const
Returns a short description of this Solver.
Definition: Amesos2_MatrixAdapter_def.hpp:167
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:42
Indicates that the concrete class can use the generic getC{c|r}s methods implemented in MatrixAdapter...
Definition: Amesos2_TypeDecl.hpp:57
EDistribution
Definition: Amesos2_TypeDecl.hpp:89