Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_ScaledIdentityLinearOpWithSolve.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ****************************************************************************
3 // Tempus: Copyright (2017) Sandia Corporation
4 //
5 // Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6 // ****************************************************************************
7 // @HEADER
8 
9 #ifndef Thyra_ScaledIdentityLinearOpWithSolve_hpp
10 #define Thyra_ScaledIdentityLinearOpWithSolve_hpp
11 
12 #include "Thyra_LinearOpWithSolveBase.hpp"
13 #include "Thyra_MultiVectorStdOps.hpp"
14 
15 namespace Thyra {
16 
21 template <class Scalar>
23  : virtual public LinearOpWithSolveBase<Scalar> {
24  public:
27 
30 
31  void initialize(const RCP<const VectorSpaceBase<Scalar> >& space,
32  const Scalar& s)
33  {
35  space_ = space;
36  s_ = s;
37  }
38 
39  void uninitialize() { space_ = Teuchos::null; }
40 
41  RCP<const VectorSpaceBase<Scalar> > space() const { return space_; }
42  Scalar scale() const { return s_; }
43  void setScale(const Scalar& s) { s_ = s; }
44 
46 
49 
50  RCP<const VectorSpaceBase<Scalar> > range() const { return space_; }
51 
52  RCP<const VectorSpaceBase<Scalar> > domain() const { return space_; }
53 
54  RCP<const LinearOpBase<Scalar> > clone() const
55  {
56  RCP<ScaledIdentityLinearOpWithSolve<Scalar> > op =
58  op->initialize(space_, s_);
59  return op;
60  }
62 
63  protected:
66  bool opSupportedImpl(EOpTransp /* M_trans */) const { return true; }
67 
68  void applyImpl(const EOpTransp M_trans, const MultiVectorBase<Scalar>& X,
69  const Ptr<MultiVectorBase<Scalar> >& Y, const Scalar alpha,
70  const Scalar beta) const
71  {
73  Thyra::scale(beta, Y);
74  if (M_trans == CONJ || M_trans == CONJTRANS)
75  V_StVpV(Y, ST::conjugate(s_) * alpha, X, *Y);
76  else
77  V_StVpV(Y, s_ * alpha, X, *Y);
78  }
80 
83  bool solveSupportsImpl(EOpTransp /* M_trans */) const { return true; }
84 
86  EOpTransp /* M_trans */,
87  const Ptr<const SolveCriteria<Scalar> > /* solveCriteria */) const
88  {
89  return true;
90  }
91 
93  EOpTransp /* M_trans */,
94  const SolveMeasureType& /* solveMeasureType */) const
95  {
96  return true;
97  }
98 
100  const EOpTransp M_trans, const MultiVectorBase<Scalar>& B,
101  const Ptr<MultiVectorBase<Scalar> >& X,
102  const Ptr<const SolveCriteria<Scalar> > /* solveCriteria */) const
103  {
105  assign(X, ST::zero());
106  if (M_trans == CONJ || M_trans == CONJTRANS)
107  V_StVpV(X, ST::one() / ST::conjugate(s_), B, *X);
108  else
109  V_StVpV(X, ST::one() / s_, B, *X);
110  SolveStatus<Scalar> solveStatus;
111  solveStatus.solveStatus = SOLVE_STATUS_CONVERGED;
112  return solveStatus;
113  }
115 
116  private:
117  // //////////////////////////////
118  // Private data members
119 
120  RCP<const VectorSpaceBase<Scalar> > space_;
121  Scalar s_;
122 
123  // //////////////////////////////
124  // Private member functions
125 
126  static void validateInitialize(
127  const RCP<const VectorSpaceBase<Scalar> >& space)
128  {
129 #ifdef TEUCHOS_DEBUG
131 #else
132  (void)space;
133 #endif
134  }
135 };
136 
141 template <class Scalar>
142 RCP<ScaledIdentityLinearOpWithSolve<Scalar> > scaledIdentity()
143 {
145 }
146 
151 template <class Scalar>
152 RCP<ScaledIdentityLinearOpWithSolve<Scalar> > scaledIdentity(
153  const RCP<const VectorSpaceBase<Scalar> >& space, const Scalar& s)
154 {
155  RCP<ScaledIdentityLinearOpWithSolve<Scalar> > op =
157  op->initialize(space, s);
158  return op;
159 }
160 
161 } // end namespace Thyra
162 
163 #endif
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
bool is_null(const boost::shared_ptr< T > &p)
EOpTransp
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
RCP< ScaledIdentityLinearOpWithSolve< Scalar > > scaledIdentity(const RCP< const VectorSpaceBase< Scalar > > &space, const Scalar &s)
Nonmember constructor function.
static void validateInitialize(const RCP< const VectorSpaceBase< Scalar > > &space)
RCP< const VectorSpaceBase< Scalar > > space() const
RCP< const VectorSpaceBase< Scalar > > domain() const
bool solveSupportsNewImpl(EOpTransp, const Ptr< const SolveCriteria< Scalar > >) const
void initialize(const RCP< const VectorSpaceBase< Scalar > > &space, const Scalar &s)
RCP< const LinearOpBase< Scalar > > clone() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
bool solveSupportsSolveMeasureTypeImpl(EOpTransp, const SolveMeasureType &) const
RCP< const VectorSpaceBase< Scalar > > range() const
ESolveStatus solveStatus
RCP< ScaledIdentityLinearOpWithSolve< Scalar > > scaledIdentity()
Nonmember constructor function.
SolveStatus< Scalar > solveImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &B, const Ptr< MultiVectorBase< Scalar > > &X, const Ptr< const SolveCriteria< Scalar > >) const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)