00001 /* @HEADER@ */ 00002 // 00003 /* @HEADER@ */ 00004 00005 #ifndef PLAYA_SIMPLE_DIAGONAL_OP_IMPL_HPP 00006 #define PLAYA_SIMPLE_DIAGONAL_OP_IMPL_HPP 00007 00008 00009 00010 #include "PlayaSimpleDiagonalOpDecl.hpp" 00011 #include "PlayaOut.hpp" 00012 #include "PlayaTabs.hpp" 00013 00014 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION 00015 #include "PlayaVectorImpl.hpp" 00016 #endif 00017 00018 00019 namespace Playa 00020 { 00021 using namespace Teuchos; 00022 00023 00024 00025 00026 /* 00027 * --- scaled op 00028 */ 00029 00030 template <class Scalar> inline 00031 SimpleDiagonalOp<Scalar>::SimpleDiagonalOp( 00032 const Vector<Scalar>& diag) 00033 : LinearOpWithSpaces<Scalar>( 00034 diag.space(), diag.space() 00035 ), diag_(diag) 00036 {} 00037 00038 /* */ 00039 template <class Scalar> inline 00040 void SimpleDiagonalOp<Scalar>::apply(Teuchos::ETransp transApplyType, 00041 const Vector<Scalar>& in, 00042 Vector<Scalar> out) const 00043 { 00044 Tabs tab(0); 00045 PLAYA_MSG2(this->verb(), tab << "SimpleDiagonalOp::apply()"); 00046 00047 Vector<Scalar> tmp = in.dotStar(diag_); 00048 out.acceptCopyOf(tmp); 00049 00050 PLAYA_MSG2(this->verb(), tab << "done SimpleDiagonalOp::apply()"); 00051 } 00052 00053 /* */ 00054 template <class Scalar> inline 00055 std::string SimpleDiagonalOp<Scalar>::description() const 00056 { 00057 return "DiagonalOp[diag=" + diag_.description() + "]"; 00058 } 00059 00060 00061 /* */ 00062 template <class Scalar> inline 00063 void SimpleDiagonalOp<Scalar>::print(std::ostream& os) const 00064 { 00065 Tabs tab(0); 00066 os << tab << "DiagonalOp[" << std::endl; 00067 Tabs tab1; 00068 os << tab1 << "diag = " << diag_ << std::endl; 00069 os << tab << "]" << std::endl; 00070 } 00071 00072 00073 00074 template <class Scalar> inline 00075 LinearOperator<Scalar> diagonalOperator( 00076 const Vector<Scalar>& diag) 00077 { 00078 RCP<LinearOperatorBase<Scalar> > A 00079 = rcp(new SimpleDiagonalOp<Scalar>(diag)); 00080 00081 return A; 00082 } 00083 00084 00085 00086 } 00087 00088 #endif