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"
63namespace MatrixMatrix {
95template <
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);
124template <
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());
149template <
class Scalar,
154 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
157 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
189template <
class Scalar,
193Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
194add (
const Scalar& alpha,
195 const bool transposeA,
196 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
198 const bool transposeB,
199 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
200 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
201 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
202 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
240template <
class Scalar,
245add (
const Scalar& alpha,
246 const bool transposeA,
247 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
249 const bool transposeB,
250 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
251 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> & C,
252 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
253 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
254 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
286template <
class Scalar,
291 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
294 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
297 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > C);
321 template <
class Scalar,
326 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> & Dinv,
327 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
328 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
329 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
330 bool call_FillComplete_on_result =
true,
331 const std::string& label = std::string(),
332 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
339template<
class Scalar,
343void mult_AT_B_newmatrix(
344 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
345 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
346 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
347 const std::string& label = std::string(),
348 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
351template<
class Scalar,
356 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
357 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
358 CrsWrapper<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
359 const std::string& label = std::string(),
360 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
362template<
class Scalar,
366void mult_A_B_newmatrix(
367 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
368 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
369 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
370 const std::string& label = std::string(),
371 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
373template<
class Scalar,
377void mult_A_B_newmatrix(
378 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
379 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
380 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
382template<
class Scalar,
387 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
388 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
389 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
390 const std::string& label = std::string(),
391 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
397template<
class Scalar,
401void jacobi_A_B_newmatrix(
403 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> & Dinv,
404 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
405 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
406 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
407 const std::string & label = std::string(),
408 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
411template<
class Scalar,
415void jacobi_A_B_reuse(
417 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> & Dinv,
418 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
419 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
420 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
421 const std::string & label = std::string(),
422 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
425template<
class Scalar,
429void import_and_extract_views(
430 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
431 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
432 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
433 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal, Node> > prototypeImporter = Teuchos::null,
434 bool userAssertsThereAreNoRemotes =
false,
435 const std::string& label = std::string(),
436 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
438template<
class Scalar,
442void import_and_extract_views(
443 const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
444 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
445 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
446 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal, Node> > prototypeImporter = Teuchos::null,
447 bool userAssertsThereAreNoRemotes =
false);
449template<
class Scalar,
453void setMaxNumEntriesPerRow(
454 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
459 template<
class Scalar,
463 class LocalOrdinalViewType>
464 struct KernelWrappers {
465 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
466 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
467 const LocalOrdinalViewType & Acol2Brow,
468 const LocalOrdinalViewType & Acol2Irow,
469 const LocalOrdinalViewType & Bcol2Ccol,
470 const LocalOrdinalViewType & Icol2Ccol,
471 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
472 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
473 const std::string& label = std::string(),
474 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
476 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
477 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
478 const LocalOrdinalViewType & Acol2Brow,
479 const LocalOrdinalViewType & Acol2Irow,
480 const LocalOrdinalViewType & Bcol2Ccol,
481 const LocalOrdinalViewType & Icol2Ccol,
482 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
483 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
484 const std::string& label = std::string(),
485 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
491 template<
class Scalar,
495 class LocalOrdinalViewType>
496 struct KernelWrappers2 {
497 static inline void jacobi_A_B_newmatrix_kernel_wrapper(Scalar omega,
498 const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> & Dinv,
499 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
500 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
501 const LocalOrdinalViewType & Acol2Brow,
502 const LocalOrdinalViewType & Acol2Irow,
503 const LocalOrdinalViewType & Bcol2Ccol,
504 const LocalOrdinalViewType & Icol2Ccol,
505 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
506 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
507 const std::string& label = std::string(),
508 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
510 static inline void jacobi_A_B_reuse_kernel_wrapper(Scalar omega,
511 const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> & Dinv,
512 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
513 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
514 const LocalOrdinalViewType & Acol2Brow,
515 const LocalOrdinalViewType & Acol2Irow,
516 const LocalOrdinalViewType & Bcol2Ccol,
517 const LocalOrdinalViewType & Icol2Ccol,
518 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
519 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Cimport,
520 const std::string& label = std::string(),
521 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
527 template<
class Scalar,
531 class LocalOrdinalViewType>
532 struct KernelWrappers3 {
533 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
534 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
535 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
536 const LocalOrdinalViewType & Acol2Prow,
537 const LocalOrdinalViewType & Acol2PIrow,
538 const LocalOrdinalViewType & Pcol2Ccol,
539 const LocalOrdinalViewType & PIcol2Ccol,
540 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
541 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
542 const std::string& label = std::string(),
543 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
545 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
546 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
547 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
548 const LocalOrdinalViewType & Acol2Prow,
549 const LocalOrdinalViewType & Acol2PIrow,
550 const LocalOrdinalViewType & Pcol2Ccol,
551 const LocalOrdinalViewType & PIcol2Ccol,
552 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
553 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
554 const std::string& label = std::string(),
555 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
558 static inline void mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
559 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
560 const LocalOrdinalViewType & Acol2Prow,
561 const LocalOrdinalViewType & Acol2PIrow,
562 const LocalOrdinalViewType & Pcol2Ccol,
563 const LocalOrdinalViewType & PIcol2Ccol,
564 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
565 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
566 const std::string& label = std::string(),
567 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
569 static inline void mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
570 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
571 const LocalOrdinalViewType & Acol2Prow,
572 const LocalOrdinalViewType & Acol2PIrow,
573 const LocalOrdinalViewType & Pcol2Ccol,
574 const LocalOrdinalViewType & PIcol2Ccol,
575 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
576 Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > Acimport,
577 const std::string& label = std::string(),
578 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
582 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class LocalOrdinalViewType>
584 merge_matrices(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
585 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
586 const LocalOrdinalViewType & Acol2Brow,
587 const LocalOrdinalViewType & Acol2Irow,
588 const LocalOrdinalViewType & Bcol2Ccol,
589 const LocalOrdinalViewType & Icol2Ccol,
590 const size_t mergedNodeNumCols);
593 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class LocalOrdinalViewType>
594 inline const typename Tpetra::BlockCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>::local_matrix_device_type
595 merge_matrices(BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
596 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
597 const LocalOrdinalViewType & Acol2Brow,
598 const LocalOrdinalViewType & Acol2Irow,
599 const LocalOrdinalViewType & Bcol2Ccol,
600 const LocalOrdinalViewType & Icol2Ccol,
601 const size_t mergedNodeNumCols);
606template<
class CrsMatrixType>
607size_t C_estimate_nnz(CrsMatrixType & A, CrsMatrixType &B);
609template<
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
614 typedef typename Node::device_type device_type;
615 typedef typename device_type::execution_space execution_space;
616 typedef typename device_type::memory_space memory_space;
619 typedef typename KCRS::values_type::non_const_type values_array;
620 typedef typename KCRS::row_map_type::non_const_type row_ptrs_array;
621 typedef typename KCRS::row_map_type row_ptrs_array_const;
622 typedef typename KCRS::index_type::non_const_type col_inds_array;
624 typedef typename Kokkos::View<GlobalOrdinal*, device_type> global_col_inds_array;
625 typedef Kokkos::RangePolicy<execution_space> range_type;
626 typedef KokkosKernels::Experimental::KokkosKernelsHandle<size_t, LocalOrdinal, impl_scalar_type,
627 execution_space, memory_space, memory_space> KKH;
642 static void addSorted(
643 const values_array& Avals,
644 const row_ptrs_array_const& Arowptrs,
645 const col_inds_array& Acolinds,
646 const impl_scalar_type scalarA,
647 const values_array& Bvals,
648 const row_ptrs_array_const& Browptrs,
649 const col_inds_array& Bcolinds,
650 const impl_scalar_type scalarB,
652 row_ptrs_array& Crowptrs,
653 col_inds_array& Ccolinds);
666 static void convertToGlobalAndAdd(
668 const impl_scalar_type scalarA,
670 const impl_scalar_type scalarB,
671 const local_map_type& AcolMap,
672 const local_map_type& BcolMap,
674 row_ptrs_array& Crowptrs,
675 global_col_inds_array& Ccolinds);
691 static void addUnsorted(
692 const values_array& Avals,
693 const row_ptrs_array_const& Arowptrs,
694 const col_inds_array& Acolinds,
695 const impl_scalar_type scalarA,
696 const values_array& Bvals,
697 const row_ptrs_array_const& Browptrs,
698 const col_inds_array& Bcolinds,
699 const impl_scalar_type scalarB,
700 GlobalOrdinal numGlobalCols,
702 row_ptrs_array& Crowptrs,
703 col_inds_array& Ccolinds);
Sparse matrix that presents a row-oriented interface that lets users read or modify entries.
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.
A parallel distribution of indices over processes.
::Tpetra::Details::LocalMap< local_ordinal_type, global_ordinal_type, device_type > local_map_type
Type of the "local" Map.
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 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)
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.