1#ifndef TATOOINE_FIELD_H
2#define TATOOINE_FIELD_H
12template <
typename Real, std::
size_t NumDimensions,
typename Tensor>
22 if constexpr (is_arithmetic<tensor_type>) {
25 return tensor_type::fill(nan<Real>());
34 static constexpr auto is_field() {
return true; }
38 static constexpr auto num_dimensions() -> std::size_t {
return NumDimensions; }
69 constexpr auto operator=(
field const&) ->
field& = default;
70 constexpr auto operator=(
field&&) noexcept ->
field& = default;
97 requires (
sizeof...(xs) == NumDimensions) ||
98 (
sizeof...(xs) == NumDimensions + 1) {
99 if constexpr (
sizeof...(xs) == NumDimensions) {
101 }
else if constexpr (
sizeof...(xs) == NumDimensions + 1) {
102 auto const data = std::array{
static_cast<real_type>(xs)...};
104 for (std::size_t i = 0; i < NumDimensions; ++i) {
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>
125template <
typename Real, std::
size_t NumDimensions,
typename Tensor>
127 std::unique_ptr<polymorphic::field<Real, NumDimensions, Tensor>>>;
128template <
typename Real, std::size_t NumDimensions,
129 std::size_t C = NumDimensions>
132template <
typename DerivedField,
typename Real, std::size_t NumDimensions,
161 auto
as_derived() -> auto& {
return static_cast<DerivedField&
>(*this); }
163 return static_cast<DerivedField const&
>(*this);
172template <
typename V,
typename Real, std::size_t NumDimensions,
173 std::size_t R = NumDimensions, std::size_t C = NumDimensions>
176template <
typename V,
typename Real, std::size_t NumDimensions,
177 std::size_t C = NumDimensions>
180template <
typename V,
typename Real, std::
size_t NumDimensions>
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>>,
190 std::invoke_result_t<F, vec<tatooine::real_number, NumDimensions>,
191 tatooine::real_number>> {
200 std::invoke_result_t<F, vec<tatooine::real_number, NumDimensions>,
201 tatooine::real_number>>;
212template <std::
size_t NumDimensions,
typename F>
232 std::remove_pointer_t<std::decay_t<T>>::is_field();
235template <
typename T,
typename =
void>
240 : std::integral_constant<bool, T::is_scalarfield()> {};
245template <
typename T,
typename =
void>
253 : std::integral_constant<bool, T::is_vectorfield()> {};
255template <
typename T,
typename =
void>
260 : std::integral_constant<bool, T::is_matrixfield()> {};
Definition: concepts.h:33
Definition: tensor_concepts.h:33
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
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(field &&) noexcept=default
Real real_type
Definition: field.h:17
tatooine::field< lambda_field< NumDimensions, F >, tatooine::value_type< std::invoke_result_t< F, vec< tatooine::real_number, NumDimensions >, tatooine::real_number > >, NumDimensions, std::invoke_result_t< F, vec< tatooine::real_number, NumDimensions >, tatooine::real_number > >::pos_type vec< real_type, NumDimensions > pos_type
Definition: field.h:20
tatooine::field< lambda_field< NumDimensions, F >, tatooine::value_type< std::invoke_result_t< F, vec< tatooine::real_number, NumDimensions >, tatooine::real_number > >, NumDimensions, std::invoke_result_t< F, vec< tatooine::real_number, NumDimensions >, tatooine::real_number > >::tensor_type std::invoke_result_t< F, vec< tatooine::real_number, NumDimensions >, tatooine::real_number > tensor_type
Definition: field.h:18
auto as_derived() -> auto &
Definition: field.h:161
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
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
Real real_type
Definition: field.h:17
static auto constexpr rank()
Definition: base_tensor.h:41
static auto constexpr num_components()
Definition: base_tensor.h:43