42 #ifndef TPETRA_MATRIXMATRIX_DECL_HPP
43 #define TPETRA_MATRIXMATRIX_DECL_HPP
46 #include <Teuchos_RCP.hpp>
47 #include <Teuchos_Array.hpp>
48 #include "Tpetra_ConfigDefs.hpp"
49 #include "Tpetra_CrsMatrix.hpp"
50 #include "Tpetra_BlockCrsMatrix.hpp"
51 #include "Tpetra_Vector.hpp"
52 #include "TpetraExt_MMHelpers.hpp"
53 #include "KokkosKernels_Handle.hpp"
63 namespace MatrixMatrix {
95 template <
class Scalar,
100 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
102 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
104 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
105 bool call_FillComplete_on_result =
true,
106 const std::string& label = std::string(),
107 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
124 template <
class Scalar,
129 const Teuchos::RCP<
const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A,
131 const Teuchos::RCP<
const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& B,
133 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C,
134 const std::string& label = std::string());
147 template <
class Scalar,
152 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
155 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
187 template <
class Scalar,
191 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
192 add (
const Scalar& alpha,
193 const bool transposeA,
194 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
196 const bool transposeB,
197 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
198 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
199 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
200 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
238 template <
class Scalar,
243 add (
const Scalar& alpha,
244 const bool transposeA,
245 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
247 const bool transposeB,
248 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
249 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> & C,
250 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
251 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
252 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
289 template <
class Scalar,
294 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
297 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
300 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
331 template <
class Scalar,
336 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
339 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
342 const Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
365 template <
class Scalar,
370 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> & Dinv,
371 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
372 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
373 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
374 bool call_FillComplete_on_result =
true,
375 const std::string& label = std::string(),
376 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
383 template<
class Scalar,
387 void mult_AT_B_newmatrix(
388 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
389 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
390 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
391 const std::string& label = std::string(),
392 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
395 template<
class Scalar,
400 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
401 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
402 CrsWrapper<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
403 const std::string& label = std::string(),
404 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
406 template<
class Scalar,
410 void mult_A_B_newmatrix(
411 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
412 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
413 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
414 const std::string& label = std::string(),
415 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
417 template<
class Scalar,
421 void mult_A_B_newmatrix(
422 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
423 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
424 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
426 template<
class Scalar,
431 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
432 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
433 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
434 const std::string& label = std::string(),
435 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
441 template<
class Scalar,
445 void jacobi_A_B_newmatrix(
447 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> & Dinv,
448 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
449 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
450 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
451 const std::string & label = std::string(),
452 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
455 template<
class Scalar,
459 void jacobi_A_B_reuse(
461 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> & Dinv,
462 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
463 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
464 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
465 const std::string & label = std::string(),
466 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
469 template<
class Scalar,
473 void import_and_extract_views(
474 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
475 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
476 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
477 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal, Node> > prototypeImporter = Teuchos::null,
478 bool userAssertsThereAreNoRemotes =
false,
479 const std::string& label = std::string(),
480 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
482 template<
class Scalar,
486 void import_and_extract_views(
487 const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
488 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
489 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
490 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal, Node> > prototypeImporter = Teuchos::null,
491 bool userAssertsThereAreNoRemotes =
false);
493 template<
class Scalar,
497 void setMaxNumEntriesPerRow(
498 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
503 template<
class Scalar,
507 class LocalOrdinalViewType>
508 struct KernelWrappers {
509 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
510 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
511 const LocalOrdinalViewType & Acol2Brow,
512 const LocalOrdinalViewType & Acol2Irow,
513 const LocalOrdinalViewType & Bcol2Ccol,
514 const LocalOrdinalViewType & Icol2Ccol,
515 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
516 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
517 const std::string& label = std::string(),
518 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
520 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
521 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
522 const LocalOrdinalViewType & Acol2Brow,
523 const LocalOrdinalViewType & Acol2Irow,
524 const LocalOrdinalViewType & Bcol2Ccol,
525 const LocalOrdinalViewType & Icol2Ccol,
526 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
527 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
528 const std::string& label = std::string(),
529 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
535 template<
class Scalar,
539 class LocalOrdinalViewType>
540 struct KernelWrappers2 {
541 static inline void jacobi_A_B_newmatrix_kernel_wrapper(Scalar omega,
542 const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> & Dinv,
543 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
544 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
545 const LocalOrdinalViewType & Acol2Brow,
546 const LocalOrdinalViewType & Acol2Irow,
547 const LocalOrdinalViewType & Bcol2Ccol,
548 const LocalOrdinalViewType & Icol2Ccol,
549 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
550 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
551 const std::string& label = std::string(),
552 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
554 static inline void jacobi_A_B_reuse_kernel_wrapper(Scalar omega,
555 const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> & Dinv,
556 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
557 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
558 const LocalOrdinalViewType & Acol2Brow,
559 const LocalOrdinalViewType & Acol2Irow,
560 const LocalOrdinalViewType & Bcol2Ccol,
561 const LocalOrdinalViewType & Icol2Ccol,
562 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
563 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
564 const std::string& label = std::string(),
565 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
571 template<
class Scalar,
575 class LocalOrdinalViewType>
576 struct KernelWrappers3 {
577 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
578 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
579 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
580 const LocalOrdinalViewType & Acol2Prow,
581 const LocalOrdinalViewType & Acol2PIrow,
582 const LocalOrdinalViewType & Pcol2Ccol,
583 const LocalOrdinalViewType & PIcol2Ccol,
584 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
585 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
586 const std::string& label = std::string(),
587 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
589 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
590 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
591 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
592 const LocalOrdinalViewType & Acol2Prow,
593 const LocalOrdinalViewType & Acol2PIrow,
594 const LocalOrdinalViewType & Pcol2Ccol,
595 const LocalOrdinalViewType & PIcol2Ccol,
596 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
597 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
598 const std::string& label = std::string(),
599 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
602 static inline void mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
603 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
604 const LocalOrdinalViewType & Acol2Prow,
605 const LocalOrdinalViewType & Acol2PIrow,
606 const LocalOrdinalViewType & Pcol2Ccol,
607 const LocalOrdinalViewType & PIcol2Ccol,
608 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
609 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
610 const std::string& label = std::string(),
611 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
613 static inline void mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
614 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
615 const LocalOrdinalViewType & Acol2Prow,
616 const LocalOrdinalViewType & Acol2PIrow,
617 const LocalOrdinalViewType & Pcol2Ccol,
618 const LocalOrdinalViewType & PIcol2Ccol,
619 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
620 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
621 const std::string& label = std::string(),
622 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
626 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class LocalOrdinalViewType>
628 merge_matrices(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
629 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
630 const LocalOrdinalViewType & Acol2Brow,
631 const LocalOrdinalViewType & Acol2Irow,
632 const LocalOrdinalViewType & Bcol2Ccol,
633 const LocalOrdinalViewType & Icol2Ccol,
634 const size_t mergedNodeNumCols);
637 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class LocalOrdinalViewType>
638 inline const typename Tpetra::BlockCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>::local_matrix_device_type
639 merge_matrices(BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
640 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
641 const LocalOrdinalViewType & Acol2Brow,
642 const LocalOrdinalViewType & Acol2Irow,
643 const LocalOrdinalViewType & Bcol2Ccol,
644 const LocalOrdinalViewType & Icol2Ccol,
645 const size_t mergedNodeNumCols);
650 template<
class CrsMatrixType>
651 size_t C_estimate_nnz(CrsMatrixType & A, CrsMatrixType &B);
653 template<
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
658 typedef typename Node::device_type device_type;
659 typedef typename device_type::execution_space execution_space;
660 typedef typename device_type::memory_space memory_space;
663 typedef typename KCRS::values_type::non_const_type values_array;
664 typedef typename KCRS::row_map_type::non_const_type row_ptrs_array;
665 typedef typename KCRS::row_map_type row_ptrs_array_const;
666 typedef typename KCRS::index_type::non_const_type col_inds_array;
668 typedef typename Kokkos::View<GlobalOrdinal*, device_type> global_col_inds_array;
669 typedef Kokkos::RangePolicy<execution_space> range_type;
670 typedef KokkosKernels::Experimental::KokkosKernelsHandle<size_t, LocalOrdinal, impl_scalar_type,
671 execution_space, memory_space, memory_space> KKH;
687 static void addSorted(
688 const values_array& Avals,
689 const row_ptrs_array_const& Arowptrs,
690 const col_inds_array& Acolinds,
691 const impl_scalar_type scalarA,
692 const values_array& Bvals,
693 const row_ptrs_array_const& Browptrs,
694 const col_inds_array& Bcolinds,
695 const impl_scalar_type scalarB,
696 #
if KOKKOSKERNELS_VERSION >= 40299
697 GlobalOrdinal numGlobalCols,
700 row_ptrs_array& Crowptrs,
701 col_inds_array& Ccolinds);
714 static void convertToGlobalAndAdd(
716 const impl_scalar_type scalarA,
718 const impl_scalar_type scalarB,
719 const local_map_type& AcolMap,
720 const local_map_type& BcolMap,
722 row_ptrs_array& Crowptrs,
723 global_col_inds_array& Ccolinds);
739 static void addUnsorted(
740 const values_array& Avals,
741 const row_ptrs_array_const& Arowptrs,
742 const col_inds_array& Acolinds,
743 const impl_scalar_type scalarA,
744 const values_array& Bvals,
745 const row_ptrs_array_const& Browptrs,
746 const col_inds_array& Bcolinds,
747 const impl_scalar_type scalarB,
748 GlobalOrdinal numGlobalCols,
750 row_ptrs_array& Crowptrs,
751 col_inds_array& Ccolinds);
758 #endif // TPETRA_MATRIXMATRIX_DECL_HPP
Sparse matrix that presents a row-oriented interface that lets users read or modify entries...
void Jacobi(Scalar omega, const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Dinv, const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &C, bool call_FillComplete_on_result=true, const std::string &label=std::string(), const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
KokkosSparse::CrsMatrix< impl_scalar_type, local_ordinal_type, device_type, void, typename local_graph_device_type::size_type > local_matrix_device_type
The specialization of Kokkos::CrsMatrix that represents the part of the sparse matrix on each MPI pro...
void Add(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, bool transposeA, Scalar scalarA, CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, Scalar scalarB)
void Multiply(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, bool transposeA, const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, bool transposeB, CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &C, bool call_FillComplete_on_result=true, const std::string &label=std::string(), const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Sparse matrix-matrix multiply.
typename row_matrix_type::impl_scalar_type impl_scalar_type
The type used internally in place of Scalar.
A parallel distribution of indices over processes.
Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > add(const Scalar &alpha, const bool transposeA, const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta, const bool transposeB, const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Compute the sparse matrix sum C = scalarA * Op(A) + scalarB * Op(B), where Op(X) is either X or its t...
::Tpetra::Details::LocalMap< local_ordinal_type, global_ordinal_type, device_type > local_map_type
Type of the "local" Map.