|
Thyra Package Browser (Single Doxygen Collection) Version of the Day
|
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
1.7.4