00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef THYRA_DEFAULT_INVERSE_LINEAR_OP_DECL_HPP
00030 #define THYRA_DEFAULT_INVERSE_LINEAR_OP_DECL_HPP
00031
00032 #include "Thyra_InverseLinearOpBase.hpp"
00033 #include "Thyra_SingleScalarLinearOpBase.hpp"
00034 #include "Teuchos_ConstNonconstObjectContainer.hpp"
00035 #include "Teuchos_arrayArg.hpp"
00036
00037 namespace Thyra {
00038
00040 enum EThrowOnSolveFailure {
00041 THROW_ON_SOLVE_FAILURE=1
00042 ,IGNORE_SOLVE_FAILURE=0
00043 };
00044
00068 template<class Scalar>
00069 class DefaultInverseLinearOp
00070 : virtual public InverseLinearOpBase<Scalar>
00071 , virtual protected SingleScalarLinearOpBase<Scalar>
00072 {
00073 public:
00074
00076 using SingleScalarLinearOpBase<Scalar>::apply;
00077
00080
00084 DefaultInverseLinearOp();
00085
00088 DefaultInverseLinearOp(
00089 const Teuchos::RefCountPtr<LinearOpWithSolveBase<Scalar> > &lows
00090 ,const SolveCriteria<Scalar> *fwdSolveCriteria = NULL
00091 ,const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE
00092 ,const SolveCriteria<Scalar> *adjSolveCriteria = NULL
00093 ,const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00094 );
00095
00101 DefaultInverseLinearOp(
00102 const Teuchos::RefCountPtr<const LinearOpWithSolveBase<Scalar> > &lows
00103 ,const SolveCriteria<Scalar> *fwdSolveCriteria = NULL
00104 ,const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE
00105 ,const SolveCriteria<Scalar> *adjSolveCriteria = NULL
00106 ,const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00107 );
00108
00143 void initialize(
00144 const Teuchos::RefCountPtr<LinearOpWithSolveBase<Scalar> > &lows
00145 ,const SolveCriteria<Scalar> *fwdSolveCriteria = NULL
00146 ,const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE
00147 ,const SolveCriteria<Scalar> *adjSolveCriteria = NULL
00148 ,const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00149 );
00150
00185 void initialize(
00186 const Teuchos::RefCountPtr<const LinearOpWithSolveBase<Scalar> > &lows
00187 ,const SolveCriteria<Scalar> *fwdSolveCriteria = NULL
00188 ,const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE
00189 ,const SolveCriteria<Scalar> *adjSolveCriteria = NULL
00190 ,const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00191 );
00192
00201 void uninitialize();
00202
00204
00207
00209 bool isLowsConst() const;
00211 Teuchos::RefCountPtr<LinearOpWithSolveBase<Scalar> >
00212 getNonconstLows();
00214 Teuchos::RefCountPtr<const LinearOpWithSolveBase<Scalar> >
00215 getLows() const;
00216
00218
00221
00226 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> > range() const;
00227
00232 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> > domain() const;
00233
00235 Teuchos::RefCountPtr<const LinearOpBase<Scalar> > clone() const;
00236
00238
00241
00243 std::string description() const;
00244
00246 void describe(
00247 Teuchos::FancyOStream &out
00248 ,const Teuchos::EVerbosityLevel verbLevel
00249 ) const;
00250
00252
00253 protected:
00254
00257
00261 bool opSupported(ETransp M_trans) const;
00262
00264 void apply(
00265 const ETransp M_trans
00266 ,const MultiVectorBase<Scalar> &X
00267 ,MultiVectorBase<Scalar> *Y
00268 ,const Scalar alpha
00269 ,const Scalar beta
00270 ) const;
00271
00273
00274 private:
00275
00276 Teuchos::ConstNonconstObjectContainer<LinearOpWithSolveBase<Scalar> > lows_;
00277 Teuchos::RefCountPtr<SolveCriteria<Scalar> > fwdSolveCriteria_;
00278 EThrowOnSolveFailure throwOnFwdSolveFailure_;
00279 Teuchos::RefCountPtr<SolveCriteria<Scalar> > adjSolveCriteria_;
00280 EThrowOnSolveFailure throwOnAdjSolveFailure_;
00281
00282 void assertInitialized() const;
00283
00284 template<class LOWS>
00285 void initializeImpl(
00286 const Teuchos::RefCountPtr<LOWS> &lows
00287 ,const SolveCriteria<Scalar> *fwdSolveCriteria
00288 ,const EThrowOnSolveFailure throwOnFwdSolveFailure
00289 ,const SolveCriteria<Scalar> *adjSolveCriteria
00290 ,const EThrowOnSolveFailure throwOnAdjSolveFailure
00291 );
00292
00293
00294 DefaultInverseLinearOp(const DefaultInverseLinearOp&);
00295 DefaultInverseLinearOp& operator=(const DefaultInverseLinearOp&);
00296
00297 };
00298
00303 template<class Scalar>
00304 Teuchos::RefCountPtr<LinearOpBase<Scalar> >
00305 nonconstInverse(
00306 const Teuchos::RefCountPtr<LinearOpWithSolveBase<Scalar> > &A
00307 ,const SolveCriteria<Scalar> *fwdSolveCriteria = NULL
00308 ,const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE
00309 ,const SolveCriteria<Scalar> *adjSolveCriteria = NULL
00310 ,const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00311 );
00312
00317 template<class Scalar>
00318 Teuchos::RefCountPtr<LinearOpBase<Scalar> >
00319 inverse(
00320 const Teuchos::RefCountPtr<const LinearOpWithSolveBase<Scalar> > &A
00321 ,const SolveCriteria<Scalar> *fwdSolveCriteria = NULL
00322 ,const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE
00323 ,const SolveCriteria<Scalar> *adjSolveCriteria = NULL
00324 ,const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00325 );
00326
00327
00328
00329
00330 template<class Scalar>
00331 inline
00332 void DefaultInverseLinearOp<Scalar>::assertInitialized() const
00333 {
00334 #ifdef TEUCHOS_DEBUG
00335 TEST_FOR_EXCEPT( !lows_.getConstObj().get() );
00336 #endif
00337 }
00338
00339 }
00340
00341 #endif // THYRA_DEFAULT_INVERSE_LINEAR_OP_DECL_HPP