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 //
4 // Tpetra: Templated Linear Algebra Services Package
5 // Copyright (2008) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ************************************************************************
40 // @HEADER
41 
42 #ifndef TPETRA_MATRIXMATRIX_DECL_HPP
43 #define TPETRA_MATRIXMATRIX_DECL_HPP
44 
45 #include <string>
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"
54 
55 
61 namespace Tpetra {
62 
63 namespace MatrixMatrix {
64 
95 template <class Scalar,
96  class LocalOrdinal,
97  class GlobalOrdinal,
98  class Node>
99 void Multiply(
100  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
101  bool transposeA,
102  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
103  bool transposeB,
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);
108 
124 template <class Scalar,
125  class LocalOrdinal,
126  class GlobalOrdinal,
127  class Node>
128 void Multiply(
129  const Teuchos::RCP<const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A,
130  bool transposeA,
131  const Teuchos::RCP<const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& B,
132  bool transposeB,
133  Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C,
134  const std::string& label = std::string());
135 
147 template <class Scalar,
148  class LocalOrdinal,
149  class GlobalOrdinal,
150  class Node>
151 void Add(
152  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
153  bool transposeA,
154  Scalar scalarA,
155  CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
156  Scalar scalarB );
157 
187 template <class Scalar,
188  class LocalOrdinal,
189  class GlobalOrdinal,
190  class Node>
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,
195  const Scalar& beta,
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);
201 
202 
238 template <class Scalar,
239  class LocalOrdinal,
240  class GlobalOrdinal,
241  class Node>
242 void
243 add (const Scalar& alpha,
244  const bool transposeA,
245  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
246  const Scalar& beta,
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);
253 
254 
289 template <class Scalar,
290  class LocalOrdinal,
291  class GlobalOrdinal,
292  class Node>
293 void Add(
294  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
295  bool transposeA,
296  Scalar scalarA,
297  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
298  bool transposeB,
299  Scalar scalarB,
300  Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
301 
331 template <class Scalar,
332  class LocalOrdinal,
333  class GlobalOrdinal,
334  class Node>
335 void Add(
336  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
337  bool transposeA,
338  Scalar scalarA,
339  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
340  bool transposeB,
341  Scalar scalarB,
342  const Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
343 
365  template <class Scalar,
366  class LocalOrdinal,
367  class GlobalOrdinal,
368  class Node>
369  void Jacobi(Scalar omega,
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);
377 
378 } // namespace MatrixMatrix
379 
380 namespace MMdetails{
381 
382  // Matrix multiplication functions
383 template<class Scalar,
384  class LocalOrdinal,
385  class GlobalOrdinal,
386  class Node>
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);
393 
394 
395 template<class Scalar,
396  class LocalOrdinal,
397  class GlobalOrdinal,
398  class Node>
399 void mult_A_B(
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);
405 
406 template<class Scalar,
407  class LocalOrdinal,
408  class GlobalOrdinal,
409  class Node>
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);
416 
417 template<class Scalar,
418  class LocalOrdinal,
419  class GlobalOrdinal,
420  class Node>
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);
425 
426 template<class Scalar,
427  class LocalOrdinal,
428  class GlobalOrdinal,
429  class Node>
430 void mult_A_B_reuse(
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);
436 
437 
438 
439 
440  // Matrix jacobi functions
441 template<class Scalar,
442  class LocalOrdinal,
443  class GlobalOrdinal,
444  class Node>
445 void jacobi_A_B_newmatrix(
446  Scalar omega,
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);
453 
454 
455 template<class Scalar,
456  class LocalOrdinal,
457  class GlobalOrdinal,
458  class Node>
459 void jacobi_A_B_reuse(
460  Scalar omega,
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);
467 
468  // Other functions
469 template<class Scalar,
470  class LocalOrdinal,
471  class GlobalOrdinal,
472  class Node>
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);
481 
482 template<class Scalar,
483  class LocalOrdinal,
484  class GlobalOrdinal,
485  class Node>
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);
492 
493 template<class Scalar,
494  class LocalOrdinal,
495  class GlobalOrdinal,
496  class Node>
497 void setMaxNumEntriesPerRow(
498  CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
499 
500 
501  // MMM Kernel wrappers struct
502  // Because C++ doesn't support partial template specialization of functions.
503  template<class Scalar,
504  class LocalOrdinal,
505  class GlobalOrdinal,
506  class Node,
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);
519 
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);
530  };
531 
532  // Jacobi Kernel wrappers struct
533  // Because C++ doesn't support partial template specialization of functions.
534 
535  template<class Scalar,
536  class LocalOrdinal,
537  class GlobalOrdinal,
538  class Node,
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);
553 
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);
566  };
567 
568 
569  // Triple-Product Kernel wrappers struct
570  // Because C++ doesn't support partial template specialization of functions.
571  template<class Scalar,
572  class LocalOrdinal,
573  class GlobalOrdinal,
574  class Node,
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);
588 
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);
600 
601 
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);
612 
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);
623  };
624 
625  // This only merges matrices that look like B & Bimport, aka, they have no overlapping rows
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);
635 
636  // This only merges matrices that look like B & Bimport, aka, they have no overlapping rows
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);
646 
647 
648 
649 
650 template<class CrsMatrixType>
651 size_t C_estimate_nnz(CrsMatrixType & A, CrsMatrixType &B);
652 
653 template<typename Scalar, typename LocalOrdinal, typename GlobalOrdinal, typename Node>
654 struct AddKernels
655 {
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;
661  typedef typename crs_matrix_type::impl_scalar_type impl_scalar_type;
662  typedef typename crs_matrix_type::local_matrix_device_type KCRS;
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;
667  typedef typename map_type::local_map_type local_map_type;
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;
672 
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,
698 #endif
699  values_array& Cvals,
700  row_ptrs_array& Crowptrs,
701  col_inds_array& Ccolinds);
702 
714  static void convertToGlobalAndAdd(
715  const KCRS& A,
716  const impl_scalar_type scalarA,
717  const KCRS& B,
718  const impl_scalar_type scalarB,
719  const local_map_type& AcolMap,
720  const local_map_type& BcolMap,
721  values_array& Cvals,
722  row_ptrs_array& Crowptrs,
723  global_col_inds_array& Ccolinds);
724 
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,
749  values_array& Cvals,
750  row_ptrs_array& Crowptrs,
751  col_inds_array& Ccolinds);
752 };
753 
754 }//end namespace MMdetails
755 
756 } // end of Tpetra namespace
757 
758 #endif // TPETRA_MATRIXMATRIX_DECL_HPP
759 
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)
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.
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...
::Tpetra::Details::LocalMap< local_ordinal_type, global_ordinal_type, device_type > local_map_type
Type of the &quot;local&quot; Map.