1#ifndef TATOOINE_DETAIL_AUTONOMOUS_PARTICLE_SAMPLER_H
2#define TATOOINE_DETAIL_AUTONOMOUS_PARTICLE_SAMPLER_H
13template <
floating_po
int Real, std::
size_t NumDimensions>
86 return ellipse(tag).is_inside(q);
112 return ellipse(tag).discretize(n);
116template <
floating_po
int Real>
118 std::size_t
const n, filesystem::path
const& path,
120 auto file = std::ofstream{path, std::ios::binary};
121 if (!file.is_open()) {
122 throw std::runtime_error{
"Could not write " + path.string()};
124 auto offset = std::size_t{};
125 using header_type = std::uint64_t;
126 using lines_connectivity_int_t = std::int32_t;
127 using lines_offset_int_t = lines_connectivity_int_t;
129 <<
" type=\"PolyData\""
130 <<
" version=\"1.0\" "
131 "byte_order=\"LittleEndian\""
133 << vtk::xml::to_data_type<header_type>()
135 file <<
"<PolyData>\n";
136 for (std::size_t i = 0 ;i <
size(samplers); ++i) {
138 <<
" NumberOfPoints=\"" << n <<
"\""
139 <<
" NumberOfPolys=\"0\""
140 <<
" NumberOfVerts=\"0\""
141 <<
" NumberOfLines=\"" << n - 1 <<
"\""
142 <<
" NumberOfStrips=\"0\""
148 <<
" format=\"appended\""
149 <<
" offset=\"" << offset <<
"\""
151 << vtk::xml::to_data_type<Real>()
152 <<
"\" NumberOfComponents=\"" << 3 <<
"\"/>";
153 auto const num_bytes_points =
154 header_type(
sizeof(Real) * 3 * n);
155 offset += num_bytes_points +
sizeof(header_type);
156 file <<
"</Points>\n";
161 file <<
"<DataArray format=\"appended\" offset=\"" << offset <<
"\" type=\""
162 << vtk::xml::to_data_type<lines_connectivity_int_t>()
163 <<
"\" Name=\"connectivity\"/>\n";
164 auto const num_bytes_lines_connectivity =
166 sizeof(lines_connectivity_int_t);
167 offset += num_bytes_lines_connectivity +
sizeof(header_type);
169 file <<
"<DataArray format=\"appended\" offset=\"" << offset <<
"\" type=\""
170 << vtk::xml::to_data_type<lines_offset_int_t>()
171 <<
"\" Name=\"offsets\"/>\n";
172 auto const num_bytes_lines_offsets =
173 sizeof(lines_offset_int_t) * (n - 1) * 2;
174 offset += num_bytes_lines_offsets +
sizeof(header_type);
175 file <<
"</Lines>\n";
176 file <<
"</Piece>\n";
178 file <<
"</PolyData>\n";
179 file <<
"<AppendedData encoding=\"raw\">_";
181 for (
auto const&
sampler : samplers) {
182 auto const num_bytes_points =
183 header_type(
sizeof(Real) * 3 * n);
184 using namespace std::ranges;
189 auto radian_to_cartesian = [](
auto const t) {
192 auto out_it = std::back_inserter(discretization);
193 copy(radial | views::transform(radian_to_cartesian), out_it);
194 discretization.set_closed(
true);
195 for (
auto const v : discretization.vertices()) {
197 discretization[v].x() = v2.x();
198 discretization[v].y() = v2.y();
202 file.write(
reinterpret_cast<char const*
>(&num_bytes_points),
sizeof(header_type));
203 for (
auto const v : discretization.vertices()) {
204 file.write(
reinterpret_cast<char const*
>(discretization.at(v).data()),
210 auto connectivity_data = std::vector<lines_connectivity_int_t>{};
211 connectivity_data.reserve((n - 1) * 2);
212 for (std::size_t i = 0; i < n - 1; ++i) {
213 connectivity_data.push_back(
static_cast<lines_connectivity_int_t
>(i));
214 connectivity_data.push_back(
static_cast<lines_connectivity_int_t
>(i + 1));
217 auto const num_bytes_lines_connectivity =
218 header_type((n - 1) * 2 *
sizeof(lines_connectivity_int_t));
219 file.write(
reinterpret_cast<char const*
>(&num_bytes_lines_connectivity),
220 sizeof(header_type));
221 file.write(
reinterpret_cast<char const*
>(connectivity_data.data()),
222 static_cast<std::streamsize
>(num_bytes_lines_connectivity));
227 auto offsets = std::vector<lines_offset_int_t>(n, 2);
228 for (std::size_t i = 1; i <
size(offsets); ++i) {
229 offsets[i] += offsets[i - 1];
231 auto const num_bytes_lines_offsets =
232 header_type(
sizeof(lines_offset_int_t) * (n - 1) * 2);
233 file.write(
reinterpret_cast<char const*
>(&num_bytes_lines_offsets),
234 sizeof(header_type));
235 file.write(
reinterpret_cast<char const*
>(offsets.data()),
236 static_cast<std::streamsize
>(num_bytes_lines_offsets));
240 file <<
"</AppendedData>";
241 file <<
"</VTKFile>";
Definition: post_triangulation.h:10
auto write_vtp(std::vector< sampler< Real, 2 > > const &samplers, std::size_t const n, filesystem::path const &path, forward_or_backward_tag auto const tag)
Definition: sampler.h:117
constexpr auto inv(diag_static_tensor< Tensor, N, N > const &A) -> std::optional< diag_static_tensor< vec< tatooine::value_type< Tensor >, N >, N, N > >
Definition: diag_tensor.h:109
constexpr auto euclidean_length(base_tensor< Tensor, T, N > const &t_in) -> T
Definition: length.h:12
constexpr auto opposite(forward_tag const)
Definition: tags.h:15
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
auto transposed(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:170
auto ellipse(backward_tag const) const -> auto const &
Definition: sampler.h:55
auto distance_sqr(pos_type const &q, forward_or_backward_tag auto const tag) const
Definition: sampler.h:97
auto nabla_phi(forward_tag const) const -> auto const &
Definition: sampler.h:61
auto x0(forward_or_backward_tag auto const tag) const -> auto const &
Definition: sampler.h:89
auto ellipse(forward_tag const) const -> auto const &
Definition: sampler.h:51
sampler(sampler &&) noexcept=default
mat_type m_nabla_phi1
Definition: sampler.h:28
auto distance(pos_type const &q, auto const tag) const
Definition: sampler.h:102
auto S(forward_or_backward_tag auto const tag) const -> auto const &
Definition: sampler.h:106
auto operator()(pos_type const &q, forward_or_backward_tag auto const tag) const
Definition: sampler.h:79
auto nabla_phi(backward_tag const) const -> auto const &
Definition: sampler.h:65
auto sample(pos_type const &q, forward_or_backward_tag auto const tag) const
Definition: sampler.h:75
vec< Real, NumDimensions > vec_type
Definition: sampler.h:18
ellipse_type m_ellipse1
Definition: sampler.h:27
ellipse_type m_ellipse0
Definition: sampler.h:27
auto local_pos(pos_type const &q, forward_or_backward_tag auto const tag) const
Definition: sampler.h:70
mat_type m_nabla_phi0
Definition: sampler.h:28
sampler(sampler const &)=default
auto phi(forward_or_backward_tag auto const tag) const -> auto const &
Definition: sampler.h:93
auto discretize(std::size_t const n, forward_or_backward_tag auto const tag) const
Definition: sampler.h:110
auto is_inside(pos_type const &q, forward_or_backward_tag auto const tag) const
Definition: sampler.h:84
Definition: hyper_ellipse.h:12
Definition: linspace.h:26
constexpr auto pop_back()
Definition: linspace.h:107