10#ifndef TPETRA_MATRIXMATRIX_DECL_HPP
11#define TPETRA_MATRIXMATRIX_DECL_HPP
14#include <Teuchos_RCP.hpp>
15#include <Teuchos_Array.hpp>
16#include <Teuchos_ScalarTraits.hpp>
17#include "Tpetra_ConfigDefs.hpp"
18#include "Tpetra_CrsMatrix.hpp"
19#include "Tpetra_BlockCrsMatrix.hpp"
20#include "Tpetra_Vector.hpp"
21#include "TpetraExt_MMHelpers.hpp"
22#include "KokkosKernels_Handle.hpp"
31namespace MatrixMatrix {
65template <
class Scalar,
70 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
72 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
74 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
75 bool call_FillComplete_on_result =
true,
76 const std::string& label = std::string(),
77 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
95template <
class Scalar,
100 const Teuchos::RCP<
const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A,
102 const Teuchos::RCP<
const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& B,
104 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C,
105 const std::string& label = std::string());
118template <
class Scalar,
123 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
126 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
158template <
class Scalar,
162Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
163add(
const Scalar& alpha,
164 const bool transposeA,
165 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
167 const bool transposeB,
168 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
169 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
170 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
171 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
208template <
class Scalar,
212void add(
const Scalar& alpha,
213 const bool transposeA,
214 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
216 const bool transposeB,
217 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
218 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
219 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
220 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
221 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
257template <
class Scalar,
262 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
265 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
268 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
299template <
class Scalar,
304 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
307 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
310 const Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
335template <
class Scalar,
339void Jacobi(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
340 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
341 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
342 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
343 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
344 bool call_FillComplete_on_result =
true,
345 const std::string& label = std::string(),
346 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
353template <
class Scalar,
357void mult_AT_B_newmatrix(
358 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
359 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
360 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
361 const std::string& label = std::string(),
362 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
364template <
class Scalar,
369 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
370 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
371 CrsWrapper<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
372 const std::string& label = std::string(),
373 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
375template <
class Scalar,
379void mult_A_B_newmatrix(
380 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
381 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
382 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
383 const std::string& label = std::string(),
384 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
386template <
class Scalar,
390void mult_A_B_newmatrix(
391 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
392 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
393 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
395template <
class Scalar,
400 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
401 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
402 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
403 const std::string& label = std::string(),
404 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
407template <
class Scalar,
411void jacobi_A_B_newmatrix(
412 typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
413 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
414 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
415 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
416 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
417 const std::string& label = std::string(),
418 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
420template <
class Scalar,
424void jacobi_A_B_reuse(
425 typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
426 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
427 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
428 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
429 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
430 const std::string& label = std::string(),
431 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
434template <
class Scalar,
438void import_and_extract_views(
439 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
440 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
441 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
442 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
443 bool userAssertsThereAreNoRemotes,
444 const std::string& label,
445 const Teuchos::RCP<Teuchos::ParameterList>& params);
447template <
class Scalar,
451void import_and_extract_views(
452 const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
453 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
454 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
455 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
456 bool userAssertsThereAreNoRemotes);
458template <
class Scalar,
462void setMaxNumEntriesPerRow(
463 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
467template <
class Scalar,
471 class LocalOrdinalViewType>
472struct KernelWrappers {
473 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
474 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
475 const LocalOrdinalViewType& Acol2Brow,
476 const LocalOrdinalViewType& Acol2Irow,
477 const LocalOrdinalViewType& Bcol2Ccol,
478 const LocalOrdinalViewType& Icol2Ccol,
479 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
480 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
481 const std::string& label = std::string(),
482 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
484 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
485 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
486 const LocalOrdinalViewType& Acol2Brow,
487 const LocalOrdinalViewType& Acol2Irow,
488 const LocalOrdinalViewType& Bcol2Ccol,
489 const LocalOrdinalViewType& Icol2Ccol,
490 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
491 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
492 const std::string& label = std::string(),
493 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
499template <
class Scalar,
503 class LocalOrdinalViewType>
504struct KernelWrappers2 {
505 static inline void jacobi_A_B_newmatrix_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
506 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
507 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
508 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
509 const LocalOrdinalViewType& Acol2Brow,
510 const LocalOrdinalViewType& Acol2Irow,
511 const LocalOrdinalViewType& Bcol2Ccol,
512 const LocalOrdinalViewType& Icol2Ccol,
513 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
514 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
515 const std::string& label = std::string(),
516 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
518 static inline void jacobi_A_B_reuse_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
519 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
520 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);
534template <
class Scalar,
538 class LocalOrdinalViewType>
539struct KernelWrappers3 {
540 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
541 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
542 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
543 const LocalOrdinalViewType& Acol2Prow,
544 const LocalOrdinalViewType& Acol2PIrow,
545 const LocalOrdinalViewType& Pcol2Ccol,
546 const LocalOrdinalViewType& PIcol2Ccol,
547 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
548 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
549 const std::string& label = std::string(),
550 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
552 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
553 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
554 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
555 const LocalOrdinalViewType& Acol2Prow,
556 const LocalOrdinalViewType& Acol2PIrow,
557 const LocalOrdinalViewType& Pcol2Ccol,
558 const LocalOrdinalViewType& PIcol2Ccol,
559 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
560 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
561 const std::string& label = std::string(),
562 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
564 static inline void mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
565 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
566 const LocalOrdinalViewType& Acol2Prow,
567 const LocalOrdinalViewType& Acol2PIrow,
568 const LocalOrdinalViewType& Pcol2Ccol,
569 const LocalOrdinalViewType& PIcol2Ccol,
570 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
571 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
572 const std::string& label = std::string(),
573 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
575 static inline void mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
576 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
577 const LocalOrdinalViewType& Acol2Prow,
578 const LocalOrdinalViewType& Acol2PIrow,
579 const LocalOrdinalViewType& Pcol2Ccol,
580 const LocalOrdinalViewType& PIcol2Ccol,
581 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
582 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
583 const std::string& label = std::string(),
584 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
588template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class LocalOrdinalViewType>
590merge_matrices(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
591 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
592 const LocalOrdinalViewType& Acol2Brow,
593 const LocalOrdinalViewType& Acol2Irow,
594 const LocalOrdinalViewType& Bcol2Ccol,
595 const LocalOrdinalViewType& Icol2Ccol,
596 const size_t mergedNodeNumCols);
599template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class LocalOrdinalViewType>
600inline const typename Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::local_matrix_device_type
601merge_matrices(BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
602 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
603 const LocalOrdinalViewType& Acol2Brow,
604 const LocalOrdinalViewType& Acol2Irow,
605 const LocalOrdinalViewType& Bcol2Ccol,
606 const LocalOrdinalViewType& Icol2Ccol,
607 const size_t mergedNodeNumCols);
609template <
class CrsMatrixType>
610size_t C_estimate_nnz(CrsMatrixType& A, CrsMatrixType& B);
612template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
616 typedef typename Node::device_type device_type;
617 typedef typename device_type::execution_space execution_space;
618 typedef typename device_type::memory_space memory_space;
621 typedef typename KCRS::values_type::non_const_type values_array;
622 typedef typename KCRS::row_map_type::non_const_type row_ptrs_array;
623 typedef typename KCRS::row_map_type row_ptrs_array_const;
624 typedef typename KCRS::index_type::non_const_type col_inds_array;
625 typedef typename map_type::local_map_type local_map_type;
626 typedef typename Kokkos::View<GlobalOrdinal*, device_type> global_col_inds_array;
627 typedef Kokkos::RangePolicy<execution_space> range_type;
628 typedef KokkosKernels::Experimental::KokkosKernelsHandle<size_t, LocalOrdinal, impl_scalar_type,
629 execution_space, memory_space, memory_space>
646 static void addSorted(
647 const values_array& Avals,
648 const row_ptrs_array_const& Arowptrs,
649 const col_inds_array& Acolinds,
650 const impl_scalar_type scalarA,
651 const values_array& Bvals,
652 const row_ptrs_array_const& Browptrs,
653 const col_inds_array& Bcolinds,
654 const impl_scalar_type scalarB,
655 GlobalOrdinal numGlobalCols,
657 row_ptrs_array& Crowptrs,
658 col_inds_array& Ccolinds);
671 static void convertToGlobalAndAdd(
673 const impl_scalar_type scalarA,
675 const impl_scalar_type scalarB,
676 const local_map_type& AcolMap,
677 const local_map_type& BcolMap,
679 row_ptrs_array& Crowptrs,
680 global_col_inds_array& Ccolinds);
696 static void addUnsorted(
697 const values_array& Avals,
698 const row_ptrs_array_const& Arowptrs,
699 const col_inds_array& Acolinds,
700 const impl_scalar_type scalarA,
701 const values_array& Bvals,
702 const row_ptrs_array_const& Browptrs,
703 const col_inds_array& Bcolinds,
704 const impl_scalar_type scalarB,
705 GlobalOrdinal numGlobalCols,
707 row_ptrs_array& Crowptrs,
708 col_inds_array& Ccolinds);
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...
typename row_matrix_type::impl_scalar_type impl_scalar_type
The type used internally in place of Scalar.
Struct that holds views of the contents of a CrsMatrix.
void Jacobi(typename Teuchos::ScalarTraits< Scalar >::magnitudeType 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)
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...
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.
void Add(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, bool transposeA, Scalar scalarA, CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, Scalar scalarB)
Namespace Tpetra contains the class and methods constituting the Tpetra library.