void MatrixSymDiagStd::Vp_StMtV( VectorMutable* v_lhs, value_type alpha, BLAS_Cpp::Transp trans_rhs1 , const Vector& v_rhs2, value_type beta) const { // ToDo: Validate input! if(beta == 0.0) *v_lhs = 0.0; else if(beta != 1.0) Vt_S( v_lhs, beta ); ele_wise_prod( alpha, v_rhs2, *diag_, v_lhs ); }
void DefaultDiagonalLinearOp<Scalar>::applyImpl( const EOpTransp M_trans, const MultiVectorBase<Scalar> &X, const Ptr<MultiVectorBase<Scalar> > &Y, const Scalar alpha, const Scalar beta ) const { typedef Teuchos::ScalarTraits<Scalar> ST; #ifdef TEUCHOS_DEBUG THYRA_ASSERT_LINEAR_OP_MULTIVEC_APPLY_SPACES( "DefaultDiagonalLinearOp<Scalar>::apply(...)",*this, M_trans, X, &*Y ); #endif // TEUCHOS_DEBUG // Y = beta * Y if( beta != ST::one() ) scale<Scalar>(beta, Y); // Y += alpha *op(M) * X const Ordinal m = X.domain()->dim(); for (Ordinal col_j = 0; col_j < m; ++col_j) { const RCP<const VectorBase<Scalar> > x = X.col(col_j); const RCP<VectorBase<Scalar> > y = Y->col(col_j); if (ST::isComplex) { if ( M_trans==NOTRANS || M_trans==TRANS ) { ele_wise_prod( alpha, *diag_.getConstObj(), *x, y.ptr() ); } else { ele_wise_conj_prod( alpha, *diag_.getConstObj(), *x, y.ptr() ); } } else { ele_wise_prod( alpha, *diag_.getConstObj(), *x, y.ptr() ); } } }
bool MatrixSymDiagStd::syrk( BLAS_Cpp::Transp A_trans ,value_type a ,value_type b ,MatrixSymOp *B ) const { MatrixSymDiagStd *B_sd = dynamic_cast<MatrixSymDiagStd*>(B); if(!B_sd) return false; VectorMutable &B_diag = B_sd->diag(); const Vector &A_diag = this->diag(); // B = b*B + a*A*A Vt_S( &B_diag, b ); ele_wise_prod( 1.0, A_diag, A_diag, &B_diag ); // B.diag(i) += a * (A.diag)(i) * (A.diag)(i) return true; }