Tatooine
tensor_symbolic.h
Go to the documentation of this file.
1#ifndef TATOOINE_TENSOR_SYMBOLIC_H
2#define TATOOINE_TENSOR_SYMBOLIC_H
3//==============================================================================
4#include <tatooine/tensor.h>
5#include <tatooine/available_libraries.h>
6#if TATOOINE_GINAC_AVAILABLE
7#include "symbolic.h"
8//==============================================================================
9namespace tatooine {
10//==============================================================================
11template <typename RealOut = double, typename Tensor, size_t... Dims,
12 typename... Relations>
14 Relations&&... relations) {
15 tensor<RealOut, Dims...> t_out;
16
17 t_out.for_indices([&](const auto... is) {
18 t_out(is...) = symbolic::evtod<RealOut>(
19 t_in(is...), std::forward<Relations>(relations)...);
20 });
21
22 return t_out;
23}
24
25//------------------------------------------------------------------------------
26template <typename RealOut = double, typename Tensor, size_t... Dims>
28 const GiNaC::symbol& symbol, unsigned nth = 1) {
29 return unary_operation(
30 [&](const auto& component) { return component.diff(symbol, nth); }, t_in);
31}
32
33//------------------------------------------------------------------------------
34template <typename Tensor, size_t M, size_t N>
36 GiNaC::matrix m_out(M, N);
37 m_in.for_indices([&](const auto... is) { m_out(is...) = m_in(is...); });
38 return m_out;
39}
40
41//------------------------------------------------------------------------------
42template <size_t M, size_t N>
43auto to_mat(const GiNaC::matrix& m_in) {
44 assert(m_in.rows() == M);
45 assert(m_in.cols() == N);
47 m_out.for_indices([&](const auto... is) { m_out(is...) = m_in(is...); });
48 return m_out;
49}
50
51//------------------------------------------------------------------------------
52template <typename Tensor, size_t... Dims>
54 m.for_indices([&m](const auto... is) { m(is...) = m(is...).eval(); });
55}
56//------------------------------------------------------------------------------
57template <typename Tensor, size_t... Dims>
59 m.for_indices([&m](const auto... is) { m(is...) = m(is...).evalf(); });
60}
61//------------------------------------------------------------------------------
62template <typename Tensor, size_t... Dims>
64 m.for_indices([&m](const auto... is) { m(is...) = m(is...).evalm(); });
65}
66
67//------------------------------------------------------------------------------
68template <typename Tensor, size_t... Dims>
70 m.for_indices([&m](const auto... is) { m(is...) = m(is...).expand(); });
71}
72
73//------------------------------------------------------------------------------
74template <typename Tensor, size_t... Dims>
76 m.for_indices([&m](const auto... is) { m(is...).normal(); });
77}
78
79//------------------------------------------------------------------------------
80template <typename Tensor, size_t M, size_t N>
82 return to_mat<M, N>(to_ginac_matrix(m_in).inverse());
83}
84//==============================================================================
85} // namespace tatooine
86//==============================================================================
87#endif
88#endif
Definition: algorithm.h:6
void normal(base_tensor< Tensor, GiNaC::ex, Dims... > &m)
Definition: tensor_symbolic.h:75
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
void eval(base_tensor< Tensor, GiNaC::ex, Dims... > &m)
Definition: tensor_symbolic.h:53
auto to_mat(const GiNaC::matrix &m_in)
Definition: tensor_symbolic.h:43
void evalf(base_tensor< Tensor, GiNaC::ex, Dims... > &m)
Definition: tensor_symbolic.h:58
auto inverse(const base_tensor< Tensor, GiNaC::ex, M, N > &m_in)
Definition: tensor_symbolic.h:81
constexpr auto unary_operation(invocable< tatooine::value_type< Tensor > > auto &&op, Tensor const &t)
Definition: unary_operation.h:9
constexpr auto diff(polynomial< Real, Degree > const &f)
Definition: polynomial.h:179
auto evtod(const base_tensor< Tensor, GiNaC::ex, Dims... > &t_in, Relations &&... relations)
Definition: tensor_symbolic.h:13
void expand(base_tensor< Tensor, GiNaC::ex, Dims... > &m)
Definition: tensor_symbolic.h:69
void evalm(base_tensor< Tensor, GiNaC::ex, Dims... > &m)
Definition: tensor_symbolic.h:63
auto to_ginac_matrix(const base_tensor< Tensor, GiNaC::ex, M, N > &m_in)
Definition: tensor_symbolic.h:35
Definition: base_tensor.h:23
static auto constexpr for_indices(invocable< decltype(Dims)... > auto &&f)
Definition: base_tensor.h:58
Definition: mat.h:14
Definition: tensor.h:17