v0.14.0
Loading...
Searching...
No Matches
Ddg_plus_Ddg.hpp
Go to the documentation of this file.
1/* Adds Ddg+Ddg -> Ddg */
2
3#pragma once
4
5namespace FTensor
6{
7 /* Base Template */
8 template <class A, class B, class T, class U, int Dim01_0, int Dim23_0,
9 int Dim01_1, int Dim23_1, char i0, char j0, char k0, char l0,
10 char i1, char j1, char k1, char l1>
12 {};
13
14 /* A(i,j,k,l)+B(i,j,k,l) -> Ddg */
15
16 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
17 char j, char k, char l>
18 class Ddg_plus_Ddg<A, B, T, U, Dim01, Dim23, Dim01, Dim23, i, j, k, l, i, j,
19 k, l>
20 {
23
24 public:
25 typename promote<T, U>::V
26 operator()(const int N1, const int N2, const int N3, const int N4) const
27 {
28 return iterA(N1, N2, N3, N4) + iterB(N1, N2, N3, N4);
29 }
30
33 : iterA(a), iterB(b)
34 {}
35 };
36
37 /* A(i,j,k,l)+B(k,l,i,j) -> Ddg */
38 // TODO: Add rest of combinations (k,l,j,i), (l,k,i,j), (l,k,j,i)
39 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
40 char j, char k, char l>
41 class Ddg_plus_Ddg<A, B, T, U, Dim01, Dim23, Dim23, Dim01, i, j, k, l, k, l,
42 i, j>
43 {
46
47 public:
48 typename promote<T, U>::V
49 operator()(const int N1, const int N2, const int N3, const int N4) const
50 {
51 return iterA(N1, N2, N3, N4) + iterB(N3, N4, N1, N2);
52 }
53
56 : iterA(a), iterB(b)
57 {}
58 };
59
60 template <class A, class B, class T, class U, int Dim01_0, int Dim23_0,
61 int Dim01_1, int Dim23_1, char i0, char j0, char k0, char l0,
62 char i1, char j1, char k1, char l1>
63 Ddg_Expr<Ddg_plus_Ddg<A, B, T, U, Dim01_0, Dim23_0, Dim01_1, Dim23_1, i0, j0,
64 k0, l0, i1, j1, k1, l1>,
65 typename promote<T, U>::V, Dim01_0, Dim23_0, i0, j0, k0, l0>
68 {
69 using TensorExpr = Ddg_plus_Ddg<A, B, T, U, Dim01_0, Dim23_0, Dim01_1,
70 Dim23_1, i0, j0, k0, l0, i1, j1, k1, l1>;
71 static_assert(
72 !std::is_empty<TensorExpr>::value,
73 "Indexes or Dimensions are not compatible with the + operator");
75 i0, j0, k0, l0>(TensorExpr(a, b));
76 }
77}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
Ddg_plus_Ddg(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Ddg_Expr< B, U, Dim23, Dim01, k, l, i, j > &b)
Ddg_plus_Ddg(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Ddg_Expr< B, U, Dim01, Dim23, i, j, k, l > &b)
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
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_plus_Ddg< A, B, T, U, Dim01_0, Dim23_0, Dim01_1, Dim23_1, i0, j0, k0, l0, i1, j1, k1, l1 >, typename promote< T, U >::V, Dim01_0, Dim23_0, i0, j0, k0, l0 > operator+(const Ddg_Expr< A, T, Dim01_0, Dim23_0, i0, j0, k0, l0 > &a, const Ddg_Expr< B, U, Dim01_1, Dim23_1, i1, j1, k1, l1 > &b)
constexpr AssemblyType A