MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_IteratorOps.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// MueLu: A linear algebra interface package
4//
5// Copyright 2012 NTESS and the MueLu contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef MUELU_ITERATOROPS_HPP_
11#define MUELU_ITERATOROPS_HPP_
12
13#include "MueLu_ConfigDefs.hpp"
14
15#include "Teuchos_ScalarTraits.hpp"
16
17#include "Xpetra_Matrix.hpp"
18#include "Xpetra_MatrixMatrix.hpp"
19#include "Xpetra_CrsMatrixWrap.hpp"
20
21#include "Xpetra_Map.hpp"
22#include "Xpetra_StridedMap.hpp"
23#include "Xpetra_StridedMapFactory.hpp"
24#include "Xpetra_MapExtractor.hpp"
25#include "Xpetra_MatrixFactory.hpp"
26#include "Xpetra_BlockedCrsMatrix.hpp"
27
28#include "MueLu_Exceptions.hpp"
29
30namespace MueLu {
31
32// General implementation
33template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
34void Jacobi(
35 typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
36 const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
37 const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
38 const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
39 Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
40 bool call_FillComplete_on_result = true,
41 bool doOptimizeStorage = true,
42 const std::string& label = std::string(),
43 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
44 typedef Scalar SC;
45 typedef LocalOrdinal LO;
46 typedef GlobalOrdinal GO;
47 typedef Node NO;
48
49 TEUCHOS_TEST_FOR_EXCEPTION(C.getRowMap()->isSameAs(*A.getRowMap()) == false, MueLu::Exceptions::RuntimeError,
50 "MueLu::Jacobi: row map of C is not same as row map of A")
51 TEUCHOS_TEST_FOR_EXCEPTION(C.getRowMap()->isSameAs(*B.getRowMap()) == false, MueLu::Exceptions::RuntimeError,
52 "MueLu::Jacobi: row map of C is not same as row map of B");
53 TEUCHOS_TEST_FOR_EXCEPTION(!A.isFillComplete(), MueLu::Exceptions::RuntimeError, "A is not fill-completed");
54 TEUCHOS_TEST_FOR_EXCEPTION(!B.isFillComplete(), MueLu::Exceptions::RuntimeError, "B is not fill-completed");
55
56 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
57
58 if (C.getRowMap()->lib() == Xpetra::UseTpetra) {
59 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpA = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(A);
60 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpB = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(B);
61 Tpetra::CrsMatrix<SC, LO, GO, NO>& tpC = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstTpetraCrs(C);
62 const RCP<Tpetra::Vector<SC, LO, GO, NO> >& tpD = toTpetra(Dinv);
63 Tpetra::MatrixMatrix::Jacobi(omega, *tpD, tpA, tpB, tpC, haveMultiplyDoFillComplete, label, params);
64 }
65
66 if (call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
67 RCP<Teuchos::ParameterList> fillParams = rcp(new Teuchos::ParameterList());
68 fillParams->set("Optimize Storage", doOptimizeStorage);
69 C.fillComplete(B.getDomainMap(), B.getRangeMap(), fillParams);
70 }
71
72 // transfer striding information
73 RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpA = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(A));
74 RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpB = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(B));
75 if (A.IsView("stridedMaps") || B.IsView("stridedMaps"))
76 C.CreateView("stridedMaps", rcpA, false, rcpB, false); // TODO use references instead of RCPs
77} // end Jacobi
78
86template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
88 public:
89 static RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
90 Jacobi(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega, const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv, const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A, const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B, RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > C_in, Teuchos::FancyOStream& fos, const std::string& label, RCP<ParameterList>& params) {
91 TEUCHOS_TEST_FOR_EXCEPTION(!A.isFillComplete(), MueLu::Exceptions::RuntimeError, "A is not fill-completed");
92 TEUCHOS_TEST_FOR_EXCEPTION(!B.isFillComplete(), MueLu::Exceptions::RuntimeError, "B is not fill-completed");
93
94 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > C = C_in;
95 if (C == Teuchos::null) {
96 C = Xpetra::MatrixFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(B.getRowMap(), Teuchos::OrdinalTraits<LocalOrdinal>::zero());
97 } else {
98 C->resumeFill(); // why this is not done inside of Tpetra Jacobi?
99 fos << "Reuse C pattern" << std::endl;
100 }
101
102 MueLu::Jacobi<Scalar, LocalOrdinal, GlobalOrdinal, Node>(omega, Dinv, A, B, *C, true, true, label, params);
103 if (A.IsView("stridedMaps") || B.IsView("stridedMaps"))
104 C->CreateView("stridedMaps", rcpFromRef(A), false, rcpFromRef(B), false);
105
106 return C;
107 }
108};
109
110} // end namespace MueLu
111
112#define MUELU_ITERATOROPS_SHORT
113
114#endif /* PACKAGES_MUELU_SUP_UTILS_XPETRA_ITERATOROPS_HPP_ */
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
MueLu::DefaultNode Node
Exception throws to report errors in the internal logical of the program.
MueLu utility class containing iteration operators.
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Jacobi(typename Teuchos::ScalarTraits< Scalar >::magnitudeType omega, const Xpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Dinv, const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > C_in, Teuchos::FancyOStream &fos, const std::string &label, RCP< ParameterList > &params)
Namespace for MueLu classes and methods.
void Jacobi(typename Teuchos::ScalarTraits< Scalar >::magnitudeType omega, const Xpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Dinv, const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &C, bool call_FillComplete_on_result=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const Teuchos::RCP< Teuchos::ParameterList > &params=Teuchos::null)