52 #ifndef AMESOS2_UTIL_HPP 53 #define AMESOS2_UTIL_HPP 55 #include "Amesos2_config.h" 57 #include <Teuchos_RCP.hpp> 58 #include <Teuchos_BLAS_types.hpp> 59 #include <Teuchos_ArrayView.hpp> 60 #include <Teuchos_FancyOStream.hpp> 62 #ifdef HAVE_AMESOS2_EPETRA 63 # include <Epetra_Map.h> 66 #include <Tpetra_Map.hpp> 83 using Teuchos::ArrayView;
86 using Meta::if_then_else;
103 template <
typename LO,
typename GO,
typename GS,
typename Node>
104 const Teuchos::RCP<const Tpetra::Map<LO,GO,Node> >
106 GS num_global_elements,
107 const Teuchos::RCP<
const Teuchos::Comm<int> >& comm,
111 #ifdef HAVE_AMESOS2_EPETRA 117 template <
typename LO,
typename GO,
typename GS,
typename Node>
118 RCP<Tpetra::Map<LO,GO,Node> >
126 template <
typename LO,
typename GO,
typename GS,
typename Node>
135 const RCP<const Teuchos::Comm<int> >
to_teuchos_comm(RCP<const Epetra_Comm> c);
142 const RCP<const Epetra_Comm>
to_epetra_comm(RCP<
const Teuchos::Comm<int> > c);
143 #endif // HAVE_AMESOS2_EPETRA 150 template <
typename Scalar,
151 typename GlobalOrdinal,
152 typename GlobalSizeT>
154 ArrayView<GlobalOrdinal> indices,
155 ArrayView<GlobalSizeT> ptr,
156 ArrayView<Scalar> trans_vals,
157 ArrayView<GlobalOrdinal> trans_indices,
158 ArrayView<GlobalSizeT> trans_ptr);
173 template <
typename Scalar1,
typename Scalar2>
174 void scale(ArrayView<Scalar1> vals,
size_t l,
175 size_t ld, ArrayView<Scalar2> s);
195 template <
typename Scalar1,
typename Scalar2,
class BinaryOp>
196 void scale(ArrayView<Scalar1> vals,
size_t l,
197 size_t ld, ArrayView<Scalar2> s, BinaryOp binary_op);
201 void printLine( Teuchos::FancyOStream &out );
208 #ifndef DOXYGEN_SHOULD_SKIP_THIS 231 template <
class M,
typename S,
typename GO,
typename GS,
class Op>
232 struct same_gs_helper
234 static void do_get(
const Teuchos::Ptr<const M> mat,
235 const ArrayView<typename M::scalar_t> nzvals,
236 const ArrayView<typename M::global_ordinal_t> indices,
237 const ArrayView<GS> pointers,
240 const Tpetra::Map<
typename M::local_ordinal_t,
241 typename M::global_ordinal_t,
242 typename M::node_t> > map,
245 Op::apply(mat, nzvals, indices, pointers, nnz, map, ordering);
249 template <
class M,
typename S,
typename GO,
typename GS,
class Op>
250 struct diff_gs_helper
252 static void do_get(
const Teuchos::Ptr<const M> mat,
253 const ArrayView<typename M::scalar_t> nzvals,
254 const ArrayView<typename M::global_ordinal_t> indices,
255 const ArrayView<GS> pointers,
258 const Tpetra::Map<
typename M::local_ordinal_t,
259 typename M::global_ordinal_t,
260 typename M::node_t> > map,
263 typedef typename M::global_size_t mat_gs_t;
264 typename ArrayView<GS>::size_type i, size = pointers.size();
265 Teuchos::Array<mat_gs_t> pointers_tmp(size);
266 mat_gs_t nnz_tmp = 0;
268 Op::apply(mat, nzvals, indices, pointers_tmp, nnz_tmp, map, ordering);
270 for (i = 0; i < size; ++i){
271 pointers[i] = Teuchos::as<GS>(pointers_tmp[i]);
273 nnz = Teuchos::as<GS>(nnz_tmp);
277 template <
class M,
typename S,
typename GO,
typename GS,
class Op>
278 struct same_go_helper
280 static void do_get(
const Teuchos::Ptr<const M> mat,
281 const ArrayView<typename M::scalar_t> nzvals,
282 const ArrayView<GO> indices,
283 const ArrayView<GS> pointers,
286 const Tpetra::Map<
typename M::local_ordinal_t,
287 typename M::global_ordinal_t,
288 typename M::node_t> > map,
291 typedef typename M::global_size_t mat_gs_t;
292 if_then_else<is_same<GS,mat_gs_t>::value,
293 same_gs_helper<M,S,GO,GS,Op>,
294 diff_gs_helper<M,S,GO,GS,Op> >::type::do_get(mat, nzvals, indices,
300 template <
class M,
typename S,
typename GO,
typename GS,
class Op>
301 struct diff_go_helper
303 static void do_get(
const Teuchos::Ptr<const M> mat,
304 const ArrayView<typename M::scalar_t> nzvals,
305 const ArrayView<GO> indices,
306 const ArrayView<GS> pointers,
309 const Tpetra::Map<
typename M::local_ordinal_t,
310 typename M::global_ordinal_t,
311 typename M::node_t> > map,
314 typedef typename M::global_ordinal_t mat_go_t;
315 typedef typename M::global_size_t mat_gs_t;
316 typename ArrayView<GO>::size_type i, size = indices.size();
317 Teuchos::Array<mat_go_t> indices_tmp(size);
319 if_then_else<is_same<GS,mat_gs_t>::value,
320 same_gs_helper<M,S,GO,GS,Op>,
321 diff_gs_helper<M,S,GO,GS,Op> >::type::do_get(mat, nzvals, indices_tmp,
325 for (i = 0; i < size; ++i){
326 indices[i] = Teuchos::as<GO>(indices_tmp[i]);
331 template <
class M,
typename S,
typename GO,
typename GS,
class Op>
332 struct same_scalar_helper
334 static void do_get(
const Teuchos::Ptr<const M> mat,
335 const ArrayView<S> nzvals,
336 const ArrayView<GO> indices,
337 const ArrayView<GS> pointers,
340 const Tpetra::Map<
typename M::local_ordinal_t,
341 typename M::global_ordinal_t,
342 typename M::node_t> > map,
345 typedef typename M::global_ordinal_t mat_go_t;
346 if_then_else<is_same<GO,mat_go_t>::value,
347 same_go_helper<M,S,GO,GS,Op>,
348 diff_go_helper<M,S,GO,GS,Op> >::type::do_get(mat, nzvals, indices,
354 template <
class M,
typename S,
typename GO,
typename GS,
class Op>
355 struct diff_scalar_helper
357 static void do_get(
const Teuchos::Ptr<const M> mat,
358 const ArrayView<S> nzvals,
359 const ArrayView<GO> indices,
360 const ArrayView<GS> pointers,
363 const Tpetra::Map<
typename M::local_ordinal_t,
364 typename M::global_ordinal_t,
365 typename M::node_t> > map,
368 typedef typename M::scalar_t mat_scalar_t;
369 typedef typename M::global_ordinal_t mat_go_t;
370 typename ArrayView<S>::size_type i, size = nzvals.size();
371 Teuchos::Array<mat_scalar_t> nzvals_tmp(size);
373 if_then_else<is_same<GO,mat_go_t>::value,
374 same_go_helper<M,S,GO,GS,Op>,
375 diff_go_helper<M,S,GO,GS,Op> >::type::do_get(mat, nzvals_tmp, indices,
379 for (i = 0; i < size; ++i){
380 nzvals[i] = Teuchos::as<S>(nzvals_tmp[i]);
384 #endif // DOXYGEN_SHOULD_SKIP_THIS 398 template<
class Matrix,
typename S,
typename GO,
typename GS,
class Op>
401 static void do_get(
const Teuchos::Ptr<const Matrix> mat,
402 const ArrayView<S> nzvals,
403 const ArrayView<GO> indices,
404 const ArrayView<GS> pointers,
409 typedef typename Matrix::local_ordinal_t lo_t;
410 typedef typename Matrix::global_ordinal_t go_t;
411 typedef typename Matrix::global_size_t gs_t;
412 typedef typename Matrix::node_t node_t;
414 const Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
415 = getDistributionMap<lo_t,go_t,gs_t,node_t>(distribution,
416 Op::get_dimension(mat),
417 mat->getComm(), indexBase);
418 do_get(mat, nzvals, indices, pointers, nnz, Teuchos::ptrInArg(*map), ordering);
425 static void do_get(
const Teuchos::Ptr<const Matrix> mat,
426 const ArrayView<S> nzvals,
427 const ArrayView<GO> indices,
428 const ArrayView<GS> pointers,
431 const Teuchos::RCP<
const Tpetra::Map<
typename Matrix::local_ordinal_t,
432 typename Matrix::global_ordinal_t,
433 typename Matrix::node_t> > map
435 do_get(mat, nzvals, indices, pointers, nnz, Teuchos::ptrInArg(*map), ordering);
442 static void do_get(
const Teuchos::Ptr<const Matrix> mat,
443 const ArrayView<S> nzvals,
444 const ArrayView<GO> indices,
445 const ArrayView<GS> pointers,
448 const Tpetra::Map<
typename Matrix::local_ordinal_t,
449 typename Matrix::global_ordinal_t,
450 typename Matrix::node_t> > map,
453 typedef typename Matrix::scalar_t mat_scalar;
454 if_then_else<is_same<mat_scalar,S>::value,
455 same_scalar_helper<Matrix,S,GO,GS,Op>,
456 diff_scalar_helper<Matrix,S,GO,GS,Op> >::type::do_get(mat,
463 #ifndef DOXYGEN_SHOULD_SKIP_THIS 468 template<
class Matrix>
471 static void apply(
const Teuchos::Ptr<const Matrix> mat,
472 const ArrayView<typename Matrix::scalar_t> nzvals,
473 const ArrayView<typename Matrix::global_ordinal_t> rowind,
474 const ArrayView<typename Matrix::global_size_t> colptr,
475 typename Matrix::global_size_t& nnz,
477 const Tpetra::Map<
typename Matrix::local_ordinal_t,
478 typename Matrix::global_ordinal_t,
479 typename Matrix::node_t> > map,
482 mat->getCcs(nzvals, rowind, colptr, nnz, map, ordering);
486 const Teuchos::RCP<
const Tpetra::Map<
typename Matrix::local_ordinal_t,
487 typename Matrix::global_ordinal_t,
488 typename Matrix::node_t> >
489 getMap(
const Teuchos::Ptr<const Matrix> mat)
491 return mat->getColMap();
495 typename Matrix::global_size_t
496 get_dimension(
const Teuchos::Ptr<const Matrix> mat)
498 return mat->getGlobalNumCols();
502 template<
class Matrix>
505 static void apply(
const Teuchos::Ptr<const Matrix> mat,
506 const ArrayView<typename Matrix::scalar_t> nzvals,
507 const ArrayView<typename Matrix::global_ordinal_t> colind,
508 const ArrayView<typename Matrix::global_size_t> rowptr,
509 typename Matrix::global_size_t& nnz,
511 const Tpetra::Map<
typename Matrix::local_ordinal_t,
512 typename Matrix::global_ordinal_t,
513 typename Matrix::node_t> > map,
516 mat->getCrs(nzvals, colind, rowptr, nnz, map, ordering);
520 const Teuchos::RCP<
const Tpetra::Map<
typename Matrix::local_ordinal_t,
521 typename Matrix::global_ordinal_t,
522 typename Matrix::node_t> >
523 getMap(
const Teuchos::Ptr<const Matrix> mat)
525 return mat->getRowMap();
529 typename Matrix::global_size_t
530 get_dimension(
const Teuchos::Ptr<const Matrix> mat)
532 return mat->getGlobalNumRows();
535 #endif // DOXYGEN_SHOULD_SKIP_THIS 574 template<
class Matrix,
typename S,
typename GO,
typename GS>
585 template<
class Matrix,
typename S,
typename GO,
typename GS>
596 template <
typename LO,
typename GO,
typename GS,
typename Node>
597 const Teuchos::RCP<const Tpetra::Map<LO,GO,Node> >
599 GS num_global_elements,
600 const Teuchos::RCP<
const Teuchos::Comm<int> >& comm,
605 switch( distribution ){
608 return Tpetra::createUniformContigMapWithNode<LO,GO, Node>(num_global_elements, comm);
611 return Tpetra::createLocalMapWithNode<LO,GO, Node>(num_global_elements, comm);
615 int rank = Teuchos::rank(*comm);
616 size_t my_num_elems = Teuchos::OrdinalTraits<size_t>::zero();
617 if( rank == 0 ) my_num_elems = num_global_elements;
618 return rcp(
new Tpetra::Map<LO,GO, Node>(num_global_elements,
619 my_num_elems, indexBase, comm));
623 TEUCHOS_TEST_FOR_EXCEPTION(
true,
625 "Control should never reach this point. " 626 "Please contact the Amesos2 developers." );
631 #ifdef HAVE_AMESOS2_EPETRA 632 template <
typename LO,
typename GO,
typename GS,
typename Node>
633 Teuchos::RCP<Tpetra::Map<LO,GO,Node> >
639 int num_my_elements = map.NumMyElements();
640 Teuchos::Array<int> my_global_elements(num_my_elements);
641 map.MyGlobalElements(my_global_elements.getRawPtr());
643 typedef Tpetra::Map<LO,GO,Node> map_t;
644 RCP<map_t> tmap = rcp(
new map_t(Teuchos::OrdinalTraits<GS>::invalid(),
645 my_global_elements(),
646 as<GO>(map.IndexBase()),
651 template <
typename LO,
typename GO,
typename GS,
typename Node>
652 Teuchos::RCP<Epetra_Map>
657 Teuchos::Array<GO> elements_tmp;
658 elements_tmp = map.getNodeElementList();
659 int num_my_elements = elements_tmp.size();
660 Teuchos::Array<int> my_global_elements(num_my_elements);
661 for (
int i = 0; i < num_my_elements; ++i){
662 my_global_elements[i] = as<int>(elements_tmp[i]);
666 RCP<Epetra_Map> emap = rcp(
new Epetra_Map(-1,
668 my_global_elements.getRawPtr(),
669 as<GO>(map.getIndexBase()),
673 #endif // HAVE_AMESOS2_EPETRA 675 template <
typename Scalar,
676 typename GlobalOrdinal,
677 typename GlobalSizeT>
678 void transpose(Teuchos::ArrayView<Scalar> vals,
679 Teuchos::ArrayView<GlobalOrdinal> indices,
680 Teuchos::ArrayView<GlobalSizeT> ptr,
681 Teuchos::ArrayView<Scalar> trans_vals,
682 Teuchos::ArrayView<GlobalOrdinal> trans_indices,
683 Teuchos::ArrayView<GlobalSizeT> trans_ptr)
691 #ifdef HAVE_AMESOS2_DEBUG 692 typename Teuchos::ArrayView<GlobalOrdinal>::iterator ind_it, ind_begin, ind_end;
693 ind_begin = indices.begin();
694 ind_end = indices.end();
695 size_t min_trans_ptr_size = *std::max_element(ind_begin, ind_end) + 1;
696 TEUCHOS_TEST_FOR_EXCEPTION( Teuchos::as<size_t>(trans_ptr.size()) < min_trans_ptr_size,
697 std::invalid_argument,
698 "Transpose pointer size not large enough." );
699 TEUCHOS_TEST_FOR_EXCEPTION( trans_vals.size() < vals.size(),
700 std::invalid_argument,
701 "Transpose values array not large enough." );
702 TEUCHOS_TEST_FOR_EXCEPTION( trans_indices.size() < indices.size(),
703 std::invalid_argument,
704 "Transpose indices array not large enough." );
706 typename Teuchos::ArrayView<GlobalOrdinal>::iterator ind_it, ind_end;
710 Teuchos::Array<GlobalSizeT> count(trans_ptr.size(), 0);
711 ind_end = indices.end();
712 for( ind_it = indices.begin(); ind_it != ind_end; ++ind_it ){
713 ++(count[(*ind_it) + 1]);
717 typename Teuchos::Array<GlobalSizeT>::iterator cnt_it, cnt_end;
718 cnt_end = count.end();
719 for( cnt_it = count.begin() + 1; cnt_it != cnt_end; ++cnt_it ){
720 *cnt_it = *cnt_it + *(cnt_it - 1);
723 trans_ptr.assign(count);
737 GlobalSizeT size = ptr.size();
738 for( GlobalSizeT i = 0; i < size - 1; ++i ){
739 GlobalOrdinal u = ptr[i];
740 GlobalOrdinal v = ptr[i + 1];
741 for( GlobalOrdinal j = u; j < v; ++j ){
742 GlobalOrdinal k = count[indices[j]];
743 trans_vals[k] = vals[j];
744 trans_indices[k] = i;
745 ++(count[indices[j]]);
751 template <
typename Scalar1,
typename Scalar2>
753 scale(Teuchos::ArrayView<Scalar1> vals,
size_t l,
754 size_t ld, Teuchos::ArrayView<Scalar2> s)
756 size_t vals_size = vals.size();
757 #ifdef HAVE_AMESOS2_DEBUG 758 size_t s_size = s.size();
759 TEUCHOS_TEST_FOR_EXCEPTION( s_size < l,
760 std::invalid_argument,
761 "Scale vector must have length at least that of the vector" );
764 for( i = 0, s_i = 0; i < vals_size; ++i, ++s_i ){
774 template <
typename Scalar1,
typename Scalar2,
class BinaryOp>
776 scale(Teuchos::ArrayView<Scalar1> vals,
size_t l,
777 size_t ld, Teuchos::ArrayView<Scalar2> s,
780 size_t vals_size = vals.size();
781 #ifdef HAVE_AMESOS2_DEBUG 782 size_t s_size = s.size();
783 TEUCHOS_TEST_FOR_EXCEPTION( s_size < l,
784 std::invalid_argument,
785 "Scale vector must have length at least that of the vector" );
788 for( i = 0, s_i = 0; i < vals_size; ++i, ++s_i ){
794 vals[i] = binary_op(vals[i], s[s_i]);
804 #endif // #ifndef AMESOS2_UTIL_HPP void scale(ArrayView< Scalar1 > vals, size_t l, size_t ld, ArrayView< Scalar2 > s)
Scales a 1-D representation of a multivector.
static void do_get(const Teuchos::Ptr< const Matrix > mat, const ArrayView< S > nzvals, const ArrayView< GO > indices, const ArrayView< GS > pointers, GS &nnz, const Teuchos::Ptr< const Tpetra::Map< typename Matrix::local_ordinal_t, typename Matrix::global_ordinal_t, typename Matrix::node_t > > map, EStorage_Ordering ordering=ARBITRARY)
Definition: Amesos2_Util.hpp:442
const Teuchos::RCP< const Tpetra::Map< LO, GO, Node > > getDistributionMap(EDistribution distribution, GS num_global_elements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, GO indexBase=0)
Gets a Tpetra::Map described by the EDistribution.
Definition: Amesos2_Util.hpp:598
Similar to get_ccs_helper , but used to get a CRS representation of the given matrix.
Definition: Amesos2_Util.hpp:586
A generic base class for the CRS and CCS helpers.
Definition: Amesos2_Util.hpp:399
Definition: Amesos2_TypeDecl.hpp:142
EStorage_Ordering
Definition: Amesos2_TypeDecl.hpp:140
Definition: Amesos2_TypeDecl.hpp:125
void transpose(ArrayView< Scalar > vals, ArrayView< GlobalOrdinal > indices, ArrayView< GlobalSizeT > ptr, ArrayView< Scalar > trans_vals, ArrayView< GlobalOrdinal > trans_indices, ArrayView< GlobalSizeT > trans_ptr)
const RCP< const Teuchos::Comm< int > > to_teuchos_comm(RCP< const Epetra_Comm > c)
Transform an Epetra_Comm object into a Teuchos::Comm object.
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
void printLine(Teuchos::FancyOStream &out)
Prints a line of 70 "-"s on std::cout.
Definition: Amesos2_Util.cpp:119
A generic helper class for getting a CCS representation of a Matrix.
Definition: Amesos2_Util.hpp:575
Definition: Amesos2_TypeDecl.hpp:126
static void do_get(const Teuchos::Ptr< const Matrix > mat, const ArrayView< S > nzvals, const ArrayView< GO > indices, const ArrayView< GS > pointers, GS &nnz, EStorage_Ordering ordering=ARBITRARY)
Definition: Amesos2_Util.hpp:425
const RCP< const Epetra_Comm > to_epetra_comm(RCP< const Teuchos::Comm< int > > c)
Transfrom a Teuchos::Comm object into an Epetra_Comm object.
Teuchos::RCP< Epetra_Map > tpetra_map_to_epetra_map(const Tpetra::Map< LO, GO, Node > &map)
Transform a Tpetra::Map object into an Epetra_Map.
Definition: Amesos2_Util.hpp:653
Definition: Amesos2_TypeDecl.hpp:124
Enum and other types declarations for Amesos2.
Teuchos::RCP< Tpetra::Map< LO, GO, Node > > epetra_map_to_tpetra_map(const Epetra_BlockMap &map)
Transform an Epetra_Map object into a Tpetra::Map.
Definition: Amesos2_Util.hpp:634
Definition: Amesos2_TypeDecl.hpp:127
EDistribution
Definition: Amesos2_TypeDecl.hpp:123