13 #ifndef OHMMS_TINYVECTORTENSOR_OPERATORS_H 14 #define OHMMS_TINYVECTORTENSOR_OPERATORS_H 29 template<
class T1,
class T2,
unsigned D>
36 for (
unsigned int i = 0; i < D; ++i)
38 Type_t sum = lhs(i, 0) * rhs[0];
39 for (
unsigned int j = 1; j < D; ++j)
40 sum += lhs(i, j) * rhs[j];
48 template<
class T1,
class T2>
58 template<
class T1,
class T2>
68 template<
class T1,
class T2>
75 lhs[3] * rhs[0] + lhs[4] * rhs[1] + lhs[5] * rhs[2],
76 lhs[6] * rhs[0] + lhs[7] * rhs[1] + lhs[8] * rhs[2]);
80 template<
class T1,
class T2>
87 lhs[4] * rhs[0] + lhs[5] * rhs[1] + lhs[6] * rhs[2] + lhs[7] * rhs[3],
88 lhs[8] * rhs[0] + lhs[9] * rhs[1] + lhs[10] * rhs[2] + lhs[11] * rhs[3],
89 lhs[12] * rhs[0] + lhs[13] * rhs[1] + lhs[14] * rhs[2] + lhs[15] * rhs[3]);
99 template<
class T1,
class T2,
unsigned D>
106 for (
unsigned int i = 0; i < D; ++i)
108 Type_t sum = lhs[0] * rhs(0, i);
109 for (
unsigned int j = 1; j < D; ++j)
110 sum += lhs[j] * rhs(j, i);
118 template<
class T1,
class T2>
128 template<
class T1,
class T2>
134 return TinyVector<Type_t, 2>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0), lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1));
138 template<
class T1,
class T2>
145 lhs[0] * rhs[1] + lhs[1] * rhs[4] + lhs[2] * rhs[7],
146 lhs[0] * rhs[2] + lhs[1] * rhs[5] + lhs[2] * rhs[8]);
150 template<
class T1,
class T2>
157 lhs[0] * rhs[1] + lhs[1] * rhs[5] + lhs[2] * rhs[9] + lhs[3] * rhs[13],
158 lhs[0] * rhs[2] + lhs[1] * rhs[6] + lhs[2] * rhs[10] + lhs[3] * rhs[14],
159 lhs[0] * rhs[3] + lhs[1] * rhs[7] + lhs[2] * rhs[11] + lhs[3] * rhs[15]);
169 template<
class T1,
class T2,
unsigned D>
176 for (
unsigned int i = 0; i < D; ++i)
181 sum += lhs.
HL(i, j) * rhs[j];
183 sum += lhs.
HL(j, i) * rhs[j];
191 template<
class T1,
class T2>
201 template<
class T1,
class T2>
207 return TinyVector<Type_t, 2>(lhs(0, 0) * rhs[0] + lhs(0, 1) * rhs[1], lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1]);
211 template<
class T1,
class T2>
218 lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1] + lhs(1, 2) * rhs[2],
219 lhs(2, 0) * rhs[0] + lhs(2, 1) * rhs[1] + lhs(2, 2) * rhs[2]);
229 template<
class T1,
class T2,
unsigned D>
236 for (
unsigned int i = 0; i < D; ++i)
238 Type_t sum = lhs[0] * rhs[i * (i + 1) / 2];
241 sum += lhs[j] * rhs[i * (i + 1) / 2 + j];
243 sum += lhs[j] * rhs[j * (j + 1) / 2 + i];
251 template<
class T1,
class T2>
261 template<
class T1,
class T2>
267 return TinyVector<Type_t, 2>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0), lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1));
271 template<
class T1,
class T2>
278 lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1) + lhs[2] * rhs(2, 1),
279 lhs[0] * rhs(0, 2) + lhs[1] * rhs(1, 2) + lhs[2] * rhs(2, 2));
289 template<
class T1,
class T2,
unsigned D>
296 for (
unsigned int i = 0; i < D; ++i)
297 for (
unsigned int j = 0; j < D; ++j)
299 Type_t sum = lhs.
HL(i, 0) * rhs(0, j);
302 sum += lhs.
HL(i, k) * rhs(k, j);
304 sum += lhs.
HL(k, i) * rhs(k, j);
311 template<
class T1,
class T2>
321 template<
class T1,
class T2>
328 lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1),
329 lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0),
330 lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1));
334 template<
class T1,
class T2>
340 return Tensor<Type_t, 3>(lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0) + lhs(0, 2) * rhs(2, 0),
341 lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1) + lhs(0, 2) * rhs(2, 1),
342 lhs(0, 0) * rhs(0, 2) + lhs(0, 1) * rhs(1, 2) + lhs(0, 2) * rhs(2, 2),
343 lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0) + lhs(1, 2) * rhs(2, 0),
344 lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1) + lhs(1, 2) * rhs(2, 1),
345 lhs(1, 0) * rhs(0, 2) + lhs(1, 1) * rhs(1, 2) + lhs(1, 2) * rhs(2, 2),
346 lhs(2, 0) * rhs(0, 0) + lhs(2, 1) * rhs(1, 0) + lhs(2, 2) * rhs(2, 0),
347 lhs(2, 0) * rhs(0, 1) + lhs(2, 1) * rhs(1, 1) + lhs(2, 2) * rhs(2, 1),
348 lhs(2, 0) * rhs(0, 2) + lhs(2, 1) * rhs(1, 2) + lhs(2, 2) * rhs(2, 2));
358 template<
class T1,
class T2,
unsigned D>
365 for (
unsigned int i = 0; i < D; ++i)
366 for (
unsigned int j = 0; j < D; ++j)
368 Type_t sum = lhs(i, 0) * rhs.
HL(j, 0);
371 sum += lhs(i, k) * rhs.
HL(j, k);
373 sum += lhs(i, k) * rhs.
HL(k, j);
374 res[i * D + j] = sum;
380 template<
class T1,
class T2>
390 template<
class T1,
class T2>
397 lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1),
398 lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0),
399 lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1));
403 template<
class T1,
class T2>
409 return Tensor<Type_t, 3>(lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0) + lhs(0, 2) * rhs(2, 0),
410 lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1) + lhs(0, 2) * rhs(2, 1),
411 lhs(0, 0) * rhs(0, 2) + lhs(0, 1) * rhs(1, 2) + lhs(0, 2) * rhs(2, 2),
412 lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0) + lhs(1, 2) * rhs(2, 0),
413 lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1) + lhs(1, 2) * rhs(2, 1),
414 lhs(1, 0) * rhs(0, 2) + lhs(1, 1) * rhs(1, 2) + lhs(1, 2) * rhs(2, 2),
415 lhs(2, 0) * rhs(0, 0) + lhs(2, 1) * rhs(1, 0) + lhs(2, 2) * rhs(2, 0),
416 lhs(2, 0) * rhs(0, 1) + lhs(2, 1) * rhs(1, 1) + lhs(2, 2) * rhs(2, 1),
417 lhs(2, 0) * rhs(0, 2) + lhs(2, 1) * rhs(1, 2) + lhs(2, 2) * rhs(2, 2));
427 template<
class T1,
class T2,
unsigned D>
434 for (
unsigned int j = 0; j < D; ++j)
437 for (
int i = 0; i < j; i++)
438 sum -= lhs[i] * rhs[((j - 1) * j / 2) + i];
439 for (
int i = j + 1; i < D; ++i)
440 sum += lhs[i] * rhs[((i - 1) * i / 2) + j];
447 template<
class T1,
class T2>
453 return TinyVector<Type_t, 2>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0), lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1));
457 template<
class T1,
class T2>
464 lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1) + lhs[2] * rhs(2, 1),
465 lhs[0] * rhs(0, 2) + lhs[1] * rhs(1, 2) + lhs[2] * rhs(2, 2));
475 template<
class T1,
class T2,
unsigned D>
482 for (
unsigned int i = 0; i < D; ++i)
485 for (
unsigned int j = 0; j < i; ++j)
486 sum += lhs[((i - 1) * i / 2) + j] * rhs[j];
487 for (
unsigned int j = i + 1; j < D; ++j)
488 sum -= lhs[((j - 1) * j / 2) + i] * rhs[j];
496 template<
class T1,
class T2>
506 template<
class T1,
class T2>
512 return TinyVector<Type_t, 2>(lhs(0, 0) * rhs[0] + lhs(0, 1) * rhs[1], lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1]);
516 template<
class T1,
class T2>
523 lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1] + lhs(1, 2) * rhs[2],
524 lhs(2, 0) * rhs[0] + lhs(2, 1) * rhs[1] + lhs(2, 2) * rhs[2]);
532 // Specializations for TinyMatrix x TinyMatrix matrix multiplication
533 // Matrix(D1,D2)* Matrix(D2,D3) = Matrix(D1,D3)
536 template<class T1, class T2, unsigned D1, unsigned D2, unsigned D3>
537 struct OTDot< TinyMatrix<T1,D1,D2> , TinyMatrix<T2,D2,D3> >
539 using Type_t = typename BinaryReturn<T1,T2,OpMultiply>::Type_t;
540 using Return_t = TinyMatrix<Type_t, D1, D3>;
541 inline static Return_t
542 apply(const TinyMatrix<T1,D1,D2>& lhs, const TinyMatrix<T2,D2,D3>& rhs) {
544 for(int i=0; i<D1; i++)
545 for(int j=0; j<D3; j++) {
547 for(int k=0; k<D2; k++)
548 tmp += lhs(i,k)*rhs(k,j);
555 template<class T1, class T2>
556 struct OTDot< TinyMatrix<T1,3,3> , TinyMatrix<T2,3,3> >
558 using Type_t = typename BinaryReturn<T1,T2,OpMultiply>::Type_t;
559 using Return_t = TinyMatrix<Type_t, 3, 3>;
560 inline static Return_t
561 apply(const TinyMatrix<T1,3,3>& lhs, const TinyMatrix<T2,3,3>& rhs) {
562 return Return_t(lhs(0,0)*rhs(0,0)+lhs(0,1)*rhs(1,0)+lhs(0,2)*rhs(2,0),
563 lhs(0,0)*rhs(0,1)+lhs(0,1)*rhs(1,1)+lhs(0,2)*rhs(2,1),
564 lhs(0,0)*rhs(0,2)+lhs(0,1)*rhs(1,2)+lhs(0,2)*rhs(2,2),
565 lhs(1,0)*rhs(0,0)+lhs(1,1)*rhs(1,0)+lhs(1,2)*rhs(2,0),
566 lhs(1,0)*rhs(0,1)+lhs(1,1)*rhs(1,1)+lhs(1,2)*rhs(2,1),
567 lhs(1,0)*rhs(0,2)+lhs(1,1)*rhs(1,2)+lhs(1,2)*rhs(2,2),
568 lhs(2,0)*rhs(0,0)+lhs(2,1)*rhs(1,0)+lhs(2,2)*rhs(2,0),
569 lhs(2,0)*rhs(0,1)+lhs(2,1)*rhs(1,1)+lhs(2,2)*rhs(2,1),
570 lhs(2,0)*rhs(0,2)+lhs(2,1)*rhs(1,2)+lhs(2,2)*rhs(2,2));
573 template<class T1, class T2>
574 struct OTDot< TinyMatrix<T1,4,4> , TinyMatrix<T2,4,4> >
576 using Type_t = typename BinaryReturn<T1,T2,OpMultiply>::Type_t;
577 using Return_t = TinyMatrix<Type_t, 4, 4>;
578 inline static Return_t
579 apply(const TinyMatrix<T1,4,4>& lhs, const TinyMatrix<T2,4,4>& rhs) {
580 return Return_t(lhs(0,0)*rhs(0,0)+lhs(0,1)*rhs(1,0)+lhs(0,2)*rhs(2,0)+lhs(0,3)*rhs(3,0),
581 lhs(0,0)*rhs(0,1)+lhs(0,1)*rhs(1,1)+lhs(0,2)*rhs(2,1)+lhs(0,3)*rhs(3,1),
582 lhs(0,0)*rhs(0,2)+lhs(0,1)*rhs(1,2)+lhs(0,2)*rhs(2,2)+lhs(0,3)*rhs(3,2),
583 lhs(0,0)*rhs(0,3)+lhs(0,1)*rhs(1,3)+lhs(0,2)*rhs(2,3)+lhs(0,3)*rhs(3,3),
584 lhs(1,0)*rhs(0,0)+lhs(1,1)*rhs(1,0)+lhs(1,2)*rhs(2,0)+lhs(1,3)*rhs(3,0),
585 lhs(1,0)*rhs(0,1)+lhs(1,1)*rhs(1,1)+lhs(1,2)*rhs(2,1)+lhs(1,3)*rhs(3,1),
586 lhs(1,0)*rhs(0,2)+lhs(1,1)*rhs(1,2)+lhs(1,2)*rhs(2,2)+lhs(1,3)*rhs(3,2),
587 lhs(1,0)*rhs(0,3)+lhs(1,1)*rhs(1,3)+lhs(1,2)*rhs(2,3)+lhs(1,3)*rhs(3,3),
588 lhs(2,0)*rhs(0,0)+lhs(2,1)*rhs(1,0)+lhs(2,2)*rhs(2,0)+lhs(2,3)*rhs(3,0),
589 lhs(2,0)*rhs(0,1)+lhs(2,1)*rhs(1,1)+lhs(2,2)*rhs(2,1)+lhs(2,3)*rhs(3,1),
590 lhs(2,0)*rhs(0,2)+lhs(2,1)*rhs(1,2)+lhs(2,2)*rhs(2,2)+lhs(2,3)*rhs(3,2),
591 lhs(2,0)*rhs(0,3)+lhs(2,1)*rhs(1,3)+lhs(2,2)*rhs(2,3)+lhs(2,3)*rhs(3,3),
592 lhs(3,0)*rhs(0,0)+lhs(3,1)*rhs(1,0)+lhs(3,2)*rhs(2,0)+lhs(3,3)*rhs(3,0),
593 lhs(3,0)*rhs(0,1)+lhs(3,1)*rhs(1,1)+lhs(3,2)*rhs(2,1)+lhs(3,3)*rhs(3,1),
594 lhs(3,0)*rhs(0,2)+lhs(3,1)*rhs(1,2)+lhs(3,2)*rhs(2,2)+lhs(3,3)*rhs(3,2),
595 lhs(3,0)*rhs(0,3)+lhs(3,1)*rhs(1,3)+lhs(3,2)*rhs(2,3)+lhs(3,3)*rhs(3,3));
605 template<
class T1,
class T2>
615 template<
class T1,
class T2,
unsigned D>
623 template<
class T1,
class T2>
630 return Return_t(a[0] * b[0], a[0] * b[1], a[1] * b[0], a[1] * b[1]);
634 template<
class T1,
class T2>
641 return Return_t(a[0] * b[0], a[0] * b[1], a[0] * b[2], a[1] * b[0], a[1] * b[1], a[1] * b[2], a[2] * b[0],
642 a[2] * b[1], a[2] * b[2]);
647 #endif // OHMMS_TINYVECTOR_DOTCROSS_H typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, D > apply(const AntiSymTensor< T1, D > &lhs, const TinyVector< T2, D > &rhs)
typename Promote< T1, T2 >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 1 > apply(const AntiSymTensor< T1, 1 > &lhs, const TinyVector< T2, 1 > &rhs)
static TinyVector< Type_t, 2 > apply(const SymTensor< T1, 2 > &lhs, const TinyVector< T2, 2 > &rhs)
static TinyVector< Type_t, 1 > apply(const SymTensor< T1, 1 > &lhs, const TinyVector< T2, 1 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 2 > apply(const AntiSymTensor< T1, 2 > &lhs, const TinyVector< T2, 2 > &rhs)
helper functions for EinsplineSetBuilder
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Tensor< Type_t, 2 > apply(const SymTensor< T1, 2 > &lhs, const Tensor< T2, 2 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const TinyVector< T1, 3 > &lhs, const SymTensor< T2, 3 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Return_t apply(const TinyVector< T1, 3 > &a, const TinyVector< T2, 3 > &b)
static TinyVector< Type_t, D > apply(const SymTensor< T1, D > &lhs, const TinyVector< T2, D > &rhs)
static TinyVector< Type_t, 2 > apply(const Tensor< T1, 2 > &lhs, const TinyVector< T2, 2 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 4 > apply(const Tensor< T1, 4 > &lhs, const TinyVector< T2, 4 > &rhs)
static TinyVector< Type_t, 3 > apply(const TinyVector< T1, 3 > &lhs, const AntiSymTensor< T2, 3 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Tensor< Type_t, 3 > apply(const Tensor< T1, 3 > &lhs, const SymTensor< T2, 3 > &rhs)
static TinyVector< Type_t, D > apply(const TinyVector< T2, D > &lhs, const Tensor< T1, D > &rhs)
static Tensor< Type_t, 1 > apply(const Tensor< T1, 1 > &lhs, const SymTensor< T2, 1 > &rhs)
static TinyVector< Type_t, 3 > apply(const SymTensor< T1, 3 > &lhs, const TinyVector< T2, 3 > &rhs)
static Tensor< Type_t, 3 > apply(const SymTensor< T1, 3 > &lhs, const Tensor< T2, 3 > &rhs)
static Tensor< Type_t, D > apply(const SymTensor< T1, D > &lhs, const Tensor< T2, D > &rhs)
static TinyVector< Type_t, D > apply(const Tensor< T1, D > &lhs, const TinyVector< T2, D > &rhs)
Tensor<T,D> class for D by D tensor.
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Return_t apply(const TinyVector< T1, 2 > &a, const TinyVector< T2, 2 > &b)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const Tensor< T1, 3 > &lhs, const TinyVector< T2, 3 > &rhs)
static TinyVector< Type_t, D > apply(const TinyVector< T2, D > &lhs, const SymTensor< T1, D > &rhs)
static TinyVector< Type_t, 1 > apply(const TinyVector< T1, 1 > &lhs, const Tensor< T2, 1 > &rhs)
static Tensor< Type_t, D > apply(const Tensor< T1, D > &lhs, const SymTensor< T2, D > &rhs)
static TinyVector< Type_t, 2 > apply(const TinyVector< T1, 2 > &lhs, const SymTensor< T2, 2 > &rhs)
static TinyVector< Type_t, 1 > apply(const TinyVector< T1, 1 > &lhs, const SymTensor< T2, 1 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Tensor< Type_t, 1 > apply(const SymTensor< T1, 1 > &lhs, const Tensor< T2, 1 > &rhs)
static TinyVector< Type_t, 1 > apply(const Tensor< T1, 1 > &lhs, const TinyVector< T2, 1 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 2 > apply(const TinyVector< T1, 2 > &lhs, const Tensor< T2, 2 > &rhs)
static TinyVector< Type_t, D > apply(const TinyVector< T2, D > &lhs, const AntiSymTensor< T1, D > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
Type_t HL(unsigned int hi, unsigned int lo) const
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const TinyVector< T1, 3 > &lhs, const Tensor< T2, 3 > &rhs)
static TinyVector< Type_t, 4 > apply(const TinyVector< T1, 4 > &lhs, const Tensor< T2, 4 > &rhs)
static Tensor< Type_t, 2 > apply(const Tensor< T1, 2 > &lhs, const SymTensor< T2, 2 > &rhs)
static Return_t apply(const TinyVector< T1, D > &a, const TinyVector< T2, D > &b)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 2 > apply(const TinyVector< T1, 2 > &lhs, const AntiSymTensor< T2, 2 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
BareKineticEnergy::Return_t Return_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const AntiSymTensor< T1, 3 > &lhs, const TinyVector< T2, 3 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t