11#ifndef TSV_META_DOT_DOT_H
12#define TSV_META_DOT_DOT_H
28template<
class T1,
class T2,
unsigned D>
35 for (
unsigned int i=0; i<D; ++i)
36 for (
unsigned int j=0; j<D; ++j)
37 sum += lhs(i,j) * rhs(i,j);
43template<
class T1,
class T2>
53template<
class T1,
class T2>
59 return lhs[0] * rhs[0] + lhs[1] * rhs[1] +
60 lhs[2] * rhs[2] + lhs[3] * rhs[3];
64template<
class T1,
class T2>
70 return lhs[0] * rhs[0] + lhs[1] * rhs[1] +
71 lhs[2] * rhs[2] + lhs[3] * rhs[3] + lhs[4] * rhs[4] +
72 lhs[5] * rhs[5] + lhs[6] * rhs[6] + lhs[7] * rhs[7] +
83template<
class T1,
class T2,
unsigned D>
90 for (
unsigned int i=0; i<D; ++i)
91 sum += lhs.
HL(i, i) * rhs.
HL(i, i);
93 for (
unsigned int i=0; i<D; ++i)
94 for (
unsigned int j=i+1; j<D; ++j)
95 sum += 2.0 * lhs.
HL(j, i) * rhs.
HL(j, i);
101template<
class T1,
class T2>
107 return lhs[0] * rhs[0];
111template<
class T1,
class T2>
117 return lhs(0,0) * rhs(0,0) + lhs(1,1) * rhs(1,1) +
118 2.0 * lhs(0,1) * rhs(0,1);
122template<
class T1,
class T2>
128 return lhs(0,0) * rhs(0,0) + lhs(1,1) * rhs(1,1) + lhs(2,2) * rhs(2,2) +
129 2.0 * (lhs(0,1) * rhs(0,1) + lhs(0,2) * rhs(0,2) +
130 lhs(1,2) * rhs(1,2));
140template<
class T1,
class T2,
unsigned D>
147 for (
unsigned int i=0; i<D; ++i)
148 for (
unsigned int j=0; j<D; ++j)
149 sum += lhs(i,j) * rhs(i,j);
155template<
class T1,
class T2>
161 return lhs[0]*rhs[0];
165template<
class T1,
class T2>
171 return lhs(0,0) * rhs(0,0) + lhs(0,1) * (rhs(0,1) + rhs(1,0)) +
176template<
class T1,
class T2>
182 return lhs(0,0) * rhs(0,0) + lhs(0,1) * (rhs(0,1) + rhs(1,0)) +
183 + lhs(0,2) * (rhs(0,2) + rhs(2,0)) + lhs(1,1) * rhs(1,1) +
184 lhs(1,2) * (rhs(1,2) + rhs(2,1)) + lhs(2,2) * rhs(2,2);
194template<
class T1,
class T2,
unsigned D>
201 for (
unsigned int i=0; i<D; ++i)
202 for (
unsigned int j=0; j<D; ++j)
203 sum += lhs(i,j) * rhs(j,j);
209template<
class T1,
class T2>
215 return lhs[0]*rhs[0];
219template<
class T1,
class T2>
225 return lhs(0,0) * rhs(0,0) + (lhs(0,1) + lhs(1,0)) * rhs(0,1) +
230template<
class T1,
class T2>
236 return lhs(0,0) * rhs(0,0) + (lhs(0,1) + lhs(1,0)) * rhs(0,1) +
237 lhs(1,1) * rhs(1,1) + (lhs(0,2) + lhs(2,0)) * rhs(0,2) +
238 (lhs(1,2) + lhs(2,1)) * rhs(1,2) + lhs(2,2) * rhs(2,2);
248template<
class T1,
class T2,
unsigned D>
254 T0 sum = lhs[0]*rhs[0];
255 for (
int i=1; i<D*(D-1)/2; ++i)
256 sum += lhs[i]*rhs[i];
261template<
class T1,
class T2>
267 T0 sum = lhs[0]*rhs[0];
272template<
class T1,
class T2>
278 T0 sum = lhs[0]*rhs[0]+lhs[1]*rhs[1]+lhs[2]*rhs[2];
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Element_t HL(unsigned int hi, unsigned int lo) const
static T0 apply(const Tenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
static T0 apply(const Tenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
static T0 apply(const SymTenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
static T0 apply(const SymTenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
static T0 apply(const SymTenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
static T0 apply(const Tenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const AntiSymTenzor< T1, D > &lhs, const AntiSymTenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const AntiSymTenzor< T1, 2 > &lhs, const AntiSymTenzor< T2, 2 > &rhs)
static T0 apply(const AntiSymTenzor< T1, 3 > &lhs, const AntiSymTenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETE_ComputeBinaryType< T1, T2, Op, Op::tag >::type type