7template <
class T,
int Tensor_Dim0,
int Tensor_Dim1>
8class Tensor2<T *, Tensor_Dim0, Tensor_Dim1> {
11 mutable T *restrict data[Tensor_Dim0][Tensor_Dim1];
17 Tensor2(T *d00, T *d01, T *d10, T *d11,
const int i) : inc(
i) {
19 data, d00, d01, d10, d11);
21 Tensor2(T *d00, T *d01, T *d10, T *d11, T *d20, T *d21,
const int i)
24 data, d00, d01, d10, d11, d20, d21);
26 Tensor2(T *d00, T *d01, T *d02, T *d10, T *d11, T *d12, T *d20, T *d21,
30 data, d00, d01, d02, d10, d11, d12, d20, d21, d22);
32 Tensor2(T *d00, T *d01, T *d02, T *d03, T *d10, T *d11, T *d12, T *d13,
33 T *d20, T *d21, T *d22, T *d23, T *d30, T *d31, T *d32, T *d33,
37 data, d00, d01, d02, d03, d10, d11, d12, d13, d20, d21, d22, d23, d30,
42 template <
class... U>
Tensor2(U *...
d) : data{
d...}, inc(1) {}
45 Tensor2(std::array<U *, Tensor_Dim0 * Tensor_Dim1> &
a,
const int i = 1)
48 for (
int i = 0;
i != Tensor_Dim0; ++
i) {
49 for (
int j = 0;
j != Tensor_Dim1; ++
j, ++
k) {
64 if (N1 >= Tensor_Dim0 || N1 < 0 || N2 >= Tensor_Dim1 || N2 < 0) {
66 s <<
"Bad index in Tensor2<T*," << Tensor_Dim0 <<
"," << Tensor_Dim1
67 <<
">.operator(" << N1 <<
"," << N2 <<
")" << std::endl;
68 throw std::out_of_range(s.str());
76 if (N1 >= Tensor_Dim0 || N1 < 0 || N2 >= Tensor_Dim1 || N2 < 0) {
78 s <<
"Bad index in Tensor2<T*," << Tensor_Dim0 <<
"," << Tensor_Dim1
79 <<
">.operator(" << N1 <<
"," << N2 <<
") const" << std::endl;
80 throw std::out_of_range(s.str());
86 T *
ptr(
const int N1,
const int N2)
const {
88 if (N1 >= Tensor_Dim0 || N1 < 0 || N2 >= Tensor_Dim1 || N2 < 0) {
90 s <<
"Bad index in Tensor2<T*," << Tensor_Dim0 <<
"," << Tensor_Dim1
91 <<
">.ptr(" << N1 <<
"," << N2 <<
")" << std::endl;
92 throw std::out_of_range(s.str());
103 template <
char i,
char j,
int Dim0,
int Dim1>
110 template <
char i,
char j,
int Dim0,
int Dim1>
125 template <
char i,
int Dim,
int N>
135 template <
char i,
int Dim,
int N>
145 template <
char i,
int Dim,
int N>
155 template <
char i,
int Dim,
int N>
169 for (
int i = 0;
i < Tensor_Dim0; ++
i)
170 for (
int j = 0;
j < Tensor_Dim1; ++
j)
180 template <
char i,
int Dim>
185 template <
char i,
int Dim>
212template <
class T,
int Tensor_Dim0,
int Tensor_Dim1,
int I>
218 template <
class... U>
224 Tensor2(std::array<U *, Tensor_Dim0 * Tensor_Dim1> &
a)
225 :
Tensor2<T *, Tensor_Dim0, Tensor_Dim1>(
a) {}
231 for (
int i = 0;
i < Tensor_Dim0; ++
i)
232 for (
int j = 0;
j < Tensor_Dim1; ++
j)
238template <
class T,
int Tensor_Dim0,
int Tensor_Dim1,
int G>
246 return Tensor_Dim1 * N1 + N2;
256 if (N1 >= Tensor_Dim0 || N1 < 0 || N2 >= Tensor_Dim1 || N2 < 0) {
258 s <<
"Bad index in Tensor2<CursorPtr<T*," <<
G <<
">," << Tensor_Dim0
259 <<
"," << Tensor_Dim1 <<
">.operator(" << N1 <<
"," << N2 <<
")"
261 throw std::out_of_range(s.str());
264 return *(data + getFlatIndex(N1, N2));
269 if (N1 >= Tensor_Dim0 || N1 < 0 || N2 >= Tensor_Dim1 || N2 < 0) {
271 s <<
"Bad index in Tensor2<CursorPtr<T*," <<
G <<
">," << Tensor_Dim0
272 <<
"," << Tensor_Dim1 <<
">.operator(" << N1 <<
"," << N2 <<
") const"
274 throw std::out_of_range(s.str());
277 return *(data + getFlatIndex(N1, N2));
280 T *
ptr(
const int N1,
const int N2)
const {
282 if (N1 >= Tensor_Dim0 || N1 < 0 || N2 >= Tensor_Dim1 || N2 < 0) {
284 s <<
"Bad index in Tensor2<CursorPtr<T*," <<
G <<
">," << Tensor_Dim0
285 <<
"," << Tensor_Dim1 <<
">.ptr(" << N1 <<
"," << N2 <<
")"
287 throw std::out_of_range(s.str());
290 const int flat_index = getFlatIndex(N1, N2);
291 return data + flat_index;
294 template <
char i,
char j,
int Dim0,
int Dim1>
300 template <
char i,
char j,
int Dim0,
int Dim1>
306 template <
char i,
int Dim,
int N>
313 template <
char i,
int Dim,
int N>
320 template <
char i,
int Dim,
int N>
327 template <
char i,
int Dim,
int N>
339 template <
char i,
int Dim>
344 template <
char i,
int Dim>
T & operator()(const int N1, const int N2)
T operator()(const int N1, const int N2) const
Tensor1_Expr< const Tensor2_number_0< const Self, T, N >, T, Dim, i > operator()(const Number< N >, const Index< i, Dim >) const
T internal_contract(Number< N >) const
Tensor2_Expr< const Self, T, Dim0, Dim1, i, j > operator()(const Index< i, Dim0 >, const Index< j, Dim1 >) const
Tensor1_Expr< const Tensor2_number_1< const Self, T, N >, T, Dim, i > operator()(const Index< i, Dim >, const Number< N >) const
static constexpr int getFlatIndex(const int N1, const int N2)
T operator()(const Index< i, Dim >, const Index< i, Dim >) const
Tensor1_Expr< Tensor2_number_rhs_1< Self, T, N >, T, Dim, i > operator()(const Index< i, Dim >, const Number< N >)
const Tensor2 & operator++() const
Tensor1_Expr< Tensor2_number_rhs_0< Self, T, N >, T, Dim, i > operator()(const Number< N >, const Index< i, Dim >)
T internal_contract(Number< 1 >) const
T operator()(const Index< i, Dim >, const Index< i, Dim >)
T * ptr(const int N1, const int N2) const
Tensor2_Expr< Self, T, Dim0, Dim1, i, j > operator()(const Index< i, Dim0 >, const Index< j, Dim1 >)
Tensor2(std::array< U *, Tensor_Dim0 *Tensor_Dim1 > &a)
const Tensor2 & operator++() const
Tensor2(const Tensor2< PackPtr< T *, I >, Tensor_Dim0, Tensor_Dim1 > &)=delete
Preventing casting on derived class.
Tensor1_Expr< const Tensor2_number_0< const Tensor2< T *, Tensor_Dim0, Tensor_Dim1 >, T, N >, T, Dim, i > operator()(const Number< N >, const Index< i, Dim >) const
T internal_contract(Number< N >) const
Tensor2(T *d00, T *d01, T *d10, T *d11, T *d20, T *d21, const int i)
T operator()(const int N1, const int N2) const
Tensor1_Expr< Tensor2_number_rhs_1< Tensor2< T *, Tensor_Dim0, Tensor_Dim1 >, T, N >, T, Dim, i > operator()(const Index< i, Dim >, const Number< N >)
const Tensor2 & operator++() const
Tensor1_Expr< const Tensor2_number_1< const Tensor2< T *, Tensor_Dim0, Tensor_Dim1 >, T, N >, T, Dim, i > operator()(const Index< i, Dim >, const Number< N >) const
Tensor2(T *d00, T *d01, T *d10, T *d11, const int i)
Tensor2(T *d00, T *d01, T *d02, T *d03, T *d10, T *d11, T *d12, T *d13, T *d20, T *d21, T *d22, T *d23, T *d30, T *d31, T *d32, T *d33, const int i)
T & operator()(const int N1, const int N2)
Tensor2_Expr< Tensor2< T *, Tensor_Dim0, Tensor_Dim1 >, T, Dim0, Dim1, i, j > operator()(const Index< i, Dim0 >, const Index< j, Dim1 > index2)
Tensor2(std::array< U *, Tensor_Dim0 *Tensor_Dim1 > &a, const int i=1)
Tensor1_Expr< Tensor2_number_rhs_0< Tensor2< T *, Tensor_Dim0, Tensor_Dim1 >, T, N >, T, Dim, i > operator()(const Number< N >, const Index< i, Dim >)
Tensor2(T *d00, T *d01, T *d02, T *d10, T *d11, T *d12, T *d20, T *d21, T *d22, const int i)
T internal_contract(Number< 1 >) const
T operator()(const Index< i, Dim >, const Index< i, Dim > index2) const
Tensor2_Expr< const Tensor2< T *, Tensor_Dim0, Tensor_Dim1 >, T, Dim0, Dim1, i, j > operator()(const Index< i, Dim0 >, const Index< j, Dim1 > index2) const
T * ptr(const int N1, const int N2) const
Tensor2(const Tensor2< CursorPtr< T *, G >, Tensor_Dim0, Tensor_Dim1 > &)=delete
T operator()(const Index< i, Dim >, const Index< i, Dim > index2)
FTensor::Index< 'i', SPACE_DIM > i
constexpr IntegrationType G
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
Tensors class implemented by Walter Landry.
const Tensor1_Expr< const dTensor0< T, Dim, i >, typename promote< T, double >::V, Dim, i > d(const Tensor0< T * > &a, const Index< i, Dim > index, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
constexpr IntegrationType I