Thyra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
17 namespace Thyra {
18 
19 
20 // Constructors/initializers/accessors
21 
22 
23 template <class Scalar>
25 {}
26 
27 
28 template <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 
44 template <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 
60 template <class Scalar>
62  const Teuchos::RCP<LinearOpBase<Scalar> > &unspecifiedPrecOp
63  )
64 {
65  unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
66 }
67 
68 
69 template <class Scalar>
71  const Teuchos::RCP<const LinearOpBase<Scalar> > &unspecifiedPrecOp
72  )
73 {
74  unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
75 }
76 
77 
78 template <class Scalar>
80  const Teuchos::RCP<LinearOpBase<Scalar> > &leftPrecOp
81  )
82 {
83  uninitialize();
84  leftPrecOp_.initialize(leftPrecOp);
85 }
86 
87 
88 template <class Scalar>
90  const Teuchos::RCP<const LinearOpBase<Scalar> > &leftPrecOp
91  )
92 {
93  uninitialize();
94  leftPrecOp_.initialize(leftPrecOp);
95 }
96 
97 
98 template <class Scalar>
100  const Teuchos::RCP<LinearOpBase<Scalar> > &rightPrecOp
101  )
102 {
103  uninitialize();
104  rightPrecOp_.initialize(rightPrecOp);
105 }
106 
107 
108 template <class Scalar>
110  const Teuchos::RCP<const LinearOpBase<Scalar> > &rightPrecOp
111  )
112 {
113  uninitialize();
114  rightPrecOp_.initialize(rightPrecOp);
115 }
116 
117 
118 template <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 
130 template <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 
142 template <class Scalar>
144  const Teuchos::RCP<LinearOpBase<Scalar> > &unspecifiedPrecOp
145  )
146 {
147  uninitialize();
148  unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
149 }
150 
151 
152 template <class Scalar>
154  const Teuchos::RCP<const LinearOpBase<Scalar> > &unspecifiedPrecOp
155  )
156 {
157  uninitialize();
158  unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
159 }
160 
161 
162 template <class Scalar>
164 {
165  leftPrecOp_.uninitialize();
166  rightPrecOp_.uninitialize();
167  unspecifiedPrecOp_.uninitialize();
168 }
169 
170 
171 // Overridden from PreconditionerBase
172 
173 
174 template <class Scalar>
176 {
177  return leftPrecOp_.isConst();
178 }
179 
180 
181 template <class Scalar>
184 {
185  return leftPrecOp_.getNonconstObj();
186 }
187 
188 
189 template <class Scalar>
192 {
193  return leftPrecOp_.getConstObj();
194 }
195 
196 
197 template <class Scalar>
199 {
200  return rightPrecOp_.isConst();
201 }
202 
203 
204 template <class Scalar>
207 {
208  return rightPrecOp_.getNonconstObj();
209 }
210 
211 
212 template <class Scalar>
215 {
216  return rightPrecOp_.getConstObj();
217 }
218 
219 
220 template <class Scalar>
222 {
223  return unspecifiedPrecOp_.isConst();
224 }
225 
226 
227 template <class Scalar>
230 {
231  return unspecifiedPrecOp_.getNonconstObj();
232 }
233 
234 
235 template <class Scalar>
238 {
239  return unspecifiedPrecOp_.getConstObj();
240 }
241 
242 
243 // Overridden from Teuchos::Describable
244 
245 
246 template <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 
272 template <class Scalar>
275  const Teuchos::EVerbosityLevel verbLevel
276  ) const
277 {
278  using Teuchos::FancyOStream;
279  using Teuchos::OSTab;
280  using Teuchos::describe;
281  OSTab tab(out);
282  switch(verbLevel) {
284  case Teuchos::VERB_LOW:
285  out << Teuchos::Describable::description() << std::endl;
286  break;
288  case Teuchos::VERB_HIGH:
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
bool is_null(const boost::shared_ptr< T > &p)
void initializeUnspecified(const Teuchos::RCP< LinearOpBase< Scalar > > &unspecifiedPrecOp)
Initialize a single unspecified preconditioner operator.
basic_OSTab< char > OSTab
basic_FancyOStream< char > FancyOStream
void initializeRight(const Teuchos::RCP< LinearOpBase< Scalar > > &rightPrecOp)
Initialize a right preconditioner.
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual std::string description() const
Teuchos::RCP< const LinearOpBase< Scalar > > getRightPrecOp() const
Base class for all linear operators.
Teuchos::RCP< const LinearOpBase< Scalar > > getLeftPrecOp() const
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstLeftPrecOp()
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstRightPrecOp()
Teuchos::RCP< const LinearOpBase< Scalar > > getUnspecifiedPrecOp() const
void initializeLeftRight(const Teuchos::RCP< LinearOpBase< Scalar > > &leftPrecOp, const Teuchos::RCP< LinearOpBase< Scalar > > &rightPrecOp)
Initialize a split left/right preconditioner.
DefaultPreconditioner()
Construct to uninitialized.
void initializeLeft(const Teuchos::RCP< LinearOpBase< Scalar > > &leftPrecOp)
Initialize a left preconditioner.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
std::string typeName(const T &t)