1#ifndef TATOOINE_SYMBOLIC_FIELD_H
2#define TATOOINE_SYMBOLIC_FIELD_H
4#include <tatooine/available_libraries.h>
5#if TATOOINE_GINAC_AVAILABLE
14template <
typename real_type,
size_t N,
size_t... TensorDims>
24 static auto x(
size_t i) ->
auto& {
return symbol::x(i); }
39 [[nodiscard]]
auto expr() const -> const auto& {
return m_expr; }
41 template <
size_t... Is>
44 return evtod<real_type>(
m_expr, (
x(Is) == _x(Is))...,
t() == _t);
56template <
typename Real0,
typename Real1,
size_t N,
size_t D>
63template <
typename Real0,
typename Real1,
size_t N,
size_t... TensorDims>
70template <
typename Real0,
typename Real1,
size_t N,
size_t... TensorDims>
78template <
typename Real0,
typename Real1,
size_t... TensorDims>
86template <
typename Real0,
typename Real1,
size_t... TensorDims>
94template <
typename Real0,
typename Real1,
size_t N,
size_t D0,
size_t D1>
107template <
typename Real,
size_t N,
size_t... TensorDims>
109 field<symbolic::
field<Real, N, TensorDims...>, Real, N, TensorDims...>>
112template <
typename Real,
size_t N,
size_t... TensorDims>
124template <
typename Real,
size_t N,
size_t... TensorDims>
127 TensorDims...>&) noexcept {
131template <
typename Real,
size_t N,
size_t... TensorDims>
133 tensor<GiNaC::ex, TensorDims..., N> ex;
134 for (
size_t i = 0; i < N; ++i) {
135 ex.template slice<
sizeof...(TensorDims)>(i) =
static auto constexpr t
Definition: index.h:24
constexpr auto operator+(const field< Real0, N, TensorDims... > &lhs, const field< Real1, N, TensorDims... > &rhs)
Definition: symbolic_field.h:64
constexpr auto dot(const field< Real0, N, D > &lhs, const field< Real1, N, D > &rhs)
Definition: symbolic_field.h:57
constexpr auto operator*(const field< Real0, TensorDims... > &lhs, const field< Real1, TensorDims... > &rhs)
Definition: symbolic_field.h:79
constexpr auto operator/(const field< Real0, TensorDims... > &lhs, const field< Real1, TensorDims... > &rhs)
Definition: symbolic_field.h:87
constexpr auto operator-(const field< Real0, N, TensorDims... > &lhs, const field< Real1, N, TensorDims... > &rhs)
Definition: symbolic_field.h:71
Definition: algorithm.h:6
constexpr auto is_symbolic_field(T &&) noexcept
Definition: symbolic_field.h:120
static constexpr auto is_symbolic_field_v
Definition: symbolic_field.h:117
constexpr auto diff(polynomial< Real, Degree > const &f)
Definition: polynomial.h:179
real_type real_type
Definition: field.h:17
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
Tensor tensor_type
Definition: field.h:18
auto num_dimensions() const -> std::size_t
Definition: hdf5.h:764
Definition: symbolic_field.h:105
Definition: symbolic.h:61
static constexpr auto num_dimensions() -> std::size_t
Definition: field.h:38
Definition: symbolic_field.h:16
auto evaluate(const pos_type &_x, double _t) const -> tensor_type
Definition: symbolic_field.h:47
auto expr() const -> const auto &
Definition: symbolic_field.h:39
symtensor_type m_expr
Definition: symbolic_field.h:28
void set_expr(const symtensor_type &ex)
Definition: symbolic_field.h:31
static auto x(size_t i) -> auto &
Definition: symbolic_field.h:24
constexpr field(const symtensor_type &ex)
Definition: symbolic_field.h:36
constexpr field()=default
void set_expr(symtensor_type &&ex)
Definition: symbolic_field.h:32
static auto t() -> auto &
Definition: symbolic_field.h:25
constexpr field(symtensor_type &&ex)
Definition: symbolic_field.h:37
field< real_type, N, TensorDims... > this_type
Definition: symbolic_field.h:17
auto evaluate(const pos_type &_x, double _t, std::index_sequence< Is... >) const -> tensor_type
Definition: symbolic_field.h:42
constexpr auto in_domain(const pos_type &, double) const
Definition: symbolic_field.h:50
auto constexpr x() const -> auto const &requires(N >=1)
Definition: vec.h:102