Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TpetraExt_MatrixMatrix_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Tpetra: Templated Linear Algebra Services Package
4 //
5 // Copyright 2008 NTESS and the Tpetra contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef TPETRA_MATRIXMATRIX_DECL_HPP
11 #define TPETRA_MATRIXMATRIX_DECL_HPP
12 
13 #include <string>
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"
22 
28 namespace Tpetra {
29 
30 namespace MatrixMatrix {
31 
62 template <class Scalar,
63  class LocalOrdinal,
64  class GlobalOrdinal,
65  class Node>
66 void Multiply(
67  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
68  bool transposeA,
69  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
70  bool transposeB,
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);
75 
91 template <class Scalar,
92  class LocalOrdinal,
93  class GlobalOrdinal,
94  class Node>
95 void Multiply(
96  const Teuchos::RCP<const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A,
97  bool transposeA,
98  const Teuchos::RCP<const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& B,
99  bool transposeB,
100  Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C,
101  const std::string& label = std::string());
102 
114 template <class Scalar,
115  class LocalOrdinal,
116  class GlobalOrdinal,
117  class Node>
118 void Add(
119  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
120  bool transposeA,
121  Scalar scalarA,
122  CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
123  Scalar scalarB);
124 
154 template <class Scalar,
155  class LocalOrdinal,
156  class GlobalOrdinal,
157  class Node>
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,
162  const Scalar& beta,
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);
168 
204 template <class Scalar,
205  class LocalOrdinal,
206  class GlobalOrdinal,
207  class Node>
208 void add(const Scalar& alpha,
209  const bool transposeA,
210  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
211  const Scalar& beta,
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);
218 
253 template <class Scalar,
254  class LocalOrdinal,
255  class GlobalOrdinal,
256  class Node>
257 void Add(
258  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
259  bool transposeA,
260  Scalar scalarA,
261  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
262  bool transposeB,
263  Scalar scalarB,
264  Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
265 
295 template <class Scalar,
296  class LocalOrdinal,
297  class GlobalOrdinal,
298  class Node>
299 void Add(
300  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
301  bool transposeA,
302  Scalar scalarA,
303  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
304  bool transposeB,
305  Scalar scalarB,
306  const Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
307 
329 template <class Scalar,
330  class LocalOrdinal,
331  class GlobalOrdinal,
332  class Node>
333 void Jacobi(Scalar omega,
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);
341 
342 } // namespace MatrixMatrix
343 
344 namespace MMdetails {
345 
346 // Matrix multiplication functions
347 template <class Scalar,
348  class LocalOrdinal,
349  class GlobalOrdinal,
350  class Node>
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);
357 
358 template <class Scalar,
359  class LocalOrdinal,
360  class GlobalOrdinal,
361  class Node>
362 void mult_A_B(
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);
368 
369 template <class Scalar,
370  class LocalOrdinal,
371  class GlobalOrdinal,
372  class Node>
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);
379 
380 template <class Scalar,
381  class LocalOrdinal,
382  class GlobalOrdinal,
383  class Node>
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);
388 
389 template <class Scalar,
390  class LocalOrdinal,
391  class GlobalOrdinal,
392  class Node>
393 void mult_A_B_reuse(
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);
399 
400 // Matrix jacobi functions
401 template <class Scalar,
402  class LocalOrdinal,
403  class GlobalOrdinal,
404  class Node>
405 void jacobi_A_B_newmatrix(
406  Scalar omega,
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);
413 
414 template <class Scalar,
415  class LocalOrdinal,
416  class GlobalOrdinal,
417  class Node>
418 void jacobi_A_B_reuse(
419  Scalar omega,
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);
426 
427 // Other functions
428 template <class Scalar,
429  class LocalOrdinal,
430  class GlobalOrdinal,
431  class Node>
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);
440 
441 template <class Scalar,
442  class LocalOrdinal,
443  class GlobalOrdinal,
444  class Node>
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);
451 
452 template <class Scalar,
453  class LocalOrdinal,
454  class GlobalOrdinal,
455  class Node>
456 void setMaxNumEntriesPerRow(
457  CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
458 
459 // MMM Kernel wrappers struct
460 // Because C++ doesn't support partial template specialization of functions.
461 template <class Scalar,
462  class LocalOrdinal,
463  class GlobalOrdinal,
464  class Node,
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);
477 
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);
488 };
489 
490 // Jacobi Kernel wrappers struct
491 // Because C++ doesn't support partial template specialization of functions.
492 
493 template <class Scalar,
494  class LocalOrdinal,
495  class GlobalOrdinal,
496  class Node,
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);
511 
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);
524 };
525 
526 // Triple-Product Kernel wrappers struct
527 // Because C++ doesn't support partial template specialization of functions.
528 template <class Scalar,
529  class LocalOrdinal,
530  class GlobalOrdinal,
531  class Node,
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);
545 
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);
557 
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);
568 
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);
579 };
580 
581 // This only merges matrices that look like B & Bimport, aka, they have no overlapping rows
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);
591 
592 // This only merges matrices that look like B & Bimport, aka, they have no overlapping rows
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);
602 
603 template <class CrsMatrixType>
604 size_t C_estimate_nnz(CrsMatrixType& A, CrsMatrixType& B);
605 
606 template <typename Scalar, typename LocalOrdinal, typename GlobalOrdinal, typename Node>
607 struct AddKernels {
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;
613  typedef typename crs_matrix_type::impl_scalar_type impl_scalar_type;
614  typedef typename crs_matrix_type::local_matrix_device_type KCRS;
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;
619  typedef typename map_type::local_map_type local_map_type;
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>
624  KKH;
625 
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,
650  values_array& Cvals,
651  row_ptrs_array& Crowptrs,
652  col_inds_array& Ccolinds);
653 
665  static void convertToGlobalAndAdd(
666  const KCRS& A,
667  const impl_scalar_type scalarA,
668  const KCRS& B,
669  const impl_scalar_type scalarB,
670  const local_map_type& AcolMap,
671  const local_map_type& BcolMap,
672  values_array& Cvals,
673  row_ptrs_array& Crowptrs,
674  global_col_inds_array& Ccolinds);
675 
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,
700  values_array& Cvals,
701  row_ptrs_array& Crowptrs,
702  col_inds_array& Ccolinds);
703 };
704 
705 } // end namespace MMdetails
706 
707 } // namespace Tpetra
708 
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 > &params=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 > &params=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 > &params=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 &quot;local&quot; Map.