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 "Xpetra_Matrix.hpp"
16#include "Xpetra_MatrixMatrix.hpp"
17#include "Xpetra_CrsMatrixWrap.hpp"
18
19#include "Xpetra_Map.hpp"
20#include "Xpetra_StridedMap.hpp"
21#include "Xpetra_StridedMapFactory.hpp"
22#include "Xpetra_MapExtractor.hpp"
23#include "Xpetra_MatrixFactory.hpp"
24#include "Xpetra_BlockedCrsMatrix.hpp"
25
26#include "MueLu_Exceptions.hpp"
27
28namespace MueLu {
29
30// General implementation
31// Epetra variant throws
32template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
33void Jacobi(
34 Scalar omega,
35 const Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
36 const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
37 const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
38 Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
39 bool call_FillComplete_on_result = true,
40 bool doOptimizeStorage = true,
41 const std::string& label = std::string(),
42 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
43 typedef Scalar SC;
44 typedef LocalOrdinal LO;
45 typedef GlobalOrdinal GO;
46 typedef Node NO;
47
48 TEUCHOS_TEST_FOR_EXCEPTION(C.getRowMap()->isSameAs(*A.getRowMap()) == false, MueLu::Exceptions::RuntimeError,
49 "MueLu::Jacobi: row map of C is not same as row map of A")
50 TEUCHOS_TEST_FOR_EXCEPTION(C.getRowMap()->isSameAs(*B.getRowMap()) == false, MueLu::Exceptions::RuntimeError,
51 "MueLu::Jacobi: row map of C is not same as row map of B");
52 TEUCHOS_TEST_FOR_EXCEPTION(!A.isFillComplete(), MueLu::Exceptions::RuntimeError, "A is not fill-completed");
53 TEUCHOS_TEST_FOR_EXCEPTION(!B.isFillComplete(), MueLu::Exceptions::RuntimeError, "B is not fill-completed");
54
55 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
56
57 if (C.getRowMap()->lib() == Xpetra::UseEpetra) {
58#ifndef HAVE_MUELU_EPETRAEXT
59 throw(MueLu::Exceptions::RuntimeError("MueLu::Jacobi requires EpetraExt to be compiled."));
60#else
61 throw(MueLu::Exceptions::RuntimeError("MueLu::Jacobi requires you to use an Epetra-compatible data type."));
62#endif
63 } else if (C.getRowMap()->lib() == Xpetra::UseTpetra) {
64 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpA = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(A);
65 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpB = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(B);
66 Tpetra::CrsMatrix<SC, LO, GO, NO>& tpC = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstTpetraCrs(C);
67 const RCP<Tpetra::Vector<SC, LO, GO, NO> >& tpD = toTpetra(Dinv);
68 Tpetra::MatrixMatrix::Jacobi(omega, *tpD, tpA, tpB, tpC, haveMultiplyDoFillComplete, label, params);
69 }
70
71 if (call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
72 RCP<Teuchos::ParameterList> fillParams = rcp(new Teuchos::ParameterList());
73 fillParams->set("Optimize Storage", doOptimizeStorage);
74 C.fillComplete(B.getDomainMap(), B.getRangeMap(), fillParams);
75 }
76
77 // transfer striding information
78 RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpA = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(A));
79 RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpB = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(B));
80 C.CreateView("stridedMaps", rcpA, false, rcpB, false); // TODO use references instead of RCPs
81} // end Jacobi
82
83#if defined(HAVE_MUELU_EPETRA) && !defined(XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES)
84template <>
86 const Xpetra::Vector<double, int, int, Xpetra::EpetraNode>& Dinv,
87 const Xpetra::Matrix<double, int, int, Xpetra::EpetraNode>& A,
88 const Xpetra::Matrix<double, int, int, Xpetra::EpetraNode>& B,
89 Xpetra::Matrix<double, int, int, Xpetra::EpetraNode>& C,
90 bool call_FillComplete_on_result,
91 bool doOptimizeStorage,
92 const std::string& label,
93 const Teuchos::RCP<Teuchos::ParameterList>& params);
94#endif
95
96#if defined(HAVE_MUELU_EPETRA) && !defined(XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES)
97template <>
99 const Xpetra::Vector<double, int, long long, Xpetra::EpetraNode>& Dinv,
100 const Xpetra::Matrix<double, int, long long, Xpetra::EpetraNode>& A,
101 const Xpetra::Matrix<double, int, long long, Xpetra::EpetraNode>& B,
102 Xpetra::Matrix<double, int, long long, Xpetra::EpetraNode>& C,
103 bool call_FillComplete_on_result,
104 bool doOptimizeStorage,
105 const std::string& label,
106 const Teuchos::RCP<Teuchos::ParameterList>& params);
107#endif
108
116template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
118 public:
119 static RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
120 Jacobi(Scalar 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) {
121 TEUCHOS_TEST_FOR_EXCEPTION(!A.isFillComplete(), MueLu::Exceptions::RuntimeError, "A is not fill-completed");
122 TEUCHOS_TEST_FOR_EXCEPTION(!B.isFillComplete(), MueLu::Exceptions::RuntimeError, "B is not fill-completed");
123
124 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > C = C_in;
125 if (C == Teuchos::null) {
126 C = Xpetra::MatrixFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(B.getRowMap(), Teuchos::OrdinalTraits<LocalOrdinal>::zero());
127 } else {
128 C->resumeFill(); // why this is not done inside of Tpetra Jacobi?
129 fos << "Reuse C pattern" << std::endl;
130 }
131
132 MueLu::Jacobi<Scalar, LocalOrdinal, GlobalOrdinal, Node>(omega, Dinv, A, B, *C, true, true, label, params);
133 C->CreateView("stridedMaps", rcpFromRef(A), false, rcpFromRef(B), false);
134
135 return C;
136 }
137};
138
139} // end namespace MueLu
140
141#define MUELU_ITERATOROPS_SHORT
142
143#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(Scalar 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< double, int, long long, Xpetra::EpetraNode >(double omega, const Xpetra::Vector< double, int, long long, Xpetra::EpetraNode > &Dinv, const Xpetra::Matrix< double, int, long long, Xpetra::EpetraNode > &A, const Xpetra::Matrix< double, int, long long, Xpetra::EpetraNode > &B, Xpetra::Matrix< double, int, long long, Xpetra::EpetraNode > &C, bool call_FillComplete_on_result, bool doOptimizeStorage, const std::string &label, const Teuchos::RCP< Teuchos::ParameterList > &params)
void Jacobi(Scalar 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)
void Jacobi< double, int, int, Xpetra::EpetraNode >(double omega, const Xpetra::Vector< double, int, int, Xpetra::EpetraNode > &Dinv, const Xpetra::Matrix< double, int, int, Xpetra::EpetraNode > &A, const Xpetra::Matrix< double, int, int, Xpetra::EpetraNode > &B, Xpetra::Matrix< double, int, int, Xpetra::EpetraNode > &C, bool call_FillComplete_on_result, bool doOptimizeStorage, const std::string &label, const Teuchos::RCP< Teuchos::ParameterList > &params)