7template <floating_point_range... Dimensions>
8requires(
sizeof...(Dimensions) > 1) class rectilinear_grid;
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> {
23 : m_sampler{sampler} {}
26 typename VertexPropSampler::real_type,
27 VertexPropSampler::num_dimensions(),
28 typename VertexPropSampler::tensor_type>;
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) {
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>
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;
70 x(dim) += gcem::ceil((front - x(dim)) / extent) * extent;
74 x(dim) -= gcem::ceil((x(dim) - back) / extent) * extent;
81 return clamp_pos(x, std::make_index_sequence<num_repeated_dimensions>{});
86 return m_sampler(clamp_pos(x), t);
88 return parent_type::ood_tensor();
91 template <std::size_t... i>
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;
103 std::make_index_sequence<num_non_repeated_dimensions>{});
107template <std::size_t... RepeatedDims,
typename GridVertexProperty>
117template <std::size_t... RepeatedDims,
typename GridVertexProperty>
128template <std::size_t... DimsToRepeat,
typename Dim0,
typename Dim1,
132 ValueType,
true>& prop) {
133 auto const s = prop.grid().size();
135 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
136 variadic::contains<0, DimsToRepeat...>) {
137 for (std::size_t i = 0;
139 prop(s[0] - 1, i) = prop(0, i);
142 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
143 variadic::contains<1, DimsToRepeat...>) {
144 for (std::size_t i = 0;
146 prop(i, s[1] - 1) = prop(i, 0);
149 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
150 (variadic::contains<0, DimsToRepeat...> &&
151 variadic::contains<1, DimsToRepeat...>)) {
153 prop(s[0] - 1, s[1] - 1) = prop(0, 0);
157template <std::size_t... DimsToRepeat,
typename Dim0,
typename Dim1,
158 typename Dim2,
typename ValueType>
162 auto const s = prop.grid().size();
164 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
165 variadic::contains<0, DimsToRepeat...>) {
166 for (std::size_t i = 0;
168 for (std::size_t j = 0;
171 prop(s[0] - 1, i, j) = prop(0, i, j);
175 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
176 variadic::contains<1, DimsToRepeat...>) {
177 for (std::size_t i = 0;
179 for (std::size_t j = 0;
182 prop(i, s[1] - 1, j) = prop(i, 0, j);
186 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
187 variadic::contains<2, DimsToRepeat...>) {
188 for (std::size_t i = 0;
190 for (std::size_t j = 0;
193 prop(i, j, s[2] - 1) = prop(i, j, 0);
198 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
199 (variadic::contains<1, DimsToRepeat...> &&
200 variadic::contains<2, DimsToRepeat...>)) {
201 for (std::size_t i = 0;
203 prop(i, s[1] - 1, s[2] - 1) = prop(i, 0, 0);
206 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
207 (variadic::contains<0, DimsToRepeat...> &&
208 variadic::contains<2, DimsToRepeat...>)) {
209 for (std::size_t i = 0;
211 prop(s[0] - 1, i, s[2] - 1) = prop(0, i, 0);
214 if constexpr (
sizeof...(DimsToRepeat) == 0 ||
215 (variadic::contains<0, DimsToRepeat...> &&
216 variadic::contains<1, DimsToRepeat...>)) {
217 for (std::size_t i = 0;
219 prop(s[0] - 1, s[1] - 1, i) = prop(0, 0, i);
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);
Definition: rectilinear_grid.h:38
Definition: dimension.h:9
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.h:96
Definition: vertex_property_sampler.h:271
Real real_type
Definition: field.h:17
VertexPropSampler::tensor_type tensor_type
Definition: field.h:18
Definition: interpolation.h:16