Tatooine
spacetime_splitted_vectorfield.h
Go to the documentation of this file.
1#ifndef TATOOINE_SPACETIME_SPLITTED_VECTORFIELD_H
2#define TATOOINE_SPACETIME_SPLITTED_VECTORFIELD_H
3//==============================================================================
4#include <tatooine/field.h>
5#include <tatooine/concepts.h>
7//==============================================================================
8namespace tatooine {
9//==============================================================================
10template <typename V>
12 : vectorfield<spacetime_splitted_vectorfield<V>,
13 typename std::remove_pointer_t<std::decay_t<V>>::real_type,
14 std::remove_pointer_t<std::decay_t<V>>::num_dimensions() -
15 1> {
19 typename std::remove_pointer_t<std::decay_t<V>>::real_type,
20 std::remove_pointer_t<std::decay_t<V>>::num_dimensions() - 1>;
22 using typename parent_type::pos_type;
23 using typename parent_type::real_type;
24 using typename parent_type::tensor_type;
25 //============================================================================
26 V m_v;
27 //============================================================================
28 constexpr auto internal_field() const -> auto const& {
29 if constexpr (std::is_pointer_v<std::decay_t<V>>) {
30 return *m_v;
31 } else {
32 return m_v;
33 };
34 }
35 //----------------------------------------------------------------------------
36 template <typename W>
37 auto set_field(vectorfield<W, real_type, num_dimensions() + 1> const& v)
38 requires std::is_pointer_v<V> {
39 m_v = &v;
40 }
41 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
44 requires std::is_pointer_v<V> {
45 m_v = &v;
46 }
47 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
50 requires std::is_pointer_v<V> {
51 m_v = v;
52 }
53 //============================================================================
55 : m_v{std::forward<decltype(v)>(v)} {}
56 //----------------------------------------------------------------------------
58 default;
60 default;
61 //----------------------------------------------------------------------------
62 ~spacetime_splitted_vectorfield() override = default;
63 //----------------------------------------------------------------------------
64 [[nodiscard]] constexpr auto evaluate(pos_type const& x, real_type const t) const
65 -> tensor_type {
66 auto spatio_temporal_position = vec<real_type, num_dimensions() + 1>{};
67 for (std::size_t i = 0; i < num_dimensions(); ++i) {
68 spatio_temporal_position(i) = x(i);
69 }
70 spatio_temporal_position(num_dimensions()) = t;
71 auto vt = internal_field()(spatio_temporal_position, t);
72 if constexpr (!same_as<decltype(vt), tensor_type>) {
73 auto v = tensor_type{};
74 for (std::size_t i = 0; i < num_dimensions(); ++i) {
75 v(i) = vt(i);
76 }
77 return v;
78 } else {
79 return vt;
80 }
81 }
82};
83template <typename V>
85template <typename V>
88template <typename V>
90template <typename V>
92template <typename V>
95//==============================================================================
96template <typename V, typename VReal, std::size_t N, std::size_t NV>
99}
100// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
101template <typename V, typename VReal, std::size_t N, std::size_t NV>
104}
105// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
106template <typename V, typename VReal, std::size_t N, std::size_t NV>
108 return spacetime_splitted_vectorfield<V>{std::move(v.as_derived())};
109}
110// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
111template <typename VReal, std::size_t N, std::size_t NV>
114}
115// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
116template <typename VReal, std::size_t N, std::size_t NV>
120}
121//==============================================================================
122} // namespace tatooine
123//==============================================================================
124#endif
Definition: concepts.h:39
Definition: concepts.h:15
Definition: algorithm.h:6
auto split_spacetime(vectorfield< V, VReal, N, NV > const &v)
Definition: spacetime_splitted_vectorfield.h:97
static constexpr forward_tag forward
Definition: tags.h:9
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
auto num_dimensions() const -> std::size_t
Definition: hdf5.h:764
Definition: field.h:13
static constexpr auto num_dimensions() -> std::size_t
Definition: field.h:38
Definition: spacetime_splitted_vectorfield.h:15
spacetime_splitted_vectorfield< V > this_type
Definition: spacetime_splitted_vectorfield.h:16
constexpr spacetime_splitted_vectorfield(spacetime_splitted_vectorfield const &)=default
constexpr auto evaluate(pos_type const &x, real_type const t) const -> tensor_type
Definition: spacetime_splitted_vectorfield.h:64
auto set_field(polymorphic::vectorfield< real_type, num_dimensions()+1 > const &v)
Definition: spacetime_splitted_vectorfield.h:42
auto set_field(polymorphic::vectorfield< real_type, num_dimensions()+1 > const *v)
Definition: spacetime_splitted_vectorfield.h:48
constexpr auto internal_field() const -> auto const &
Definition: spacetime_splitted_vectorfield.h:28
constexpr spacetime_splitted_vectorfield(convertible_to< V > auto &&v)
Definition: spacetime_splitted_vectorfield.h:54
V m_v
Definition: spacetime_splitted_vectorfield.h:26
auto set_field(vectorfield< W, real_type, num_dimensions()+1 > const &v)
Definition: spacetime_splitted_vectorfield.h:37
Real real_type
Definition: field.h:17
constexpr spacetime_splitted_vectorfield(spacetime_splitted_vectorfield &&) noexcept=default
Definition: vec.h:12