Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
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 <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"
23
29namespace Tpetra {
30
31namespace MatrixMatrix {
32
65template <class Scalar,
66 class LocalOrdinal,
67 class GlobalOrdinal,
68 class Node>
69void Multiply(
70 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
71 bool transposeA,
72 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
73 bool transposeB,
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);
78
95template <class Scalar,
96 class LocalOrdinal,
97 class GlobalOrdinal,
98 class Node>
99void Multiply(
100 const Teuchos::RCP<const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A,
101 bool transposeA,
102 const Teuchos::RCP<const BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& B,
103 bool transposeB,
104 Teuchos::RCP<BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C,
105 const std::string& label = std::string());
106
118template <class Scalar,
119 class LocalOrdinal,
120 class GlobalOrdinal,
121 class Node>
122void Add(
123 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
124 bool transposeA,
125 Scalar scalarA,
126 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
127 Scalar scalarB);
128
158template <class Scalar,
159 class LocalOrdinal,
160 class GlobalOrdinal,
161 class Node>
162Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
163add(const Scalar& alpha,
164 const bool transposeA,
165 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
166 const Scalar& beta,
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);
172
208template <class Scalar,
209 class LocalOrdinal,
210 class GlobalOrdinal,
211 class Node>
212void add(const Scalar& alpha,
213 const bool transposeA,
214 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
215 const Scalar& beta,
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);
222
257template <class Scalar,
258 class LocalOrdinal,
259 class GlobalOrdinal,
260 class Node>
261void Add(
262 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
263 bool transposeA,
264 Scalar scalarA,
265 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
266 bool transposeB,
267 Scalar scalarB,
268 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
269
299template <class Scalar,
300 class LocalOrdinal,
301 class GlobalOrdinal,
302 class Node>
303void Add(
304 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
305 bool transposeA,
306 Scalar scalarA,
307 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
308 bool transposeB,
309 Scalar scalarB,
310 const Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& C);
311
335template <class Scalar,
336 class LocalOrdinal,
337 class GlobalOrdinal,
338 class Node>
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);
347
348} // namespace MatrixMatrix
349
350namespace MMdetails {
351
352// Matrix multiplication functions
353template <class Scalar,
354 class LocalOrdinal,
355 class GlobalOrdinal,
356 class Node>
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);
363
364template <class Scalar,
365 class LocalOrdinal,
366 class GlobalOrdinal,
367 class Node>
368void mult_A_B(
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);
374
375template <class Scalar,
376 class LocalOrdinal,
377 class GlobalOrdinal,
378 class Node>
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);
385
386template <class Scalar,
387 class LocalOrdinal,
388 class GlobalOrdinal,
389 class Node>
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);
394
395template <class Scalar,
396 class LocalOrdinal,
397 class GlobalOrdinal,
398 class Node>
399void mult_A_B_reuse(
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);
405
406// Matrix jacobi functions
407template <class Scalar,
408 class LocalOrdinal,
409 class GlobalOrdinal,
410 class Node>
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);
419
420template <class Scalar,
421 class LocalOrdinal,
422 class GlobalOrdinal,
423 class Node>
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);
432
433// Other functions
434template <class Scalar,
435 class LocalOrdinal,
436 class GlobalOrdinal,
437 class Node>
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);
446
447template <class Scalar,
448 class LocalOrdinal,
449 class GlobalOrdinal,
450 class Node>
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);
457
458template <class Scalar,
459 class LocalOrdinal,
460 class GlobalOrdinal,
461 class Node>
462void setMaxNumEntriesPerRow(
463 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Mview);
464
465template <class Node>
466struct KokkosKernelsSPGEMMBackend;
467
468template <class Scalar,
469 class LocalOrdinal,
470 class GlobalOrdinal,
471 class Node,
472 class LocalOrdinalViewType>
473void kokkos_kernels_mult_A_B_newmatrix(
474 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
475 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
476 const LocalOrdinalViewType& Acol2Brow,
477 const LocalOrdinalViewType& Acol2Irow,
478 const LocalOrdinalViewType& Bcol2Ccol,
479 const LocalOrdinalViewType& Icol2Ccol,
480 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
481 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
482 const std::string& label,
483 const Teuchos::RCP<Teuchos::ParameterList>& params);
484
485template <class Scalar,
486 class LocalOrdinal,
487 class GlobalOrdinal,
488 class Node,
489 class LocalOrdinalViewType>
490void host_mult_A_B_reuse(
491 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
492 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
493 const LocalOrdinalViewType& targetMapToOrigRow_dev,
494 const LocalOrdinalViewType& targetMapToImportRow_dev,
495 const LocalOrdinalViewType& Bcol2Ccol_dev,
496 const LocalOrdinalViewType& Icol2Ccol_dev,
497 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
498 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
499 const std::string& label,
500 const Teuchos::RCP<Teuchos::ParameterList>& params);
501
502template <class Scalar,
503 class LocalOrdinal,
504 class GlobalOrdinal,
505 class Node,
506 class LocalOrdinalViewType>
507void kokkos_kernels_jacobi_A_B_newmatrix(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
508 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
509 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,
518 const Teuchos::RCP<Teuchos::ParameterList>& params);
519
520template <class Scalar,
521 class LocalOrdinal,
522 class GlobalOrdinal,
523 class Node,
524 class LocalOrdinalViewType>
525void host_jacobi_A_B_reuse(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
526 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
527 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
528 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
529 const LocalOrdinalViewType& targetMapToOrigRow_dev,
530 const LocalOrdinalViewType& targetMapToImportRow_dev,
531 const LocalOrdinalViewType& Bcol2Ccol_dev,
532 const LocalOrdinalViewType& Icol2Ccol_dev,
533 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
534 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
535 const std::string& label,
536 const Teuchos::RCP<Teuchos::ParameterList>& params);
537
538// MMM Kernel wrappers struct
539// Because C++ doesn't support partial template specialization of functions.
540template <class Scalar,
541 class LocalOrdinal,
542 class GlobalOrdinal,
543 class Node,
544 class LocalOrdinalViewType>
545struct KernelWrappers {
546 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
547 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
548 const LocalOrdinalViewType& Acol2Brow,
549 const LocalOrdinalViewType& Acol2Irow,
550 const LocalOrdinalViewType& Bcol2Ccol,
551 const LocalOrdinalViewType& Icol2Ccol,
552 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
553 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
554 const std::string& label = std::string(),
555 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
556
557 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
558 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
559 const LocalOrdinalViewType& Acol2Brow,
560 const LocalOrdinalViewType& Acol2Irow,
561 const LocalOrdinalViewType& Bcol2Ccol,
562 const LocalOrdinalViewType& Icol2Ccol,
563 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
564 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
565 const std::string& label = std::string(),
566 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
567};
568
569// Jacobi Kernel wrappers struct
570// Because C++ doesn't support partial template specialization of functions.
571
572template <class Scalar,
573 class LocalOrdinal,
574 class GlobalOrdinal,
575 class Node,
576 class LocalOrdinalViewType>
577struct KernelWrappers2 {
578 static inline void jacobi_A_B_newmatrix_kernel_wrapper(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
579 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
580 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
581 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
582 const LocalOrdinalViewType& Acol2Brow,
583 const LocalOrdinalViewType& Acol2Irow,
584 const LocalOrdinalViewType& Bcol2Ccol,
585 const LocalOrdinalViewType& Icol2Ccol,
586 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
587 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
588 const std::string& label = std::string(),
589 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
590
591 static inline void jacobi_A_B_reuse_kernel_wrapper(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
592 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
593 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
594 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
595 const LocalOrdinalViewType& Acol2Brow,
596 const LocalOrdinalViewType& Acol2Irow,
597 const LocalOrdinalViewType& Bcol2Ccol,
598 const LocalOrdinalViewType& Icol2Ccol,
599 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
600 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
601 const std::string& label = std::string(),
602 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
603};
604
605// Triple-Product Kernel wrappers struct
606// Because C++ doesn't support partial template specialization of functions.
607template <class Scalar,
608 class LocalOrdinal,
609 class GlobalOrdinal,
610 class Node,
611 class LocalOrdinalViewType>
612struct KernelWrappers3 {
613 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
614 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
615 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
616 const LocalOrdinalViewType& Acol2Prow,
617 const LocalOrdinalViewType& Acol2PIrow,
618 const LocalOrdinalViewType& Pcol2Ccol,
619 const LocalOrdinalViewType& PIcol2Ccol,
620 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
621 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
622 const std::string& label = std::string(),
623 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
624
625 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Rview,
626 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
627 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
628 const LocalOrdinalViewType& Acol2Prow,
629 const LocalOrdinalViewType& Acol2PIrow,
630 const LocalOrdinalViewType& Pcol2Ccol,
631 const LocalOrdinalViewType& PIcol2Ccol,
632 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
633 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
634 const std::string& label = std::string(),
635 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
636
637 static inline void mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
638 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
639 const LocalOrdinalViewType& Acol2Prow,
640 const LocalOrdinalViewType& Acol2PIrow,
641 const LocalOrdinalViewType& Pcol2Ccol,
642 const LocalOrdinalViewType& PIcol2Ccol,
643 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
644 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
645 const std::string& label = std::string(),
646 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
647
648 static inline void mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
649 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Pview,
650 const LocalOrdinalViewType& Acol2Prow,
651 const LocalOrdinalViewType& Acol2PIrow,
652 const LocalOrdinalViewType& Pcol2Ccol,
653 const LocalOrdinalViewType& PIcol2Ccol,
654 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Ac,
655 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Acimport,
656 const std::string& label = std::string(),
657 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
658};
659
660// This only merges matrices that look like B & Bimport, aka, they have no overlapping rows
661template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node, class LocalOrdinalViewType>
663merge_matrices(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
664 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
665 const LocalOrdinalViewType& Acol2Brow,
666 const LocalOrdinalViewType& Acol2Irow,
667 const LocalOrdinalViewType& Bcol2Ccol,
668 const LocalOrdinalViewType& Icol2Ccol,
669 const size_t mergedNodeNumCols);
670
671// This only merges matrices that look like B & Bimport, aka, they have no overlapping rows
672template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node, class LocalOrdinalViewType>
673inline const typename Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::local_matrix_device_type
674merge_matrices(BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
675 BlockCrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
676 const LocalOrdinalViewType& Acol2Brow,
677 const LocalOrdinalViewType& Acol2Irow,
678 const LocalOrdinalViewType& Bcol2Ccol,
679 const LocalOrdinalViewType& Icol2Ccol,
680 const size_t mergedNodeNumCols);
681
682template <class CrsMatrixType>
683size_t C_estimate_nnz(CrsMatrixType& A, CrsMatrixType& B);
684
685template <typename Scalar, typename LocalOrdinal, typename GlobalOrdinal, typename Node>
686struct AddKernels {
689 typedef typename Node::device_type device_type;
690 typedef typename device_type::execution_space execution_space;
691 typedef typename device_type::memory_space memory_space;
692 typedef typename crs_matrix_type::impl_scalar_type impl_scalar_type;
693 typedef typename crs_matrix_type::local_matrix_device_type KCRS;
694 typedef typename KCRS::values_type::non_const_type values_array;
695 typedef typename KCRS::row_map_type::non_const_type row_ptrs_array;
696 typedef typename KCRS::row_map_type row_ptrs_array_const;
697 typedef typename KCRS::index_type::non_const_type col_inds_array;
698 typedef typename map_type::local_map_type local_map_type;
699 typedef typename Kokkos::View<GlobalOrdinal*, device_type> global_col_inds_array;
700 typedef Kokkos::RangePolicy<execution_space> range_type;
701 typedef KokkosKernels::Experimental::KokkosKernelsHandle<size_t, LocalOrdinal, impl_scalar_type,
702 execution_space, memory_space, memory_space>
703 KKH;
704
719 static void addSorted(
720 const values_array& Avals,
721 const row_ptrs_array_const& Arowptrs,
722 const col_inds_array& Acolinds,
723 const impl_scalar_type scalarA,
724 const values_array& Bvals,
725 const row_ptrs_array_const& Browptrs,
726 const col_inds_array& Bcolinds,
727 const impl_scalar_type scalarB,
728 GlobalOrdinal numGlobalCols,
729 values_array& Cvals,
730 row_ptrs_array& Crowptrs,
731 col_inds_array& Ccolinds);
732
744 static void convertToGlobalAndAdd(
745 const KCRS A,
746 const impl_scalar_type scalarA,
747 const KCRS B,
748 const impl_scalar_type scalarB,
749 const local_map_type& AcolMap,
750 const local_map_type& BcolMap,
751 values_array& Cvals,
752 row_ptrs_array& Crowptrs,
753 global_col_inds_array& Ccolinds);
754
769 static void addUnsorted(
770 const values_array& Avals,
771 const row_ptrs_array_const& Arowptrs,
772 const col_inds_array& Acolinds,
773 const impl_scalar_type scalarA,
774 const values_array& Bvals,
775 const row_ptrs_array_const& Browptrs,
776 const col_inds_array& Bcolinds,
777 const impl_scalar_type scalarB,
778 GlobalOrdinal numGlobalCols,
779 values_array& Cvals,
780 row_ptrs_array& Crowptrs,
781 col_inds_array& Ccolinds);
782};
783
784} // end namespace MMdetails
785
786} // namespace Tpetra
787
788#endif // TPETRA_MATRIXMATRIX_DECL_HPP
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 > &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...
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.
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.