Thyra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_DiagonalScalarProd_def.hpp
1 // @HEADER
2 // *****************************************************************************
3 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
4 //
5 // Copyright 2004 NTESS and the Thyra contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef THYRA_DIAGONAL_SCALAR_PROD_DEF_HPP
11 #define THYRA_DIAGONAL_SCALAR_PROD_DEF_HPP
12 
13 
14 #include "Thyra_DiagonalScalarProd_decl.hpp"
15 #include "Thyra_DetachedSpmdVectorView.hpp"
16 #include "Thyra_SpmdVectorSpaceBase.hpp"
17 #include "Thyra_AssertOp.hpp"
18 #include "Teuchos_CommHelpers.hpp"
19 
20 
21 namespace Thyra {
22 
23 
24 // Consturctors/Initializers/Accessors
25 
26 
27 template<class Scalar>
29 {}
30 
31 
32 template<class Scalar>
34  const RCP<const VectorBase<Scalar> > &s_diag )
35 {
36  s_diag_ = s_diag.assert_not_null();
37 }
38 
39 
40 // Overridden from ScalarProdBase
41 
42 
43 template<class Scalar>
45 {
46  return false;
47 }
48 
49 
50 template<class Scalar>
53  const ArrayView<Scalar> &scalarProds_out ) const
54 {
55 
56  using Teuchos::as;
58 
59  const Ordinal m = X.domain()->dim();
60 
61 #ifdef TEUCHOS_DEBUG
62  THYRA_ASSERT_VEC_SPACES( "DiagonalScalarProd<Scalar>::scalarProds(X,Y,sclarProds)",
63  *s_diag_->space(), *Y.range() );
64  THYRA_ASSERT_VEC_SPACES( "DiagonalScalarProd<Scalar>::scalarProds(X,Y,sclarProds)",
65  *X.range(), *Y.range() );
66  THYRA_ASSERT_VEC_SPACES( "DiagonalScalarProd<Scalar>::scalarProds(X,Y,sclarProds)",
67  *X.domain(), *Y.domain() );
68  TEUCHOS_ASSERT_EQUALITY( as<Ordinal>(scalarProds_out.size()), m );
69 #endif
70 
71  const ConstDetachedSpmdVectorView<Scalar> s_diag(s_diag_);
72 
73  const RCP<const Teuchos::Comm<Ordinal> > comm = s_diag.spmdSpace()->getComm();
74 
75  for (Ordinal j = 0; j < m; ++j) {
76 
79 
80  Scalar scalarProd_j = ST::zero();
81 
82  for (Ordinal i = 0; i < x.subDim(); ++i) {
83  scalarProd_j += ST::conjugate(x[i]) * s_diag[i] * y[i];
84  }
85 
86  if (!is_null(comm)) {
87  Scalar g_scalarProd_j = 0.0;
88  Teuchos::reduceAll<Ordinal,Scalar>(
89  *comm, Teuchos::REDUCE_SUM,
90  scalarProd_j,
91  Teuchos::outArg(g_scalarProd_j)
92  );
93  scalarProds_out[j] = g_scalarProd_j;
94  }
95  else {
96  scalarProds_out[j] = scalarProd_j;
97  }
98 
99  }
100 
101 }
102 
103 
104 template<class Scalar>
107 {
108  TEUCHOS_TEST_FOR_EXCEPT_MSG(true, "ToDo: Implement when needed!")
109  TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
110 }
111 
112 
113 } // end namespace Thyra
114 
115 
116 #endif // THYRA_DIAGONAL_SCALAR_PROD_DEF_HPP
#define THYRA_ASSERT_VEC_SPACES(FUNC_NAME, VS1, VS2)
This is a very useful macro that should be used to validate that two vector spaces are compatible...
bool is_null(const boost::shared_ptr< T > &p)
virtual RCP< const VectorSpaceBase< Scalar > > range() const =0
Return a smart pointer for the range space for this operator.
virtual void scalarProdsImpl(const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y, const ArrayView< Scalar > &scalarProds_out) const
virtual bool isEuclideanImpl() const
Returns false.
size_type size() const
RCP< const LinearOpBase< Scalar > > getLinearOpImpl() const
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
#define TEUCHOS_TEST_FOR_EXCEPT_MSG(throw_exception_test, msg)
Interface for a collection of column vectors called a multi-vector.
RCP< const VectorBase< Scalar > > col(Ordinal j) const
Calls colImpl().
Abstract interface for finite-dimensional dense vectors.
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
const RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpace() const
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
TypeTo as(const TypeFrom &t)
Create an explicit detached non-mutable (const) view of all of the local elements on this process of ...
void initialize(const RCP< const VectorBase< Scalar > > &s_diag)
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)