v0.15.0
Loading...
Searching...
No Matches
Tensor2_symmetric_times_Tensor1.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Tensor2_symmetric*Tensor1 and Tensor1*Tensor2_symmetric, yielding a
3 Tensor1 or Dg. */
4
5#pragma once
6
7namespace FTensor
8{
9 /* A(i,j)*B(j) -> Tensor1 */
10
11 template <class A, class B, class T, class U, int Dim, char i, char j>
13 {
16
17 template <int Current_Dim>
18 typename promote<T, U>::V
19 eval(const int N1, const Number<Current_Dim> &) const
20 {
21 return iterA(N1, Current_Dim - 1) * iterB(Current_Dim - 1)
23 }
24 typename promote<T, U>::V eval(const int N1, const Number<1> &) const
25 {
26 return iterA(N1, 0) * iterB(0);
27 }
28
29 public:
35 typename promote<T, U>::V operator()(const int N1) const
36 {
37 return eval(N1, Number<Dim>());
38 }
39 };
40
41 template <class A, class B, class T, class U, int Dim, char i, char j>
43 typename promote<T, U>::V, Dim, i>
52
53 /* A(j,i)*B(j) -> Tensor1 */
54
55 template <class A, class B, class T, class U, int Dim, char i, char j>
57 {
60
61 template <int Current_Dim>
62 typename promote<T, U>::V
63 eval(const int N1, const Number<Current_Dim> &) const
64 {
65 return iterA(Current_Dim - 1, N1) * iterB(Current_Dim - 1)
67 }
68 typename promote<T, U>::V eval(const int N1, const Number<1> &) const
69 {
70 return iterA(0, N1) * iterB(0);
71 }
72
73 public:
79 typename promote<T, U>::V operator()(const int N1) const
80 {
81 return eval(N1, Number<Dim>());
82 }
83 };
84
85 template <class A, class B, class T, class U, int Dim, char i, char j>
87 typename promote<T, U>::V, Dim, i>
96
97 /* B(j)*A(i,j) -> Tensor1 */
98
99 template <class A, class B, class T, class U, int Dim, char i, char j>
101 typename promote<T, U>::V, Dim, i>
110
111 /* B(j)*A(j,i) -> Tensor1 */
112
113 template <class A, class B, class T, class U, int Dim, char i, char j>
115 typename promote<T, U>::V, Dim, i>
124
125 /* A(i,j)*B(k) -> Dg */
126
127 template <class A, class B, class T, class U, int Dim, int Dim2, char i,
128 char j, char k>
130 {
133
134 public:
140 typename promote<T, U>::V
141 operator()(const int N1, const int N2, const int N3) const
142 {
143 return iterA(N1, N2) * iterB(N3);
144 }
145 };
146
147 template <class A, class B, class T, class U, int Dim, int Dim2, char i,
148 char j, char k>
149 Dg_Expr<Tensor2_symmetric_times_Tensor1<A, B, T, U, Dim, Dim2, i, j, k>,
150 typename promote<T, U>::V, Dim, Dim2, i, j, k>
159
160 /* B(k)*A(i,j) -> Dg */
161
162 template <class A, class B, class T, class U, int Dim, int Dim2, char i,
163 char j, char k>
164 Dg_Expr<Tensor2_symmetric_times_Tensor1<A, B, T, U, Dim, Dim2, i, j, k>,
165 typename promote<T, U>::V, Dim, Dim2, i, j, k>
174}
constexpr double a
promote< T, U >::V eval(const int N1, const Number< Current_Dim > &) const
Tensor2_symmetric_Expr< A, T, Dim, j, i > iterA
promote< T, U >::V eval(const int N1, const Number< 1 > &) const
Tensor2_symmetric_times_Tensor1_0(const Tensor2_symmetric_Expr< A, T, Dim, j, i > &a, const Tensor1_Expr< B, U, Dim, j > &b)
promote< T, U >::V eval(const int N1, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const Number< Current_Dim > &) const
Tensor2_symmetric_Expr< A, T, Dim, i, j > iterA
Tensor2_symmetric_times_Tensor1_1(const Tensor2_symmetric_Expr< A, T, Dim, i, j > &a, const Tensor1_Expr< B, U, Dim, j > &b)
Tensor2_symmetric_Expr< A, T, Dim, i, j > iterA
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Tensor2_symmetric_times_Tensor1(const Tensor2_symmetric_Expr< A, T, Dim, i, j > &a, const Tensor1_Expr< B, U, Dim2, k > &b)
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
Tensors class implemented by Walter Landry.
Definition FTensor.hpp:51
promote< T, U >::V operator*(const Ddg_Expr< A, T, Dim, Dim, i, j, k, l > &a, const Ddg_Expr< B, U, Dim, Dim, i, k, j, l > &b)
constexpr AssemblyType A