v0.14.0
Loading...
Searching...
No Matches
Ddg_carat_Ddg.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Ddg^Ddg, yielding a Ddg. */
3
4#pragma once
5
6namespace FTensor
7{
8 /* A(i,j,k,l)*B(j,l,m,n) */
9
10 template <class A, class B, class T, class U, int Dim, int Dim23, char i,
11 char j, char k, char l, char m, char n>
13 {
16
17 template <int Current_Dim0, int Current_Dim1>
18 typename promote<T, U>::V
19 eval(const int N1, const int N2, const int N3, const int N4,
20 const Number<Current_Dim0> &, const Number<Current_Dim1> &) const
21 {
22 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1, N2)
23 * iterB(Current_Dim0 - 1, Current_Dim1 - 1, N3, N4)
24 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>(),
26 }
27 template <int Current_Dim1>
28 typename promote<T, U>::V
29 eval(const int N1, const int N2, const int N3, const int N4,
30 const Number<1> &, const Number<Current_Dim1> &) const
31 {
32 return iterA(0, N1, Current_Dim1 - 1, N2)
33 * iterB(0, Current_Dim1 - 1, N3, N4)
35 }
36 typename promote<T, U>::V
37 eval(const int N1, const int N2, const int N3, const int N4,
38 const Number<1> &, const Number<1> &) const
39 {
40 return iterA(0, N1, 0, N2) * iterB(0, 0, N3, N4);
41 }
42
43 public:
46 : iterA(a), iterB(b)
47 {}
48 typename promote<T, U>::V
49 operator()(const int N1, const int N2, const int N3, const int N4) const
50 {
51 return eval(N1, N2, N3, N4, Number<Dim>(), Number<Dim>());
52 }
53 };
54
55 template <class A, class B, class T, class U, int Dim, int Dim23, char i,
56 char j, char k, char l, char m, char n>
57 Ddg_Expr<Ddg_carat_Ddg_13<A, B, T, U, Dim, Dim23, i, j, k, l, m, n>,
58 typename promote<T, U>::V, Dim, Dim23, i, k, m, n>
61 {
62 using TensorExpr
65 n>(TensorExpr(a, b));
66 }
67}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Ddg_Expr< A, T, Dim, Dim, i, j, k, l > iterA
Ddg_Expr< B, U, Dim, Dim23, j, l, m, n > iterB
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
Ddg_carat_Ddg_13(const Ddg_Expr< A, T, Dim, Dim, i, j, k, l > &a, const Ddg_Expr< B, U, Dim, Dim23, j, l, m, n > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
FTensor::Index< 'n', SPACE_DIM > n
FTensor::Index< 'm', SPACE_DIM > m
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
const double T
Tensors class implemented by Walter Landry.
Definition: FTensor.hpp:51
Ddg_Expr< Ddg_carat_Ddg_13< A, B, T, U, Dim, Dim23, i, j, k, l, m, n >, typename promote< T, U >::V, Dim, Dim23, i, k, m, n > operator^(const Ddg_Expr< A, T, Dim, Dim, i, j, k, l > &a, const Ddg_Expr< B, U, Dim, Dim23, j, l, m, n > &b)
constexpr AssemblyType A