Tatooine
infinite_vertex_property_sampler.h
Go to the documentation of this file.
2#include <tatooine/field.h>
4//==============================================================================
5namespace tatooine {
6//==============================================================================
7template <floating_point_range... Dimensions>
8requires(sizeof...(Dimensions) > 1) class rectilinear_grid;
9//==============================================================================
10} // namespace tatooine
11//==============================================================================
12namespace tatooine::detail::rectilinear_grid {
13//==============================================================================
14template <typename VertexPropSampler, std::size_t... RepeatedDims>
17 infinite_vertex_property_sampler<VertexPropSampler, RepeatedDims...>,
18 typename VertexPropSampler::real_type,
19 VertexPropSampler::num_dimensions(),
20 typename VertexPropSampler::tensor_type> {
21 VertexPropSampler const& m_sampler;
22 infinite_vertex_property_sampler(VertexPropSampler const& sampler)
23 : m_sampler{sampler} {}
24
26 typename VertexPropSampler::real_type,
27 VertexPropSampler::num_dimensions(),
28 typename VertexPropSampler::tensor_type>;
29 using typename parent_type::pos_type;
30 using typename parent_type::real_type;
31 using typename parent_type::tensor_type;
32
33 private:
34 static constexpr auto non_repeated_dimensions__() {
35 auto constexpr rs = repeated_dimensions;
36 auto non = std::array<std::size_t, num_non_repeated_dimensions>{};
37 auto idx = std::size_t(0);
38 for (std::size_t i = 0; i < parent_type::num_dimensions(); ++i) {
39 bool b = true;
40 for (auto r : rs) {
41 if (r == i) {
42 b = false;
43 break;
44 }
45 }
46 if (b) {
47 non[idx++] = i;
48 }
49 }
50
51 return non;
52 }
53
54 public:
55 static auto constexpr num_non_repeated_dimensions =
56 parent_type::num_dimensions() - sizeof...(RepeatedDims);
57 static auto constexpr num_repeated_dimensions =
58 parent_type::num_dimensions() - num_non_repeated_dimensions;
59 static constexpr auto repeated_dimensions = std::array{RepeatedDims...};
60 static constexpr auto non_repeated_dimensions = non_repeated_dimensions__();
61 template <std::size_t... i>
62 auto clamp_pos(pos_type x, std::index_sequence<i...>) const {
63 (
64 [&] {
65 auto constexpr dim = repeated_dimensions[i];
66 auto const front = m_sampler.grid().template dimension<dim>().front();
67 auto const back = m_sampler.grid().template dimension<dim>().back();
68 auto const extent = back - front;
69 if (x(dim) < front) {
70 x(dim) += gcem::ceil((front - x(dim)) / extent) * extent;
71 }
72 if (x(dim) > back) {
73 x(dim) -= extent;
74 x(dim) -= gcem::ceil((x(dim) - back) / extent) * extent;
75 }
76 }(),
77 ...);
78 return x;
79 }
80 auto clamp_pos(pos_type const& x) const {
81 return clamp_pos(x, std::make_index_sequence<num_repeated_dimensions>{});
82 }
83 [[nodiscard]] auto evaluate(pos_type const& x, real_type const t) const
84 -> tensor_type {
85 if (is_inside(x)) {
86 return m_sampler(clamp_pos(x), t);
87 }
88 return parent_type::ood_tensor();
89 }
90 //----------------------------------------------------------------------------
91 template <std::size_t... i>
92 auto constexpr is_inside(pos_type const& x, std::index_sequence<i...>) const
93 -> bool {
94 return ([&] {
95 auto constexpr dim = non_repeated_dimensions[i];
96 auto const front = m_sampler.grid().template dimension<dim>().front();
97 auto const back = m_sampler.grid().template dimension<dim>().back();
98 return front <= x(dim) && x(dim) <= back;
99 }() && ...);
100 }
101 auto constexpr is_inside(pos_type const& x) const -> bool {
102 return is_inside(x,
103 std::make_index_sequence<num_non_repeated_dimensions>{});
104 }
105};
106//------------------------------------------------------------------------------
107template <std::size_t... RepeatedDims, typename GridVertexProperty>
110 interpolation::linear> const& v) {
114 RepeatedDims...>{v};
115}
116//------------------------------------------------------------------------------
117template <std::size_t... RepeatedDims, typename GridVertexProperty>
121 v) {
125 RepeatedDims...>{v};
126}
127//------------------------------------------------------------------------------
128template <std::size_t... DimsToRepeat, typename Dim0, typename Dim1,
129 typename ValueType>
132 ValueType, true>& prop) {
133 auto const s = prop.grid().size();
134 // borders
135 if constexpr (sizeof...(DimsToRepeat) == 0 ||
136 variadic::contains<0, DimsToRepeat...>) {
137 for (std::size_t i = 0;
138 i < (variadic::contains<1, DimsToRepeat...> ? s[1] - 1 : s[1]); ++i) {
139 prop(s[0] - 1, i) = prop(0, i);
140 }
141 }
142 if constexpr (sizeof...(DimsToRepeat) == 0 ||
143 variadic::contains<1, DimsToRepeat...>) {
144 for (std::size_t i = 0;
145 i < (variadic::contains<1, DimsToRepeat...> ? s[0] - 1 : s[0]); ++i) {
146 prop(i, s[1] - 1) = prop(i, 0);
147 }
148 }
149 if constexpr (sizeof...(DimsToRepeat) == 0 ||
150 (variadic::contains<0, DimsToRepeat...> &&
151 variadic::contains<1, DimsToRepeat...>)) {
152 // corner
153 prop(s[0] - 1, s[1] - 1) = prop(0, 0);
154 }
155}
156//------------------------------------------------------------------------------
157template <std::size_t... DimsToRepeat, typename Dim0, typename Dim1,
158 typename Dim2, typename ValueType>
161 tatooine::rectilinear_grid<Dim0, Dim1, Dim2>, ValueType, true>& prop) {
162 auto const s = prop.grid().size();
163 // planes
164 if constexpr (sizeof...(DimsToRepeat) == 0 ||
165 variadic::contains<0, DimsToRepeat...>) {
166 for (std::size_t i = 0;
167 i < (variadic::contains<1, DimsToRepeat...> ? s[1] - 1 : s[1]); ++i) {
168 for (std::size_t j = 0;
169 j < (variadic::contains<2, DimsToRepeat...> ? s[2] - 1 : s[2]);
170 ++j) {
171 prop(s[0] - 1, i, j) = prop(0, i, j);
172 }
173 }
174 }
175 if constexpr (sizeof...(DimsToRepeat) == 0 ||
176 variadic::contains<1, DimsToRepeat...>) {
177 for (std::size_t i = 0;
178 i < (variadic::contains<0, DimsToRepeat...> ? s[0] - 1 : s[0]); ++i) {
179 for (std::size_t j = 0;
180 j < (variadic::contains<2, DimsToRepeat...> ? s[2] - 1 : s[2]);
181 ++j) {
182 prop(i, s[1] - 1, j) = prop(i, 0, j);
183 }
184 }
185 }
186 if constexpr (sizeof...(DimsToRepeat) == 0 ||
187 variadic::contains<2, DimsToRepeat...>) {
188 for (std::size_t i = 0;
189 i < (variadic::contains<0, DimsToRepeat...> ? s[0] - 1 : s[0]); ++i) {
190 for (std::size_t j = 0;
191 j < (variadic::contains<1, DimsToRepeat...> ? s[1] - 1 : s[1]);
192 ++j) {
193 prop(i, j, s[2] - 1) = prop(i, j, 0);
194 }
195 }
196 }
197 // edges
198 if constexpr (sizeof...(DimsToRepeat) == 0 ||
199 (variadic::contains<1, DimsToRepeat...> &&
200 variadic::contains<2, DimsToRepeat...>)) {
201 for (std::size_t i = 0;
202 i < (variadic::contains<0, DimsToRepeat...> ? s[0] - 1 : s[0]); ++i) {
203 prop(i, s[1] - 1, s[2] - 1) = prop(i, 0, 0);
204 }
205 }
206 if constexpr (sizeof...(DimsToRepeat) == 0 ||
207 (variadic::contains<0, DimsToRepeat...> &&
208 variadic::contains<2, DimsToRepeat...>)) {
209 for (std::size_t i = 0;
210 i < (variadic::contains<1, DimsToRepeat...> ? s[1] - 1 : s[1]); ++i) {
211 prop(s[0] - 1, i, s[2] - 1) = prop(0, i, 0);
212 }
213 }
214 if constexpr (sizeof...(DimsToRepeat) == 0 ||
215 (variadic::contains<0, DimsToRepeat...> &&
216 variadic::contains<1, DimsToRepeat...>)) {
217 for (std::size_t i = 0;
218 i < (variadic::contains<2, DimsToRepeat...> ? s[2] - 1 : s[2]); ++i) {
219 prop(s[0] - 1, s[1] - 1, i) = prop(0, 0, i);
220 }
221 }
222 // corner
223 if constexpr (sizeof...(DimsToRepeat) == 0 ||
224 (variadic::contains<0, DimsToRepeat...> &&
225 variadic::contains<1, DimsToRepeat...> &&
226 variadic::contains<2, DimsToRepeat...>)) {
227 prop(s[0] - 1, s[1] - 1, s[2] - 1) = prop(0, 0, 0);
228 }
229}
230//==============================================================================
231} // namespace tatooine::detail::rectilinear_grid
232//==============================================================================
Definition: rectilinear_grid.h:38
Definition: vtp_writer.h:3
auto make_infinite(vertex_property_sampler< GridVertexProperty, interpolation::linear, interpolation::linear > const &v)
Definition: infinite_vertex_property_sampler.h:108
auto repeat_for_infinite(typed_vertex_property_interface< tatooine::rectilinear_grid< Dim0, Dim1 >, ValueType, true > &prop)
Definition: infinite_vertex_property_sampler.h:130
static constexpr auto contains
Definition: variadic_helpers.h:81
Definition: algorithm.h:6
Definition: infinite_vertex_property_sampler.h:20
infinite_vertex_property_sampler(VertexPropSampler const &sampler)
Definition: infinite_vertex_property_sampler.h:22
auto clamp_pos(pos_type x, std::index_sequence< i... >) const
Definition: infinite_vertex_property_sampler.h:62
auto constexpr is_inside(pos_type const &x, std::index_sequence< i... >) const -> bool
Definition: infinite_vertex_property_sampler.h:92
auto clamp_pos(pos_type const &x) const
Definition: infinite_vertex_property_sampler.h:80
auto evaluate(pos_type const &x, real_type const t) const -> tensor_type
Definition: infinite_vertex_property_sampler.h:83
static constexpr auto non_repeated_dimensions__()
Definition: infinite_vertex_property_sampler.h:34
VertexPropSampler const & m_sampler
Definition: infinite_vertex_property_sampler.h:21
auto constexpr is_inside(pos_type const &x) const -> bool
Definition: infinite_vertex_property_sampler.h:101
Definition: vertex_property_sampler.h:271
Definition: field.h:134
Real real_type
Definition: field.h:17
Definition: interpolation.h:16
Definition: vec.h:12