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
00039
00041 enum EThrowOnSolveFailure {
00042 THROW_ON_SOLVE_FAILURE=1
00043 ,IGNORE_SOLVE_FAILURE=0
00044 };
00045
00046
00070 template<class Scalar>
00071 class DefaultInverseLinearOp
00072 : virtual public InverseLinearOpBase<Scalar>,
00073 virtual protected SingleScalarLinearOpBase<Scalar>
00074 {
00075 public:
00076
00078 using SingleScalarLinearOpBase<Scalar>::apply;
00079
00082
00086 DefaultInverseLinearOp();
00087
00090 DefaultInverseLinearOp(
00091 const Teuchos::RCP<LinearOpWithSolveBase<Scalar> > &lows,
00092 const SolveCriteria<Scalar> *fwdSolveCriteria = NULL,
00093 const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE,
00094 const SolveCriteria<Scalar> *adjSolveCriteria = NULL,
00095 const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00096 );
00097
00103 DefaultInverseLinearOp(
00104 const Teuchos::RCP<const LinearOpWithSolveBase<Scalar> > &lows,
00105 const SolveCriteria<Scalar> *fwdSolveCriteria = NULL,
00106 const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE,
00107 const SolveCriteria<Scalar> *adjSolveCriteria = NULL,
00108 const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00109 );
00110
00150 void initialize(
00151 const Teuchos::RCP<LinearOpWithSolveBase<Scalar> > &lows,
00152 const SolveCriteria<Scalar> *fwdSolveCriteria = NULL,
00153 const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE,
00154 const SolveCriteria<Scalar> *adjSolveCriteria = NULL,
00155 const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00156 );
00157
00196 void initialize(
00197 const Teuchos::RCP<const LinearOpWithSolveBase<Scalar> > &lows,
00198 const SolveCriteria<Scalar> *fwdSolveCriteria = NULL,
00199 const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE,
00200 const SolveCriteria<Scalar> *adjSolveCriteria = NULL,
00201 const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00202 );
00203
00212 void uninitialize();
00213
00215
00218
00220 bool isLowsConst() const;
00222 Teuchos::RCP<LinearOpWithSolveBase<Scalar> >
00223 getNonconstLows();
00225 Teuchos::RCP<const LinearOpWithSolveBase<Scalar> >
00226 getLows() const;
00227
00229
00232
00237 Teuchos::RCP< const VectorSpaceBase<Scalar> > range() const;
00238
00243 Teuchos::RCP< const VectorSpaceBase<Scalar> > domain() const;
00244
00246 Teuchos::RCP<const LinearOpBase<Scalar> > clone() const;
00247
00249
00252
00254 std::string description() const;
00255
00257 void describe(
00258 Teuchos::FancyOStream &out,
00259 const Teuchos::EVerbosityLevel verbLevel
00260 ) const;
00261
00263
00264 protected:
00265
00268
00272 bool opSupported(ETransp M_trans) const;
00273
00275 void apply(
00276 const ETransp M_trans,
00277 const MultiVectorBase<Scalar> &X,
00278 MultiVectorBase<Scalar> *Y,
00279 const Scalar alpha,
00280 const Scalar beta
00281 ) const;
00282
00284
00285 private:
00286
00287 Teuchos::ConstNonconstObjectContainer<LinearOpWithSolveBase<Scalar> > lows_;
00288 Teuchos::RCP<SolveCriteria<Scalar> > fwdSolveCriteria_;
00289 EThrowOnSolveFailure throwOnFwdSolveFailure_;
00290 Teuchos::RCP<SolveCriteria<Scalar> > adjSolveCriteria_;
00291 EThrowOnSolveFailure throwOnAdjSolveFailure_;
00292
00293 void assertInitialized() const;
00294
00295 template<class LOWS>
00296 void initializeImpl(
00297 const Teuchos::RCP<LOWS> &lows,
00298 const SolveCriteria<Scalar> *fwdSolveCriteria,
00299 const EThrowOnSolveFailure throwOnFwdSolveFailure,
00300 const SolveCriteria<Scalar> *adjSolveCriteria,
00301 const EThrowOnSolveFailure throwOnAdjSolveFailure
00302 );
00303
00304
00305 DefaultInverseLinearOp(const DefaultInverseLinearOp&);
00306 DefaultInverseLinearOp& operator=(const DefaultInverseLinearOp&);
00307
00308 };
00309
00310
00315 template<class Scalar>
00316 Teuchos::RCP<LinearOpBase<Scalar> >
00317 nonconstInverse(
00318 const Teuchos::RCP<LinearOpWithSolveBase<Scalar> > &A,
00319 const SolveCriteria<Scalar> *fwdSolveCriteria = NULL,
00320 const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE,
00321 const SolveCriteria<Scalar> *adjSolveCriteria = NULL,
00322 const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00323 );
00324
00325
00330 template<class Scalar>
00331 Teuchos::RCP<LinearOpBase<Scalar> >
00332 inverse(
00333 const Teuchos::RCP<const LinearOpWithSolveBase<Scalar> > &A,
00334 const SolveCriteria<Scalar> *fwdSolveCriteria = NULL,
00335 const EThrowOnSolveFailure throwOnFwdSolveFailure = THROW_ON_SOLVE_FAILURE,
00336 const SolveCriteria<Scalar> *adjSolveCriteria = NULL,
00337 const EThrowOnSolveFailure throwOnAdjSolveFailure = THROW_ON_SOLVE_FAILURE
00338 );
00339
00340
00341
00342
00343
00344
00345 template<class Scalar>
00346 inline
00347 void DefaultInverseLinearOp<Scalar>::assertInitialized() const
00348 {
00349 #ifdef TEUCHOS_DEBUG
00350 TEST_FOR_EXCEPT( !lows_.getConstObj().get() );
00351 #endif
00352 }
00353
00354
00355 }
00356
00357
00358 #endif // THYRA_DEFAULT_INVERSE_LINEAR_OP_DECL_HPP