Thyra Package Browser (Single Doxygen Collection) Version of the Day
Thyra_DiagonalScalarProd_def.hpp
Go to the documentation of this file.
00001 #ifndef THYRA_DIAGONAL_SCALAR_PROD_DEF_HPP
00002 #define THYRA_DIAGONAL_SCALAR_PROD_DEF_HPP
00003 
00004 
00005 #include "Thyra_DiagonalScalarProd_decl.hpp"
00006 #include "Thyra_DetachedSpmdVectorView.hpp"
00007 #include "Thyra_AssertOp.hpp"
00008 #include "Teuchos_CommHelpers.hpp"
00009 
00010 
00011 namespace Thyra {
00012 
00013 
00014 // Consturctors/Initializers/Accessors
00015 
00016 
00017 template<class Scalar>
00018 DiagonalScalarProd<Scalar>::DiagonalScalarProd()
00019 {}
00020 
00021 
00022 template<class Scalar>
00023 void DiagonalScalarProd<Scalar>::initialize(
00024   const RCP<const VectorBase<Scalar> > &s_diag )
00025 {
00026   s_diag_ = s_diag.assert_not_null();
00027 }
00028 
00029 
00030 // Overridden from ScalarProdBase
00031 
00032 
00033 template<class Scalar>
00034 bool DiagonalScalarProd<Scalar>::isEuclideanImpl() const
00035 {
00036   return false;
00037 }
00038 
00039 
00040 template<class Scalar>
00041 void DiagonalScalarProd<Scalar>::scalarProdsImpl(
00042   const MultiVectorBase<Scalar>& X, const MultiVectorBase<Scalar>& Y,
00043   const ArrayView<Scalar> &scalarProds_out ) const
00044 {
00045 
00046   using Teuchos::as;
00047   typedef Teuchos::ScalarTraits<Scalar> ST;
00048   typedef Ordinal Ordinal;
00049 
00050   const Ordinal m = X.domain()->dim();
00051 
00052 #ifdef TEUCHOS_DEBUG
00053   THYRA_ASSERT_VEC_SPACES( "DiagonalScalarProd<Scalar>::scalarProds(X,Y,sclarProds)",
00054     *s_diag_->space(), *Y.range() );
00055   THYRA_ASSERT_VEC_SPACES( "DiagonalScalarProd<Scalar>::scalarProds(X,Y,sclarProds)",
00056     *X.range(), *Y.range() );
00057   THYRA_ASSERT_VEC_SPACES( "DiagonalScalarProd<Scalar>::scalarProds(X,Y,sclarProds)",
00058     *X.domain(), *Y.domain() );
00059   TEUCHOS_ASSERT_EQUALITY( as<Ordinal>(scalarProds_out.size()), m );
00060 #endif
00061 
00062   const ConstDetachedSpmdVectorView<Scalar> s_diag(s_diag_);
00063 
00064   const RCP<const Teuchos::Comm<Ordinal> > comm = s_diag.spmdSpace()->getComm();
00065   
00066   for (Ordinal j = 0; j < m; ++j) {
00067 
00068     const ConstDetachedSpmdVectorView<Scalar> x(X.col(j));
00069     const ConstDetachedSpmdVectorView<Scalar> y(Y.col(j));
00070     
00071     Scalar scalarProd_j = ST::zero();
00072 
00073     for (Ordinal i = 0; i < x.subDim(); ++i) {
00074       scalarProd_j += ST::conjugate(x[i]) * s_diag[i] * y[i];
00075     }
00076 
00077     if (!is_null(comm)) {
00078       Scalar g_scalarProd_j = 0.0;
00079       Teuchos::reduceAll<Ordinal,Scalar>(
00080         *comm, Teuchos::REDUCE_SUM,
00081         scalarProd_j,
00082         Teuchos::outArg(g_scalarProd_j)
00083         );
00084       scalarProds_out[j] = g_scalarProd_j;
00085     }
00086     else {
00087       scalarProds_out[j] = scalarProd_j;
00088     }
00089 
00090   }
00091 
00092 }
00093 
00094 
00095 template<class Scalar>
00096 RCP<const LinearOpBase<Scalar> >
00097 DiagonalScalarProd<Scalar>::getLinearOpImpl() const
00098 {
00099   TEST_FOR_EXCEPT_MSG(true, "ToDo: Implement when needed!")
00100   return Teuchos::null;
00101 }
00102 
00103 
00104 } // end namespace Thyra
00105 
00106 
00107 #endif  // THYRA_DIAGONAL_SCALAR_PROD_DEF_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines