Tatooine
triangular_vtp_writer.h
Go to the documentation of this file.
1#ifndef TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_TRIANGULAR_VTP_WRITER_H
2#define TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_TRIANGULAR_VTP_WRITER_H
3//==============================================================================
4#include <tatooine/concepts.h>
6#include <tatooine/linspace.h>
7#include <tatooine/vtk/xml.h>
8
9#include <array>
10#include <vector>
11//==============================================================================
13//==============================================================================
14template <typename Grid, unsigned_integral HeaderType = std::uint64_t,
15 integral ConnectivityInt = std::int64_t,
16 integral OffsetInt = std::int64_t>
17requires(Grid::num_dimensions() == 2 || Grid::num_dimensions() == 3)
19 static auto constexpr num_dimensions() { return Grid::num_dimensions(); }
20 using vertex_property_type = typename Grid::vertex_property_type;
21 template <typename T>
23 typename Grid::template typed_vertex_property_type<T>;
24 //----------------------------------------------------------------------------
25 Grid const& m_grid;
26 //----------------------------------------------------------------------------
27 auto write(filesystem::path const& path) const {
28 auto file = std::ofstream{path};
29 if (!file.is_open()) {
30 throw std::runtime_error{"Could open file " + path.string() +
31 " for writing."};
32 }
33 auto offset = std::size_t{};
34 write_vtk_file(file, offset);
35 }
36 //----------------------------------------------------------------------------
37 private:
38 auto write_vtk_file(std::ofstream& file, auto& offset) const {
39 auto const num_bytes_points =
40 HeaderType(sizeof(typename Grid::real_type) * 3 * m_grid.vertices().size());
41 auto const num_bytes_connectivity = m_grid.simplices().size() *
42 m_grid.num_vertices_per_simplex() *
43 sizeof(ConnectivityInt);
44 auto const num_bytes_offsets = sizeof(OffsetInt) * m_grid.simplices().size();
45 file << "<VTKFile"
46 << " type=\"PolyData\""
47 << " version=\"1.0\""
48 << " byte_order=\"LittleEndian\""
49 << " header_type=\""
51 vtk::xml::to_data_type<HeaderType>())
52 << "\">\n"
53 << "<PolyData>\n"
54 << "<Piece"
55 << " NumberOfPoints=\"" << m_grid.vertices().size() << "\""
56 << " NumberOfPolys=\"" << m_grid.simplices().size() << "\""
57 << " NumberOfVerts=\"0\""
58 << " NumberOfLines=\"0\""
59 << " NumberOfStrips=\"0\""
60 << ">\n"
61 // Points
62 << "<Points>"
63 << "<DataArray"
64 << " format=\"appended\""
65 << " offset=\"" << offset << "\""
66 << " type=\""
68 vtk::xml::to_data_type<typename Grid::real_type>())
69 << "\" NumberOfComponents=\"3\"/>"
70 << "</Points>\n";
71 offset += num_bytes_points + sizeof(HeaderType);
72 // Polys
73 file << "<Polys>\n"
74 // Polys - connectivity
75 << "<DataArray format=\"appended\" offset=\"" << offset << "\" type=\""
77 vtk::xml::to_data_type<ConnectivityInt>())
78 << "\" Name=\"connectivity\"/>\n";
79 offset += num_bytes_connectivity + sizeof(HeaderType);
80 // Polys - offsets
81 file << "<DataArray format=\"appended\" offset=\"" << offset << "\" type=\""
83 vtk::xml::to_data_type<OffsetInt>())
84 << "\" Name=\"offsets\"/>\n";
85 offset += num_bytes_offsets + sizeof(HeaderType);
86 file << "</Polys>\n"
87 << "</Piece>\n"
88 << "</PolyData>\n"
89 << "<AppendedData encoding=\"raw\">\n_";
90 // Writing vertex data to appended data section
91
92 using namespace std::ranges;
93 {
94 file.write(reinterpret_cast<char const*>(&num_bytes_points),
95 sizeof(HeaderType));
96 if constexpr (Grid::num_dimensions() == 2) {
97 auto point_data = std::vector<vec<typename Grid::real_type, 3>>(
98 m_grid.vertices().size());
99 auto position = [this](auto const v) -> auto& { return m_grid[v]; };
100 constexpr auto to_3d = [](auto const& p) {
101 return Vec3<typename Grid::real_type>{p.x(), p.y(), 0};
102 };
103 auto it = begin(point_data);
104 for (auto const v : m_grid.vertices()) {
105 *it = to_3d(m_grid[v]);
106 ++it;
107 }
108 //copy(m_grid.vertices() | views::transform(position) |
109 // views::transform(to_3d),
110 // begin(point_data));
111 file.write(reinterpret_cast<char const*>(point_data.data()),
112 num_bytes_points);
113 } else if constexpr (Grid::num_dimensions() == 3) {
114 file.write(reinterpret_cast<char const*>(m_grid.vertices().data()),
115 num_bytes_points);
116 }
117 }
118
119 // Writing polys connectivity data to appended data section
120 {
121 auto connectivity_data = std::vector<ConnectivityInt>(
122 m_grid.simplices().size() * m_grid.num_vertices_per_simplex());
123 auto index = [](auto const x) -> ConnectivityInt { return x.index(); };
124 copy(m_grid.simplices().data_container() | views::transform(index),
125 begin(connectivity_data));
126 file.write(reinterpret_cast<char const*>(&num_bytes_connectivity),
127 sizeof(HeaderType));
128 file.write(reinterpret_cast<char const*>(connectivity_data.data()),
129 num_bytes_connectivity);
130 }
131
132 // Writing polys offsets to appended data section
133 {
134 auto offsets = std::vector<OffsetInt>(m_grid.simplices().size(),
135 m_grid.num_vertices_per_simplex());
136 for (std::size_t i = 1; i < size(offsets); ++i) {
137 offsets[i] += offsets[i - 1];
138 };
139 file.write(reinterpret_cast<char const*>(&num_bytes_offsets),
140 sizeof(HeaderType));
141 file.write(reinterpret_cast<char const*>(offsets.data()),
142 num_bytes_offsets);
143 }
144 file << "\n</AppendedData>\n"
145 << "</VTKFile>";
146 }
147};
148//==============================================================================
149} // namespace tatooine::detail::unstructured_simplicial_grid
150//==============================================================================
151#endif
Definition: edge_vtp_writer.h:12
auto size(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:89
auto begin(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:79
auto to_string(data_type const t) -> std::string_view
auto constexpr index(handle< Child, Int > const h)
Definition: handle.h:119
auto write(filesystem::path const &path) const
Definition: triangular_vtp_writer.h:27
typename Grid::template typed_vertex_property_type< T > typed_vertex_property_type
Definition: triangular_vtp_writer.h:23
static auto constexpr num_dimensions()
Definition: triangular_vtp_writer.h:19
typename Grid::vertex_property_type vertex_property_type
Definition: triangular_vtp_writer.h:20
auto write_vtk_file(std::ofstream &file, auto &offset) const
Definition: triangular_vtp_writer.h:38
Grid const & m_grid
Definition: triangular_vtp_writer.h:25
Definition: vec.h:12