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_DIAGONAL_LINEAR_OP_HPP
00030 #define THYRA_DIAGONAL_LINEAR_OP_HPP
00031
00032 #include "Thyra_DefaultDiagonalLinearOpDecl.hpp"
00033 #include "Thyra_SingleRhsLinearOpWithSolveBase.hpp"
00034 #include "Thyra_VectorBase.hpp"
00035
00036 namespace Thyra {
00037
00038
00039
00040 template<class Scalar>
00041 DefaultDiagonalLinearOp<Scalar>::DefaultDiagonalLinearOp()
00042 {}
00043
00044 template<class Scalar>
00045 DefaultDiagonalLinearOp<Scalar>::DefaultDiagonalLinearOp(
00046 const Teuchos::RefCountPtr<const VectorSpaceBase<Scalar> > &space
00047 )
00048 {
00049 initialize(space);
00050 }
00051
00052 template<class Scalar>
00053 DefaultDiagonalLinearOp<Scalar>::DefaultDiagonalLinearOp(
00054 const Teuchos::RefCountPtr<VectorBase<Scalar> > &diag
00055 )
00056 {
00057 initialize(diag);
00058 }
00059
00060 template<class Scalar>
00061 DefaultDiagonalLinearOp<Scalar>::DefaultDiagonalLinearOp(
00062 const Teuchos::RefCountPtr<const VectorBase<Scalar> > &diag
00063 )
00064 {
00065 initialize(diag);
00066 }
00067
00068 template<class Scalar>
00069 void DefaultDiagonalLinearOp<Scalar>::initialize(
00070 const Teuchos::RefCountPtr<const VectorSpaceBase<Scalar> > &space
00071 )
00072 {
00073 #ifdef TEUCHOS_DEBUG
00074 TEST_FOR_EXCEPT(space.get()==NULL);
00075 #endif
00076 initialize(createMember(space));
00077 }
00078
00079 template<class Scalar>
00080 void DefaultDiagonalLinearOp<Scalar>::initialize(
00081 const Teuchos::RefCountPtr<VectorBase<Scalar> > &diag
00082 )
00083 {
00084 diag_.initialize(diag);
00085 }
00086
00087 template<class Scalar>
00088 void DefaultDiagonalLinearOp<Scalar>::initialize(
00089 const Teuchos::RefCountPtr<const VectorBase<Scalar> > &diag
00090 )
00091 {
00092 diag_.initialize(diag);
00093 }
00094
00095 template<class Scalar>
00096 void DefaultDiagonalLinearOp<Scalar>::uninitialize()
00097 {
00098 diag_.uninitialize();
00099 }
00100
00101
00102
00103 template<class Scalar>
00104 bool DefaultDiagonalLinearOp<Scalar>::isDiagConst() const
00105 {
00106 return diag_.isConst();
00107 }
00108
00109 template<class Scalar>
00110 Teuchos::RefCountPtr<VectorBase<Scalar> >
00111 DefaultDiagonalLinearOp<Scalar>::getNonconstDiag()
00112 {
00113 return diag_.getNonconstObj();
00114 }
00115
00116 template<class Scalar>
00117 Teuchos::RefCountPtr<const VectorBase<Scalar> >
00118 DefaultDiagonalLinearOp<Scalar>::getDiag() const
00119 {
00120 return diag_.getConstObj();
00121 }
00122
00123
00124
00125 template<class Scalar>
00126 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> >
00127 DefaultDiagonalLinearOp<Scalar>::range() const
00128 {
00129 return diag_.getConstObj()->space();
00130 }
00131
00132 template<class Scalar>
00133 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> >
00134 DefaultDiagonalLinearOp<Scalar>::domain() const
00135 {
00136 return diag_.getConstObj()->space();
00137 }
00138
00139 template<class Scalar>
00140 Teuchos::RefCountPtr<const LinearOpBase<Scalar> >
00141 DefaultDiagonalLinearOp<Scalar>::clone() const
00142 {
00143 return Teuchos::rcp(new DefaultDiagonalLinearOp<Scalar>(diag_.getConstObj()->clone_v()));
00144 }
00145
00146
00147
00148
00149
00150 template<class Scalar>
00151 bool DefaultDiagonalLinearOp<Scalar>::opSupported(ETransp M_trans) const
00152 {
00153 return
00154 ( Teuchos::ScalarTraits<Scalar>::isComplex
00155 ? ( M_trans==NOTRANS || M_trans==TRANS )
00156 : true
00157 );
00158 }
00159
00160
00161
00162 template<class Scalar>
00163 void DefaultDiagonalLinearOp<Scalar>::apply(
00164 const ETransp M_trans
00165 ,const VectorBase<Scalar> &x
00166 ,VectorBase<Scalar> *y
00167 ,const Scalar alpha
00168 ,const Scalar beta
00169 ) const
00170 {
00171 typedef Teuchos::ScalarTraits<Scalar> ST;
00172 #ifdef TEUCHOS_DEBUG
00173 TEST_FOR_EXCEPT( ST::isComplex && !(M_trans==NOTRANS||M_trans==TRANS) );
00174 THYRA_ASSERT_LINEAR_OP_VEC_APPLY_SPACES(
00175 "DefaultDiagonalLinearOp<Scalar>::apply(...)",*this,M_trans,x,y
00176 );
00177 #endif // TEUCHOS_DEBUG
00178 typedef Teuchos::ScalarTraits<Scalar> ST;
00179 if( beta != ST::one() ) Vt_S( y, beta );
00180 ele_wise_prod( alpha, x, *diag_.getConstObj(), y );
00181 }
00182
00183 }
00184
00185 #endif // THYRA_DIAGONAL_LINEAR_OP_HPP