GCC Code Coverage Report


Directory: gridformat/
File: gridformat/vtk/common.hpp
Date: 2026-10-12 17:50:57
Exec Total Coverage
Lines: 193 217 88.9%
Functions: 988 1493 66.2%
Branches: 374 1136 32.9%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2022-2023 Dennis Gläser <dennis.glaeser@iws.uni-stuttgart.de>
2 // SPDX-License-Identifier: MIT
3 /*!
4 * \file
5 * \ingroup VTK
6 * \brief Common functionality for VTK writers
7 */
8 #ifndef GRIDFORMAT_VTK_COMMON_HPP_
9 #define GRIDFORMAT_VTK_COMMON_HPP_
10
11 #include <ranges>
12 #include <cassert>
13 #include <utility>
14 #include <type_traits>
15 #include <algorithm>
16 #include <array>
17 #include <cmath>
18
19 #include <gridformat/common/field.hpp>
20 #include <gridformat/common/concepts.hpp>
21 #include <gridformat/common/exceptions.hpp>
22 #include <gridformat/common/precision.hpp>
23 #include <gridformat/common/serialization.hpp>
24 #include <gridformat/common/md_layout.hpp>
25 #include <gridformat/common/ranges.hpp>
26 #include <gridformat/common/matrix.hpp>
27 #include <gridformat/common/type_traits.hpp>
28 #include <gridformat/common/string_conversion.hpp>
29 #include <gridformat/common/flat_index_mapper.hpp>
30 #include <gridformat/common/field_transformations.hpp>
31 #include <gridformat/common/field.hpp>
32
33 #include <gridformat/grid/entity_fields.hpp>
34 #include <gridformat/grid/cell_type.hpp>
35 #include <gridformat/grid/concepts.hpp>
36 #include <gridformat/grid/_detail.hpp>
37 #include <gridformat/grid/grid.hpp>
38
39 #ifndef DOXYGEN
40 namespace GridFormat::Encoding { struct Ascii; struct Base64; struct RawBinary; }
41 #endif // DOXYGEN
42
43 namespace GridFormat::VTK {
44
45 //! \addtogroup VTK
46 //! \{
47
48 namespace DataFormat {
49
50 struct Inlined {}; //!< Inline data format (inside xml elements)
51 struct Appended {}; //!< Appended data format (all data is appended at the end of the xml file)
52
53 inline constexpr Inlined inlined; //!< Instance of the inline data format
54 inline constexpr Appended appended; //!< Instance of the appended data format
55
56 } // namespace DataFormat
57
58 #ifndef DOXYGEN
59 namespace Traits {
60
61 template<typename T> struct ProducesValidXML;
62 template<> struct ProducesValidXML<Encoding::Ascii> : public std::true_type {};
63 template<> struct ProducesValidXML<Encoding::Base64> : public std::true_type {};
64 template<> struct ProducesValidXML<Encoding::RawBinary> : public std::false_type {};
65
66 } // namespace Traits
67
68 template<typename Encoder>
69 12316 inline constexpr bool produces_valid_xml(const Encoder&) {
70 static_assert(
71 is_complete<Traits::ProducesValidXML<Encoder>>,
72 "Traits::ProducesValidXML was not specialized for the given encoder"
73 );
74 12316 return Traits::ProducesValidXML<Encoder>::value;
75 }
76
77 30836 inline constexpr std::uint8_t cell_type_number(CellType t) {
78
14/16
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 465 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 676 times.
✓ Branch 4 taken 15696 times.
✓ Branch 5 taken 3088 times.
✓ Branch 6 taken 164 times.
✓ Branch 7 taken 1732 times.
✓ Branch 8 taken 923 times.
✓ Branch 9 taken 3000 times.
✓ Branch 10 taken 31 times.
✓ Branch 11 taken 631 times.
✓ Branch 12 taken 415 times.
✓ Branch 13 taken 3331 times.
✓ Branch 14 taken 549 times.
✗ Branch 15 not taken.
30836 switch (t) {
79 135 case (CellType::vertex): return 1;
80 465 case (CellType::segment): return 3;
81 ✗ case (CellType::polyline): return 4;
82 676 case (CellType::triangle): return 5;
83 15696 case (CellType::pixel): return 8;
84 3088 case (CellType::quadrilateral): return 9;
85 164 case (CellType::polygon): return 7;
86 1732 case (CellType::tetrahedron): return 10;
87 923 case (CellType::hexahedron): return 12;
88 3000 case (CellType::voxel): return 11;
89 31 case (CellType::lagrange_segment): return 68;
90 631 case (CellType::lagrange_triangle): return 69;
91 415 case (CellType::lagrange_quadrilateral): return 70;
92 3331 case (CellType::lagrange_tetrahedron): return 71;
93 549 case (CellType::lagrange_hexahedron): return 72;
94 }
95
96 ✗ throw NotImplemented("VTK cell type number for the given cell type");
97 }
98
99 10054 inline constexpr CellType cell_type(std::uint8_t vtk_id) {
100
4/16
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 35 times.
✓ Branch 4 taken 1200 times.
✓ Branch 5 taken 8784 times.
✓ Branch 6 taken 35 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
10054 switch (vtk_id) {
101 ✗ case 1: return CellType::vertex;
102 ✗ case 3: return CellType::segment;
103 ✗ case 4: return CellType::polyline;
104 35 case 5: return CellType::triangle;
105 1200 case 8: return CellType::pixel;
106 8784 case 9: return CellType::quadrilateral;
107 35 case 7: return CellType::polygon;
108 ✗ case 10: return CellType::tetrahedron;
109 ✗ case 12: return CellType::hexahedron;
110 ✗ case 11: return CellType::voxel;
111 ✗ case 68: return CellType::lagrange_segment;
112 ✗ case 69: return CellType::lagrange_triangle;
113 ✗ case 70: return CellType::lagrange_quadrilateral;
114 ✗ case 71: return CellType::lagrange_tetrahedron;
115 ✗ case 72: return CellType::lagrange_hexahedron;
116 }
117
118 ✗ throw NotImplemented("Cell type for the given VTK cell type number: " + std::to_string(vtk_id));
119 }
120
121 94936 inline FieldPtr make_vtk_field(FieldPtr field) {
122
1/2
✓ Branch 2 taken 94936 times.
✗ Branch 3 not taken.
94936 const auto layout = field->layout();
123
3/4
✓ Branch 1 taken 94936 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 33529 times.
✓ Branch 4 taken 61407 times.
94936 if (layout.dimension() < 2)
124 33529 return field;
125 // (maybe) make vector/tensor fields 3d
126
1/2
✓ Branch 1 taken 61407 times.
✗ Branch 2 not taken.
61407 if (std::ranges::all_of(
127
4/6
✓ Branch 1 taken 61407 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 61407 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 17450 times.
✓ Branch 7 taken 43957 times.
122814 std::views::iota(std::size_t{1}, layout.dimension()),
128 69496 [&] (const std::size_t codim) { return layout.extent(codim) < 3; }
129 ))
130
1/2
✓ Branch 3 taken 17450 times.
✗ Branch 4 not taken.
17450 return transform(field, FieldTransformation::extend_all_to(3));
131 43957 return field;
132 94936 }
133
134 template<std::derived_from<Field> F>
135 requires(!std::is_lvalue_reference_v<F>)
136 14162 FieldPtr make_vtk_field(F&& field) {
137
2/4
✓ Branch 2 taken 7081 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7081 times.
✗ Branch 6 not taken.
14162 return make_vtk_field(make_field_ptr(std::forward<F>(field)));
138 }
139
140 template<typename ctype, GridDetail::ExposesPointRange Grid>
141 6734 auto make_coordinates_field(const Grid& grid, bool structured_grid_ordering) {
142 6734 return make_vtk_field(PointField{
143 grid,
144 142386 [&] (const auto& point) { return coordinates(grid, point); },
145 structured_grid_ordering,
146 Precision<ctype>{}
147
1/2
✓ Branch 1 taken 3424 times.
✗ Branch 2 not taken.
13468 });
148 }
149
150 template<typename HeaderType = std::size_t, Concepts::UnstructuredGrid Grid, typename PointMap>
151 requires(std::is_lvalue_reference_v<PointMap>)
152 2754 auto make_connectivity_field(const Grid& grid, PointMap&& map) {
153 class ConnectivityField : public Field {
154 public:
155 1434 explicit ConnectivityField(const Grid& g, PointMap&& map)
156 1434 : _grid(g)
157 1434 , _point_map{std::forward<PointMap>(map)} {
158 1434 _num_values = 0;
159
1/2
✓ Branch 2 taken 114 times.
✗ Branch 3 not taken.
67682 std::ranges::for_each(cells(g), [&] (const auto& cell) {
160 34540 _num_values += number_of_points(_grid, cell);
161 });
162 1434 }
163
164 private:
165
1/2
✓ Branch 1 taken 456 times.
✗ Branch 2 not taken.
4568 MDLayout _layout() const override { return MDLayout{{_num_values}}; }
166 4172 DynamicPrecision _precision() const override { return Precision<HeaderType>{}; }
167 1412 Serialization _serialized() const override {
168
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
1412 Serialization serialization(sizeof(HeaderType)*_num_values);
169
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
1412 HeaderType* data = serialization.as_span_of<HeaderType>().data();
170
171 1412 std::size_t i = 0;
172
1/2
✓ Branch 2 taken 114 times.
✗ Branch 3 not taken.
67448 std::ranges::for_each(cells(_grid), [&] (const auto& cell) {
173
118/434
✓ Branch 1 taken 6474 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6474 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 674 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 674 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7520 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7520 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3084 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 3084 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 972 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 972 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 11892 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 11892 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 298 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 298 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 310 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 310 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 62 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 62 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 700 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 700 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 948 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 948 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1168 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1168 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 44 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 44 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 5 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 5 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 47 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 47 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 5 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 5 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 12 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 12 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 15 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 15 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 10 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 10 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 6 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 6 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 3 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 3 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 5 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 5 times.
✗ Branch 131 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✓ Branch 139 taken 10 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 10 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 2 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 2 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 12 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 12 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 2 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 2 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 12 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 12 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 5 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 5 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 2 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 2 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 5 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 5 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 2 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 2 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 2 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 2 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 2 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 2 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 2 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 2 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 2 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 2 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 2 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 2 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 2 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 2 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 2 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 2 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 2 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 2 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 2 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 2 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 2 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 2 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 6 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 6 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 6 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 6 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 6 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 6 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 6 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 6 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 6 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 6 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 6 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 6 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 6 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 6 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 6 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 6 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 6 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 6 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 6 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 6 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 6 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 6 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 6 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 6 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 6 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 6 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 6 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 6 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 6 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 6 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 6 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 6 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 6 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 6 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 6 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 6 times.
✗ Branch 359 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 367 not taken.
✗ Branch 368 not taken.
✗ Branch 370 not taken.
✗ Branch 371 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 406 not taken.
✗ Branch 407 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✗ Branch 415 not taken.
✗ Branch 416 not taken.
✗ Branch 418 not taken.
✗ Branch 419 not taken.
✗ Branch 421 not taken.
✗ Branch 422 not taken.
✗ Branch 424 not taken.
✗ Branch 425 not taken.
✗ Branch 427 not taken.
✗ Branch 428 not taken.
✗ Branch 430 not taken.
✗ Branch 431 not taken.
✗ Branch 433 not taken.
✗ Branch 434 not taken.
✗ Branch 436 not taken.
✗ Branch 437 not taken.
✗ Branch 439 not taken.
✗ Branch 440 not taken.
✗ Branch 442 not taken.
✗ Branch 443 not taken.
✗ Branch 445 not taken.
✗ Branch 446 not taken.
✗ Branch 448 not taken.
✗ Branch 449 not taken.
✗ Branch 451 not taken.
✗ Branch 452 not taken.
✗ Branch 454 not taken.
✗ Branch 455 not taken.
✗ Branch 457 not taken.
✗ Branch 458 not taken.
✗ Branch 460 not taken.
✗ Branch 461 not taken.
✗ Branch 463 not taken.
✗ Branch 464 not taken.
✗ Branch 466 not taken.
✗ Branch 467 not taken.
✗ Branch 469 not taken.
✗ Branch 470 not taken.
✗ Branch 472 not taken.
✗ Branch 473 not taken.
✗ Branch 475 not taken.
✗ Branch 476 not taken.
✗ Branch 478 not taken.
✗ Branch 479 not taken.
✗ Branch 481 not taken.
✗ Branch 482 not taken.
✗ Branch 484 not taken.
✗ Branch 485 not taken.
✗ Branch 487 not taken.
✗ Branch 488 not taken.
✗ Branch 490 not taken.
✗ Branch 491 not taken.
✗ Branch 493 not taken.
✗ Branch 494 not taken.
✗ Branch 496 not taken.
✗ Branch 497 not taken.
✗ Branch 499 not taken.
✗ Branch 500 not taken.
✗ Branch 502 not taken.
✗ Branch 503 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 511 not taken.
✗ Branch 512 not taken.
✗ Branch 514 not taken.
✗ Branch 515 not taken.
✗ Branch 517 not taken.
✗ Branch 518 not taken.
✗ Branch 520 not taken.
✗ Branch 521 not taken.
✗ Branch 523 not taken.
✗ Branch 524 not taken.
✗ Branch 526 not taken.
✗ Branch 527 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✗ Branch 535 not taken.
✗ Branch 536 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 541 not taken.
✗ Branch 542 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✗ Branch 547 not taken.
✗ Branch 548 not taken.
✗ Branch 550 not taken.
✗ Branch 551 not taken.
✗ Branch 553 not taken.
✗ Branch 554 not taken.
✗ Branch 556 not taken.
✗ Branch 557 not taken.
✗ Branch 559 not taken.
✗ Branch 560 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✗ Branch 571 not taken.
✗ Branch 572 not taken.
✗ Branch 574 not taken.
✗ Branch 575 not taken.
✗ Branch 577 not taken.
✗ Branch 578 not taken.
✗ Branch 580 not taken.
✗ Branch 581 not taken.
✗ Branch 583 not taken.
✗ Branch 584 not taken.
✗ Branch 586 not taken.
✗ Branch 587 not taken.
✗ Branch 589 not taken.
✗ Branch 590 not taken.
✗ Branch 592 not taken.
✗ Branch 593 not taken.
✗ Branch 595 not taken.
✗ Branch 596 not taken.
✗ Branch 598 not taken.
✗ Branch 599 not taken.
✗ Branch 601 not taken.
✗ Branch 602 not taken.
✗ Branch 604 not taken.
✗ Branch 605 not taken.
✗ Branch 607 not taken.
✗ Branch 608 not taken.
✗ Branch 610 not taken.
✗ Branch 611 not taken.
✗ Branch 613 not taken.
✗ Branch 614 not taken.
✗ Branch 616 not taken.
✗ Branch 617 not taken.
✗ Branch 619 not taken.
✗ Branch 620 not taken.
✗ Branch 622 not taken.
✗ Branch 623 not taken.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✗ Branch 628 not taken.
✗ Branch 629 not taken.
✗ Branch 631 not taken.
✗ Branch 632 not taken.
✗ Branch 634 not taken.
✗ Branch 635 not taken.
✗ Branch 637 not taken.
✗ Branch 638 not taken.
✗ Branch 640 not taken.
✗ Branch 641 not taken.
✗ Branch 643 not taken.
✗ Branch 644 not taken.
✗ Branch 646 not taken.
✗ Branch 647 not taken.
344916 std::ranges::for_each(points(_grid, cell), [&] (const auto& point) {
174
130/464
✓ Branch 1 taken 11908 times.
✓ Branch 2 taken 26484 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11908 times.
✓ Branch 5 taken 1360 times.
✓ Branch 6 taken 446 times.
✓ Branch 7 taken 694 times.
✓ Branch 8 taken 1360 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 13750 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 7806 times.
✓ Branch 14 taken 13447 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 7806 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 122 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12000 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4882 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 3638 times.
✓ Branch 26 taken 280 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3638 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 560 times.
✓ Branch 31 taken 17336 times.
✓ Branch 32 taken 25200 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 17504 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 646 times.
✓ Branch 38 taken 480 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 646 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 168 times.
✓ Branch 43 taken 166 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 446 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 6 times.
✓ Branch 50 taken 342 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 6 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1191 times.
✓ Branch 55 taken 3846 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 6791 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 3846 times.
✓ Branch 62 taken 11631 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3846 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 20 times.
✓ Branch 67 taken 6 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 29 times.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✓ Branch 73 taken 6 times.
✓ Branch 74 taken 20 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 6 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 15 times.
✓ Branch 79 taken 6 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 82 taken 18 times.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 6 times.
✓ Branch 86 taken 15 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 6 times.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 91 taken 6 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 26 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 6 times.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✓ Branch 100 taken 6 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 20 times.
✓ Branch 103 taken 6 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 6 times.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✓ Branch 110 taken 20 times.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✓ Branch 114 taken 12 times.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 121 not taken.
✓ Branch 122 taken 12 times.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✓ Branch 145 taken 6 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 6 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 6 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 6 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 6 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 6 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 6 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 6 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 6 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 6 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 6 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 6 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 6 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 6 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 6 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 6 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 6 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 6 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 6 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 6 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 6 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 6 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 6 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 6 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 6 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 6 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 6 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 6 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 6 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 6 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 6 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 6 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 6 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 6 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 6 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 6 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 24 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 24 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 24 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 24 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 24 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 24 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 24 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 24 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 24 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 24 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 24 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 24 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 24 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 24 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 24 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 24 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 24 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 24 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 24 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 24 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 24 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 24 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 24 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 24 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 24 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 24 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 24 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 24 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 24 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 24 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 24 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 24 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 24 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 24 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 24 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 24 times.
✗ Branch 359 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 367 not taken.
✗ Branch 368 not taken.
✗ Branch 370 not taken.
✗ Branch 371 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 406 not taken.
✗ Branch 407 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✗ Branch 415 not taken.
✗ Branch 416 not taken.
✗ Branch 418 not taken.
✗ Branch 419 not taken.
✗ Branch 421 not taken.
✗ Branch 422 not taken.
✗ Branch 424 not taken.
✗ Branch 425 not taken.
✗ Branch 427 not taken.
✗ Branch 428 not taken.
✗ Branch 430 not taken.
✗ Branch 431 not taken.
✗ Branch 433 not taken.
✗ Branch 434 not taken.
✗ Branch 436 not taken.
✗ Branch 437 not taken.
✗ Branch 439 not taken.
✗ Branch 440 not taken.
✗ Branch 442 not taken.
✗ Branch 443 not taken.
✗ Branch 445 not taken.
✗ Branch 446 not taken.
✗ Branch 448 not taken.
✗ Branch 449 not taken.
✗ Branch 451 not taken.
✗ Branch 452 not taken.
✗ Branch 454 not taken.
✗ Branch 455 not taken.
✗ Branch 457 not taken.
✗ Branch 458 not taken.
✗ Branch 460 not taken.
✗ Branch 461 not taken.
✗ Branch 463 not taken.
✗ Branch 464 not taken.
✗ Branch 466 not taken.
✗ Branch 467 not taken.
✗ Branch 469 not taken.
✗ Branch 470 not taken.
✗ Branch 472 not taken.
✗ Branch 473 not taken.
✗ Branch 475 not taken.
✗ Branch 476 not taken.
✗ Branch 478 not taken.
✗ Branch 479 not taken.
✗ Branch 481 not taken.
✗ Branch 482 not taken.
✗ Branch 484 not taken.
✗ Branch 485 not taken.
✗ Branch 487 not taken.
✗ Branch 488 not taken.
✗ Branch 490 not taken.
✗ Branch 491 not taken.
✗ Branch 493 not taken.
✗ Branch 494 not taken.
✗ Branch 496 not taken.
✗ Branch 497 not taken.
✗ Branch 499 not taken.
✗ Branch 500 not taken.
✗ Branch 502 not taken.
✗ Branch 503 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 511 not taken.
✗ Branch 512 not taken.
✗ Branch 514 not taken.
✗ Branch 515 not taken.
✗ Branch 517 not taken.
✗ Branch 518 not taken.
✗ Branch 520 not taken.
✗ Branch 521 not taken.
✗ Branch 523 not taken.
✗ Branch 524 not taken.
✗ Branch 526 not taken.
✗ Branch 527 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✗ Branch 535 not taken.
✗ Branch 536 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 541 not taken.
✗ Branch 542 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✗ Branch 547 not taken.
✗ Branch 548 not taken.
✗ Branch 550 not taken.
✗ Branch 551 not taken.
✗ Branch 553 not taken.
✗ Branch 554 not taken.
✗ Branch 556 not taken.
✗ Branch 557 not taken.
✗ Branch 559 not taken.
✗ Branch 560 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✗ Branch 571 not taken.
✗ Branch 572 not taken.
✗ Branch 574 not taken.
✗ Branch 575 not taken.
✗ Branch 577 not taken.
✗ Branch 578 not taken.
✗ Branch 580 not taken.
✗ Branch 581 not taken.
✗ Branch 583 not taken.
✗ Branch 584 not taken.
✗ Branch 586 not taken.
✗ Branch 587 not taken.
✗ Branch 589 not taken.
✗ Branch 590 not taken.
✗ Branch 592 not taken.
✗ Branch 593 not taken.
✗ Branch 595 not taken.
✗ Branch 596 not taken.
✗ Branch 598 not taken.
✗ Branch 599 not taken.
✗ Branch 601 not taken.
✗ Branch 602 not taken.
✗ Branch 604 not taken.
✗ Branch 605 not taken.
✗ Branch 607 not taken.
✗ Branch 608 not taken.
✗ Branch 610 not taken.
✗ Branch 611 not taken.
✗ Branch 613 not taken.
✗ Branch 614 not taken.
✗ Branch 616 not taken.
✗ Branch 617 not taken.
✗ Branch 619 not taken.
✗ Branch 620 not taken.
✗ Branch 622 not taken.
✗ Branch 623 not taken.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✗ Branch 628 not taken.
✗ Branch 629 not taken.
✗ Branch 631 not taken.
✗ Branch 632 not taken.
✗ Branch 634 not taken.
✗ Branch 635 not taken.
✗ Branch 637 not taken.
✗ Branch 638 not taken.
✗ Branch 640 not taken.
✗ Branch 641 not taken.
✗ Branch 643 not taken.
✗ Branch 644 not taken.
✗ Branch 646 not taken.
✗ Branch 647 not taken.
165705 data[i] = _point_map.at(id(_grid, point));
175 165705 i++;
176 });
177 });
178 1412 return serialization;
179 ✗ }
180
181 const Grid& _grid;
182 LVReferenceOrValue<PointMap> _point_map;
183 HeaderType _num_values;
184
1/2
✓ Branch 2 taken 1434 times.
✗ Branch 3 not taken.
2754 } _field{grid, std::forward<PointMap>(map)};
185
186
1/2
✓ Branch 2 taken 1434 times.
✗ Branch 3 not taken.
5508 return make_vtk_field(std::move(_field));
187 2754 }
188
189 template<typename HeaderType = std::size_t, Concepts::UnstructuredGrid Grid>
190 2754 auto make_offsets_field(const Grid& grid) {
191 class OffsetField : public Field {
192 public:
193 1434 explicit OffsetField(const Grid& g)
194 1434 : _grid(g)
195 1434 , _num_cells{static_cast<HeaderType>(Ranges::size(cells(g)))}
196 1434 {}
197
198 private:
199
1/2
✓ Branch 1 taken 456 times.
✗ Branch 2 not taken.
4568 MDLayout _layout() const override { return MDLayout{{_num_cells}}; }
200 4172 DynamicPrecision _precision() const override { return Precision<HeaderType>{}; }
201 1412 Serialization _serialized() const override {
202
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
1412 Serialization serialization(sizeof(HeaderType)*_num_cells);
203
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
1412 HeaderType* data = serialization.as_span_of<HeaderType>().data();
204
205 1412 std::size_t i = 0;
206 1412 HeaderType offset = 0;
207
1/2
✓ Branch 2 taken 114 times.
✗ Branch 3 not taken.
67448 std::ranges::for_each(cells(_grid), [&] (const auto& cell) {
208 34434 offset += number_of_points(_grid, cell);
209 34434 data[i] = offset;
210 34434 i++;
211 });
212 1412 return serialization;
213 ✗ }
214
215 const Grid& _grid;
216 HeaderType _num_cells;
217
1/2
✓ Branch 1 taken 929 times.
✗ Branch 2 not taken.
2754 } _field{grid};
218
219
1/2
✓ Branch 2 taken 1434 times.
✗ Branch 3 not taken.
5508 return make_vtk_field(std::move(_field));
220 2754 }
221
222 template<Concepts::UnstructuredGrid Grid>
223 1313 auto make_cell_types_field(const Grid& grid) {
224 1313 return make_vtk_field(CellField{
225 grid,
226 27714 [&] (const auto& cell) {
227 30836 return VTK::cell_type_number(type(grid, cell));
228 },
229 false
230
1/2
✓ Branch 1 taken 775 times.
✗ Branch 2 not taken.
2626 });
231 }
232
233 108202 inline auto active_array_attribute_for_rank(unsigned int rank) {
234
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 108202 times.
108202 if (rank > 2)
235 ✗ throw ValueError("Rank must be <= 2");
236 static constexpr std::array attributes{"Scalars", "Vectors", "Tensors"};
237 108202 return attributes[rank];
238 }
239
240 namespace CommonDetail {
241
242 template<Concepts::StaticallySizedRange R>
243 31162 std::string number_string_3d(const R& r) {
244 static_assert(static_size<R> >= 1 || static_size<R> <= 3);
245 if constexpr (static_size<R> == 3)
246
1/2
✓ Branch 2 taken 12055 times.
✗ Branch 3 not taken.
24110 return as_string(r);
247 if constexpr (static_size<R> == 2)
248
2/4
✓ Branch 2 taken 3220 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3220 times.
✗ Branch 6 not taken.
6440 return as_string(r) + " 0";
249 if constexpr (static_size<R> == 1)
250
2/4
✓ Branch 2 taken 306 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 306 times.
✗ Branch 6 not taken.
612 return as_string(r) + " 0 0";
251 }
252
253 template<Concepts::StaticallySizedMDRange<2> R>
254 6506 std::string direction_string(const R& basis) {
255
1/2
✓ Branch 1 taken 3318 times.
✗ Branch 2 not taken.
6506 Matrix m{basis};
256 6506 m.transpose();
257
258
1/2
✓ Branch 1 taken 3318 times.
✗ Branch 2 not taken.
6506 std::string result = "";
259
1/2
✓ Branch 1 taken 3318 times.
✗ Branch 2 not taken.
23874 std::ranges::for_each(m, [&] (const auto& row) {
260
6/6
✓ Branch 1 taken 688 times.
✓ Branch 2 taken 789 times.
✓ Branch 4 taken 4497 times.
✓ Branch 5 taken 2308 times.
✓ Branch 7 taken 442 times.
✓ Branch 8 taken 221 times.
8945 if (result != "")
261 5627 result += " ";
262
6/12
✓ Branch 1 taken 1477 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1477 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 6805 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 6805 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 663 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 663 times.
✗ Branch 21 not taken.
8945 result += number_string_3d(row);
263 });
264
2/2
✓ Branch 0 taken 1009 times.
✓ Branch 1 taken 3318 times.
8395 for (int i = static_size<R>; i < 3; ++i)
265
1/2
✓ Branch 1 taken 1009 times.
✗ Branch 2 not taken.
1889 result += " 0 0 0";
266 6506 return result;
267 ✗ }
268
269 template<Concepts::StaticallySizedRange R1,
270 Concepts::StaticallySizedRange R2>
271 requires(std::integral<std::ranges::range_value_t<R1>> and
272 std::integral<std::ranges::range_value_t<R2>>)
273 44800 std::array<std::size_t, 6> get_extents(const R1& from, const R2& to) {
274 static_assert(static_size<R1> == static_size<R2>);
275 static_assert(static_size<R1> <= 3);
276
277 44800 int i = 0;
278 44800 auto result = Ranges::filled_array<6>(std::size_t{0});
279 44800 auto it1 = std::ranges::begin(from);
280 44800 auto it2 = std::ranges::begin(to);
281
2/2
✓ Branch 1 taken 62540 times.
✓ Branch 2 taken 22776 times.
168347 for (; it1 != std::ranges::end(from); ++it1, ++it2, ++i) {
282 123547 result[i*2 + 0] = *it1;
283 123547 result[i*2 + 1] = *it2;
284 }
285 44800 return result;
286 }
287
288 template<Concepts::StaticallySizedRange R>
289 271 std::array<std::size_t, 6> get_extents(const R& to) {
290 using T = std::ranges::range_value_t<R>;
291
2/4
✓ Branch 1 taken 191 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 191 times.
✗ Branch 5 not taken.
271 return get_extents(Ranges::filled_array<static_size<R>>(T{0}), to);
292 }
293
294 template<Concepts::StaticallySizedRange R1,
295 Concepts::StaticallySizedRange R2>
296 44529 std::string extents_string(const R1& from, const R2& to) {
297
2/4
✓ Branch 2 taken 22585 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 22585 times.
✗ Branch 6 not taken.
44529 return as_string(get_extents(from, to));
298 }
299
300 template<Concepts::StaticallySizedRange R>
301 20652 std::string extents_string(const R& r) {
302 using T = std::ranges::range_value_t<R>;
303
2/4
✓ Branch 1 taken 10500 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10500 times.
✗ Branch 5 not taken.
20652 return extents_string(Ranges::filled_array<static_size<R>>(T{0}), r);
304 }
305
306 template<Concepts::StructuredEntitySet Grid>
307 requires(!Concepts::StaticallySizedRange<Grid>)
308 2268 std::string extents_string(const Grid& grid) {
309
2/4
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
2268 return extents_string(extents(grid));
310 }
311
312 template<Concepts::StaticallySizedRange Spacing>
313 2251 auto structured_grid_axis_orientation(const Spacing& spacing) {
314 std::array<bool, static_size<Spacing>> result;
315
1/2
✓ Branch 1 taken 123 times.
✗ Branch 2 not taken.
2251 std::ranges::copy(
316
2/4
✓ Branch 1 taken 123 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 123 times.
✗ Branch 5 not taken.
8447 spacing | std::views::transform([&] <typename CT> (const CT dx) { return dx <= CT{0}; }),
317 result.begin()
318 );
319 2251 return result;
320 }
321
322 7760 inline std::size_t number_of_entities(const std::array<std::size_t, 6>& extents) {
323 7760 return std::max(extents[1] - extents[0], std::size_t{1})
324 7760 *std::max(extents[3] - extents[2], std::size_t{1})
325 7760 *std::max(extents[5] - extents[4], std::size_t{1});
326 }
327
328 3201 inline unsigned int structured_grid_dimension(const std::array<std::size_t, 3>& cells_per_direction) {
329 12804 return std::ranges::count_if(cells_per_direction, [] (const std::size_t e) { return e > 0; });
330 }
331
332 template<typename T>
333 24340 std::array<T, 3> compute_location(const std::array<T, 3>& origin,
334 const std::array<T, 3>& coordinate,
335 const std::array<T, 9>& direction) {
336 24340 const auto& [x, y, z] = coordinate;
337 return {
338 24340 origin[0] + x*direction[0] + y*direction[1] + z*direction[2],
339 24340 origin[1] + x*direction[3] + y*direction[4] + z*direction[5],
340 24340 origin[2] + x*direction[6] + y*direction[7] + z*direction[8]
341 73020 };
342 }
343
344 template<typename T>
345 284 std::array<T, 3> compute_piece_origin(const std::array<T, 3>& global_origin,
346 const std::array<T, 3>& spacing,
347 const std::array<std::size_t, 3>& extents_begin,
348 const std::array<T, 9>& direction) {
349 284 return compute_location(
350 global_origin,
351 {
352 284 spacing[0]*static_cast<T>(extents_begin[0]),
353 284 spacing[1]*static_cast<T>(extents_begin[1]),
354 284 spacing[2]*static_cast<T>(extents_begin[2])
355 },
356 direction
357 284 );
358 }
359
360 template<typename T>
361 284 Serialization serialize_structured_points(const std::array<std::size_t, 6>& extents,
362 const std::array<T, 3>& origin,
363 const std::array<T, 3>& spacing,
364 const std::array<T, 9>& direction) {
365 ✗ const MDLayout layout{{
366 284 extents[1] - extents[0],
367 284 extents[3] - extents[2],
368
1/2
✓ Branch 3 taken 284 times.
✗ Branch 4 not taken.
284 extents[5] - extents[4]
369 }};
370
1/2
✓ Branch 1 taken 284 times.
✗ Branch 2 not taken.
284 const FlatIndexMapper mapper{layout};
371
1/2
✓ Branch 4 taken 284 times.
✗ Branch 5 not taken.
284 const auto piece_origin = compute_piece_origin(
372 origin, spacing, {extents[0], extents[2], extents[4]}, direction
373 );
374
375 static constexpr unsigned int vtk_space_dim = 3;
376
2/4
✓ Branch 1 taken 284 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 284 times.
✗ Branch 5 not taken.
284 Serialization result(layout.number_of_entries()*sizeof(T)*vtk_space_dim);
377
1/2
✓ Branch 1 taken 284 times.
✗ Branch 2 not taken.
284 auto span_out = result.as_span_of(Precision<T>{});
378
8/14
✓ Branch 1 taken 284 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 284 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 284 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 284 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 24056 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 24340 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 24056 times.
✓ Branch 20 taken 284 times.
24340 for (const auto& md_index : MDIndexRange{layout}) {
379
1/2
✓ Branch 1 taken 24056 times.
✗ Branch 2 not taken.
24056 const auto offset = mapper.map(md_index)*vtk_space_dim;
380
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 24056 times.
24056 assert(offset + 2 < span_out.size());
381
1/2
✓ Branch 1 taken 24056 times.
✗ Branch 2 not taken.
24056 std::ranges::copy(
382
1/2
✓ Branch 1 taken 24056 times.
✗ Branch 2 not taken.
24056 compute_location(piece_origin, {
383 24056 static_cast<T>(md_index.get(0))*spacing[0],
384 24056 static_cast<T>(md_index.get(1))*spacing[1],
385 24056 static_cast<T>(md_index.get(2))*spacing[2]
386 }, direction),
387 24056 span_out.data() + offset
388 );
389 }
390 284 return result;
391 284 }
392
393 template<typename Visitor>
394 1041 void visit_structured_cells(const Visitor& visitor,
395 const std::array<std::size_t, 6>& extents,
396 const bool is_axis_aligned = true) {
397 3123 std::array<CellType, 4> grid_dim_to_cell_type{
398 CellType::vertex,
399 CellType::segment,
400
2/2
✓ Branch 0 taken 779 times.
✓ Branch 1 taken 262 times.
1041 (is_axis_aligned ? CellType::pixel : CellType::quadrilateral),
401
2/2
✓ Branch 0 taken 779 times.
✓ Branch 1 taken 262 times.
1041 (is_axis_aligned ? CellType::voxel : CellType::hexahedron)
402 };
403
404 3123 std::array<std::size_t, 3> counts{
405 1041 extents[1] - extents[0],
406 1041 extents[3] - extents[2],
407 1041 extents[5] - extents[4]
408 };
409
410
1/2
✓ Branch 1 taken 1041 times.
✗ Branch 2 not taken.
1041 const std::size_t grid_dim = structured_grid_dimension(counts);
411
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1041 times.
1041 if (grid_dim == 0)
412 ✗ throw ValueError("Grid must be at least 1d");
413
414
2/4
✓ Branch 1 taken 1041 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1041 times.
✗ Branch 5 not taken.
1041 const MDLayout point_layout{Ranges::incremented(counts, 1)};
415
1/2
✓ Branch 1 taken 1041 times.
✗ Branch 2 not taken.
1041 const FlatIndexMapper point_mapper{point_layout};
416
2/4
✓ Branch 0 taken 1041 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1041 times.
✗ Branch 4 not taken.
1041 const auto x_offset = grid_dim > 1 ? point_layout.extent(0) : std::size_t{0};
417
4/6
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 998 times.
✓ Branch 3 taken 43 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 43 times.
✗ Branch 7 not taken.
1041 const auto y_offset = grid_dim > 2 ? point_layout.extent(0)*point_layout.extent(1) : std::size_t{0};
418
419 // avoid zero counts s.t. the index range does not degenerate
420
1/2
✓ Branch 1 taken 1041 times.
✗ Branch 2 not taken.
4164 std::ranges::for_each(counts, [] (std::size_t& count) { count = std::max(count, std::size_t{1}); });
421
1/2
✓ Branch 2 taken 1041 times.
✗ Branch 3 not taken.
1041 std::vector<std::size_t> corners(std::pow(2, grid_dim), 0);
422
423
2/4
✓ Branch 1 taken 1041 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1041 times.
✗ Branch 5 not taken.
1041 const MDIndexRange index_range{MDLayout{counts}};
424
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1041 times.
1041 if (grid_dim == 1) {
425 ✗ std::ranges::for_each(index_range, [&] (const auto& md_index) {
426 ✗ const auto p0 = point_mapper.map(md_index);
427 ✗ corners = {p0, p0 + 1};
428 ✗ visitor(grid_dim_to_cell_type[grid_dim], corners);
429 });
430
2/2
✓ Branch 0 taken 998 times.
✓ Branch 1 taken 43 times.
1041 } else if (grid_dim == 2) {
431
1/2
✓ Branch 1 taken 998 times.
✗ Branch 2 not taken.
30985 std::ranges::for_each(index_range, [&] (const auto& md_index) {
432 29987 const auto p0 = point_mapper.map(md_index);
433
1/2
✓ Branch 1 taken 29987 times.
✗ Branch 2 not taken.
29987 corners = {p0, p0 + 1, p0 + x_offset, p0 + 1 + x_offset};
434 29987 visitor(grid_dim_to_cell_type[grid_dim], corners);
435 });
436 } else {
437
1/2
✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
5113 std::ranges::for_each(index_range, [&] (const auto& md_index) {
438 5070 const auto p0 = point_mapper.map(md_index);
439 10140 corners = {
440 5070 p0, p0 + 1, p0 + x_offset, p0 + 1 + x_offset,
441
1/2
✓ Branch 1 taken 5070 times.
✗ Branch 2 not taken.
5070 p0 + y_offset, p0 + y_offset + 1, p0 + y_offset + x_offset, p0 + 1 + y_offset + x_offset
442 };
443 5070 visitor(grid_dim_to_cell_type[grid_dim], corners);
444 });
445 }
446 1041 }
447
448 } // namespace CommonDetail
449 #endif // DOXYGEN
450
451 //! \} group VTK
452 } // namespace GridFormat::VTK
453
454
455 #endif // GRIDFORMAT_VTK_COMMON_HPP_
456