MueLu
Version of the Day
Toggle main menu visibility
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
58
#include "
MueLu_ShiftedLaplacianOperator_decl.hpp
"
59
#include "MueLu_Hierarchy.hpp"
60
#include "MueLu_Utilities.hpp"
61
62
63
namespace
MueLu
{
64
65
// ------------- getDomainMap -----------------------
66
67
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
68
Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
69
ShiftedLaplacianOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
70
getDomainMap
()
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 =
84
Utilities<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Op2NonConstTpetraCrs
(A);
85
return
tpA->getDomainMap ();
86
}
87
88
// ------------- getRangeMap -----------------------
89
90
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
91
Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
92
ShiftedLaplacianOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
93
getRangeMap
()
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 =
106
Utilities<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Op2NonConstTpetraCrs
(A);
107
return
tpA->getRangeMap();
108
}
109
110
// ------------- apply -----------------------
111
112
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
113
void
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 -----------------------
167
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
168
bool
ShiftedLaplacianOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node>::hasTransposeApply
()
const
{
169
return
false
;
170
}
171
172
}
// namespace
173
174
#endif
//ifdef MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP
MueLu_ConfigDefs.hpp
MueLu_ShiftedLaplacianOperator_decl.hpp
Scalar
MueLu::DefaultScalar Scalar
Definition
MueLu_UseDefaultTypes.hpp:49
MueLu::ShiftedLaplacianOperator::cycles_
int cycles_
Definition
MueLu_ShiftedLaplacianOperator_decl.hpp:156
MueLu::ShiftedLaplacianOperator::getRangeMap
Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
Definition
MueLu_ShiftedLaplacianOperator_def.hpp:93
MueLu::ShiftedLaplacianOperator::hasTransposeApply
bool hasTransposeApply() const
Indicates whether this operator supports applying the adjoint operator.
Definition
MueLu_ShiftedLaplacianOperator_def.hpp:168
MueLu::ShiftedLaplacianOperator::Hierarchy_
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Hierarchy_
Definition
MueLu_ShiftedLaplacianOperator_decl.hpp:145
MueLu::ShiftedLaplacianOperator::getDomainMap
Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
Definition
MueLu_ShiftedLaplacianOperator_def.hpp:70
MueLu::ShiftedLaplacianOperator::apply
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.
Definition
MueLu_ShiftedLaplacianOperator_def.hpp:113
MueLu::Utilities::Op2NonConstTpetraCrs
static RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2NonConstTpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
Definition
MueLu_Utilities_def.hpp:258
MueLu
Namespace for MueLu classes and methods.
Definition
MueLu_BrickAggregationFactory_decl.hpp:78
adapters
tpetra
MueLu_ShiftedLaplacianOperator_def.hpp
Generated by
1.17.0