#ifndef GRID_MATH_INNER_H #define GRID_MATH_INNER_H namespace Grid { /////////////////////////////////////////////////////////////////////////////////////// // innerProduct Scalar x Scalar -> Scalar // innerProduct Vector x Vector -> Scalar // innerProduct Matrix x Matrix -> Scalar /////////////////////////////////////////////////////////////////////////////////////// template inline RealD norm2l(const sobj &arg){ typedef typename sobj::scalar_type scalar; decltype(innerProduct(arg,arg)) nrm; nrm = innerProduct(arg,arg); return real(nrm); } template inline auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar { typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; iScalar ret; ret=zero; for(int c1=0;c1 inline auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar { typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; iScalar ret; iScalar tmp; ret=zero; for(int c1=0;c1 inline auto innerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar { typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; iScalar ret; ret._internal = innerProduct(lhs._internal,rhs._internal); return ret; } } #endif