Tatooine
field.h
Go to the documentation of this file.
1#ifndef TATOOINE_FIELD_H
2#define TATOOINE_FIELD_H
3//==============================================================================
4#include <tatooine/tensor.h>
6#include <tatooine/nan.h>
7
8#include <vector>
9//==============================================================================
11//==============================================================================
12template <typename Real, std::size_t NumDimensions, typename Tensor>
13struct field {
14 //============================================================================
15 // typedefs
16 //============================================================================
17 using real_type = Real;
21 static auto constexpr ood_tensor() {
22 if constexpr (is_arithmetic<tensor_type>) {
23 return nan<Real>();
24 } else {
25 return tensor_type::fill(nan<Real>());
26 }
27 }
28 static auto constexpr ood_position() {
29 return pos_type::fill(nan<Real>());
30 }
31 //============================================================================
32 // static methods
33 //============================================================================
34 static constexpr auto is_field() { return true; }
35 static constexpr auto is_scalarfield() { return is_arithmetic<Tensor>; }
36 static constexpr auto is_vectorfield() { return tensor_rank() == 1; }
37 static constexpr auto is_matrixfield() { return tensor_rank() == 2; }
38 static constexpr auto num_dimensions() -> std::size_t { return NumDimensions; }
39 //----------------------------------------------------------------------------
40 static constexpr auto num_tensor_components() {
41 if constexpr (is_scalarfield()) {
42 return 1;
43 } else {
45 }
46 }
47 //----------------------------------------------------------------------------
48 static constexpr auto tensor_rank() {
49 if constexpr (is_scalarfield()) {
50 return 0;
51 } else {
52 return tensor_type::rank();
53 }
54 }
55 //----------------------------------------------------------------------------
56 static constexpr auto tensor_dimension(std::size_t i)
57 requires(tensor_rank() > 0) {
58 return tensor_type::dimension(i);
59 }
60 //============================================================================
61 // ctors
62 //============================================================================
63 constexpr field() = default;
64 constexpr field(field const&) = default;
65 constexpr field(field&&) noexcept = default;
66 //============================================================================
67 // assign ops
68 //============================================================================
69 constexpr auto operator=(field const&) -> field& = default;
70 constexpr auto operator=(field&&) noexcept -> field& = default;
71 //============================================================================
72 // dtor
73 //============================================================================
74 virtual ~field() = default;
75 //============================================================================
76 // virtual methods
77 //============================================================================
78 [[nodiscard]] constexpr virtual auto evaluate(pos_type const&,
79 real_type const) const
80 -> tensor_type = 0;
81 //============================================================================
82 // methods
83 //============================================================================
84 constexpr auto evaluate(fixed_size_vec<NumDimensions> auto const& x) const
85 -> tensor_type {
86 return evaluate(x, 0);
87 }
88 constexpr auto operator()(fixed_size_vec<NumDimensions> auto const& x,
89 real_type const t) const -> tensor_type {
90 return evaluate(x, t);
91 }
92 constexpr auto operator()(fixed_size_vec<NumDimensions> auto const& x) const
93 -> tensor_type {
94 return evaluate(x, 0);
95 }
96 constexpr auto operator()(arithmetic auto const... xs) const -> tensor_type
97 requires (sizeof...(xs) == NumDimensions) ||
98 (sizeof...(xs) == NumDimensions + 1) {
99 if constexpr (sizeof...(xs) == NumDimensions) {
100 return evaluate(pos_type{xs...});
101 } else if constexpr (sizeof...(xs) == NumDimensions + 1) {
102 auto const data = std::array{static_cast<real_type>(xs)...};
103 auto x = pos_type{};
104 for (std::size_t i = 0; i < NumDimensions; ++i) {
105 x(i) = data[i];
106 }
107 return evaluate(x, data.back());
108 }
109 }
110}; // field
111//==============================================================================
112template <typename Real, std::size_t NumDimensions,
113 std::size_t R = NumDimensions, std::size_t C = NumDimensions>
115template <typename Real, std::size_t NumDimensions,
116 std::size_t C = NumDimensions>
118template <typename Real, std::size_t NumDimensions>
120//==============================================================================
121} // namespace tatooine::polymorphic
122//==============================================================================
123namespace tatooine {
124//==============================================================================
125template <typename Real, std::size_t NumDimensions, typename Tensor>
126using field_list = std::vector<
127 std::unique_ptr<polymorphic::field<Real, NumDimensions, Tensor>>>;
128template <typename Real, std::size_t NumDimensions,
129 std::size_t C = NumDimensions>
131//==============================================================================
132template <typename DerivedField, typename Real, std::size_t NumDimensions,
133 typename Tensor>
134struct field : polymorphic::field<Real, NumDimensions, Tensor> {
135 //============================================================================
136 // typedefs
137 //============================================================================
140 using typename parent_type::pos_type;
143 //============================================================================
144 // ctors
145 //============================================================================
146 field() = default;
147 field(field const&) = default;
148 field(field&&) noexcept = default;
149 //============================================================================
150 // assign ops
151 //============================================================================
152 auto operator=(field const&) -> field& = default;
153 auto operator=(field&&) noexcept -> field& = default;
154 //============================================================================
155 // dtor
156 //============================================================================
157 virtual ~field() = default;
158 //============================================================================
159 // methods
160 //============================================================================
161 auto as_derived() -> auto& { return static_cast<DerivedField&>(*this); }
162 auto as_derived() const -> auto const& {
163 return static_cast<DerivedField const&>(*this);
164 }
165 //----------------------------------------------------------------------------
166 [[nodiscard]] auto evaluate(pos_type const& x, real_type const t) const
167 -> tensor_type override {
168 return as_derived().evaluate(x, t);
169 }
170};
171//==============================================================================
172template <typename V, typename Real, std::size_t NumDimensions,
173 std::size_t R = NumDimensions, std::size_t C = NumDimensions>
175//------------------------------------------------------------------------------
176template <typename V, typename Real, std::size_t NumDimensions,
177 std::size_t C = NumDimensions>
179//------------------------------------------------------------------------------
180template <typename V, typename Real, std::size_t NumDimensions>
182//==============================================================================
183template <std::size_t NumDimensions, typename F>
185 : field<lambda_field<NumDimensions, F>,
186 tatooine::value_type<std::invoke_result_t<
187 F, vec<tatooine::real_number, NumDimensions>,
188 tatooine::real_number>>,
189 NumDimensions,
190 std::invoke_result_t<F, vec<tatooine::real_number, NumDimensions>,
191 tatooine::real_number>> {
193 constexpr lambda_field(F&& f) : m_f{std::forward<F>(f)} {}
194 ~lambda_field() = default;
197 tatooine::value_type<std::invoke_result_t<
198 F, vec<tatooine::real_number, NumDimensions>, tatooine::real_number>>,
199 NumDimensions,
200 std::invoke_result_t<F, vec<tatooine::real_number, NumDimensions>,
201 tatooine::real_number>>;
202 using typename parent_type::pos_type;
203 using typename parent_type::real_type;
204 using typename parent_type::tensor_type;
205 [[nodiscard]] constexpr auto evaluate(pos_type const& x,
206 real_type const t) const
207 -> tensor_type {
208 return m_f(x, t);
209 }
210};
211//==============================================================================
212template <std::size_t NumDimensions, typename F>
213constexpr auto make_field(F&& f) {
214 return lambda_field<NumDimensions, std::decay_t<F>>{std::forward<F>(f)};
215}
216//==============================================================================
217// type traits
218//==============================================================================
219//template <typename T, typename = void>
220//struct is_field_impl : std::false_type {};
222//template <typename T>
223//struct is_field_impl<T>
224// : std::integral_constant<
225// bool, std::remove_pointer_t<std::decay_t<T>>::is_field()> {};
227//template <typename T>
228//static constexpr bool is_field = is_field_impl<T>::value;
229
230template <typename T>
231concept is_field = requires {
232 std::remove_pointer_t<std::decay_t<T>>::is_field();
233};
234//==============================================================================
235template <typename T, typename = void>
236struct is_scalarfield_impl : std::false_type {};
237//------------------------------------------------------------------------------
238template <typename T>
240 : std::integral_constant<bool, T::is_scalarfield()> {};
241//------------------------------------------------------------------------------
242template <typename T>
244//==============================================================================
245template <typename T, typename = void>
246struct is_vectorfield_impl : std::false_type {};
247//------------------------------------------------------------------------------
248template <typename T>
250//------------------------------------------------------------------------------
251template <typename T>
253 : std::integral_constant<bool, T::is_vectorfield()> {};
254//==============================================================================
255template <typename T, typename = void>
256struct is_matrixfield_impl : std::false_type {};
257//------------------------------------------------------------------------------
258template <typename T>
260 : std::integral_constant<bool, T::is_matrixfield()> {};
261//------------------------------------------------------------------------------
262template <typename T>
264//==============================================================================
265} // namespace tatooine
266//==============================================================================
268//==============================================================================
269#endif
Definition: concepts.h:33
Definition: tensor_concepts.h:33
Definition: field.h:231
Definition: field.h:10
Definition: algorithm.h:6
typename value_type_impl< T >::type value_type
Definition: type_traits.h:280
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
static constexpr bool is_scalarfield
Definition: field.h:243
constexpr auto make_field(F &&f)
Definition: field.h:213
std::vector< std::unique_ptr< polymorphic::field< Real, NumDimensions, Tensor > > > field_list
Definition: field.h:127
static constexpr auto is_matrixfield
Definition: field.h:263
field_list< Real, NumDimensions, vec< Real, C > > vectorfield_list
Definition: field.h:130
static constexpr bool is_vectorfield
Definition: field.h:249
static constexpr forward_tag forward
Definition: tags.h:9
auto constexpr dimension() const
Definition: contracted_dynamic_tensor.h:36
Definition: field.h:134
auto evaluate(pos_type const &x, real_type const t) const -> tensor_type override
Definition: field.h:166
field(field const &)=default
auto as_derived() const -> auto const &
Definition: field.h:162
field()=default
field(field &&) noexcept=default
Real real_type
Definition: field.h:17
auto as_derived() -> auto &
Definition: field.h:161
Definition: field.h:256
Definition: field.h:236
Definition: field.h:246
Definition: field.h:191
F m_f
Definition: field.h:192
constexpr auto evaluate(pos_type const &x, real_type const t) const -> tensor_type
Definition: field.h:205
constexpr lambda_field(F &&f)
Definition: field.h:193
Definition: field.h:13
static constexpr auto is_field()
Definition: field.h:34
static constexpr auto is_matrixfield()
Definition: field.h:37
static constexpr auto tensor_dimension(std::size_t i)
Definition: field.h:56
constexpr auto operator()(fixed_size_vec< NumDimensions > auto const &x) const -> tensor_type
Definition: field.h:92
constexpr field(field &&) noexcept=default
constexpr field(field const &)=default
static constexpr auto is_scalarfield()
Definition: field.h:35
static auto constexpr ood_position()
Definition: field.h:28
static auto constexpr ood_tensor()
Definition: field.h:21
constexpr auto operator()(arithmetic auto const ... xs) const -> tensor_type
Definition: field.h:96
static constexpr auto num_tensor_components()
Definition: field.h:40
virtual constexpr auto evaluate(pos_type const &, real_type const) const -> tensor_type=0
constexpr auto operator()(fixed_size_vec< NumDimensions > auto const &x, real_type const t) const -> tensor_type
Definition: field.h:88
Real real_type
Definition: field.h:17
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
static constexpr auto tensor_rank()
Definition: field.h:48
Tensor tensor_type
Definition: field.h:18
static constexpr auto is_vectorfield()
Definition: field.h:36
static constexpr auto num_dimensions() -> std::size_t
Definition: field.h:38
constexpr field()=default
Definition: spacetime_vectorfield.h:13
Definition: tags.h:96
static auto constexpr rank()
Definition: base_tensor.h:41
static auto constexpr num_components()
Definition: base_tensor.h:43
Definition: vec.h:12