1#ifndef TATOOINE_TENSOR_SYMBOLIC_H
2#define TATOOINE_TENSOR_SYMBOLIC_H
5#include <tatooine/available_libraries.h>
6#if TATOOINE_GINAC_AVAILABLE
11template <
typename RealOut =
double,
typename Tensor,
size_t... Dims,
12 typename... Relations>
14 Relations&&... relations) {
15 tensor<RealOut, Dims...> t_out;
18 t_out(is...) = symbolic::evtod<RealOut>(
19 t_in(is...), std::forward<Relations>(relations)...);
26template <
typename RealOut =
double,
typename Tensor,
size_t... Dims>
28 const GiNaC::symbol& symbol,
unsigned nth = 1) {
30 [&](
const auto& component) {
return component.diff(symbol, nth); }, t_in);
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...); });
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...); });
52template <
typename Tensor,
size_t... Dims>
54 m.
for_indices([&m](
const auto... is) { m(is...) = m(is...).eval(); });
57template <
typename Tensor,
size_t... Dims>
59 m.
for_indices([&m](
const auto... is) { m(is...) = m(is...).evalf(); });
62template <
typename Tensor,
size_t... Dims>
64 m.
for_indices([&m](
const auto... is) { m(is...) = m(is...).evalm(); });
68template <
typename Tensor,
size_t... Dims>
70 m.
for_indices([&m](
const auto... is) { m(is...) = m(is...).expand(); });
74template <
typename Tensor,
size_t... Dims>
76 m.
for_indices([&m](
const auto... is) { m(is...).normal(); });
80template <
typename Tensor,
size_t M,
size_t N>
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