10 #ifndef TPETRA_MATRIXMATRIX_DECL_HPP
11 #define TPETRA_MATRIXMATRIX_DECL_HPP
14 #include <Teuchos_RCP.hpp>
15 #include <Teuchos_Array.hpp>
16 #include "Tpetra_ConfigDefs.hpp"
17 #include "Tpetra_CrsMatrix.hpp"
18 #include "Tpetra_BlockCrsMatrix.hpp"
19 #include "Tpetra_Vector.hpp"
20 #include "TpetraExt_MMHelpers.hpp"
21 #include "KokkosKernels_Handle.hpp"
30 namespace MatrixMatrix {
62 template <
class Scalar,
67 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
69 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
71 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
72 bool call_FillComplete_on_result =
true,
73 const std::string& label = std::string(),
74 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
91 template <
class Scalar,
96 const Teuchos::RCP<
const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A,
98 const Teuchos::RCP<
const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& B,
100 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C,
101 const std::string& label = std::string());
114 template <
class Scalar,
119 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
122 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
154 template <
class Scalar,
158 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
159 add(
const Scalar& alpha,
160 const bool transposeA,
161 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
163 const bool transposeB,
164 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
165 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
166 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
167 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
204 template <
class Scalar,
208 void add(
const Scalar& alpha,
209 const bool transposeA,
210 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
212 const bool transposeB,
213 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
214 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
215 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap = Teuchos::null,
216 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap = Teuchos::null,
217 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
253 template <
class Scalar,
258 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
261 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
264 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
295 template <
class Scalar,
300 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
303 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
306 const Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
329 template <
class Scalar,
334 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
335 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
336 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
337 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
338 bool call_FillComplete_on_result =
true,
339 const std::string& label = std::string(),
340 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
344 namespace MMdetails {
347 template <
class Scalar,
351 void mult_AT_B_newmatrix(
352 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
353 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
354 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
355 const std::string& label = std::string(),
356 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
358 template <
class Scalar,
363 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
364 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
365 CrsWrapper<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
366 const std::string& label = std::string(),
367 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
369 template <
class Scalar,
373 void mult_A_B_newmatrix(
374 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
375 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
376 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
377 const std::string& label = std::string(),
378 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
380 template <
class Scalar,
384 void mult_A_B_newmatrix(
385 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
386 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
387 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
389 template <
class Scalar,
394 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
395 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
396 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
397 const std::string& label = std::string(),
398 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
401 template <
class Scalar,
405 void jacobi_A_B_newmatrix(
407 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
408 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
409 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
410 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
411 const std::string& label = std::string(),
412 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
414 template <
class Scalar,
418 void jacobi_A_B_reuse(
420 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
421 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
422 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
423 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
424 const std::string& label = std::string(),
425 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
428 template <
class Scalar,
432 void import_and_extract_views(
433 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
434 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
435 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
436 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
437 bool userAssertsThereAreNoRemotes,
438 const std::string& label,
439 const Teuchos::RCP<Teuchos::ParameterList>& params);
441 template <
class Scalar,
445 void import_and_extract_views(
446 const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& M,
447 Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
448 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview,
449 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
450 bool userAssertsThereAreNoRemotes);
452 template <
class Scalar,
456 void setMaxNumEntriesPerRow(
457 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
461 template <
class Scalar,
465 class LocalOrdinalViewType>
466 struct KernelWrappers {
467 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
468 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
469 const LocalOrdinalViewType& Acol2Brow,
470 const LocalOrdinalViewType& Acol2Irow,
471 const LocalOrdinalViewType& Bcol2Ccol,
472 const LocalOrdinalViewType& Icol2Ccol,
473 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
474 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
475 const std::string& label = std::string(),
476 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
478 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
479 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
480 const LocalOrdinalViewType& Acol2Brow,
481 const LocalOrdinalViewType& Acol2Irow,
482 const LocalOrdinalViewType& Bcol2Ccol,
483 const LocalOrdinalViewType& Icol2Ccol,
484 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
485 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
486 const std::string& label = std::string(),
487 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
493 template <
class Scalar,
497 class LocalOrdinalViewType>
498 struct KernelWrappers2 {
499 static inline void jacobi_A_B_newmatrix_kernel_wrapper(Scalar omega,
500 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
501 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
502 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
503 const LocalOrdinalViewType& Acol2Brow,
504 const LocalOrdinalViewType& Acol2Irow,
505 const LocalOrdinalViewType& Bcol2Ccol,
506 const LocalOrdinalViewType& Icol2Ccol,
507 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
508 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
509 const std::string& label = std::string(),
510 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
512 static inline void jacobi_A_B_reuse_kernel_wrapper(Scalar omega,
513 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
514 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
515 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
516 const LocalOrdinalViewType& Acol2Brow,
517 const LocalOrdinalViewType& Acol2Irow,
518 const LocalOrdinalViewType& Bcol2Ccol,
519 const LocalOrdinalViewType& Icol2Ccol,
520 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
521 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
522 const std::string& label = std::string(),
523 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
528 template <
class Scalar,
532 class LocalOrdinalViewType>
533 struct KernelWrappers3 {
534 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
535 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
536 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
537 const LocalOrdinalViewType& Acol2Prow,
538 const LocalOrdinalViewType& Acol2PIrow,
539 const LocalOrdinalViewType& Pcol2Ccol,
540 const LocalOrdinalViewType& PIcol2Ccol,
541 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
542 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
543 const std::string& label = std::string(),
544 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
546 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
547 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
548 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
549 const LocalOrdinalViewType& Acol2Prow,
550 const LocalOrdinalViewType& Acol2PIrow,
551 const LocalOrdinalViewType& Pcol2Ccol,
552 const LocalOrdinalViewType& PIcol2Ccol,
553 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
554 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
555 const std::string& label = std::string(),
556 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);
603 template <
class CrsMatrixType>
604 size_t C_estimate_nnz(CrsMatrixType& A, CrsMatrixType& B);
606 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
610 typedef typename Node::device_type device_type;
611 typedef typename device_type::execution_space execution_space;
612 typedef typename device_type::memory_space memory_space;
615 typedef typename KCRS::values_type::non_const_type values_array;
616 typedef typename KCRS::row_map_type::non_const_type row_ptrs_array;
617 typedef typename KCRS::row_map_type row_ptrs_array_const;
618 typedef typename KCRS::index_type::non_const_type col_inds_array;
620 typedef typename Kokkos::View<GlobalOrdinal*, device_type> global_col_inds_array;
621 typedef Kokkos::RangePolicy<execution_space> range_type;
622 typedef KokkosKernels::Experimental::KokkosKernelsHandle<size_t, LocalOrdinal, impl_scalar_type,
623 execution_space, memory_space, memory_space>
640 static void addSorted(
641 const values_array& Avals,
642 const row_ptrs_array_const& Arowptrs,
643 const col_inds_array& Acolinds,
644 const impl_scalar_type scalarA,
645 const values_array& Bvals,
646 const row_ptrs_array_const& Browptrs,
647 const col_inds_array& Bcolinds,
648 const impl_scalar_type scalarB,
649 GlobalOrdinal numGlobalCols,
651 row_ptrs_array& Crowptrs,
652 col_inds_array& Ccolinds);
665 static void convertToGlobalAndAdd(
667 const impl_scalar_type scalarA,
669 const impl_scalar_type scalarB,
670 const local_map_type& AcolMap,
671 const local_map_type& BcolMap,
673 row_ptrs_array& Crowptrs,
674 global_col_inds_array& Ccolinds);
690 static void addUnsorted(
691 const values_array& Avals,
692 const row_ptrs_array_const& Arowptrs,
693 const col_inds_array& Acolinds,
694 const impl_scalar_type scalarA,
695 const values_array& Bvals,
696 const row_ptrs_array_const& Browptrs,
697 const col_inds_array& Bcolinds,
698 const impl_scalar_type scalarB,
699 GlobalOrdinal numGlobalCols,
701 row_ptrs_array& Crowptrs,
702 col_inds_array& Ccolinds);
709 #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)
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...
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.
::Tpetra::Details::LocalMap< local_ordinal_type, global_ordinal_type, device_type > local_map_type
Type of the "local" Map.