/usr/include/dune/common/dotproduct.hh is in libdune-common-dev 2.5.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_DOTPRODUCT_HH
#define DUNE_DOTPRODUCT_HH
#include "ftraits.hh"
#include "typetraits.hh"
namespace Dune {
/**
* @file
* @brief Provides the functions dot(a,b) := \f$a^H \cdot b \f$ and dotT(a,b) := \f$a^T \cdot b \f$
*
* The provided dot products dot,dotT are used to compute (indefinite) dot products for fundamental types as well as DUNE vector types, such as DenseVector, FieldVector, ISTLVector.
* Note that the definition of dot(a,b) conjugates the first argument. This agrees with the behaviour of Matlab and Petsc, but not with BLAS.
* @author Jö Fahlke, Matthias Wohlmuth
*/
/** @addtogroup Common
*
* @{
*/
template<class T>
struct AlwaysVoid { typedef void type; };
template<class T, class = void>
struct IsVector : std::false_type {};
template<class T>
struct IsVector<T, typename AlwaysVoid<typename T::field_type>::type>
: std::true_type {};
/** @brief computes the dot product for fundamental data types according to Petsc's VectDot function: dot(a,b) := std::conj(a)*b
*
* @see http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecDot.html#VecDot
* @param a
* @param b
* @return conj(a)*b
*/
template<class A, class B>
auto
dot(const A & a, const B & b) -> typename std::enable_if<!IsVector<A>::value && !std::is_same<typename FieldTraits<A>::field_type,typename FieldTraits<A>::real_type> ::value, decltype(conj(a)*b)>::type
{
return conj(a)*b;
}
/**
* @brief computes the dot product for fundamental data types according to Petsc's VectDot function: dot(a,b) := std::conj(a)*b
*
* Specialization for real first arguments which replaces conj(a) by a.
* @see http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecTDot.html#VecTDot
* @param a
* @param b
* @return a*b (which is the same as conj(a)*b in this case)
*/
// fundamental type with A being a real type
template<class A, class B>
auto
dot(const A & a, const B & b) -> typename std::enable_if<!IsVector<A>::value && std::is_same<typename FieldTraits<A>::field_type,typename FieldTraits<A>::real_type>::value, decltype(a*b)>::type
{
return a*b;
}
/**
* @brief computes the dot product for various dune vector types according to Petsc's VectDot function: dot(a,b) := std::conj(a)*b
*
* Specialization for real first arguments which replaces conj(a) by a.
* @see http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecTDot.html#VecTDot
* @param a
* @param b
* @return dot(a,b)
*/
template<typename A, typename B>
auto
dot(const A & a, const B & b) -> typename std::enable_if<IsVector<A>::value, decltype(a.dot(b))>::type
{
return a.dot(b);
}
/** @} */
/**
* @brief Computes an indefinite vector dot product for fundamental data types according to Petsc's VectTDot function: dotT(a,b) := a*b
* @see http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecTDot.html#VecTDot
* @param a
* @param b
* @return a*b
*/
template<class A, class B>
auto
dotT(const A & a, const B & b) -> decltype(a*b)
{
return a*b;
}
/** @} */
} // end namespace DUNE
#endif // DUNE_DOTPRODUCT_HH
|