| 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 |