1#ifndef TATOOINE_DISCRETIZE_FIELD_H
2#define TATOOINE_DISCRETIZE_FIELD_H
11 typename V, arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
12 floating_point_range... SpatialDimensions, arithmetic T>
16 std::size_t padding = 0, VReal padval = 0) {
17 auto const nan = VReal(0) / VReal(0);
18 std::vector<VReal> raw_data;
19 auto vs = discretized_domain.
vertices();
23 auto sample = f(x, t);
25 raw_data.push_back(
static_cast<VReal
>(sample));
28 raw_data.push_back(
static_cast<VReal
>(sample[i]));
31 for (std::size_t i = 0; i < padding; ++i) {
32 raw_data.push_back(padval);
38template <
typename V, arithmetic VReal, std::size_t NumDimensions,
40 floating_point_range... SpatialDimensions,
41 floating_point_range TemporalDimension>
45 TemporalDimension
const& temporal_domain, std::size_t padding = 0,
47 auto const nan = VReal(0) / VReal(0);
48 std::vector<VReal> raw_data;
49 auto vs = discretized_domain.
vertices();
50 raw_data.reserve(vs.size() * temporal_domain.size() *
52 for (
auto t : temporal_domain) {
54 auto const x = v.position();
55 auto sample = f(x, t);
57 raw_data.push_back(
static_cast<VReal
>(sample));
60 raw_data.push_back(
static_cast<VReal
>(sample[i]));
63 for (std::size_t i = 0; i < padding; ++i) {
64 raw_data.push_back(padval);
71template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
72 floating_point_range... SpatialDimensions>
78 using tensor_type =
typename V::tensor_type;
79 auto const nan = VReal(0) / VReal(0);
80 std::vector<tensor_type> data;
81 auto vs = discretized_domain.
vertices();
82 data.reserve(vs.size());
85 data.push_back(f(x, t));
90template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
91 floating_point_range... SpatialDimensions>
97 discretized_domain.vertices().iterate_indices(
98 [&](
auto const... is) {
99 data(is...) = f(discretized_domain.vertex_at(is...), t);
105template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
106 floating_point_range... SpatialDimensions>
114template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
115 floating_point_range... SpatialDimensions>
122template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
123 floating_point_range... SpatialDimensions>
128 return discretize(f, discretized_domain, 0, pol);
131template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
132 floating_point_range... SpatialDimensions>
135 std::string
const& property_name,
arithmetic auto const t,
137 auto& discretized_field = [&]() ->
decltype(
auto) {
138 if constexpr (is_arithmetic<Tensor>) {
139 return discretized_domain.template insert_vertex_property<VReal>(
142 return discretized_domain
146 return discretized_domain.template vertex_property<
150 return discretized_domain.template vertex_property<Tensor>(property_name);
153 discretized_domain.vertices().iterate_indices(
154 [&](
auto const... is) {
155 auto const x = discretized_domain.vertex_at(is...);
156 discretized_field(is...) = f(x, t);
159 return discretized_field;
162template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
163 floating_point_range... SpatialDimensions>
166 std::string
const& property_name,
arithmetic auto const t)
168 return discretize(f, discretized_domain, property_name, t,
172template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
173 floating_point_range... SpatialDimensions>
176 std::string
const& property_name) ->
auto& {
177 return discretize(f, discretized_domain, property_name, 0,
181template <arithmetic VReal, std::size_t NumDimensions,
typename Tensor,
182 floating_point_range... SpatialDimensions>
185 std::string
const& property_name,
187 return discretize(f, discretized_domain, property_name, 0, pol);
192template <
typename V, arithmetic VReal, std::size_t NumDimensions,
193 typename Tensor,
typename BasisReal,
typename X0Real,
typename X1Real>
198 std::size_t
const res1, std::string
const& property_name,
200 auto const cell_extent =
201 vec<VReal, 2>{spatial_size(0) / (res0 - 1), spatial_size(1) / (res1 - 1)};
202 std::cerr << x0 <<
'\n';
203 std::cerr << spatial_size <<
'\n';
204 std::cerr << cell_extent <<
'\n';
209 auto& discretized_field = [&]() ->
decltype(
auto) {
210 if constexpr (is_scalarfield<V>()) {
211 return discretized_domain.template insert_chunked_vertex_property<VReal>(
213 }
else if constexpr (is_vectorfield<V>()) {
214 return discretized_domain
215 .template vertex_property<
vec<VReal, V::tensor_type::dimension(0)>>(
217 }
else if constexpr (is_matrixfield<V>()) {
218 return discretized_domain.template vertex_property<
mat<
219 VReal, V::tensor_type::dimension(0), V::tensor_type::dimension(1)>>(
222 return discretized_domain.template vertex_property<Tensor>(property_name);
225 for (std::size_t i1 = 0; i1 < res1; ++i1) {
226 for (std::size_t i0 = 0; i0 < res0; ++i0) {
227 auto const x = x0 + basis *
vec{cell_extent(0) * i0, cell_extent(1) * i1};
228 discretized_field(i0, i1) = f(x, t);
231 return discretized_domain;
236template <
typename V, arithmetic VReal, std::size_t NumDimensions,
237 typename Tensor,
typename BasisReal,
typename X0Real>
241 std::size_t
const res1, std::string
const& property_name,
249template <
typename V, arithmetic VReal, std::size_t NumDimensions,
250 typename Tensor,
typename BasisReal,
typename X0Real>
255 std::size_t
const res0, std::size_t
const res1,
256 std::string
const& property_name,
arithmetic auto const t) {
258 basis.
col(0) = extent0;
259 basis.col(1) = extent1;
260 return discretize(f, basis, res0, res1, property_name, t);
Definition: dynamic_multidim_array.h:18
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
Definition: rectilinear_grid.h:38
auto vertices() const
Definition: rectilinear_grid.h:637
Definition: concepts.h:33
Definition: tensor_concepts.h:26
Definition: tensor_concepts.h:23
static constexpr sequential_t sequential
Definition: tags.h:63
Definition: algorithm.h:6
auto discretize(polymorphic::field< VReal, NumDimensions, Tensor > const &f, rectilinear_grid< SpatialDimensions... > const &discretized_domain, arithmetic auto const t, execution_policy_tag auto const pol) -> auto
Definition: discretize_field.h:92
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
auto sample_to_raw(field< V, VReal, NumDimensions, Tensor > const &f, rectilinear_grid< SpatialDimensions... > const &discretized_domain, T const t, std::size_t padding=0, VReal padval=0)
Definition: discretize_field.h:13
auto nan(const char *arg="")
Definition: nan.h:26
auto sample_to_vector(polymorphic::field< VReal, NumDimensions, Tensor > const &f, rectilinear_grid< SpatialDimensions... > const &discretized_domain, arithmetic auto const t)
Definition: discretize_field.h:73
auto constexpr dimension() const
Definition: contracted_dynamic_tensor.h:36
Definition: linspace.h:26
auto constexpr col(std::size_t i)
Definition: mat.h:175
static constexpr auto is_scalarfield()
Definition: field.h:35
static constexpr auto num_tensor_components()
Definition: field.h:40