Tatooine
spacetime_vectorfield.h
Go to the documentation of this file.
1#ifndef TATOOINE_SPACETIME_VECTORFIELD_H
2#define TATOOINE_SPACETIME_VECTORFIELD_H
3//==============================================================================
4#include <tatooine/available_libraries.h>
5
6#include "field.h"
7//==============================================================================
8namespace tatooine {
9//==============================================================================
10template <typename V>
12 : vectorfield<spacetime_vectorfield<V>, field_real_type<V>,
13 field_num_dimensions<V> + 1> {
16 vectorfield<this_type, field_real_type<V>, field_num_dimensions<V> + 1>;
17 using typename parent_type::pos_type;
18 using typename parent_type::real_type;
19 using typename parent_type::tensor_type;
20 static constexpr auto holds_field_pointer = is_pointer<V>;
21 static constexpr auto num_dimensions() -> std::size_t { return field_num_dimensions<V> + 1; }
22
23 static_assert(field_tensor_type<V>::rank() == 1);
24
25 private:
26 //============================================================================
27 // members
28 //============================================================================
29 V m_v;
30
31 public:
32 //============================================================================
33 // copy / move ctors
34 //============================================================================
36 spacetime_vectorfield(spacetime_vectorfield&& other) noexcept = default;
37 //============================================================================
38 // assign ops
39 //============================================================================
41 -> spacetime_vectorfield& = default;
42 auto operator=(spacetime_vectorfield&& other) noexcept
43 -> spacetime_vectorfield& = default;
44 //============================================================================
45 // dtor
46 //============================================================================
47 virtual ~spacetime_vectorfield() = default;
48 //============================================================================
49 // ctors
50 //============================================================================
52 requires is_pointer<V>
53 : m_v{nullptr} {}
54 //----------------------------------------------------------------------------
55 explicit constexpr spacetime_vectorfield(
57 requires is_pointer<V>
58 : m_v{v} {}
59 //----------------------------------------------------------------------------
60 template <std::convertible_to<V> W>
62 requires(!is_pointer<V>)
63 : m_v{w.as_derived()} {}
64 //============================================================================
65 // methods
66 //============================================================================
67 [[nodiscard]] constexpr auto evaluate(pos_type const& x, real_type const /*t*/) const
68 -> tensor_type {
69 auto spatial_position = vec<real_type, num_dimensions() - 1>{};
70 for (std::size_t i = 0; i < num_dimensions() - 1; ++i) {
71 spatial_position(i) = x(i);
72 }
73 auto temporal_position = x(num_dimensions() - 1);
74
75 auto const sample = v()(spatial_position, temporal_position);
76 auto t_out = tensor_type{};
77 for (std::size_t i = 0; i < num_dimensions() - 1; ++i) {
78 t_out(i) = sample(i);
79 }
80 t_out(num_dimensions() - 1) = 1;
81 return t_out;
82 }
83 //----------------------------------------------------------------------------
84 template <typename W>
86 requires is_pointer<V>
87 {
88 m_v = &v;
89 }
90 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92 requires is_pointer<V>
93 {
94 m_v = &v;
95 }
96 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
98 requires is_pointer<V>
99 {
100 m_v = v;
101 }
102
103 private:
104 auto v() -> auto& {
105 if constexpr (holds_field_pointer) {
106 return *m_v;
107 } else {
108 return m_v;
109 }
110 }
111 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112 auto v() const -> auto const& {
113 if constexpr (holds_field_pointer) {
114 return *m_v;
115 } else {
116 return m_v;
117 }
118 }
119};
120//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121template <typename V, typename Real, std::size_t N>
124// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
125template <typename Real, std::size_t N>
128
129//==============================================================================
130// SYMBOLIC
131//==============================================================================
132#if TATOOINE_GINAC_AVAILABLE
133#include "symbolic_field.h"
134//==============================================================================
135template <typename Real, std::size_t N>
136struct spacetime_vectorfield<symbolic::field<Real, N - 1>, Real, N>
137 : symbolic::field<Real, N> {
138 //============================================================================
139 using V = symbolic::field<Real, N - 1>;
142 using typename parent_type::pos_type;
143 using typename parent_type::symtensor_type;
144 using typename parent_type::tensor_type;
145
146 //============================================================================
148 field<symbolic::field<Real, N - 1> const, Real, N - 1>& v) {
150 for (std::size_t i = 0; i < N - 1; ++i) {
151 ex(i) = symbolic::ev(v.as_derived().expr()(i),
153 }
154 ex(N - 1) = 1;
155 this->set_expr(ex);
156 }
157};
158
159//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
160template <typename Real, std::size_t N>
163#endif
164//==============================================================================
165template <typename V, typename Real, std::size_t N>
168}
169// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
170template <typename V, typename Real, std::size_t N>
173}
174// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
175template <typename V, typename Real, std::size_t N>
178}
179//==============================================================================
180} // namespace tatooine
181//==============================================================================
182
183#endif
static auto constexpr t
Definition: index.h:24
auto ev(const GiNaC::ex &expr, Relations &&... relations)
substitudes expression with relations
Definition: symbolic.h:35
Definition: algorithm.h:6
auto spacetime(vectorfield< V, Real, N > const &vf)
Definition: spacetime_vectorfield.h:166
static constexpr auto is_pointer
Definition: type_traits.h:22
typename std::decay_t< std::remove_pointer_t< std::decay_t< Field > > >::tensor_type field_tensor_type
Definition: field_type_traits.h:14
Definition: field.h:134
Real real_type
Definition: field.h:17
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
Tensor tensor_type
Definition: field.h:18
auto as_derived() -> auto &
Definition: field.h:161
Definition: field.h:13
spacetime_vectorfield(field< symbolic::field< Real, N - 1 > const, Real, N - 1 > &v)
Definition: spacetime_vectorfield.h:147
Definition: spacetime_vectorfield.h:13
V m_v
Definition: spacetime_vectorfield.h:29
auto operator=(spacetime_vectorfield &&other) noexcept -> spacetime_vectorfield &=default
auto v() -> auto &
Definition: spacetime_vectorfield.h:104
auto set_field(polymorphic::vectorfield< real_type, num_dimensions() - 1 > const *v)
Definition: spacetime_vectorfield.h:97
spacetime_vectorfield(spacetime_vectorfield &&other) noexcept=default
auto set_field(polymorphic::vectorfield< real_type, num_dimensions() - 1 > const &v)
Definition: spacetime_vectorfield.h:91
auto set_field(vectorfield< W, real_type, num_dimensions() - 1 > const &v)
Definition: spacetime_vectorfield.h:85
virtual ~spacetime_vectorfield()=default
constexpr spacetime_vectorfield(vectorfield< W, real_type, num_dimensions() - 1 > const &w)
Definition: spacetime_vectorfield.h:61
static constexpr auto holds_field_pointer
Definition: spacetime_vectorfield.h:20
auto operator=(spacetime_vectorfield const &other) -> spacetime_vectorfield &=default
spacetime_vectorfield(spacetime_vectorfield const &other)=default
static constexpr auto num_dimensions() -> std::size_t
Definition: spacetime_vectorfield.h:21
auto v() const -> auto const &
Definition: spacetime_vectorfield.h:112
Real real_type
Definition: field.h:17
constexpr auto evaluate(pos_type const &x, real_type const) const -> tensor_type
Definition: spacetime_vectorfield.h:67
constexpr spacetime_vectorfield()
Definition: spacetime_vectorfield.h:51
constexpr spacetime_vectorfield(polymorphic::vectorfield< real_type, num_dimensions() - 1 > const *v)
Definition: spacetime_vectorfield.h:55
Definition: symbolic_field.h:16
tensor< GiNaC::ex, TensorDims... > symtensor_type
Definition: symbolic_field.h:22
Definition: vec.h:12
auto constexpr x() const -> auto const &requires(N >=1)
Definition: vec.h:102