1#ifndef TATOOINE_DIFFERENTIATED_FIELD_H
2#define TATOOINE_DIFFERENTIATED_FIELD_H
7#include <tatooine/available_libraries.h>
13template <field_concept InternalField>
15 :
field<numerically_differentiated_field<InternalField>,
16 field_real_type<InternalField>, field_num_dimensions<InternalField>,
17 tensor_add_dimension_right<field_num_dimensions<InternalField>,
18 field_tensor_type<InternalField>>> {
20 std::decay_t<std::remove_pointer_t<InternalField>>;
25 this_type,
typename raw_internal_field_t::real_type,
26 raw_internal_field_t::num_dimensions(),
28 typename raw_internal_field_t::tensor_type>>;
42 template <convertible_to<InternalField> Field_, arithmetic Eps>
52 template <convertible_to<InternalField> Field_>
56 template <convertible_to<InternalField> Field_, arithmetic Real>
69 auto dx = 2 *
m_eps(i);
82 constexpr std::size_t slice_dim = tensor_type::rank() - 1;
83 derivative.template slice<slice_dim>(i) = (y1 - y0) / dx;
94 auto eps() const -> auto const& {
return m_eps; }
95 auto eps(std::size_t i) ->
auto& {
return m_eps(i); }
96 auto eps(std::size_t i)
const {
return m_eps(i); }
114template <
typename Field, arithmetic Eps>
118template <
typename Field, arithmetic Eps>
122template <
typename Field, arithmetic Eps>
126template <
typename Field, arithmetic Eps>
128 vec<Eps, field_num_dimensions<Field>>
const &)
131template <
typename Field, arithmetic Eps>
133 vec<Eps, field_num_dimensions<Field>>
const &)
136template <
typename Field, arithmetic Eps>
138 vec<Eps, field_num_dimensions<Field>>
const &)
160 std::forward<decltype(field)>(
field),
161 std::forward<decltype(epsilon)>(epsilon)};
169 std::forward<
decltype(epsilon)>(epsilon));
172template <
typename InternalField>
180template <
typename Field, arithmetic Eps>
183template <
typename Field, arithmetic Eps>
187template <
typename Field, arithmetic Eps>
190template <
typename Field, arithmetic Eps>
194template <
typename Field, arithmetic Eps>
196 vec<Eps, field_num_dimensions<Field>>
const &)
199template <
typename Field, arithmetic Eps>
207template <
typename InternalField>
209 :
field<time_differentiated_field<InternalField>,
210 typename std::decay_t<InternalField>::real_type,
211 std::decay_t<InternalField>::num_dimensions(),
212 typename std::decay_t<InternalField>::tensor_type> {
216 std::decay_t<InternalField>::num_dimensions(),
217 typename std::decay_t<InternalField>::tensor_type>;
231 template <
typename Field_, arithmetic Eps>
253 return (x1 - x0) / dt;
269template <
typename Field,
typename Real, std::size_t NumDimensions,
276template <
typename Field,
typename Real, std::size_t NumDimensions,
282template <
typename Field,
typename Real, std::size_t NumDimensions,
288template <
typename Real, std::
size_t NumDimensions,
typename Tensor>
Definition: concepts.h:33
Definition: field_concept.h:16
Definition: tensor_concepts.h:36
static constexpr numerical_t numerical
Definition: tags.h:93
Definition: algorithm.h:6
auto diff_time(field< Field, Real, NumDimensions, Tensor > const &f, Real const eps)
Definition: differentiated_field.h:271
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
constexpr auto diff(polynomial< Real, Degree > const &f)
Definition: polynomial.h:179
typename tensor_add_dimension_right_impl< NewRightDim, Tensor >::type tensor_add_dimension_right
Definition: tensor_type_operations.h:14
static constexpr forward_tag forward
Definition: tags.h:9
Definition: differentiated_field.h:173
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: differentiated_field.h:18
std::decay_t< std::remove_pointer_t< InternalField > > raw_internal_field_t
Definition: differentiated_field.h:20
auto eps() const -> auto const &
Definition: differentiated_field.h:94
auto eps(std::size_t i) -> auto &
Definition: differentiated_field.h:95
InternalField m_internal_field
Definition: differentiated_field.h:38
static constexpr auto num_dimensions() -> std::size_t
Definition: differentiated_field.h:29
auto internal_field() const -> auto const &
Definition: differentiated_field.h:98
auto set_internal_field(InternalField f) -> void requires(holds_field_pointer)
Definition: differentiated_field.h:106
auto eps() -> auto &
Definition: differentiated_field.h:93
numerically_differentiated_field(Field_ &&f, vec_type const &eps)
Definition: differentiated_field.h:53
numerically_differentiated_field(vec_type const &eps=vec_type::ones() *1e-7)
Definition: differentiated_field.h:46
auto eps(std::size_t i) const
Definition: differentiated_field.h:96
numerically_differentiated_field< InternalField > this_type
Definition: differentiated_field.h:23
auto set_eps(vec_type &&eps)
Definition: differentiated_field.h:91
numerically_differentiated_field(Field_ &&f, Eps const eps)
Definition: differentiated_field.h:43
static constexpr auto holds_field_pointer
Definition: differentiated_field.h:21
auto set_eps(real_type eps)
Definition: differentiated_field.h:92
vec_type m_eps
Definition: differentiated_field.h:39
numerically_differentiated_field(Field_ &&f, vec< Real, num_dimensions()> const &eps)
Definition: differentiated_field.h:57
constexpr auto evaluate(pos_type const &x, real_type const t) const -> tensor_type
Definition: differentiated_field.h:61
auto set_eps(vec_type const &eps)
Definition: differentiated_field.h:90
static constexpr auto num_dimensions() -> std::size_t
Definition: field.h:38
Definition: differentiated_field.h:212
InternalField m_internal_field
Definition: differentiated_field.h:227
static constexpr auto holds_field_pointer
Definition: differentiated_field.h:223
constexpr auto evaluate(pos_type const &x, real_type const t) const -> tensor_type
Definition: differentiated_field.h:236
auto eps() -> auto &
Definition: differentiated_field.h:257
auto internal_field() const -> auto const &
Definition: differentiated_field.h:260
real_type m_eps
Definition: differentiated_field.h:228
auto set_eps(real_type eps)
Definition: differentiated_field.h:256
time_differentiated_field(Field_ &&f, Eps const eps)
Definition: differentiated_field.h:232
auto eps() const -> auto const &
Definition: differentiated_field.h:258
static auto constexpr ones()
Definition: vec.h:28