Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_DefaultPreconditioner_def.hpp
1// @HEADER
2// *****************************************************************************
3// Thyra: Interfaces and Support for Abstract Numerical Algorithms
4//
5// Copyright 2004 NTESS and the Thyra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef THYRA_DEFUALT_PRECONDITIONER_DEF_HPP
11#define THYRA_DEFUALT_PRECONDITIONER_DEF_HPP
12
13#include "Thyra_DefaultPreconditioner_decl.hpp"
14#include "Thyra_LinearOpBase.hpp"
15
16
17namespace Thyra {
18
19
20// Constructors/initializers/accessors
21
22
23template <class Scalar>
26
27
28template <class Scalar>
30 const Teuchos::RCP<LinearOpBase<Scalar> > &leftPrecOp,
31 const Teuchos::RCP<LinearOpBase<Scalar> > &rightPrecOp
32 )
33{
34#ifdef TEUCHOS_DEBUG
35 TEUCHOS_TEST_FOR_EXCEPT( is_null(leftPrecOp) && is_null(rightPrecOp) );
36#endif
37 if (!is_null(leftPrecOp))
38 leftPrecOp_.initialize(leftPrecOp);
39 if (!is_null(rightPrecOp))
40 rightPrecOp_.initialize(rightPrecOp);
41}
42
43
44template <class Scalar>
46 const Teuchos::RCP<const LinearOpBase<Scalar> > &leftPrecOp,
47 const Teuchos::RCP<const LinearOpBase<Scalar> > &rightPrecOp
48 )
49{
50#ifdef TEUCHOS_DEBUG
51 TEUCHOS_TEST_FOR_EXCEPT( is_null(leftPrecOp) && is_null(rightPrecOp) );
52#endif
53 if (!is_null(leftPrecOp))
54 leftPrecOp_.initialize(leftPrecOp);
55 if (!is_null(rightPrecOp))
56 rightPrecOp_.initialize(rightPrecOp);
57}
58
59
60template <class Scalar>
62 const Teuchos::RCP<LinearOpBase<Scalar> > &unspecifiedPrecOp
63 )
64{
65 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
66}
67
68
69template <class Scalar>
71 const Teuchos::RCP<const LinearOpBase<Scalar> > &unspecifiedPrecOp
72 )
73{
74 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
75}
76
77
78template <class Scalar>
80 const Teuchos::RCP<LinearOpBase<Scalar> > &leftPrecOp
81 )
82{
83 uninitialize();
84 leftPrecOp_.initialize(leftPrecOp);
85}
86
87
88template <class Scalar>
90 const Teuchos::RCP<const LinearOpBase<Scalar> > &leftPrecOp
91 )
92{
93 uninitialize();
94 leftPrecOp_.initialize(leftPrecOp);
95}
96
97
98template <class Scalar>
100 const Teuchos::RCP<LinearOpBase<Scalar> > &rightPrecOp
101 )
102{
103 uninitialize();
104 rightPrecOp_.initialize(rightPrecOp);
105}
106
107
108template <class Scalar>
110 const Teuchos::RCP<const LinearOpBase<Scalar> > &rightPrecOp
111 )
112{
113 uninitialize();
114 rightPrecOp_.initialize(rightPrecOp);
115}
116
117
118template <class Scalar>
120 const Teuchos::RCP<LinearOpBase<Scalar> > &leftPrecOp,
121 const Teuchos::RCP<LinearOpBase<Scalar> > &rightPrecOp
122 )
123{
124 uninitialize();
125 rightPrecOp_.initialize(rightPrecOp);
126 leftPrecOp_.initialize(leftPrecOp);
127}
128
129
130template <class Scalar>
132 const Teuchos::RCP<const LinearOpBase<Scalar> > &leftPrecOp,
133 const Teuchos::RCP<const LinearOpBase<Scalar> > &rightPrecOp
134 )
135{
136 uninitialize();
137 rightPrecOp_.initialize(rightPrecOp);
138 leftPrecOp_.initialize(leftPrecOp);
139}
140
141
142template <class Scalar>
144 const Teuchos::RCP<LinearOpBase<Scalar> > &unspecifiedPrecOp
145 )
146{
147 uninitialize();
148 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
149}
150
151
152template <class Scalar>
154 const Teuchos::RCP<const LinearOpBase<Scalar> > &unspecifiedPrecOp
155 )
156{
157 uninitialize();
158 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
159}
160
161
162template <class Scalar>
164{
165 leftPrecOp_.uninitialize();
166 rightPrecOp_.uninitialize();
167 unspecifiedPrecOp_.uninitialize();
168}
169
170
171// Overridden from PreconditionerBase
172
173
174template <class Scalar>
176{
177 return leftPrecOp_.isConst();
178}
179
180
181template <class Scalar>
184{
185 return leftPrecOp_.getNonconstObj();
186}
187
188
189template <class Scalar>
192{
193 return leftPrecOp_.getConstObj();
194}
195
196
197template <class Scalar>
199{
200 return rightPrecOp_.isConst();
201}
202
203
204template <class Scalar>
207{
208 return rightPrecOp_.getNonconstObj();
209}
210
211
212template <class Scalar>
215{
216 return rightPrecOp_.getConstObj();
217}
218
219
220template <class Scalar>
222{
223 return unspecifiedPrecOp_.isConst();
224}
225
226
227template <class Scalar>
230{
231 return unspecifiedPrecOp_.getNonconstObj();
232}
233
234
235template <class Scalar>
238{
239 return unspecifiedPrecOp_.getConstObj();
240}
241
242
243// Overridden from Teuchos::Describable
244
245
246template <class Scalar>
248{
249 std::ostringstream oss;
250 oss << Teuchos::Describable::description() << "{";
251 bool wroteOne = false;
252 if(!is_null(leftPrecOp_.getConstObj())) {
253 if(wroteOne) oss << ",";
254 oss << "leftPrecOp=" << leftPrecOp_.getConstObj()->description();
255 wroteOne = true;
256 }
257 if(!is_null(rightPrecOp_.getConstObj())) {
258 if(wroteOne) oss << ",";
259 oss << "rightPrecOp=" << rightPrecOp_.getConstObj()->description();
260 wroteOne = true;
261 }
262 if(!is_null(unspecifiedPrecOp_.getConstObj())) {
263 if(wroteOne) oss << ",";
264 oss << "unspecifiedPrecOp=" << unspecifiedPrecOp_.getConstObj()->description();
265 wroteOne = true;
266 }
267 oss << "}";
268 return oss.str();
269}
270
271
272template <class Scalar>
275 const Teuchos::EVerbosityLevel verbLevel
276 ) const
277{
279 using Teuchos::OSTab;
280 using Teuchos::describe;
281 OSTab tab(out);
282 switch(verbLevel) {
285 out << Teuchos::Describable::description() << std::endl;
286 break;
290 {
291 out
292 << Teuchos::typeName(*this) << "\n";
293 OSTab tab2(out);
294 if(!is_null(leftPrecOp_.getConstObj()))
295 out << "leftPrecOp=" << describe(*leftPrecOp_.getConstObj(),verbLevel);
296 if(!is_null(rightPrecOp_.getConstObj()))
297 out << "rig htPrecOp=" << describe(*rightPrecOp_.getConstObj(),verbLevel);
298 if(!is_null(unspecifiedPrecOp_.getConstObj()))
299 out << "unspecifiedPrecOp=" << describe(*unspecifiedPrecOp_.getConstObj(),verbLevel);
300 break;
301 }
302 default:
303 TEUCHOS_TEST_FOR_EXCEPT(true); // Should never get here!
304 }
305}
306
307
308} // namespace Thyra
309
310
311#endif // THYRA_DEFUALT_PRECONDITIONER_DEF_HPP
virtual std::string description() const
void initializeUnspecified(const Teuchos::RCP< LinearOpBase< Scalar > > &unspecifiedPrecOp)
Initialize a single unspecified preconditioner operator.
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstRightPrecOp()
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstLeftPrecOp()
Teuchos::RCP< const LinearOpBase< Scalar > > getRightPrecOp() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Teuchos::RCP< const LinearOpBase< Scalar > > getUnspecifiedPrecOp() const
void initializeLeft(const Teuchos::RCP< LinearOpBase< Scalar > > &leftPrecOp)
Initialize a left preconditioner.
DefaultPreconditioner()
Construct to uninitialized.
void initializeRight(const Teuchos::RCP< LinearOpBase< Scalar > > &rightPrecOp)
Initialize a right preconditioner.
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
Teuchos::RCP< const LinearOpBase< Scalar > > getLeftPrecOp() const
void initializeLeftRight(const Teuchos::RCP< LinearOpBase< Scalar > > &leftPrecOp, const Teuchos::RCP< LinearOpBase< Scalar > > &rightPrecOp)
Initialize a split left/right preconditioner.
Base class for all linear operators.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
std::string typeName(const T &t)