10#ifndef Thyra_ScaledIdentityLinearOpWithSolve_hpp
11#define Thyra_ScaledIdentityLinearOpWithSolve_hpp
15#include "Thyra_LinearOpWithSolveBase.hpp"
16#include "Thyra_MultiVectorStdOps.hpp"
17#include "Thyra_RowStatLinearOpBase.hpp"
18#include "Thyra_ScaledLinearOpBase.hpp"
19#include "Thyra_VectorStdOps.hpp"
33template <
class Scalar>
36 virtual public RowStatLinearOpBase<Scalar>,
37 virtual public ScaledLinearOpBase<Scalar> {
55 RCP<const VectorSpaceBase<Scalar> >
space()
const {
return space_; }
64 RCP<const VectorSpaceBase<Scalar> >
range()
const {
return space_; }
66 RCP<const VectorSpaceBase<Scalar> >
domain()
const {
return space_; }
68 RCP<const LinearOpBase<Scalar> >
clone()
const
70 RCP<ScaledIdentityLinearOpWithSolve<Scalar> > op =
84 const Scalar beta)
const
86 typedef Teuchos::ScalarTraits<Scalar> ST;
87 Thyra::scale(beta, Y);
88 if (M_trans == CONJ || M_trans == CONJTRANS)
89 V_StVpV(Y, ST::conjugate(
s_) * alpha, X, *Y);
91 V_StVpV(Y,
s_ * alpha, X, *Y);
101 const Ptr<
const SolveCriteria<Scalar> > )
const
108 const SolveMeasureType& )
const
116 const Ptr<
const SolveCriteria<Scalar> > )
const
118 typedef Teuchos::ScalarTraits<Scalar> ST;
119 assign(X, ST::zero());
120 if (M_trans == CONJ || M_trans == CONJTRANS)
121 V_StVpV(X, ST::one() / ST::conjugate(
s_), B, *X);
123 V_StVpV(X, ST::one() /
s_, B, *X);
124 SolveStatus<Scalar> solveStatus;
125 solveStatus.solveStatus = SOLVE_STATUS_CONVERGED;
136 const RowStatLinearOpBaseUtils::ERowStat rowStat)
const
139 case RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM:
140 case RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM:
return true;
141 case RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM:
142 case RowStatLinearOpBaseUtils::ROW_STAT_INV_COL_SUM:
143 return s_ != Teuchos::ScalarTraits<Scalar>::zero();
151 typedef Teuchos::ScalarTraits<Scalar> ST;
152 TEUCHOS_ASSERT(this->rowStatIsSupported(rowStat));
153 const Scalar abs_s = ST::magnitude(
s_);
154 if (rowStat == RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM ||
155 rowStat == RowStatLinearOpBaseUtils::ROW_STAT_INV_COL_SUM)
156 put_scalar(ST::one() / abs_s, rowStatVec);
158 put_scalar(abs_s, rowStatVec);
186 RCP<const VectorSpaceBase<Scalar> >
space_;
194 const std::string& caller)
196 typedef Teuchos::ScalarTraits<Scalar> ST;
197 typedef typename ST::magnitudeType Mag;
198 if (v.space()->dim() == 0)
return ST::one();
199 const Scalar d = get_ele(v, 0);
200 RCP<VectorBase<Scalar> > diff = v.clone_v();
201 add_scalar(-d, diff.ptr());
202 TEUCHOS_TEST_FOR_EXCEPTION(
203 norm_inf(*diff) > Mag(100) * ST::eps() * ST::magnitude(d),
205 "Error - Thyra::ScaledIdentityLinearOpWithSolve::"
207 <<
": only a scaling by a uniform vector (all entries equal) "
208 "keeps the operator a scaled identity.\n");
213 const RCP<
const VectorSpaceBase<Scalar> >&
space)
216 TEUCHOS_TEST_FOR_EXCEPT(is_null(
space));
227template <
class Scalar>
237template <
class Scalar>
239 const RCP<
const VectorSpaceBase<Scalar> >&
space,
const Scalar& s)
241 RCP<ScaledIdentityLinearOpWithSolve<Scalar> > op =
243 op->initialize(
space, s);
bool supportsScaleRightImpl() const
RCP< const VectorSpaceBase< double > > space_
bool solveSupportsSolveMeasureTypeImpl(EOpTransp, const SolveMeasureType &) const
void setScale(const Scalar &s)
void initialize(const RCP< const VectorSpaceBase< Scalar > > &space, const Scalar &s)
bool opSupportedImpl(EOpTransp) const
RCP< const VectorSpaceBase< double > > space() const
void getRowStatImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat, const Ptr< VectorBase< Scalar > > &rowStatVec) const
SolveStatus< Scalar > solveImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &B, const Ptr< MultiVectorBase< Scalar > > &X, const Ptr< const SolveCriteria< Scalar > >) 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)
static Scalar uniformValue(const VectorBase< Scalar > &v, const std::string &caller)
The value d of the entries of a uniform vector (throws otherwise).
void scaleLeftImpl(const VectorBase< Scalar > &row_scaling)
diag(d) * s*I = (d*s) I, for a uniform vector d.
RCP< ScaledIdentityLinearOpWithSolve< Scalar > > scaledIdentity()
Nonmember constructor function.
bool rowStatIsSupportedImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat) const
The absolute row and column sums are |s|; their inverses require s != 0.
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
void scaleRightImpl(const VectorBase< Scalar > &col_scaling)
s*I * diag(d) = (d*s) I, for a uniform vector d.
ScaledIdentityLinearOpWithSolve()
Construct to uninitialized.
RCP< const LinearOpBase< Scalar > > clone() const
bool supportsScaleLeftImpl() const
bool solveSupportsImpl(EOpTransp) const
RCP< const VectorSpaceBase< Scalar > > domain() const
RCP< const VectorSpaceBase< Scalar > > range() const
bool solveSupportsNewImpl(EOpTransp, const Ptr< const SolveCriteria< Scalar > >) const