MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_ShiftedLaplacianOperator_def.hpp
Go to the documentation of this file.
1// @HEADER
2//
3// ***********************************************************************
4//
5// MueLu: A package for multigrid based preconditioning
6// Copyright 2012 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact
39// Jonathan Hu (jhu@sandia.gov)
40// Andrey Prokopenko (aprokop@sandia.gov)
41// Ray Tuminaro (rstumin@sandia.gov)
42//
43// ***********************************************************************
44//
45// @HEADER
46
47#ifndef MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP
48#define MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP
49
50#include "MueLu_ConfigDefs.hpp"
51
52#include <Xpetra_Matrix.hpp>
53#include <Xpetra_CrsMatrixWrap.hpp>
54#include <Xpetra_BlockedCrsMatrix.hpp>
55#include <Xpetra_TpetraMultiVector.hpp>
56#include <Xpetra_MultiVectorFactory.hpp>
57
59#include "MueLu_Hierarchy.hpp"
60#include "MueLu_Utilities.hpp"
61
62
63namespace MueLu {
64
65// ------------- getDomainMap -----------------------
66
67template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
68Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
70getDomainMap () const
71{
72 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XMatrix;
73
74 RCP<MueLu::Level> L0 = Hierarchy_->GetLevel (0);
75 RCP<XMatrix> A = L0->Get<RCP<XMatrix> > ("A");
76
77 RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpbA =
78 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(A);
79 if (tpbA != Teuchos::null) {
80 return Xpetra::toTpetraNonZero (tpbA->getDomainMap ());
81 }
82
83 RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpA =
85 return tpA->getDomainMap ();
86}
87
88// ------------- getRangeMap -----------------------
89
90template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
91Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
93getRangeMap () const
94{
95 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XMatrix;
96
97 RCP<MueLu::Level> L0 = Hierarchy_->GetLevel(0);
98 RCP<XMatrix> A = L0->Get< RCP<XMatrix> >("A");
99
100 RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpbA =
101 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(A);
102 if(tpbA != Teuchos::null)
103 return Xpetra::toTpetraNonZero(tpbA->getRangeMap());
104
105 RCP< Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpA =
107 return tpA->getRangeMap();
108}
109
110// ------------- apply -----------------------
111
112template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
113void ShiftedLaplacianOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>::apply(const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>& X,
114 Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Y,
115 Teuchos::ETransp /* mode */, Scalar /* alpha */, Scalar /* beta */) const {
116
117 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
118 typedef Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XTMV;
119 // typedef Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XMV; // unused
120
121 TMV & temp_x = const_cast<TMV &>(X);
122 const XTMV tX(rcpFromRef(temp_x));
123 XTMV tY(rcpFromRef(Y));
124
125 try {
126 tY.putScalar(0.0);
127 Hierarchy_->Iterate(tX, tY, cycles_, true);
128 }
129
130 catch(std::exception& e) {
131 //FIXME add message and rethrow
132 std::cerr << "Caught an exception in MueLu::ShiftedLaplacianOperator::ApplyInverse():" << std::endl
133 << e.what() << std::endl;
134 }
135
136 // update solution with 2-grid error correction
137 /*if(option_==1) {
138 for(int j=0; j<cycles_; j++) {
139 RCP<XMV> residual = MueLu::Utilities<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Residual(*A_, tY, tX);
140 RCP<XMV> coarseResidual = Xpetra::MultiVectorFactory<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Build(R_->getRangeMap(), tX.getNumVectors());
141 RCP<XMV> coarseError = Xpetra::MultiVectorFactory<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Build(R_->getRangeMap(), tX.getNumVectors());
142 R_ -> apply(*residual, *coarseResidual, Teuchos::NO_TRANS, (Scalar) 1.0, (Scalar) 0.0);
143 RCP<TMV> tcoarseR = MueLu::Utilities<Scalar,LocalOrdinal,GlobalOrdinal,Node>::MV2NonConstTpetraMV(coarseResidual);
144 RCP<TMV> tcoarseE = MueLu::Utilities<Scalar,LocalOrdinal,GlobalOrdinal,Node>::MV2NonConstTpetraMV(coarseError);
145 BelosLP_ -> setProblem(tcoarseE,tcoarseR);
146 BelosSM_ -> solve();
147 RCP<XMV> fineError = Xpetra::MultiVectorFactory<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Build(P_->getRangeMap(), tX.getNumVectors());
148 XTMV tmpcoarseE(rcpFromRef(*tcoarseE));
149 P_ -> apply(tmpcoarseE, *fineError, Teuchos::NO_TRANS, (Scalar) 1.0, (Scalar) 0.0);
150 tY.update((Scalar) 1.0, *fineError, (Scalar) 1.0);
151 }
152 }
153
154 try {
155 Hierarchy_->Iterate(tX, tY, 1, false);
156 }
157
158 catch(std::exception& e) {
159 //FIXME add message and rethrow
160 std::cerr << "Caught an exception in MueLu::ShiftedLaplacianOperator::ApplyInverse():" << std::endl
161 << e.what() << std::endl;
162 }*/
163
164}
165
166// ------------- apply -----------------------
167template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
171
172} // namespace
173
174#endif //ifdef MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP
MueLu::DefaultScalar Scalar
Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
bool hasTransposeApply() const
Indicates whether this operator supports applying the adjoint operator.
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Hierarchy_
Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
void apply(const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::one()) const
Returns in Y the result of a Tpetra::Operator applied to a Tpetra::MultiVector X.
static RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2NonConstTpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
Namespace for MueLu classes and methods.