コード例 #1
0
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 );
}
コード例 #2
0
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() );
    }
  }

}
コード例 #3
0
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;
}